Go 实现的 MCP(Model Context Protocol)网关:把多个工具服务器统一到一个执行入口,集中治理鉴权、预算、并发、超时和审计。
- 统一工具接入:对外暴露标准 MCP 接口(
initialize/tools/list/tools/call,JSON-RPC 2.0 over HTTP);工具由独立的 stdio 子进程提供——工单查询(对接租户工单系统)、资产查询,以及用于故障注入的慢工具和恒失败工具。新增工具只需在某个工具服务器里注册,网关核心流程零改动。 - 可组合执行链:
鉴权 → 工具范围 → 请求预算(速率/身份并发) → 并发准入(全局+工具级,满员即拒) → 执行 → 运行记录,每条拒绝路径都有稳定的错误码。 - Deadline 传递:客户端请求的截止时间与网关调用上限取小后传到下游调用;超时、取消后立即释放全部并发槽位。
- 可观测性:Prometheus 指标按工具×结局分类;运行事件走有界异步队列(满员丢弃可观测)落 JSONL 并可在线查询;OpenTelemetry 追踪,事件携带 trace_id。
- 进程治理:工具服务器崩溃后有界退避自动重启,期间调用快速失败,不悬挂。
验证"执行治理"的工程问题:慢工具或故障工具只影响它自己的并发槽位,不拖垮其他工具(隔离);工具业务失败与协议失败严格区分(isError=true 不是 JSON-RPC error);所有拒绝、超时、上游失败都有事件可回查。网关自身无状态、无数据库,单进程即完整运行。
make build && make seed # 编译并生成网关 Token(data/gateway-tokens.json)
echo "<租户系统 alice token>" > data/tenant-token.txt # ticket 工具用
bash scripts/demo.sh # 起网关(:8081) + 客户端演示 + 指标/事件也可以 docker compose up --build -d 部署(TENANT_TOKEN 写入 .env)。
详细设计(调用链错误契约、配置表、MCP 子集边界):docs/DESIGN.md