关于 MCP Gateway
MCP Gateway 是一个用 Rust 编写的单一二进制程序,位于 AI 客户端与其所有工具之间。它把多个 MCP 服务和 REST API 汇聚到一个入口,面向需要管理大量工具的用户。通过按需发现和调用后端工具,它避免把完整工具目录全部加载进上下文窗口。
主要功能
- 01单一 Rust 二进制程序
- 02通过 gateway_search_tools 按需发现工具
- 03通过 gateway_invoke 调用后端工具
- 04将 MCP 服务与 REST API 汇聚为统一入口
- 05工具描述投毒校验与 SHA-256 能力固定
- 06后端热重载与断路器等弹性机制
适用场景
- 01将多个 MCP 服务统一接入一个网关,减少客户端配置
- 02在工具数量较多时减小暴露给 Agent 的工具列表
- 03为 REST API 添加 MCP 工具接口,无需编写服务代码
MCP 相关
作为 MCP 路由器,它对外暴露一组固定的元工具,并将工具、资源和提示词请求转发给后端 MCP 服务。它还能把 sampling/createMessage 等服务端到客户端请求回传给已连接的客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm ghcr.io/mikkoparkkola/mcp-gateway:3.5.1本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/mikkoparkkola/mcp-gateway:3.5.1stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP Gateway
在你的 AI 与它所需的所有工具之间架起一个网关,不让上下文窗口被塞满。
MCP Gateway 是一个单独的 Rust 二进制程序,位于 AI 客户端与其所有工具之间。将 MCP 服务和 REST API 接入其中,Agent 看到的是由 9 到 17 个工具组成的精简元界面,而不是每个后端的定义。它会按需发现并调用后端工具。一项小规模的实时 Agent 基准测试发现,多出的这一跳并未节省完成任务所需的 token,因此其价值在于目录容量、策略和路由,而非笼统声称能节省 token。请参阅基准测试。

个人和非商业用途免费,包括运行完整网关。商业运行需要商业许可证。
它解决的问题
AI 客户端连接的每个 MCP 工具都会占用约 150 个 token 的上下文开销;无论该工具是否会用到,这些内容都会加载到每个请求中。连接 20 个服务、总计 100 个工具,在对话开始前就会消耗约 15,000 个 token。随后,上下文限制还会带来第二项代价:你必须预先决定要连接哪些工具,并舍弃其余工具,因此 Agent 无法访问你选择不加载的数据,决策质量也会下降。
MCP Gateway 会将完整目录移出公开的工具列表。Agent 加载一组固定且精简的元工具,使用 gateway_search_tools 搜索,并通过 gateway_invoke 调用后端工具。这为更大的目录腾出了空间,但额外的搜索步骤可能会增加完成任务所需的 token 和时间。
flowchart LR
AI["AI client<br/>(Claude, Cursor, ...)"]
subgraph GW["MCP Gateway (single binary)"]
META["Compact meta-surface<br/>9-17 tools"]
DISC{"Discover on demand<br/>gateway_search_tools<br/>gateway_invoke"}
end
T1["MCP backend<br/>Tavily (stdio)"]
T2["MCP backend<br/>Context7 (http)"]
C1["REST capability<br/>GitHub"]
C2["REST capability<br/>Stripe"]
Cn["110+ capabilities"]
AI -->|"9-17 tool defs"| META
META --> DISC
DISC --> T1
DISC --> T2
DISC --> C1
DISC --> C2
DISC --> Cn
快速开始
四条命令:
brew trust --tap MikkoParkkola/tap # Homebrew 6.0+
brew install MikkoParkkola/tap/mcp-gateway # 1. install
mcp-gateway setup wizard --configure-client # 2. import existing servers + wire up clients
mcp-gateway serve # 3. run
mcp-gateway doctor # 4. verify everything is healthy
就是这样。现在,你的 AI 客户端会与网关通信,网关则将请求路由到你已配置的所有后端;工具数量固定为 11 tools,而不是 ~150——对于管理员而言,11 是默认 HTTP 配置所统计的数量;普通客户端显示的数量少 4 个。先在 AI 客户端中使用 gateway_search_tools 查找任意后端工具,然后使用 gateway_invoke 调用它。
还没有要导入的内容?
mcp-gateway init --with-examples会生成一个可用的gateway.yaml,其中包含公开能力,让你在添加自己的服务之前确认网关运行正常。
或者告诉你的 AI 助手(推荐):
阅读 https://github.com/MikkoParkkola/mcp-gateway 并安装 mcp-gateway,将我的所有 MCP 服务整合到一个网关后面
你的 Agent 会安装二进制文件、运行设置向导、导入现有 MCP 服务并完成自身配置。此方法适用于 Claude Code、Cursor、Windsurf、Codex,以及任何可以访问终端的 AI。
安装
| 方法 | 命令 |
|---|---|
| Homebrew(macOS/Linux,推荐) | brew install MikkoParkkola/tap/mcp-gateway |
| Cargo | cargo install mcp-gateway |
| cargo-binstall | cargo binstall mcp-gateway |
| 直接下载二进制文件(Windows x64) | 从最新版本下载 mcp-gateway-windows-x86_64.exe |
| Docker | docker run -p 127.0.0.1:39400:39400 -e MCP_GATEWAY_SERVER__ALLOW_UNAUTHENTICATED_NETWORK_BIND=true -v $(pwd)/gateway.container.yaml:/config.yaml:ro ghcr.io/mikkoparkkola/mcp-gateway:latest --config /config.yaml --host 0.0.0.0 --port 39400 |
Docker,npx/uvx 后端 | 相同命令,但将镜像标签改为 :latest-full——默认镜像不包含 Node 或 uv,因此通过 shell 调用其中任一项的 stdio 后端无法启动。参见 Docker 部署。 |
在 Linux 上,镜像以 UID/GID 1001 运行。请创建仅所有者可访问的部署副本,
而不是更改工作配置文件的所有权:install -m 600 gateway.yaml gateway.container.yaml && sudo chown 1001:1001 gateway.container.yaml。请勿将包含凭据的配置文件设为
所有人可读。Docker Desktop 在 macOS 和 Windows 上处理绑定挂载身份的方式有所不同。
直接下载二进制文件
# macOS Apple Silicon
curl -L https://github.com/MikkoParkkola/mcp-gateway/releases/latest/download/mcp-gateway-darwin-arm64 -o mcp-gateway && chmod +x mcp-gateway
# macOS Intel
curl -L https://github.com/MikkoParkkola/mcp-gateway/releases/latest/download/mcp-gateway-darwin-x86_64 -o mcp-gateway && chmod +x mcp-gateway
# Linux x86_64
curl -L https://github.com/MikkoParkkola/mcp-gateway/releases/latest/download/mcp-gateway-linux-x86_64 -o mcp-gateway && chmod +x mcp-gateway
# Windows x64 (PowerShell)
Invoke-WebRequest -Uri https://github.com/MikkoParkkola/mcp-gateway/releases/latest/download/mcp-gateway-windows-x86_64.exe -OutFile mcp-gateway.exe
三种设置方式
选项 A:自动导入所有内容(推荐)
mcp-gateway setup wizard --configure-client
扫描 Claude Desktop、Claude Code、Cursor、Zed、Continue.dev、Codex 和正在运行的 MCP 进程;让你选择要导入到 gateway.yaml 的服务;预览网关条目;将其写入每个检测到的客户端配置;验证写入结果;并在现有客户端配置发生更改时打印备份和回滚路径。添加 --yes 可跳过提示并导入所有内容。
选项 B:从内置注册表添加服务
48 个常用 MCP 服务已预先注册,包含正确的命令、参数和环境变量模板。mcp-gateway add 与 claude mcp add 和 codex mcp add 兼容:
mcp-gateway add tavily # known server, fills env vars
mcp-gateway add my-server -- npx -y @some/mcp-server --flag # arbitrary stdio command
mcp-gateway add --url https://mcp.sentry.dev/mcp sentry # HTTP server
mcp-gateway add -e API_KEY=xxx my-server -- npx my-mcp-server
mcp-gateway list 可显示已配置的内容。mcp-gateway remove <name> 可移除一项。
选项 C:手动编写 gateway.yaml
完整的架构说明请参见带注释的 examples/gateway-full.yaml,其中介绍了 env_files、server、auth、meta_mcp、streaming、failsafe、cache、capabilities 和 backends。其余顶层部分(playbooks、security、webhooks、routing_profiles、code_mode、mtls、key_server、agent_auth、runtime、marketplace、control_plane、cost_governance)目前还没有文字说明;权威列表请参见 src/config/mod.rs 中的 Config 结构体。最简示例:
server:
port: 39400
meta_mcp:
enabled: true
backends:
tavily:
# `command` is parsed with host-platform rules: POSIX shlex on unix,
# CommandLineToArgvW on Windows (so `C:\Windows\py.exe …` keeps its
# backslashes; quote paths that contain spaces).
command: "npx -y @anthropic/mcp-server-tavily"
description: "Web search"
env:
TAVILY_API_KEY: "${TAVILY_API_KEY}"
sentry:
http_url: "https://mcp.sentry.dev/mcp"
description: "Sentry issues"
运行和验证
mcp-gateway serve # start the gateway
mcp-gateway doctor # diagnose config, port, env vars, backend health
mcp-gateway doctor --fix # auto-fix issues where possible
运行 serve 后,可在 http://localhost:39400/ui 打开 Web 控制面板。/dashboard 上的运维控制面板需要管理员凭据,而浏览器无法在导航时发送凭据,因此 serve 会打印一个一次性链接,供你在绑定到环回地址时打开。绑定到网络地址的网关不会打印该链接,而是通过 /ui 使用令牌进行管理。请参阅打开控制面板。
连接 AI 客户端(如果你跳过了选项 A)
setup export 会为你将网关条目写入客户端配置文件。它会自动检测每个客户端对应的路径:
mcp-gateway setup export --target all --dry-run # preview without writing
mcp-gateway setup export --target all # write, back up, verify
mcp-gateway setup export --target claude-code # one client
mcp-gateway setup export --target all --watch # regenerate on gateway.yaml changes
mcp-gateway setup export --rollback <backup-file> # restore one client config
修改前会备份现有客户端文件。该命令会在每个已更新客户端旁打印准确的回滚命令。
| 客户端 | 配置路径 |
|---|---|
claude-code | ~/.claude.json |
claude-desktop | 平台特定 |
cursor | .cursor/mcp.json(工作区) |
vs-code-copilot | .vscode/mcp.json(工作区) |
windsurf | ~/.codeium/windsurf/mcp_config.json |
cline | .cline/mcp_servers.json(工作区) |
zed | ~/.config/zed/settings.json |
模式:--mode proxy(HTTP)、--mode stdio(子进程)、--mode auto(探测健康检查端点,然后回退)。
手动 JSON 片段(如果你更喜欢手动编辑)
{
"mcpServers": {
"gateway": {
"type": "http",
"url": "http://localhost:39400/mcp"
}
}
}
为什么使用 MCP Gateway?
- 更大的目录,更小的暴露面。 Agent 加载的是固定的元表面,而不是每个后端的定义。在已提交的实时运行中,两种路径都完成了所有任务,但元路径多用了 1.2–16.1% 的输入令牌,并多增加了一轮。请参阅基准测试。
- 工具数量不限,按需发现。 不必再选择哪些服务适合预算。Agent 会根据需要搜索(
gateway_search_tools)并调用(gateway_invoke)工具。 - 几分钟内接入任何 REST API。 放入 YAML 文件,或使用
mcp-gateway cap import导入 OpenAPI 规范。内置 110 多种功能。 - 后端的用户身份。 多租户后端可以接收经过验证的最终用户身份,无需在网关中存储长期凭据。请参阅多租户身份。
- 安全性融入设计。 工具投毒验证器会在每个后端工具描述到达 Agent 前对其进行扫描。SHA-256 功能固定为可选项:未固定的文件可以加载,固定文件不匹配时则会拒绝加载。OWASP Agentic AI Top 10 覆盖情况是在项目内自评,并非认证。该 crate 设置了
#![deny(unsafe_code)],因此任何不安全代码块都需要显式添加#[allow]才能启用,并支持可选的 mTLS、消息签名和 Agent 身份。 - 更换 MCP 技术栈,同时保留会话。 热重载后端和配置约需 8ms,同时 AI 保持连接。无需重启,也不会丢失上下文。
- 生产级韧性。 熔断器、带退避的重试、速率限制和健康检查可防止某个不稳定的服务拖垮整个工具链。
- 双协议。 MCP 加上 A2A(Agent 对 Agent)传输适配器,让同一网关既能路由工具调用,也能转发跨提供商的 Agent 消息。
MCP Gateway 是什么,以及它不是什么
MCP Gateway 是一个工具和能力路由器。它将 MCP 工具、资源和提示词流量路由到后端 MCP 服务和由能力支持的 REST API,还可以通过现有会话,将 MCP 服务向客户端发起的请求(如 sampling/createMessage、elicitation/create 和 roots/list)代理回已连接的客户端。
它不是聊天补全或嵌入代理。后端请求 sampling/createMessage 时,由已连接的客户端执行模型调用,而不是网关。兼容 OpenAI 的提示词缓存辅助工具只有一个特定用途:让 gateway_invoke 为内部调用 LLM API 的后端保留 prompt_cache_key 行为。这一边界是有意设计的。它的价值在于通过一个小型接口路由数百种工具,而不是介入模型调用链路。
与在每个请求中加载所有工具定义的默认方式相比,网关以一次性发现请求换取固定且很小的上下文开销。与一次只公开一个服务的通用传输桥接相比,它将多个后端聚合到一个带命名空间的接口后,并提供完整性检查、排序和按用户身份隔离。
多租户身份
运行自身 OIDC 的多租户后端(电子邮件、记忆、日历)通常只能看到“网关”,因此无法执行按用户访问控制,也无法生成按用户区分的审计记录。mcp-gateway 通过三种可配置策略之一,将经过验证的终端用户身份传递给后端。它可以签发由网关签名的短期断言、转发调用方自己的令牌,或为原生支持 OAuth 的后端执行 RFC 8693 令牌交换。它不会为任何人保留长期凭据。如果后端标记为 required,而请求中没有经过验证的身份,它会以失败关闭,而不会提供共享密钥;按用户划分的结果也会在缓存中保持隔离。请参阅 ADR-007、ADR-008 和 docs/UPGRADING-3.0.md。有关完整的身份传递流程、各策略的配置方式、安全不变量以及 2.x 升级路径,请参阅 v3.1.0 新内容:向后端传递终端用户身份。
独立评测
- 五种 MCP 热重载工具对比:Ruach Tov Collective 基于 BPD 对 mcp-gateway 与四种专注于重启的替代方案进行的比较,包含功能矩阵和架构分析。
- 深入了解 mcp-gateway:介绍能力系统、SHA-256 完整性固定,以及从 v2.5 到 v2.9 的开发历程。
本 README 中的定量说法均引自 docs/BENCHMARKS.md 和机器可读文件 benchmarks/public_claims.json,并通过 CI 检查确保数据未发生偏差。
Token 数量计算为何重要
你连接的每个 MCP 工具都会产生约 150 个 Token 的上下文开销。连接 20 个服务、共 100 个工具,第一条消息发出之前就已消耗约 15,000 个 Token,用在 AI 本轮可能不会用到的定义上。更糟的是,上下文限制会迫使你选择要连接哪些工具,因此 Agent 会做出较差的决策,因为无法获取所需数据。
| 不使用网关 | 使用网关 | |
|---|---|---|
| 上下文中的工具 | 每个定义、每个请求 | README 基准测试中有 11 个元工具(约 1,100 个 Token) |
| Schema 占用 | 约 15,000 个建模 Token(100 个工具) | 发现之前约 1,100 个建模 Token;不含已完成任务的成本 |
| 实测任务成本 | 在所有测试规模下,直接路径的成本都更低 | 元路径多用了 1.2–16.1% 的输入 Token,且多一轮 |
| 实际工具数量上限 | 上下文受限时为 20 到 50 个工具 | 不限,按需发现 |
| 连接新的 REST API | 构建一个 MCP 服务(数天) | 放入 YAML 文件或导入 OpenAPI 规范(数分钟) |
| 更改 MCP 配置 | 重启 AI 会话,丢失上下文 | 重启网关(约 8 毫秒),会话保持运行 |
| 某个工具出故障时 | 故障级联 | 熔断器将其隔离 |
网关至少会公开 9 个工具,在 README 基准场景中为 11 个(按管理员计算);无管理员权限的调用方看到的工具少 4 个。基础发现四件套保持固定。其他工具仅在可发挥作用时列出:支持它们的配置存在时,才会显示统计、成本报告、操作手册和配置文件控制;接入 Webhook 注册表时,才会显示 Webhook 状态,而 stdio 传输始终不会有此项。部署中若启用所有这些功能,则会提供 17 个工具。它只会在有用的地方占用上下文。
Code Mode:用两个工具取代元工具集
设置 code_mode.enabled: true 后,tools/list 会返回恰好两个工具:gateway_search 和 gateway_execute,而不是元工具集。其他所有功能都通过这两个工具调用。此模式下不会追加 meta_mcp.surfaced_tools 中指定的工具,因此无论连接了多少后端,工具数量都会保持为 2。Code Mode 默认关闭。gateway_search 默认返回 L0(工具名称、一行用途说明、分数)。传入 detail=l1 或 detail=l2 可查看更多信息,传入 explain=true 可查看排序诊断信息。include_schema=true 已弃用,会映射为 L2。
code_mode:
enabled: true
安全性
将 N 个 MCP 服务连接到一个 Agent,意味着要接受 N 个攻击面。工具投毒、Rug Pull,以及通过工具描述中的隐藏指令窃取数据,都是已被演示过的攻击,而非假设。Invariant Labs 的说明(MCP 安全通知:工具投毒攻击)和 Simon Willison 的总结(MCP 存在提示词注入安全问题)阐明了威胁模型。
mcp-gateway 将所有后端工具描述置于一个统一的审计界面之下,并通过结构性防护加以保护:
- 工具投毒验证器(AX-010)。 每个后端工具描述在进入 Agent 的上下文窗口前都会经过扫描。HIGH 模式采用默认拒绝策略:
<IMPORTANT>区块、~/.ssh/~/.aws/id_rsa/.env//etc/passwd、包含数据窃取措辞的sidenote、curl .* https?://,以及出现在数据窃取上下文中的base64。MEDIUM 模式会发出警告:连续 40 个以上的空格、零宽或双向覆盖 Unicode 字符,以及过长的描述。实现见:src/validator/rules/tool_poisoning.rs(19 个测试)。 - 可选的 SHA-256 能力哈希固定。
mcp-gateway cap pin <file>会基于文件的规范哈希写入一行sha256:(在任意 shell 中执行grep -v '^sha256:' capability.yaml | sha256sum即可复现)。未固定的文件仍可加载。已固定文件若校验不匹配,则在加载时以及每次监视器事件发生时都会采用默认拒绝策略。 - Rug Pull 检测。 已批准的能力文件在磁盘上的内容发生变化时,监视器会将其卸载并记录
RUG-PULL DETECTED。该能力会继续处于隔离状态,直到操作员重新固定其哈希。实现见:src/capability/hash.rs以及src/capability/backend.rs中的detect_rug_pulls。 - 统一的审计界面。 能力 YAML 是纯文本:可比较差异、可搜索,也可在 PR 中审查。Agent 只能看到精简的元界面,因此不会出现 N 个服务的工具列表造成的信息污染,也不会产生 N 个服务的攻击面。
完整演练、PoC 代码片段和路线图:docs/blog/security-aware-mcp-gateway.md。
- OWASP Agentic AI Top 10(自评)。 网关边界内的代码已针对全部 10 项 ASI 风险映射控制措施。这并非认证。SBOM、发布签名、实时远程证明发现、多网关签名、SQL 接收端默认设置以及串通检测等后续加固工作已单独跟踪。参见 docs/OWASP_AGENTIC_AI_COMPLIANCE.md。
最近新增
- OpenAPI 导入器。
mcp-gateway cap import <spec-url-or-file>可将 OpenAPI 3 规范转换为每个操作各自对应的一个经过验证的能力 YAML。完整的 Swagger Petstore 规范可端到端转换为 19 个经过验证的能力 YAML:mcp-gateway cap import https://petstore3.swagger.io/api/v3/openapi.json --output capabilities/ --prefix petstoresrc/capability/openapi.rs和tests/openapi_import_tests.rs中共包含 22 个测试。
架构
flowchart TB
subgraph GW["MCP Gateway (:39400)"]
META["Meta-MCP surface: 9-17 tools<br/>gateway_list_servers · gateway_list_tools<br/>gateway_search_tools · gateway_invoke"]
FS["Failsafes: circuit breaker · retry · rate limit"]
META --> FS
end
FS --> B1["Tavily<br/>(stdio)"]
FS --> B2["Context7<br/>(http)"]
FS --> B3["Pieces<br/>(sse)"]
FS --> B4["REST capabilities<br/>(110+)"]
单二进制网关。AI 客户端与精简的元界面交互,网关则动态发现后端工具并将请求路由到这些工具。主要模块:gateway/(核心路由器、OAuth、流式处理、UI)、provider/(MCP/复合/能力)、capability/(发现、验证)、transport/(HTTP、stdio)、security/(防火墙、mTLS、消息签名、Agent 身份、记忆扫描器)、identity_propagation/、key_server/、cost_accounting/、scheduler/、skills/、tool_profiles/、config_reload/ 和 a2a/(A2A 传输适配器)。
功能
Web 控制面板
嵌入式 Web 界面位于 /ui:实时状态、可搜索的工具、服务健康状况、只读控制平面视图和配置查看器。运维控制面板位于 /dashboard,需要管理员凭据——使用环回地址绑定时,serve 会打印一个一次性链接,供用户打开控制面板,因为浏览器无法在页面导航时附加 Authorization 标头。费用跟踪位于 /ui#costs。所有内容均由同一个二进制文件和端口提供,无需前端构建步骤。
安全与治理
| 功能 | 说明 | 文档 |
|---|---|---|
| 身份验证 | Bearer 令牌、API 密钥、显式管理员密钥、按客户端限速,以及可选择启用的按客户端熔断器。禁用身份验证时,通过 HTTP 发起的所有调用者均为匿名用户,不具备管理员权限;stdio 调用者则是管理员,因为是客户端启动了进程 | examples/per-client-tool-scopes.yaml |
| 跨站点防护 | 验证 Origin、Host 和 Sec-Fetch-Site,拒绝网页访问本地端口。客户端未发送 Origin 时,不会因此被拒绝;但 Host 检查适用于每个请求,因此无论请求来自浏览器与否,如果客户端使用网关未响应的名称访问网关,都会被拒绝 | docs/DEPLOYMENT.md |
| 终端用户身份传递 | 提供三种可配置策略(identity_propagation 配置):网关签名断言、客户端令牌直传和 RFC 8693 令牌交换。后端要求身份时,未满足条件则拒绝请求。按用户隔离缓存。在分发、Code Mode 和直接路由中强制执行。 | docs/adr/ADR-007-identity-propagation.md |
| 按用户隔离 OAuth | 默认拒绝访问(v3.0):需要按用户提供 OAuth 身份的后端,如果调用缺少该身份,就会拒绝调用,而不是使用共享存储的令牌。可选择恢复此前的共享凭据行为:使用 auth.single_user: true(个人网关),或使用 oauth.shared_account: true(指定后端)。从 2.x 升级时会备份 gateway.yaml 并打印一次性安全状态通知;不会自动更改配置。 | docs/adr/ADR-008-multi-user-oauth-isolation.md、docs/UPGRADING-3.0.md |
| 拒绝明文凭据 | 配置中包含凭据的后端——例如具有 oauth 配置段、身份传递、注入的密钥、任何名称的静态标头,或 URL 中包含用户信息或查询参数——如果通过纯 http:// 连接到本机以外的主机,会在配置加载时被拒绝,不会启动。环回地址不受此限制;可在该后端设置 allow_cleartext_credentials: true,以明确接受相关风险 | docs/REMOTE_BACKENDS.md |
| 按客户端限制工具范围 | 使用 glob 模式,按 API 密钥设置工具允许列表或拒绝列表 | examples/per-client-tool-scopes.yaml |
| 安全防火墙 | 凭据脱敏、提示词注入检测,以及 Shell/SQL/路径遍历扫描 | CHANGELOG |
| 费用治理 | 按工具、密钥设置每日预算,并配置提醒阈值(记录/通知/阻止) | CHANGELOG |
| 会话沙箱 | 按会话设置调用次数限制、时长上限和后端限制 | CHANGELOG |
| mTLS | 通过证书验证工具执行权限 | CHANGELOG |
集成与发现
网关内置了 110 多项功能:天气、维基百科、GitHub、股票报价、包裹追踪等。Capability YAML 文件更改后会自动热重载,无需重启。
| 功能 | 说明 |
|---|---|
| 功能系统 | 通过 YAML 将 REST API 转换为 MCP 工具。支持热重载。内置 110 多项功能。支持导入 OpenAPI。 |
| 转换链 | 命名空间、筛选、重命名和响应转换。示例。 |
| Webhook | 将 GitHub/Linear/Stripe 推送事件作为 MCP 通知。文档。 |
| 自动发现 | 从现有客户端配置和正在运行的进程中发现 MCP 服务。 |
| 置顶工具 | 将高价值工具直接置顶到 tools/list 中,实现一步调用。 |
| 语义搜索 | 基于 TF-IDF 对所有工具名称和描述进行排名搜索。 |
| 工具配置文件 | 记录每个工具的使用分析数据:延迟、错误和趋势。持久化到磁盘。 |
| 配置导出 | 通过 mcp-gateway config export 将脱敏配置导出为 YAML 或 JSON。 |
协议与传输
- MCP 版本:
initialize握手协商的最高版本为 2025-11-25。较新的 2026-07-28 修订版仅可通过无状态POST /mcp路径和MCP-Protocol-Version标头使用;默认启用,可通过server.modern_protocol: false关闭 - 传输方式:stdio、Streamable HTTP、SSE、WebSocket
- 热重载:监视并实时重新加载 capability YAML 文件和后端。每次请求都会重新读取
server.public_url和control_plane.role_mapping;其他配置均需重启 - 重载结果:对于重载无法应用的每个字段,
gateway_reload_config和/ui/api/reload都会报告restart_required,并持续报告该状态,直到重启——也就是说,除上述少数可实时应用的配置外的所有字段(包括auth)。如果重载会导致工具端点在没有凭据的情况下仍可访问,则会拒绝该重载,而不是应用它 - 配置发现:自动在当前工作目录、
~/.config/mcp-gateway/和/etc/mcp-gateway/中查找gateway.yaml - “你是不是想找?”:基于 Levenshtein 距离对工具名称进行拼写纠正
- 工具注解:MCP 2025-11-25 的
title、readOnlyHint、destructiveHint、idempotentHint、openWorldHint;网关元工具均带有完整注解,而后端工具则采用 ADR-003 中的混合透传/补全策略 - 动态描述:元工具描述中包含实时工具和服务数量
- 隧道模式:通过 Tailscale 或 pipenet 暴露服务,无需开放端口
- Shell 补全:
mcp-gateway completions bash|zsh|fish - 规范预览(可选启用):筛选后的
tools/list(SEP-1821)、tools/resolve(SEP-1862)、动态提升
支持的后端
任何符合 MCP 规范的服务都可使用。支持全部三种传输类型:
| 传输方式 | 示例 |
|---|---|
| stdio | @anthropic/mcp-server-tavily、@modelcontextprotocol/server-filesystem、@modelcontextprotocol/server-github |
| HTTP | 任何 Streamable HTTP 服务 |
| SSE | Pieces、LangChain、GitMCP(免费远程文档和代码搜索,适用于任何 GitHub 仓库) |
通过 URL 即可接入远程 MCP 服务,无需额外代码。请参阅 examples/gateway-full.yaml 中带注释的 GitMCP 后端条目,以及 docs/REMOTE_BACKENDS.md 中的分步指南。
公共 MCP 网关对比
此表比较的是面向用户的公开行为,而非内部路线图评分。MCP Gateway 的条目依据本仓库的公开文档:快速入门、部署、OWASP 控制措施、TrustCard/CBOM、CatalogTrustLab、自适应排序、身份授权、ADR-007 身份传播、ADR-008 多用户 OAuth 隔离。竞品条目依据其公开项目文档:Docker MCP Catalog and Toolkit、MCPJungle README、mcpo README 和 Supergateway README。
| 维度 | MCP Gateway | Docker MCP Gateway / Toolkit | MCPJungle | mcpo / Supergateway |
|---|---|---|---|---|
| 主要用途 | MCP 和 REST 能力路由器,提供精简的元信息界面 | 由 Docker 管理的目录、配置文件、容器化 MCP 服务和网关 | 可自托管的网关,在一个端点后运行多个 MCP 服务 | 协议桥接:mcpo 将 MCP 转换为 OpenAPI;Supergateway 将 stdio 转换为 SSE/WS |
| 安装 | 通过 cargo、Homebrew、VS Code、Cursor 和本地构建安装独立 Rust 二进制文件 | Docker Desktop / Docker CLI 插件流程 | 安装可自托管网关并注册服务 | mcpo 使用 Python/uvx/Docker;Supergateway 使用 npm/CLI 桥接 |
| 配置 | 向导、本地入门配置文件、服务模板、客户端导出、doctor JSON、备份和回滚 | Docker 配置文件和目录选择 | 集中式服务和客户端配置 | 为每个公开的服务或传输单独配置桥接命令/配置 |
| 安全 | OWASP Agentic AI 矩阵、防火墙、响应检查、哈希固定的能力、mTLS/签名选项 | Docker 目录中的已验证容器映像,提供版本管理、来源信息和安全更新 | 集中式访问控制和可观测性 | 传输/API 公开层;安全性取决于桥接身份验证和部署边界 |
| 身份与授权 | 本地身份授权协议和 CLI;默认与凭据无关的多用户 OAuth 隔离(ADR-008),且配置为 required 的后端会 fail closed,而不会提供共享凭据;通过已签名断言、调用方令牌直通或 RFC 8693 令牌交换,将每个用户的身份传播到后端;OIDC 密钥服务器默认禁用,接受委托持有者令牌需单独选择启用,控制平面角色映射限定在发行方范围内 | Docker 团队控制取决于 Docker 组织设置 | 已通过身份验证的客户端和服务访问控制 | 并非授权引擎;将身份策略交由外围部署处理 |
| 运行时隔离 | RuntimeProvider 策略规划,以及 Docker/Podman/Kubernetes 部署路径 | 以容器为先的隔离是核心运行时模型 | 在网关后运行和管理 MCP 服务 | 桥接现有服务进程/传输,而非隔离任意工具 |
| 信任元数据 | TrustCard/CBOM 生成、验证、TrustLab 证据、来源信息存根 | 目录包包含映像来源信息和安全更新流程 | 侧重网关清单和可观测性 | 协议元数据桥接;信任元数据并非主要产品界面 |
| 发现 | Meta-MCP 列表/搜索、ShadowRadar 未托管服务清单、能力注册表 | Docker MCP Catalog 中的打包服务 | 对已配置服务进行集中式发现 | 一次公开一个桥接服务界面,除非在外部组合使用 |
| 策略与治理 | 策略、授权、审计事件、只读控制平面选项卡/API、企业证据边界 | Docker 组织/目录/配置文件策略模型 | 面向团队的集中式访问控制 | 没有广泛的治理平面;需要时可与其他策略层配合使用 |
| 导入与桥接 | 原生 MCP 后端,以及 REST 能力 YAML 和协议导入规划 | Docker 打包的 MCP 服务目录 | MCP 服务聚合 | 提供完善的 OpenAPI、SSE、WebSocket 和 stdio 兼容桥接 |
| 排名与路由 | 考虑安全性的排名、说明、成本/延迟/信任/运行状况信号 | 目录/配置文件选择,不是 MCP 工具排名器 | 路由到已配置服务的网关级路由 | 传输路由,不进行语义工具排名 |
| 部署 | 本地、团队网关、Docker Compose、systemd、launchd、经过安全加固的 Helm 图表(非 root、seccomp、只读 rootfs)和实验性 (v1alpha1) Kubernetes CRD | Docker Desktop、Docker CLI、Docker Hub/目录工作流 | 本地或共享的可自托管网关 | 在目标 MCP 服务旁运行本地或远程桥接进程 |
| 许可 | 全程采用 PolyForm Noncommercial 1.0.0;商业用途需获取许可 | 适用 Docker 产品和仓库许可条款 | 参见项目仓库许可 | 参见各桥接仓库的许可 |
与 Anthropic MCP tunnels 的比较
2026-05-19,Anthropic 发布了 Claude Managed Agents,支持可自托管的沙箱(公开测试版)和 MCP tunnels(研究预览版)。MCP 隧道可让 Claude Agent 通过轻量级网关发起的一条出站连接,访问私有网络中的单个 MCP 服务,无需配置入站防火墙规则、公开端点,并提供端到端加密。
mcp-gateway 和 Anthropic 的 MCP 隧道处于不同层,可组合使用。隧道负责连接私有 MCP 服务。mcp-gateway 则负责聚合、路由、能力命名空间管理和可观测性,覆盖多个 MCP 和 REST 后端。两者同时部署时,mcp-gateway 就成为隧道公开的私有 MCP 服务:一条隧道、一条出站连接,即可访问其后的所有后端。
| 关注点 | Anthropic MCP 隧道 | mcp-gateway | 区别 |
|---|---|---|---|
| 后端拓扑 | 每条隧道对应一个 MCP 服务,通过一条出站连接公开(概览) | 聚合 N 个后端:110 多项 REST 能力,以及多个 MCP 后端,统一呈现为精简的 9–17 个工具元界面(src/gateway/、capabilities/*.yaml) | 基础能力不同:连接单个服务 vs 聚合多个后端 |
| 工具路由 | 透明透传;Agent 可看到隧道服务发布的所有工具 | 能力命名空间管理,以及通过 gateway_search_tools / gateway_invoke 动态发现(src/gateway/);按能力进行 SHA-256 固定(src/capability/hash.rs) | 所处层级不同:传输连接 vs 工具界面管理与完整性 |
| 可观测性 | Anthropic 侧提供每条隧道的会话遥测 | 通过统一的 trace_id 和成本核算追踪所有后端调用(src/cost_accounting/、src/gateway/) | 范围不同:单条隧道会话 vs 跨后端追踪关联 |
它们解决的是相邻的问题。如果团队希望 Claude Managed Agents 能访问部署在私有网络中的 mcp-gateway,就可以用隧道建立连接,并用 mcp-gateway 处理扇出、能力规范、OWASP Agentic AI 控制,以及统一的成本和追踪遥测。
API
| 端点 | 方法 | 说明 |
|---|---|---|
/health | GET | 健康检查并显示后端状态;通过身份验证的管理员调用者还可查看各后端运行时配置文件的生命周期状态 |
/mcp | POST | Meta-MCP 模式(动态发现) |
/mcp/{backend} | POST | 直接访问后端 |
/ui | GET | Web 仪表板 |
/ui/api/control-plane | GET | 只读的本地控制平面视图,用于查看清单、运行时健康状态、决策、RBAC 和许可证边界 |
/dashboard | GET | 运维仪表板。仅限管理员;通过回环地址绑定启动时,使用 serve 输出的一次性链接打开 |
/metrics | GET | Prometheus 指标(需启用 --features metrics) |
性能
| 指标 | 数值 | 备注 |
|---|---|---|
| 启动时间 | 约 8ms | 使用 hyperfine 测量(基准测试) |
| 二进制文件大小 | 约 12–13 MB | 启用 LTO 并剥离符号的发布构建 |
| 热路径微基准测试 | 已包含 | Criterion 测试套件覆盖注册表、解析、缓存键、防火墙和语义搜索热路径 |
| 端到端延迟 | 取决于后端 | 请使用实际 MCP 服务和 REST API 测量,而不要依赖单一的合成指标 |
SKILL.md / agentskills.io 兼容性
MCP Gateway 可以导入 Agent Skills 和 Claude Code 的 SKILL.md 文件,并将其作为可发现的技能,与能力 YAML 一同提供。这样,网关便能使用任何 SKILL.md,无论该文件是在本地编写、由 agentskills.io 提供,还是从 GitHub 发布版本获取,并通过与能力相同的元工具界面将其呈现出来。
# Import a local skill directory (auto-discovers SKILL.md + resources/)
mcp-gateway skills import ./skills/my-skill
# Import a single SKILL.md file
mcp-gateway skills import ./path/to/SKILL.md
# Import from an agentskills.io URL
mcp-gateway skills import https://agentskills.io/skills/my-skill/SKILL.md
# List imported skills
mcp-gateway skills list
# Search by name, description, trigger, or keyword
mcp-gateway skills search "gmail"
# Show the full body (including any embedded code blocks)
mcp-gateway skills show gws-gmail-send
# Remove a skill
mcp-gateway skills remove gws-gmail-send
解析内容
- YAML frontmatter(
name、description、version、effort、allowed-tools、triggers、keywords) - Markdown 正文,其中带围栏的
bash/python/json代码块会提取为结构化的SkillCodeBlock条目 - 渐进式披露资源:
SKILL.advanced.md、reference.md、README.md,以及技能目录中的所有resources/*.md文件
安全模型(只读)
导入的技能会作为数据存储,不会执行。嵌入的 bash 或 python 代码块会被解析,并通过 skills show 呈现给用户和 Agent,但 MCP Gateway 绝不会自动运行这些代码。未来版本可能会添加可选执行功能,并要求用户针对每项技能单独授权。目前如需运行技能命令,请从 skills show 中复制这些命令,并在自己的 shell 中运行。
注册表位置:~/.mcp-gateway/skills.json(可通过 MCP_GATEWAY_SKILLS_REGISTRY 或 --registry 覆盖)。
参考:Anthropic SKILL.md 规范 和 agentskills.io。
文档
| 文档 | 内容 |
|---|---|
| 快速入门 | 2 分钟内从零开始运行 |
| 带注释的配置示例 | 涵盖最常用配置部分的 gateway.yaml 注释示例 |
| OAuth 配置 | OAuth 2.0 设置,包含 Slack 和 Figma 示例 |
| 升级到 4.0 | 按发行方隔离 OAuth 存储、严格解析 env_files、协议最低版本,以及单许可证变更 |
| 升级到 3.0 | 按用户隔离 OAuth,以及身份传播升级路径 |
| 部署指南 | Docker、systemd、TLS/mTLS、扩展 |
| 多用户设置 | 密钥服务、策略范围、按后端传播身份 |
| OpenAPI 导入 | 从 OpenAPI 规范生成能力 |
| Webhooks | 事件集成设置 |
| 社区注册表 | 分享和安装能力 |
| 基准测试 | 性能测量 |
| 更新日志 | 发布历史 |
| OWASP Agentic AI 合规性 | 风险覆盖矩阵 |
| ShadowRadar | 被动本地发现和静态网络规则导出 |
| 与 Anthropic MCP 隧道对比 | mcp-gateway 与 Anthropic 的 MCP 隧道如何组合使用 |
故障排查
后端无法连接? 直接测试命令(npx -y @anthropic/mcp-server-tavily),然后使用 --log-level debug 检查网关日志。
熔断器已打开? 向 MCP 客户端请求 gateway_list_servers:它会报告每个后端的 circuit_breaker 状态,并且适用于随附的配置。对应的 HTTP 请求 curl -H "Authorization: Bearer $ADMIN_KEY" localhost:39400/health | jq '.backends' 还需要设置 auth.enabled: true 并提供管理员凭据——默认情况下身份验证处于关闭状态;关闭时,所有调用方都是匿名用户,因此令牌会被忽略,即使请求携带了 bearer 令牌,也只能看到 {count, all_healthy}。可在 failsafe.circuit_breaker 中调整阈值(默认值:连续失败 5 次后打开,30s 后重试)。
某个工具停止响应,约五分钟后又自动恢复? 这是按能力划分的错误预算,而不是熔断器——两者是独立机制,使用不同的键。当某项能力的失败率超过 error_budget.capability.threshold 时,它会单独被禁用,其余后端功能仍可继续提供服务;error_budget.capability.cooldown(默认 5 分钟)经过后,它会在下一次调用时自动重新启用。
gateway_list_disabled_capabilities 会列出当前暂停的能力。
整个后端离线后一直没有恢复? 后端级错误预算自动将其停用:其失败率在滑动窗口内超过了 error_budget.threshold。与能力不同,被停用的后端不会自动恢复——使用 gateway_revive_server 将其恢复;如果停用过早,可提高阈值或延长窗口。gateway_list_servers 会将已停用的后端报告为 "status": "disabled",据此可将自动停用与熔断器打开区分开来。
examples/gateway-full.yaml 中 error_budget: 下方的注释详细说明了这两种预算的所有键。限流响应(429、RESOURCE_EXHAUSTED)不会计入这两种预算:受到限流的后端仍在正常工作,因此仅限流不会导致后端停用或能力被禁用。
工具未显示? 确认后端正在运行(gateway_list_servers)。工具列表会缓存 5 分钟。
版本管理与稳定性
本项目对其产品接口遵循语义化版本规范:包括 CLI 和配置文件格式。两者的变更都会相应地调整版本号——不再接受某个配置键,或某条命令的行为发生变化,都属于破坏性变更。
Rust 库 API 不属于该接口。 类型设为 pub 是为了模块化和测试,并非为了提供受支持的嵌入式 API;它们可能在任何版本中发生变化。该 crate 发布的是一个二进制文件;截至本文撰写时,crates.io 显示其反向依赖数为零。如果将该库嵌入其他项目,请固定使用确切版本(=4.0.0),而不要使用插入符范围。
特此明确说明,因为“移除一个 pub 字段”和“破坏受支持的 API”只有在该 API 受支持时才是一回事。这里并非如此,因此需要明确说明,而不能想当然。
贡献
- Fork 并创建分支(
git checkout -b feature/your-feature) - 测试(
cargo test)并执行 lint 检查(cargo fmt && cargo clippy -- -D warnings) - 向
main提交 PR,附上清晰的说明和一条 CHANGELOG 记录
完整详情请参阅 CONTRIBUTING.md。可以从 good first issue 或 help wanted 开始。
生态系统
mcp-gateway 是一套 MCP 工具的一部分:
| 工具 | 描述 |
|---|---|
| mcp-gateway | 通用 MCP 网关:精简的 9-17 个工具接口取代 100 多项注册 |
| trvl | AI 旅行 Agent,提供 36 个用于航班、酒店和地面交通的 MCP 工具 |
| nab | 网页内容提取:可通过 Cookie 和反机器人绕过机制抓取任意 URL |
| axterminator | macOS GUI 自动化,通过 Accessibility API 提供 34 个 MCP 工具 |
许可证
mcp-gateway 采用 PolyForm Noncommercial License 1.0.0
(LICENSE-NONCOMMERCIAL) 许可。每个第一方文件都包含
版权声明和明确的
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 标头。没有
其他许可证,也没有许可名单。
这意味着:
- 个人和非商业用途免费,包括运行整个网关。
- 商业运行网关需要商业许可证。 这涵盖整个项目——分发、传输、后端管理、身份、 安全、治理——包括早期 3.x 版本曾以 MIT 标头发布的通用构建模块。请参阅 COMMERCIAL.md。
- 不会撤销早期版本授予的权利。3.0.0–3.2.1 版本以 MIT 软件包元数据发布,3.x 系列中的 v3.3.0 及后续版本则发布了一个采用逐文件标头的精简 MIT 核心。这些副本对其接收者仍采用 MIT 许可;从 v4.0.0 起,不再有 MIT 核心。请参阅 NOTICE.md。
完整模式:LICENSES.md。
致谢
由 Mikko Parkkola 创建。实现了 Model Context Protocol 的 2025-11-25 和 2026-07-28 版本;默认提供较新的版本,也可以将其关闭。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。