边缘路由服务

一个支持渐进式披露的边缘MCP路由服务,通过网关实现节点发现、工具列表查询和工具调用转发。

  • by sworddut
  • Python
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 sworddut/mcp-edge

使用说明

MCP边缘路由器演示

中文说明

带有后端MCP节点(FastMCP)的边缘MCP路由器(Cloudflare Worker)的最小演示。 它支持渐进式披露:网关只公开节点发现和工具 列出,然后将工具调用转发到所选节点。

架构概述

上图说明了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.py Python网关(本地参考)
  • 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 --local

Windows 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兼容)

  1. 创建 .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
  1. 运行:
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.
  • 节点描述来自 FastMCP instructions (见每个节点)。
  • 节点ID来源于URL(重启后稳定)。