Sushank05/mcp-doorman

GitHub: Sushank05/mcp-doorman

mcp-doorman 是一个部署在 MCP 客户端与服务器之间的轻量级安全代理网关,为个人开发者提供工具调用策略管控、密钥脱敏、注入检测和审计日志等防护能力。

Stars: 0 | Forks: 0

# mcp-doorman **MCP 服务器的安全网关 —— 每一次工具调用都会在门口接受检查。** [CI](https://github.com/YOUR_GITHUB_USERNAME/mcp-doorman/actions/workflows/ci.yml) [npm](https://www.npmjs.com/package/mcp-doorman) [许可证:Apache-2.0](LICENSE) [欢迎 PR](CONTRIBUTING.md) `mcp-doorman` 是一个直接插入的代理,位于您的 AI 代理(Claude Desktop、Claude Code、Cursor、VS Code,任何 MCP 客户端)和它使用的 MCP 服务器之间。只需一条命令,零基础设施,每个 `tools/list` 和 `tools/call` 都会通过一个防护 pipeline: - 🛂 **策略引擎** —— 支持基于 glob 匹配的、针对每个工具的 allow / deny / require-approval(允许 / 拒绝 / 需审批)规则 - 🕵️ **密钥脱敏** —— AWS key、GitHub/Slack/Stripe/OpenAI/Anthropic token、私钥、JWT、银行卡(经 Luhn 算法校验)……在到达模型*之前*,这些敏感信息就会从工具结果中被清除 - 💉 **Prompt 注入筛查** —— 标记或拦截那些试图指令模型的工具结果(以及工具*描述* —— 即工具投毒) - 📌 **Rug-pull 检测** —— 工具定义在首次使用时会被哈希锁定;如果服务器静默替换了描述,该工具将被拦截,直到人工重新锁定 - 🚦 **速率限制** —— 针对每个工具的 token bucket(令牌桶)限制了失控代理循环的影响范围 - 🙋 **人工审批网关** —— 敏感工具会通过 [MCP elicitation](https://modelcontextprotocol.io/specification/draft/client/elicitation) 在您的客户端中直接触发交互式审批提示 - 🧾 **审计日志** —— 每次调用、拒绝、脱敏和标记都会记录在一个只追加的 JSONL 文件中 ## 为什么会有这个项目 每个人都离交出自己未经审查的进程 API key 以及直通模型上下文窗口的通道仅一步之遥:只要执行一次 `npx some-random-mcp-server`。已记录的攻击类型是真实的,而非假设性的: | 攻击 | 原理 | | ----------------------------- | ----------------------------------------------------------------------------------------------------- | | **工具投毒 (Tool poisoning)** | 恶意指令隐藏在工具的*描述*中,在大多数客户端 UI 中不可见 | | **Rug pull (诱饵替换)** | 服务器在第 1 天提供无害的工具,在您批准后将它们的定义替换掉 | | **间接 Prompt 注入** | 由*合法*工具获取的网页/工单/电子邮件中带有旨在影响模型的指令 | | **密钥泄露** | 一个工具结果中泄露的凭据 + 一条注入的指令 = 您的密钥被发送到了其他人的服务器上 | | **失控循环** | 困惑或被劫持的代理进行批量删除、批量发送邮件、批量抓取操作 | 面向拥有 Kubernetes 集群的平台团队,企业级 MCP 网关已经存在。**但没有任何轻量级的工具来保护个人开发者的笔记本电脑 —— 而这恰恰是 99% 的 MCP 服务器实际运行的地方。** 这正是本项目要填补的空白。 ## 快速开始(60 秒) ``` # 1. 创建一个 config npx -y mcp-doorman init # 2. 编辑 doorman.config.json — 在其中放入你的真实服务器 # 3. 固定当前的 tool 定义(首次使用即信任) npx -y mcp-doorman pin --config doorman.config.json ``` 然后将您的客户端指向网关,而**不是**直接指向您的服务器。Claude Desktop / Claude Code / Cursor: ``` // BEFORE — every server talks straight to the model { "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] }, "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/repos"] } } } // AFTER — one doorman guards them all { "mcpServers": { "doorman": { "command": "npx", "args": ["-y", "mcp-doorman", "run", "--config", "/absolute/path/to/doorman.config.json"] } } } ``` 工具会以命名空间的形式显示,例如 `github__create_issue`、`filesystem__read_file` 等,此外还有两个内置工具:`doorman__status` 和 `doorman__recent_events`(您可以问您的代理:*“doorman 最近拦截了什么?”*)。 ## 查看运行效果 ``` git clone https://github.com/Sushank05/mcp-doorman && cd mcp-doorman npm install npm run demo ``` 该演示将网关连接到了一个故意行为不端的服务器([examples/demo-server.mjs](examples/demo-server.mjs)),该服务器会泄露虚假凭据、提供 Prompt 注入 payload,并提供一个破坏性工具 —— 展示了每个防护环节如何捕获它。 ## 工作原理 ``` flowchart LR A["MCP client\n(Claude Desktop, Cursor, ...)"] -- stdio --> D subgraph D [mcp-doorman] direction TB P[policy] --> R[rate limit] --> AP[approval] --> RD[redaction] --> I[injection scan] --> AU[(audit log)] end D -- stdio --> S1[github server] D -- stdio --> S2[filesystem server] D -- streamable HTTP --> S3[remote server] ``` 该网关对于您的客户端来说是一个 MCP **服务器**,而对于每个上游(stdio 子进程或 streamable-HTTP endpoint)来说则是一个 MCP **客户端**,并将它们聚合在一个连接之后。它基于官方的 [TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) 构建。 ## 配置 所有配置都存放在一个 JSON 文件中。包含所有选项的完整示例: ``` { "servers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } // ${VAR} = read from gateway env }, "remote": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${MCP_TOKEN}" } } }, "policy": { "defaultAction": "allow", // "allow" | "deny" | "approve" "rules": [ // first match wins, evaluated top-down { "match": "*__delete*", "action": "deny", "reason": "no destructive tools" }, { "match": ["github__create_*", "*__send_*"], "action": "approve" }, { "match": "filesystem__*", "action": "allow" } ] }, "redaction": { "enabled": true, "disable": [], // built-in rule names to turn off "enableOptIn": ["email"], // opt-ins: "email", "us-ssn", "ipv4" "custom": [{ "name": "acme-id", "pattern": "ACME-[0-9]{6}" }], "redactArguments": false // also scrub model-supplied arguments }, "injection": { "action": "flag", // "flag" (warn the model) | "block" | "off" "scanToolDescriptions": true, // tool-poisoning check on tools/list "custom": [] }, "pinning": { "enabled": true, "onNewTool": "pin", // "pin" (TOFU) | "block" (until `mcp-doorman pin`) "onChangedTool": "block" // "block" | "warn" }, "rateLimit": { "perMinute": 120, "perTool": { "*__send_*": 5 } }, "approval": { "fallback": "deny", "timeoutMs": 120000 }, // fallback when client lacks elicitation "audit": { "enabled": true, "includeArguments": true, "includeResults": false }, "logLevel": "info" } ``` 锁定状态和审计日志默认存放在配置文件旁边的 `.pins.json` / `.audit.jsonl` 中。 ### CLI | 命令 | 作用 | | --------------------------------- | ---------------------------------------------------------------------- | | `mcp-doorman run --config ` | 通过 stdio 启动网关(默认命令) | | `mcp-doorman pin --config ` | 连接到所有上游并锁定(信任)它们当前的工具定义 | | `mcp-doorman init` | 写入一个带有合理默认值的初始配置 | ## 诚实的局限性 夸大其词的安全工具比没有还糟糕。请阅读本部分。 - **启发式方法是可以被绕过的。** 注入模式可捕获已记录的、常见的攻击形式。有动机的攻击者可以转换措辞绕过任何正则表达式。请使用 `deny`/`approve` 策略作为硬性边界;筛查只是纵深防御。 - **脱敏是尽力而为的。** 已知的 token 格式可以被可靠捕获;而没有上下文的随机十六进制密钥则不行。不要将代理指向凭据存储区。 - **这不是一个沙盒。** 上游服务器仍然以您用户的特权作为子进程运行。Doorman 保护的是*协议*;请将其与容器(例如 [ToolHive](https://github.com/stacklok/toolhive) 风格)结合使用,以保护*进程*。 - **TOFU(信任优先)只认首次所见。** 锁定检测的是*更改*,而不是从第一天起就存在恶意的工具 —— 这是描述扫描器和您自己审查的工作。 - **审批网关需要 elicitation(交互请求)。** 不支持 elicitation 的客户端将回退到 `approval.fallback`(默认拒绝)。 ## 路线图 — 请求帮助 🙌 - [ ] `resources/*` 和 `prompts/*` 代理(目前仅支持工具) - [ ] 透传 sampling 和 roots - [ ] 社区规则包(`doorman-rules-finance`、`doorman-rules-healthcare`……) - [ ] 学习模式:观察一周,提出最小权限策略 - [ ] OPA / Cedar 策略后端 - [ ] `mcp-doorman audit` 子命令:美观地打印和查询 JSONL 日志 - [ ] 用于审计可视化的 Web 仪表板 - [ ] 基于熵的通用密钥检测 认领以上任何内容,或者从一个 `[good first issue](https://github.com/YOUR_GITHUB_USERNAME/mcp-doorman/labels/good%20first%20issue)` 开始。新的检测规则是最简单的贡献方式:一个正则表达式 + 两个测试。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [docs/detection-rules.md](docs/detection-rules.md)。 ## 开发 ``` npm install npm test # 69 tests: unit + full stdio e2e npm run build npm run demo # watch the guards fire live ``` ## 许可证 [Apache-2.0](LICENSE) — 可免费用于任何目的,并包含明确的专利授权。
标签:AI安全, Chat Copilot, DLL 劫持, GNU通用公共许可证, MCP网关, MITM代理, Node.js, StruQ, 大语言模型, 安全策略引擎, 审计日志, 提示词注入防护, 时序数据库, 暗色界面, 自动化攻击