MCP Hangar 是 Model Context Protocol(MCP)服务器集群的策略执行平面,定位在调用路径这一唯一可实时中介的接缝上,为整个 MCP 服务器集群提供统一的生命周期、策略与遥测通道。项目使用 Python 编写,自托管,MIT 许可,不提供 SaaS 版本。
用途与背景
在 MCP 中,工具列表是客户端缓存的提示,调用路径才是提供商实时中介的唯一表面。撤消、按租户作用域、审计等治理原语都附着于此。Hangar 在调用路径上实施确定性策略,所生成的结果可由产生它的策略复现,不做异常评分,也不依赖学习基线。
主要能力
- L7 出站策略:按 MCP 语义进行允许/拒绝,可指定哪个上游、哪个工具、哪些参数,确定性强、可复现。
- 工具 schema 摘要固定:上游若改变已固定工具的 schema,则故障关闭(fail closed),而非静默提供不同工具。可通过 tool_projection.pins 为每个调用方固定,或按租户固定(需认证)。
- 认证与 RBAC:支持 API 密钥与 OIDC/JWT 身份、基于角色的访问,以及 RFC 8707 受众绑定;可用 mcp-hangar auth bootstrap-admin 引导首个管理员,每次调用都携带已验证主体进入审计记录。
- 按租户工具投影:前门模式为每个调用方呈现不同的可执行表面,未知身份则故障关闭。
- 人机协同审批:将调用门控于明确的决定,经授权并归属到真实主体;交付渠道可插拔,核心不包含厂商集成。
- 受治理的任务中继:Hangar 介入 SEP-2663 任务生命周期,但自身不会成为执行器,不含调度器、作业运行器或结果存储。
- 可归属审计:身份归属的审计记录可导出为 CEF、LEEF 2.0、RFC 5424 syslog 或 JSON-lines,并支持 OTLP。
- 集群运行支撑:并行工具调用(一次 hangar_call 并发扇出到多个 MCP 服务器并统一返回结果);生命周期管理(惰性启动、健康检查、单飞冷启动、空闲关闭、按服务器熔断);热配置重载(通过文件监视增删服务器与工具,无需重启);OAuth 入口(作为 RFC 9728 受保护资源发布,对外部代理质询已验证令牌);内置可观测性(OpenTelemetry 追踪、Prometheus 指标、结构化日志)。
使用方式
可用安装器安装,路径为 ~/.mcp-hangar/bin/mcp-hangar。执行 init 会检测 MCP 客户端(Claude Code、Cursor、Claude Desktop),写入配置,逐个启动服务器验证可用性,并在运行期间为每个工具记录摘要固定;重启客户端后,客户端中会出现一个与既有 MCP 服务器并列的 mcp-hangar 服务器。已有条目保持不变,服务器一旦被列入 init 所写配置中的 mcp_servers 下,即处于 Hangar 之后。
手动配置时,在 stdio 传输下,生成 Hangar 的进程即信任边界,没有凭证通道,因此由 auth.stdio.principal 声明调用方(ADR-026);在 HTTP 下则无默认声明,Hangar 拒绝在无认证时绑定非回环接口。快速演示可传 --unsafe-no-auth;正式使用应配置 auth 块。演示配置文件为 demo.yaml,可通过替换配置中的 mcp-hangar 条目指向它;演示上游位于 examples/rugpull/,完整演练见 quickstart。
摘要固定检查:mcp-hangar pin --check 会打印两个摘要并以退出码 1 退出,适合放入 CI 或 pre-commit 钩子;--write 可在确认变更后采纳。
配置注意:每个服务器的 tools: 键接受两种形式,外观相似但含义相反。列表形式仅允许在提供者启动前列出工具,它不是访问策略,且无法在启动后存活——提供者的动态 tools/list 具有权威性并完全替换它,因此静态列出但提供者不返回的工具将不可调用,并在调用时以 Tool not found: <name> 失败。字典形式才是访问策略,支持 glob 模式与三级合并。完整语义见配置参考。
适用场景
适用于需要为 MCP 服务器集群建立确定性治理、可归属审计与合规导出、按租户隔离工具访问、对高风险工具变更进行摘要固定、以及在 CI 中校验工具 schema 变化的组织。
限制与说明
仅自托管,无 SaaS 版本;核心不含厂商审批集成;人机审批交付渠道需自行插拔;运行环境为 Python;使用前应完成认证配置,否则 HTTP 绑定时会被拒绝。发布日期、具体价格、性能指标与兼容版本矩阵的细节请参阅官方文档与发布兼容性矩阵。项目已发布在官方 MCP Registry(io.mcp-hangar/hangar),该条目描述的是通过 stdio 启动的 PyPI 包,而非托管实例。名称与徽标不适用 MIT 许可,采用 CC BY-ND 4.0,可原样再分发但不得修改或用于命名/品牌化分支或衍生品。