{"id":31156100,"url":"https://github.com/aborroy/simple-alfresco-agent-mesh","last_synced_at":"2026-02-16T15:38:39.614Z","repository":{"id":313004760,"uuid":"1049638467","full_name":"aborroy/simple-alfresco-agent-mesh","owner":"aborroy","description":"Simple Alfresco MCP Server that routes prompts to specialized MCP servers ","archived":false,"fork":false,"pushed_at":"2025-09-03T11:22:31.000Z","size":1115,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-03T11:25:41.768Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aborroy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-03T09:21:20.000Z","updated_at":"2025-09-03T11:22:34.000Z","dependencies_parsed_at":"2025-09-03T11:25:47.659Z","dependency_job_id":"74756809-4329-4447-95dc-3f9ee1b33f56","html_url":"https://github.com/aborroy/simple-alfresco-agent-mesh","commit_stats":null,"previous_names":["aborroy/simple-alfresco-agent-mesh"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/aborroy/simple-alfresco-agent-mesh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Fsimple-alfresco-agent-mesh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Fsimple-alfresco-agent-mesh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Fsimple-alfresco-agent-mesh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Fsimple-alfresco-agent-mesh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aborroy","download_url":"https://codeload.github.com/aborroy/simple-alfresco-agent-mesh/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aborroy%2Fsimple-alfresco-agent-mesh/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275830188,"owners_count":25536280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-18T02:00:09.552Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-09-18T20:54:44.468Z","updated_at":"2025-09-18T20:54:47.752Z","avatar_url":"https://github.com/aborroy.png","language":"Dockerfile","funding_links":[],"categories":["💻 GitHub Sample Projects"],"sub_categories":["Community Projects"],"readme":"# Simple Alfresco Agent Mesh\n\nA hands-on lab to compare three routing options (**cagent**, **LangGraph**, **LlamaIndex**) over the same Alfresco setup\n\nThe **mcp-client** always talks to MCP Server available in `localhost:8085`; one router is enabled at a time, which then fans out to **MCP Audit** and **MCP Docs**, both talking to the **Alfresco Repository**\n\nThe stack that spins up:\n\n* Alfresco Community Repository including Audit sample configuration\n* Two MCP servers:\n  * Audit MCP\n    * Spring AI, streamable HTTP (exposes audit-centric tools)\n    * Source code available in https://github.com/jottley/alfresco-mcp\n  * Docs MCP\n    * Python `alfresco-mcp` server (content/doc tools)\n    * Source code available in https://github.com/stevereiner/python-alfresco-mcp-server\n* An MCP Router/Orchestrator (cagent, LangGraph or LlamaIndex): service that classifies the user prompt and forwards the MCP call to the right backend (*audit* vs *docs*)\n\nDesigned to be easy to run locally, easy to understand, and a good template for building more sophisticated Agent Meshes\n\n\n## What’s inside\n\n```\n\n.\n├── agent-mesh-tools\n│   ├── cagent/               # Router with Docker cagent (LLM required)\n│   ├── langgraph/            # Router with LangGraph (deterministic, no LLM)\n│   └── llamaindex/           # Router with LlamaIndex (LLM required)\n├── alfresco-agents\n│   ├── alfresco/             # Alfresco Community stack (Repo, Share, Search, etc.)\n│   ├── alfresco-mcp-audit/   # MCP Audit server\n│   ├── alfresco-mcp-server/  # MCP Docs server\n│   └── compose.yaml          # Always-on: Repo + MCP backends\n├── mcp-client/               # Client used to test the active router\n└── compose.yaml              # Root compose with `include:` and profiles per router\n\n````\n\n## Architecture\n\n```mermaid\nflowchart LR\n  %% Client\n  C[mcp-client]\n\n  %% Routers\n  subgraph Routers\n    CA[cagent - local app]\n    LG[langgraph - router:8085]\n    LI[llamaindex - router:8085]\n  end\n\n  %% MCP backends\n  subgraph MCP[\"MCP Servers\"]\n    AU[MCP Audit - 8081]\n    DO[MCP Docs - 8003]\n  end\n\n  %% Alfresco core\n  subgraph Alfresco\n    RE[Alfresco Repository - 8080]\n  end\n\n  %% Connections\n  C --\u003e CA\n  C --\u003e LG\n  C --\u003e LI\n\n  CA --\u003e AU\n  CA --\u003e DO\n  LG --\u003e AU\n  LG --\u003e DO\n  LI --\u003e AU\n  LI --\u003e DO\n\n  AU --\u003e RE\n  DO --\u003e RE\n````\n\n* The **Router** is the single MCP endpoint for clients\n* It *classifies* each request and *delegates* to either the **Audit MCP** or **Docs MCP** backend over Streamable HTTP\n* Both backends talk to **Alfresco**\n\n## Routers at a glance (pick one)\n\n* **LangGraph** — *deterministic router, no LLM required*. Great for repeatable flows and simple, auditable routing rules.\n* **LlamaIndex** — *LLM-driven tool routing*. Uses the model to choose between Audit/Docs tools; more adaptive, needs an LLM.\n* **cagent** — *LLM-driven agent runtime (YAML)* with first-class MCP tool integration. It runs standalone as a CLI/TUI agent, as described in [Instantly Build AI Agents for Alfresco with Docker new \"cagent\"](https://connect.hyland.com/t5/alfresco-blog/instantly-build-ai-agents-for-alfresco-with-docker-new-quot/ba-p/492609)\n\n## Requirements\n\n- Docker \u0026 Docker Compose v2+\n  Needed to run the full stack (Alfresco, MCP servers, routers, client).\n\n- System resources\n  At least 8 GB RAM free and 4 CPU cores recommended.\n\n- Open ports\n  - 8080 \u003e Alfresco Repository  \n  - 8081 \u003e MCP Audit  \n  - 8003 \u003e MCP Docs  \n  - 8085 \u003e Active router (LangGraph, or LlamaIndex)\n\n- LLM runtime\n  - For `cagent` and LlamaIndex, an LLM is required\n  - This lab uses [Ollama](https://ollama.ai/) with the local model `gpt-oss`\n  - Ensure Ollama is installed and the model is pulled before starting:\n    ```bash\n    ollama pull gpt-oss\n    ```\n\n- No LLM required\n  - LangGraph router works deterministically without an LLM\n\n## Quick start\n\n1. Start Alfresco Community + MCP backends\n\n```bash\ndocker compose up --build\n```\n\n2. Activate exactly one router (both expose `:8085`):\n\n```bash\ndocker compose --profile langgraph up -d\n```\n\n```bash\ndocker compose --profile llamaindex up -d\n```\n\n\u003e For `cagent` follow the steps in [Instantly Build AI Agents for Alfresco with Docker new \"cagent\"](https://connect.hyland.com/t5/alfresco-blog/instantly-build-ai-agents-for-alfresco-with-docker-new-quot/ba-p/492609)\n\n3. Test with the client (always hits 8085)\n\n```bash\ndocker compose -f mcp-client/compose.yaml run --rm mcp-client\n```\n\n4. Switch routers (keep Alfresco running)\n\n```bash\ndocker compose --profile langgraph down\ndocker compose --profile llamaindex up --build\n```\n\n## Example prompts (copy/paste)\n\n### \\[DOCS]\n\n```\n\u003e I need to search for documents in Alfresco. Can you search for:\n * Documents containing \"budget\"\n * Maximum 5 results\n```\n\n### \\[AUDIT]\n\n```\n\u003e List Alfresco audit apps\n```\n\n```\n\u003e List Alfresco audit entries for audit app \"search\"\n```\n\nTips:\n\n* If your router is *LangGraph*, routing is rule-based—logs/retention/compliance \u003e **Audit**; search/metadata/renditions/transforms \u003e **Docs**\n* If it’s *LlamaIndex* or *cagent*, ensure a model is configured (e.g., OpenAI/Anthropic/Gemini or a local model via Docker Model Runner)\n\n## Lab flow (recommended)\n\n1. Bring up Alfresco + MCP (wait for health)\n2. Start LangGraph first (no keys needed) and run the prompts above\n3. Stop LangGraph, start LlamaIndex; repeat the prompts and observe differences in routing/answers\n4. Stop LlamaIndex, follow the steps in [Instantly Build AI Agents for Alfresco with Docker new \"cagent\"](https://connect.hyland.com/t5/alfresco-blog/instantly-build-ai-agents-for-alfresco-with-docker-new-quot/ba-p/492609)\n\n\n## License\n\nThis repository is provided under the **Apache 2.0** license (see `LICENSE`).\nUpstream components maintain their own licenses.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faborroy%2Fsimple-alfresco-agent-mesh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faborroy%2Fsimple-alfresco-agent-mesh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faborroy%2Fsimple-alfresco-agent-mesh/lists"}