
A lightweight mcp to prevent poisoning CVE (CVE-2025-54136), researchers hijacking Claude Code/Copilot/Gemini via prompt injection, and hundreds of MCP servers exposed with zero auth, this mcp protects the individual developer's laptop, where most MCP servers actually run.
Das Sicherheits-Gateway für MCP-Server – jeder Tool-Aufruf wird an der Tür geprüft.
CI npm License: Apache-2.0 PRs welcome
mcp-doorman ist ein Drop-in-Proxy, der sich zwischen Ihren KI-Agenten (Claude Desktop, Claude Code, Cursor, VS Code, jeder MCP-Client) und die von ihm genutzten MCP-Server setzt. Ein Befehl, keine Infrastruktur, und jeder tools/list- und tools/call-Aufruf durchläuft eine Schutz-Pipeline:
Jeder ist nur einen npx some-random-mcp-server davon entfernt, einem ungeprüften Prozess seine API-Schlüssel und eine direkte Leitung in das Kontextfenster seines Modells zu übergeben. Die dokumentierten Angriffsklassen sind real, nicht hypothetisch:
Enterprise-MCP-Gateways gibt es für Plattform-Teams mit Kubernetes-Clustern. Nichts Leichtes schützt den Laptop des einzelnen Entwicklers – den Ort, an dem 99% der MCP-Server tatsächlich laufen. Diese Lücke schließt dieses Projekt.
# 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
Richten Sie dann Ihren Client auf das Gateway anstelle Ihrer Server. 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"]
}
}
}
Tools erscheinen namespace-gescoped als github__create_issue, filesystem__read_file, usw., plus zwei Built-ins: doorman__status und doorman__recent_events (fragen Sie Ihren Agenten "Was hat doorman kürzlich blockiert?").
Windows-Hinweis: Wenn ein Server-Eintrag direkt
npxverwendet, starten Sie ihn über cmd:"command": "cmd", "args": ["/c", "npx", "-y", "..."].
git clone https://github.com/Sushank05/mcp-doorman && cd mcp-doorman
npm install
npm run demo
Die Demo verbindet das Gateway mit einem absichtlich fehlverhaltenden Server (examples/demo-server.mjs), der gefälschte Zugangsdaten preisgibt, eine Prompt-Injection-Nutzlast ausliefert und ein zerstörerisches Tool anbietet – und zeigt, wie jede Schutzmaßnahme es abfängt.
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]
Das Gateway ist ein MCP-Server gegenüber Ihrem Client und ein MCP-Client gegenüber jedem Upstream (stdio-Kindprozesse oder streamable-HTTP-Endpunkte), die hinter einer Verbindung aggregiert werden. Es basiert auf dem offiziellen TypeScript SDK.
Alles lebt in einer JSON-Datei. Vollständiges Beispiel mit jeder Option:
{
"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"
}
Pin-Zustand und Audit-Log standardmäßig in <config-name>.pins.json / <config-name>.audit.jsonl neben der Konfigurationsdatei.
| Befehl | Was es tut |
|---|---|
mcp-doorman run --config <path> | Startet das Gateway über stdio (Standardbefehl) |
mcp-doorman pin --config <path> | Verbindet sich mit allen Upstreams und pinnt (vertraut) deren aktuelle Tool-Definitionen |
mcp-doorman init | Schreibt eine Starter-Konfiguration mit sinnvollen Standardwerten |
Sicherheitstools, die übertreiben, sind schlimmer als gar keine. Lesen Sie diesen Teil.
deny/approve-Richtlinien als harte Grenze; Screening ist Defense-in-Depth.approval.fallback zurück (standardmäßig verweigern).resources/*- und prompts/*-Proxying (derzeit nur Tools)doorman-rules-finance, doorman-rules-healthcare…)mcp-doorman audit-Unterbefehl: JSONL-Log hübsch ausgeben und abfragenSchnappen Sie sich etwas aus der Liste oder beginnen Sie mit einem [good first issue](https://github.com/YOUR_GITHUB_USERNAME/mcp-doorman/labels/good%20first%20issue). Neue Erkennungsregeln sind der einfachste Beitrag: ein Regex + zwei Tests. Siehe CONTRIBUTING.md und 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 – kostenlos für jede Nutzung, mit einer ausdrücklichen Patentgewährung.
| Angriff | Funktionsweise |
|---|
| Tool-Poisoning | Bösartige Anweisungen, die in der Beschreibung eines Tools versteckt sind, in den meisten Client-Oberflächen unsichtbar |
| Rug Pull | Server präsentiert am ersten Tag harmlose Tools, tauscht die Definitionen aus, nachdem Sie sie genehmigt haben |
| Indirekte Prompt-Injection | Eine von einem legitimen Tool abgerufene Webseite/Issue/E-Mail enthält Anweisungen, die auf das Modell abzielen |
| Geheimnis-Exfiltration | Ein durchgesickertes Credential in einem Tool-Ergebnis + eine injizierte Anweisung = Ihr Schlüssel auf dem Server eines anderen |
| Außer-Kontrolle-Schleifen | Ein verwirrter oder entführter Agent löscht massenhaft, mailt massenhaft, scraped massenhaft |