MCP边缘路由器演示
带有后端MCP节点(FastMCP)的边缘MCP路由器(Cloudflare Worker)的最小演示。 它支持渐进式披露:网关只公开节点发现和工具 列出,然后将工具调用转发到所选节点。
架构概述
MCP Edge Router - Progressive Disclosure Pattern
上图说明了MCP边缘路由器的多轮交互模式和渐进式披露机制,显示了LLM代理如何通过网关发现节点、查询工具和执行操作。
项目布局
edge-worker/Cloudflare Worker MCP网关(基于流式HTTP的JSON-RPC)
- src/worker.js 网关入口点(JSON-RPC路由) - src/tool-handler.js 工具调度(list_nodes / list_node_tools / call_node_tool) - src/node-service.js 节点发现、缓存、节点调用 - src/mcp-client.js 上游JSON-RPC和超时处理 - src/redis.js 升级Redis包装器 - src/constants.js / src/helpers.js 共享常量和助手
nodes/NodeA-D FastMCP服务器(HTTP/mcp)mcp/edge_gateway.pyPython网关(本地参考)test.py简单LLM代理(OpenAI SDK+MCP)bench_cache.py缓存基准脚本start_all.ps1启动NodeA–D+本地Worker
先决条件
- Python 3.10+
- Node.js 18+
- Python核心部署
requirements.txt - 牧马人(via
npx很好)
安装Python依赖项(推荐:单 uv env)
uv venv .venv
uv pip install -r requirements.txt --python .venv/bin/python
source .venv/bin/activate如果你更喜欢conda,你仍然可以使用:
conda create -n llm-agent-env python=3.11
conda activate llm-agent-env
pip install -r requirements.txt本地跑
1) 启动NodeA–D+Worker
macOS/Linux(单共享环境):
source .venv/bin/activate
python nodes/node_a/main.py
python nodes/node_b/main.py
python nodes/node_c/main.py
python nodes/node_d/main.py
cd edge-worker && npx wrangler dev --localWindows PowerShell(现有脚本):
powershell -ExecutionPolicy Bypass -File .\start_all.ps1注: start_all.ps1 用途 conda run -n llm-agent-env ...。如果不使用conda,请手动启动每个节点。
2) 验证MCP网关(JSON-RPC)
# list tools (gateway tools)
curl -s -X POST http://localhost:8787/mcp \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"tools/list","params":{}}'
# list nodes (progressive disclosure)
curl -s -X POST http://localhost:8787/mcp \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":"2","method":"tools/call","params":{"name":"list_nodes","arguments":{}}}'
# list node tools
curl -s -X POST http://localhost:8787/mcp \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":"3","method":"tools/call","params":{"name":"list_node_tools","arguments":{"node_id":"localhost-8001-mcp"}}}'
# call node tool
curl -s -X POST http://localhost:8787/mcp \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":"4","method":"tools/call","params":{"name":"call_node_tool","arguments":{"node_id":"localhost-8001-mcp","tool_name":"math_add","arguments":{"a":2,"b":3}}}}'代理测试(OpenAI SDK+OpenRouter兼容)
- 创建
.env在repo根目录(参见.env.example):
OPENROUTER_API_KEY=your_key
OPENROUTER_MODEL=gemini-3-flash-preview
OPENROUTER_BASE_URL=https://api.chataiapi.com/v1
MCP_URL=http://localhost:8787/mcp- 运行:
python .\test.py有关可扩展的MCP服务器配置,请参阅 mcp/mcp_config.example.json (包括远程MCP示例)。
Cloudflare工作人员
自 edge-worker/:
npx wrangler dev --local在中配置MCP节点URL edge-worker/wrangler.toml:
[vars]
MCP_NODES = '["http://localhost:8001/mcp","http://localhost:8002/mcp","http://localhost:8003/mcp","http://localhost:8004/mcp"]'
NODE_DISCOVERY_CACHE_TTL = "10"
NODE_TOOLS_CACHE_TTL = "30"
UPSTREAM_TIMEOUT_MS = "5000"可选:启用Uptash Redis缓存(用于 wrangler dev --local):
cd edge-worker
cp .dev.vars.example .dev.vars
# fill real values:
# UPSTASH_REDIS_REST_URL=...
# UPSTASH_REDIS_REST_TOKEN=...笔记:
- 如果没有Uptash变量,网关将回退到无Redis模式。
edge-worker/.dev.vars被git忽略。- 对于云部署,请使用
wrangler secret put ....
缓存基准测试
从repo根目录:
source .venv/bin/activate
python bench_cache.py --mcp-url http://localhost:8787/mcp --rounds 20该脚本打印冷延迟与热延迟统计数据(平均值/p95/min/max) list_nodes 和 list_node_tools,加上加速。
备注
- 网关希望MCP节点接受
application/json, text/event-stream. - 节点描述来自
FastMCPinstructions(见每个节点)。 - 节点ID来源于URL(重启后稳定)。
