模型上下文协议系统

一个双层嵌套的MCP(模型上下文协议)系统,通过HTTP/SSE展示MCP组合,服务器同时是另一个MCP服务器的客户端。

  • by Origin-Digital-LLC
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Origin-Digital-LLC/nested-mcps

使用说明

acme mcp

一个两层嵌套的MCP(模型上下文协议)系统,演示了通过HTTP/SSE的MCP组合——一个服务器同时是另一个MCP服务器的客户端。

建筑

Claude Desktop
     │  stdio
     ▼
[stdio proxy]              ← spawned by Claude Desktop, bridges stdio ↔ HTTP
     │  HTTP/SSE (:8002)
     ▼
MCP 2: Orchestrator        ← FastAPI/uvicorn, runs on the server
     │  HTTP/SSE (:8001)
     ▼
MCP 1: Vector Store        ← FastAPI/uvicorn, internal only

MCP 1(mcp1_vectorstore) 是一个低级内存向量存储。在启动时,它通过Azure OpenAI嵌入10个Acme Robotics文档,然后使用numpy余弦相似度进行语义搜索。它作为一个独立的HTTP服务运行,从不直接暴露给Claude Desktop。

MCP 2(mcp2_orchestrator) 通过Azure AI Foundry使用GPT-4.1运行代理推理循环。它暴露了一个 ask 该工具通过HTTP/SSE将问题分解为任务,通过HTTP对MCP 1进行检索,并合成最终答案。独立任务通过以下方式并行分派 asyncio.gather.

代理 (extension/server/proxy.py)是一种薄型stdio↔HTTP网桥。Claude Desktop在本地生成它;它通过网络连接到MCP 2。这是唯一在客户端机器上运行的部分。

项目结构

src/
├── mcp1_vectorstore/
│   ├── settings.py       # endpoint, api_key, embedding deployment, port
│   └── server.py         # FastAPI/SSE: search + list_documents tools
└── mcp2_orchestrator/
    ├── settings.py       # endpoint, api_key, chat deployment, mcp1_url
    ├── mcp1_client.py    # HTTP/SSE client wrapping MCP 1
    ├── agent.py          # Agentic loop: scratchpad, task planning, parallel search
    └── server.py         # FastAPI/SSE: exposes the ask tool
extension/
├── manifest.json         # Claude Desktop Extension manifest
└── server/
    └── proxy.py          # stdio ↔ HTTP/SSE bridge (runs on client machines)

服务器安装程序

1.安装依赖项

uv sync

2.配置环境

cp .env.example .env
# Fill in Azure credentials

3.启动服务器

在两个独立的终端中:

make run-mcp1   # vector store on http://0.0.0.0:8001
make run-mcp2   # orchestrator on http://0.0.0.0:8002

连接克劳德桌面(本地开发)

跑 make claude-config 要打印配置块,请将其粘贴到 %APPDATA%\Claude\claude_desktop_config.json 并重新启动克劳德桌面。

这会产卵 proxy.py WSL通过HTTP连接到MCP 2。两台服务器必须首先运行。

企业部署(claude.ai)

对于企业claude.ai,不需要安装代理或客户端:

  1. 在具有可公开访问的HTTPS URL的内部服务器上部署MCP 2
  2. 组织管理员添加URL一次: claude.ai→ 设置→ 连接器→ 添加自定义连接器
  3. 用户点击启用它——无需URL输入,无需配置

MCP 1留在内部;Anthropic的服务器只需要访问MCP 2。

通过克劳德桌面扩展(.mcpb)分发

任何Claude Desktop用户(不仅仅是本地开发人员)都需要代理连接到内部服务器,因为Claude Desktop只会说stdio。这 .mcpb 将代理和所有Python依赖项打包到一键安装中。

make pack   # produces acme-orchestrator-proxy.mcpb

打包前,更新 MCP2_URL 在 extension/manifest.json 指向您的内部服务器(例如。 http://mcp.acme-internal.com:8002).分发 .mcpb 用户在Windows资源管理器中双击它,Claude Desktop会自动安装它。

工具

MCP 1工具(内部,仅限HTTP)

工具 输入 输出
search query: str, top_k: int = 3 [{doc_id, content, score}]
list_documents — [{doc_id, content}]

MCP 2工具(通过HTTP/SSE公开)

工具 输入 输出
ask question: str 合成答案字符串

代理循环

代理人在 agent.py 维护一个按请求的草稿栏:

{
  "question": str,
  "tasks": [{"id", "description", "status", "depends_on", "result"}],
  "final_answer": str | None
}

LLM使用四个内部工具驱动回路: add_task, complete_task, search_knowledge,以及 finish具有满意依赖关系的任务被并发分派。循环的硬上限为10次迭代。

试题

这些问题需要通过Acme Robotics知识库进行多跳检索。答案不在任何LLM的培训数据中。

顺序(两跳):

“谁开发了Acme旗舰产品中使用的导航算法,他们的学术背景是什么?”

并行+综合:

“比较Acme的市场地位:他们最大的客户关系有多大,他们与主要竞争对手相比如何?”

多跳伸展:

“Acme的增长战略是什么,他们目前的资金支持吗?”