
Un mcp leggero per prevenire l'avvelenamento CVE (CVE-2025-54136), il dirottamento di Claude Code/Copilot/Gemini da parte di ricercatori tramite prompt injection e centinaia di server MCP esposti senza autenticazione; questo mcp protegge il laptop del singolo sviluppatore, dove in realtà gira la maggior parte dei server MCP.
Il gateway di sicurezza per i server MCP — ogni chiamata di strumento viene controllata all'ingresso.
CI npm Licenza: Apache-2.0 PR benvenuti
mcp-doorman è un proxy drop-in che si posiziona tra il tuo agente AI (Claude Desktop, Claude Code, Cursor, VS Code, qualsiasi client MCP) e i server MCP che utilizza. Un solo comando, zero infrastruttura, e ogni tools/list e tools/call passa attraverso una pipeline di protezione:
Chiunque è a un solo npx some-random-mcp-server di distanza dal consegnare a un processo non verificato le proprie chiavi API e una linea diretta nella finestra di contesto del proprio modello. Le classi di attacco documentate sono reali, non ipotetiche:
Esistono gateway MCP enterprise per i team di piattaforma con cluster Kubernetes. Nessuno strumento leggero protegge il laptop del singolo sviluppatore — il luogo dove gira davvero il 99% dei server MCP. È il vuoto che questo progetto colma.
# 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
Poi punta il tuo client al gateway invece che ai tuoi 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"]
}
}
}
Gli strumenti compaiono con namespace come github__create_issue, filesystem__read_file, ecc., più due strumenti integrati: doorman__status e doorman__recent_events (chiedi al tuo agente "cosa ha bloccato di recente doorman?").
Nota per Windows: se una voce di server usa
npxdirettamente, avviala tramite cmd:"command": "cmd", "args": ["/c", "npx", "-y", "..."].
git clone https://github.com/Sushank05/mcp-doorman && cd mcp-doorman
npm install
npm run demo
La demo collega il gateway a un server volutamente malfunzionante (examples/demo-server.mjs) che fa trapelare credenziali finte, fornisce un payload di prompt injection e offre uno strumento distruttivo — e mostra ogni protezione che lo intercetta.
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]
Il gateway è un MCP server verso il tuo client e un MCP client verso ogni upstream (processi figli stdio o endpoint streamable-HTTP), aggregandoli dietro un'unica connessione. È costruito sullo TypeScript SDK ufficiale.
Tutto sta in un unico file JSON. Esempio completo con tutte le opzioni:
{
"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"
}
Lo stato dei pin e il registro di audit vengono salvati per impostazione predefinita in <config-name>.pins.json / <config-name>.audit.jsonl, accanto al file di configurazione.
| Comando | Cosa fa |
|---|---|
mcp-doorman run --config <path> | Avvia il gateway su stdio (comando predefinito) |
mcp-doorman pin --config <path> | Si connette a tutti gli upstream e fissa (considera affidabili) le definizioni correnti degli strumenti |
mcp-doorman init | Scrive una configurazione iniziale con impostazioni predefinite sensate |
Uno strumento di sicurezza che promette più di quanto mantiene è peggio di nessuno. Leggi questa parte.
deny/approve come confine rigido; lo screening è difesa in profondità.approval.fallback (deny per impostazione predefinita).resources/* e prompts/* (attualmente solo strumenti)doorman-rules-finance, doorman-rules-healthcare…)mcp-doorman audit: formatta e interroga il registro JSONLScegline uno dall'elenco sopra, oppure parti da una [good first issue](https://github.com/YOUR_GITHUB_USERNAME/mcp-doorman/labels/good%20first%20issue). Le nuove regole di rilevamento sono il contributo più semplice: una regex + due test. Vedi CONTRIBUTING.md e 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 — libero per qualsiasi uso, con una concessione esplicita di brevetto.
| Attacco | Come funziona |
|---|
| Avvelenamento degli strumenti | Istruzioni maligne nascoste nella descrizione di uno strumento, invisibili nella maggior parte delle UI dei client |
| Rug pull | Il server presenta strumenti innocui il primo giorno e sostituisce le definizioni dopo che le hai approvate |
| Iniezione indiretta di prompt | Una pagina web/issue/email recuperata da uno strumento legittimo trasporta istruzioni rivolte al modello |
| Esfiltrazione di segreti | Una credenziale trapelata nel risultato di uno strumento + un'istruzione iniettata = la tua chiave sul server di qualcun altro |
| Loop fuori controllo | Un agente confuso o dirottato cancella in massa, invia email in massa, fa scraping in massa |