
MCPサーバーのセキュリティゲートウェイ — すべてのツール呼び出しはドアで検査されます。
mcp-doorman は、AIエージェント(Claude Desktop、Claude Code、Cursor、VS Code、任意のMCPクライアント)と、それが利用するMCPサーバーの間に配置するドロップインプロキシです。ワンコマンド、インフラ不要で、すべての tools/list と tools/call はガードパイプラインを通過します:
誰もが npx some-random-mcp-server を実行するだけで、未検証のプロセスにAPIキーと、モデルのコンテキストウィンドウへの直接経路を渡してしまいます。ここに挙げる攻撃クラスは仮説ではなく、実際に文書化された脅威です:
エンタープライズ向けMCPゲートウェイは、Kubernetesクラスターを持つプラットフォームチーム向けに存在します。個人開発者のラップトップ — 実際に99%のMCPサーバーが実行されている場所 — を守る軽量なものは何もありません。 このプロジェクトは、まさにそのギャップを埋めるものです。
# 1. Create a config
npx -y mcp-doorman init
# 2. Edit doorman.config.json — put your real servers in it
# 3. Pin the current tool definitions (trust on first use)
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 などの名前空間付きで表示され、さらに2つの組み込みツール doorman__status と doorman__recent_events が追加されます(エージェントに 「doorman は最近何をブロックしましたか?」 と聞いてみてください)。
Windowsに関する注意: サーバーエントリが
npxを直接使う場合は、cmd経由で起動してください:"command": "cmd", "args": ["/c", "npx", "-y", "..."]。
git clone https://github.com/Sushank05/mcp-doorman && cd mcp-doorman
npm install
npm run demo
デモでは、ゲートウェイを意図的に不正動作するサーバー(examples/demo-server.mjs)に接続します。このサーバーは偽の資格情報を漏えいし、プロンプトインジェクションのペイロードを配信し、破壊的なツールを提供します — そして各ガードがそれを検知する様子を示します。
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エンドポイント)に対してはMCP クライアントとして動作し、それらを1つの接続の背後に集約します。公式の TypeScript SDK 上に構築されています。
すべては1つの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"
}
ピン状態と監査ログは、デフォルトで設定ファイルの隣の <config-name>.pins.json / <config-name>.audit.jsonl に保存されます。
| Command | What it does |
|---|---|
mcp-doorman run --config <path> | stdio上でゲートウェイを起動する(デフォルトコマンド) |
mcp-doorman pin --config <path> | すべてのアップストリームに接続し、現在のツール定義をピン留め(信頼)する |
mcp-doorman init | 適切なデフォルト値を備えたスターター設定を書き出す |
過大評価されたセキュリティツールは、何もないより悪いものです。この部分は読んでください。
deny/approve ポリシーを使用してください。スクリーニングは多層防御です。approval.fallback(デフォルトではdeny)にフォールバックします。resources/* と prompts/* のプロキシ(現在はツールのみ)doorman-rules-finance, doorman-rules-healthcare…)mcp-doorman audit サブコマンド: JSONLログの整形表示とクエリ上記のいずれかに取り組むか、[good first issue](https://github.com/YOUR_GITHUB_USERNAME/mcp-doorman/labels/good%20first%20issue) から始めてください。新しい検出ルールは最も簡単な貢献です: 正規表現1つ + テスト2つ。CONTRIBUTING.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 — あらゆる用途に無料で、明示的な特許許諾付き。
| Attack | How it works |
|---|
| ツールポイズニング | ツールの説明に隠された悪意ある指示。ほとんどのクライアントUIでは見えない |
| ラグプル | サーバーは初日に無害なツールを提示し、承認後に定義をすり替える |
| 間接プロンプトインジェクション | 正規のツールが取得したWebページ/Issue/メールに、モデルを標的にした指示が含まれる |
| シークレット漏えい | 1つのツール結果に漏れた資格情報 + 1つの注入指示 = あなたのキーが他人のサーバーに渡る |
| 暴走ループ | 混乱または乗っ取られたエージェントが一括削除・一括送信・一括スクレイピングを行う |