mcp-gatehouse 是一个针对 MCP(Model Context Protocol)服务器的权限、审批和审计库,构建在官方 Python SDK 之上,所有强制措施都在服务器内部、工具边界处执行。它旨在解决大多数 MCP 服务器将全部工具以完整权限交给模型且不保留操作记录的问题,适用于代理需要写入 CRM、账本或订单系统等生产环境。
主要能力
- 权限分级(Permission tiers):定义 AI 可以读取、写入以及禁止的操作级别。
- 审批门控(Approval gates):在默认策略下,破坏性操作需要审批;审批器可以是任意同步或异步可调用对象,接收 ApprovalRequest 并返回 True 允许。同步审批器在工作线程中运行,不会阻塞其他调用。
- 审计日志(Audit logging):记录所有操作,包括拒绝和错误。日志默认输出到 --audit-log 指定路径,否则使用 $MCP_GATEHOUSE_AUDIT_LOG,否则 ./audit.jsonl;当工作目录不可写时回退到 ~/.mcp-gatehouse/audit.jsonl。服务器会将选择的路径打印到 stderr。
- 敏感信息脱敏:无法拆解的敏感参数值(如任意对象、字节)会被替换为不透明占位符;异常消息不会进入日志,只记录异常类型,因为错误文本可能嵌入已脱敏的值。
- 失败关闭(Fail closed):安全默认设计为拒绝而非允许。例如,无终端时审批器拒绝
- 终端审批器(terminal_approver):在控制终端 /dev/tty 上提示,而不是 stdin,因为 stdio 传输中 stdin 是协议管道。审批器抛出异常时,调用被拒绝并记录失败。
使用方式
集成方式与官方 SDK 文档一致,只是通过 gatehouse 注册工具。Schema 生成(包括 Annotated[..., Field(description=...)] 参数文档)、传输方式等保持不变——守卫保留函数签名。同步工具仍在工作线程中运行。示例:构建 MCPServer 后,用 gatehouse 注册工具。默认策略下,DESTRUCTIVE 需要审批,所有操作审计。可以通过一行代码启用写入审批,并添加自己的敏感键而不丢失默认值。
该包附带一个可运行的订单桌面服务器,其中三个层级都已接入,并有一个终端提示审批器。可以将其添加到任何支持 stdio 的 MCP 客户端,例如在 Claude Desktop 的 claude_desktop_config.json 中配置。或者在 pip install mcp-gatehouse 后运行 mcp-gatehouse-demo。让模型列出订单并取消一个,然后观察裁决结果进入审计日志。
适用场景
- 需要为 AI 代理提供写入权限但又需要控制的生产系统。
- 没有平台团队的小型组织(例如 40 人的工厂),只需少量类和 JSONL 文件即可实现权限与审计。
- 希望在不引入代理或外部策略服务的情况下,在服务器内部实现安全门控的场景。
限制
- 不是认证、传输加密或沙箱。它是服务器内部的门,不是外围防护。详见 SECURITY.md。
- 阻塞式终端审批器与 stdio 传输不兼容,因为 stdout/stdin 是协议管道。terminal_approver 在 /dev/tty 上提示,无终端时拒绝。真实部署应通过带外方式审批:Slack、工单、队列。
- 目标平台为官方 mcp Python SDK v2.x(mcp>=2,<3)和 Python 3.10–3.14。附带类型信息(py.typed)。
- 公共 API(Gatehouse, Policy, AuditLog, AccessTier)在该行中保持不变。从 v1 服务器移植只需两处导入编辑:FastMCP 变为 MCPServer 并移至 mcp.server.mcpserver;参见 SDK 的迁移指南。
- 继续使用 SDK v1 无需操作:0.1.x 固定 mcp<2,因此 pip 仍会解析它。该行已关闭新功能,但仍获得安全修复。
其他信息
作者 Nick George 在一家中型逆向物流技术公司设计和运行生产环境 MCP 服务器,并为企业在 nickgeorgeai.com 构建此类服务器。该库是从这些构建中提取的权限与审计纪律。如果所有者或操作者想知道 MCP 是什么,可以从平易近人的指南《What is an MCP server?》开始。