
एक हल्का mcp जो CVE (CVE-2025-54136) को पॉइज़निंग से रोकता है, शोधकर्ताओं द्वारा प्रॉम्प्ट इंजेक्शन के माध्यम से Claude Code/Copilot/Gemini को हाईजैक करने से, और बिना किसी प्रमाणीकरण के उजागर होने वाले सैकड़ों MCP सर्वरों से बचाता है। यह mcp व्यक्तिगत डेवलपर के लैपटॉप की सुरक्षा करता है, जहाँ अधिकांश MCP सर्वर वास्तव में चलते हैं।
MCP सर्वरों के लिए सुरक्षा गेटवे — हर टूल कॉल दरवाजे पर जाँचा जाता है।
CI npm License: Apache-2.0 PRs का स्वागत है
mcp-doorman एक ड्रॉप-इन प्रॉक्सी है जो आपके AI एजेंट (Claude Desktop, Claude Code, Cursor, VS Code, कोई भी MCP क्लाइंट) और इसके द्वारा उपयोग किए जाने वाले MCP सर्वरों के बीच बैठता है। एक कमांड, शून्य इंफ्रास्ट्रक्चर, और हर tools/list और tools/call एक गार्ड पाइपलाइन से गुज़रता है:
हर कोई एक npx some-random-mcp-server दूर है अपने API कुंजियाँ और अपने मॉडल के संदर्भ विंडो में एक सीधी रेखा एक अप्रमाणित प्रक्रिया को सौंपने से। दस्तावेजित आक्रमण वर्ग वास्तविक हैं, काल्पनिक नहीं:
| हमला | यह कैसे काम करता है |
|---|---|
| टूल पॉइज़निंग | टूल के विवरण में छिपे दुर्भावनापूर्ण निर्देश, अधिकांश क्लाइंट UI में अदृश्य |
| रग पुल | सर्वर पहले दिन निर्दोष टूल प्रस्तुत करता है, आपके स्वीकृत करने के बाद परिभाषाएँ बदल देता है |
| अप्रत्यक्ष प्रॉम्प्ट इंजेक्शन | एक वैध टूल द्वारा लाया गया एक वेबपेज/इश्यू/ईमेल मॉडल को लक्षित करने वाले निर्देश रखता है |
| गुप्त डेटा निष्कासन | एक टूल परिणाम में लीक हुआ क्रेडेंशियल + एक इंजेक्टेड निर्देश = आपकी कुंजी किसी और के सर्वर पर |
| भगोड़े लूप | एक भ्रमित या हाईजैक एजेंट बड़े पैमाने पर डिलीट, मास-मेल, मास-स्क्रैप करता है |
एंटरप्राइज़ MCP गेटवे Kubernetes क्लस्टर वाली प्लेटफ़ॉर्म टीमों के लिए मौजूद हैं। कुछ भी हल्का-वजन व्यक्तिगत डेवलपर के लैपटॉप की रक्षा नहीं करता — वह जगह जहाँ 99% MCP सर्वर वास्तव में चलते हैं। यही वह अंतर है जिसे यह प्रोजेक्ट भरता है।
# 1. एक कॉन्फ़िग बनाएँ
npx -y mcp-doorman init
# 2. doorman.config.json संपादित करें — इसमें अपने वास्तविक सर्वर डालें
# 3. वर्तमान टूल परिभाषाएँ पिन करें (पहले उपयोग पर भरोसा करें)
npx -y mcp-doorman pin --config doorman.config.json
फिर अपने क्लाइंट को सर्वरों के बजाय गेटवे की ओर इंगित करें। Claude Desktop / Claude Code / Cursor:
// पहले — हर सर्वर सीधे मॉडल से बात करता है
{
"mcpServers": {
"github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] },
"filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/repos"] }
}
}
// बाद में — एक डोरमैन सबकी रक्षा करता है
{
"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 (अपने एजेंट से पूछें "डोरमैन ने हाल ही में क्या ब्लॉक किया?")।
विंडोज नोट: यदि कोई सर्वर प्रविष्टि सीधे
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 क्लाइंट है, उन्हें एक कनेक्शन के पीछे एकत्रित करता है। यह आधिकारिक TypeScript SDK पर बनाया गया है।
सब कुछ एक JSON फ़ाइल में रहता है। प्रत्येक विकल्प के साथ पूर्ण उदाहरण:
{
"servers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } // ${VAR} = गेटवे env से पढ़ें
},
"remote": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${MCP_TOKEN}" } }
},
"policy": {
"defaultAction": "allow", // "allow" | "deny" | "approve"
"rules": [ // पहला मैच जीतता है, ऊपर से नीचे मूल्यांकन
{ "match": "*__delete*", "action": "deny", "reason": "कोई विनाशकारी टूल नहीं" },
{ "match": ["github__create_*", "*__send_*"], "action": "approve" },
{ "match": "filesystem__*", "action": "allow" }
]
},
"redaction": {
"enabled": true,
"disable": [], // बंद करने के लिए बिल्ट-इन नियम नाम
"enableOptIn": ["email"], // ऑप्ट-इन: "email", "us-ssn", "ipv4"
"custom": [{ "name": "acme-id", "pattern": "ACME-[0-9]{6}" }],
"redactArguments": false // मॉडल-प्रदत्त तर्कों को भी साफ़ करें
},
"injection": {
"action": "flag", // "flag" (मॉडल को चेतावनी) | "block" | "off"
"scanToolDescriptions": true, // tools/list पर टूल-पॉइज़निंग जाँच
"custom": []
},
"pinning": {
"enabled": true,
"onNewTool": "pin", // "pin" (TOFU) | "block" (जब तक `mcp-doorman pin`)
"onChangedTool": "block" // "block" | "warn"
},
"rateLimit": { "perMinute": 120, "perTool": { "*__send_*": 5 } },
"approval": { "fallback": "deny", "timeoutMs": 120000 }, // फ़ॉलबैक जब क्लाइंट में elicitation न हो
"audit": { "enabled": true, "includeArguments": true, "includeResults": false },
"logLevel": "info"
}
पिन स्थिति और ऑडिट लॉग डिफ़ॉल्ट रूप से कॉन्फ़िग फ़ाइल के बगल में <config-name>.pins.json / <config-name>.audit.jsonl पर सहेजे जाते हैं।