
Wireshark for MCP. एक पारदर्शी प्रॉक्सी जो आपके AI क्लाइंट और आपके MCP सर्वरों के बीच होने वाली हर वास्तविक टूल कॉल को आपके टर्मिनल में लाइव दिखाती है।
MCP के लिए Wireshark. एक पारदर्शी प्रॉक्सी जो आपके AI क्लाइंट और आपके MCP सर्वर के बीच हर वास्तविक टूल कॉल को आपके टर्मिनल में लाइव दिखाती है।
आधिकारिक MCP Inspector अपने स्वयं के क्लाइंट के रूप में जुड़ता है, इसलिए यह कभी नहीं देख पाता कि आपका क्लाइंट (Cursor, Claude Code, Codex) वास्तव में आपके सर्वर को क्या भेजता है। और कोई भी चीज़ जो किसी अनुरोध के आने का इंतज़ार करती है वह उस कॉल को नहीं दिखा सकती जो मॉडल ने कभी नहीं की, या गलत तर्कों के साथ की गई। जब कोई टूल चुपचाप कॉल नहीं होता, क्षमताएँ मेल नहीं खातीं, या कोई कॉल बस अटक जाती है, तो आप लॉग खंगालने और अनुमान लगाने पर मजबूर रह जाते हैं।
mcpsnoop इसके बजाय वास्तविक डेटा पथ में बैठता है। अपने सर्वर कमांड को इसके साथ रैप करें और अपने वास्तविक क्लाइंट और सर्वर की बातचीत के दौरान हर JSON-RPC फ्रेम को लाइव देखें।
इसे तुरंत देखें, बिना कुछ सेट अप किए।```bash mcpsnoop demo
वास्तविक उपयोग के लिए, अपने सर्वर को अपने क्लाइंट के MCP config में लपेटें।```json
{
"mcpServers": {
"my-server": {
"command": "mcpsnoop",
"args": ["--", "node", "build/index.js"]
}
}
}
-- के बाद की हर चीज़ वह कमांड है जो सामान्यतः आपके सर्वर को लॉन्च करती है। जो भी आप पहले से उपयोग करते हैं उसे वहाँ लगा दें, जैसे python server.py, npx -y @scope/server, या कोई संकलित बाइनरी।
Claude Desktop पर आपको यह संपादन हाथ से नहीं करना पड़ता।```bash mcpsnoop wrap my-server # route my-server through mcpsnoop mcpsnoop unwrap my-server # put it back
`wrap` `claude_desktop_config.json` ढूंढता है, पहली बार इसे
`claude_desktop_config.json.mcpsnoop.bak` में कॉपी करता है, और केवल उस
एक सर्वर की प्रविष्टि को फिर से लिखता है, ताकि आपकी फ़ॉर्मेटिंग और बाकी हर सर्वर वैसे ही रहें।
फिर से लिखी गई प्रविष्टि के अंदर कुंजियाँ वर्णानुक्रम में वापस आ जाती हैं। `unwrap`
फ़ाइल को पुनर्स्थापित करता है, और जब कोई सर्वर अब wrapped न रहे तो बैकअप हटा देता है।
इनमें से किसी के बाद भी Claude Desktop को पुनः आरंभ करें, क्योंकि MCP सर्वर
स्टार्टअप पर एक बार लॉन्च होते हैं।
फिर अपने क्लाइंट का उपयोग हमेशा की तरह करें और UI खोलें।```bash
mcpsnoop
कोई फ्लैग नहीं, कोई सॉकेट पथ नहीं, याद रखने के लिए कोई स्टार्टअप क्रम नहीं। शिम और UI अपने आप एक-दूसरे को खोज लेते हैं, और UI डिस्क से पिछले सत्रों को बैकफिल करता है।
streamable-HTTP सर्वर के लिए, mcpsnoop को रिवर्स प्रॉक्सी के रूप में चलाएँ।```bash mcpsnoop http --target http://localhost:3000/mcp --listen :7000
हर प्रतिक्रिया की HTTP स्थिति स्ट्रीम में दिखाई देती है, इसलिए जिस प्रतिक्रिया में अपना कोई JSON-RPC संदेश नहीं होता, वह फिर भी कुछ न होने के बजाय एक दृश्यमान फ्रेम होती है: 401 चैलेंज, अस्वीकृत Origin पर 403, 202 जो किसी notification की पावती देता है, और 502 जब लक्ष्य तक बिल्कुल नहीं पहुँचा जा सकता। 401 का `WWW-Authenticate` हेडर यथावत रखा जाता है और इंस्पेक्टर में दिखाया जाता है, क्योंकि यह auth scheme और आगे जाने हेतु resource metadata का नाम बताता है। TUI में `status:401` से स्थिति के अनुसार फ़िल्टर करें, या किसी भी विफलता के लिए `status:err` का उपयोग करें। कोई 4xx या 5xx त्रुटि मानी जाती है, इसलिए डिफ़ॉल्ट `mcpsnoop check` रन उस पर विफल हो जाता है।
अपना कोई सर्वर नहीं है? अपने स्वयं के client द्वारा संचालित, एक प्रकाशित test server के विरुद्ध [वास्तव में इसे आज़माएँ](https://github.com/kerlenton/mcpsnoop/blob/HEAD/docs/TRY_IT.md)। किसी सत्र का घटित होने के बाद निरीक्षण करने के लिए, [लॉग्स से पिछले सत्रों की समीक्षा](https://github.com/kerlenton/mcpsnoop/blob/HEAD/docs/POST_MORTEM.md) देखें।
### कॉन्फ़िग फ़ाइल
यदि आप किसी project में समान shim flags का पुनः उपयोग करते हैं, तो उन्हें वर्तमान कार्यशील निर्देशिका में `.mcpsnoop.toml` फ़ाइल में रखें।```toml
label = "filesystem"
trace-file = "trace.jsonl"
redact-secrets = true
redact-key = "token,authorization"
redact-value = "sk-[A-Za-z0-9]+"
redact-path = "$.params.arguments.password"
no-trace = false
redact-key, redact-value, और redact-path को अलग-अलग पंक्तियों में दोहराएँ ताकि
इनमें से प्रत्येक को एक से अधिक बार जोड़ा जा सके।
यह केवल इन्हीं कुंजियों का समर्थन करता है।
फ़ाइल केवल वर्तमान कार्यशील निर्देशिका में खोजी जाती है, पैरेंट निर्देशिकाओं में नहीं।
स्पष्ट कमांड-लाइन फ़्लैग कॉन्फ़िग फ़ाइल से मिले मानों को ओवरराइड करते हैं।
पूरी सूची के लिए mcpsnoop help चलाएँ, या किसी एक कमांड के फ़्लैग देखने के लिए mcpsnoop help <command> चलाएँ।
go install github.com/kerlenton/mcpsnoop/cmd/mcpsnoop@latest
### Homebrew```bash
brew install mcpsnoop
हर प्लेटफ़ॉर्म के लिए प्रीबिल्ट बाइनरीज़ Releases पेज पर उपलब्ध हैं।
mcpsnoop bash, zsh, fish और PowerShell के लिए कम्प्लीशन के साथ आता है। सेटअप चरणों के लिए
mcpsnoop completion <shell> --help चलाएँ, जिनमें कम्प्लीशन सक्षम करना
और आपके OS के लिए इंस्टॉल पथ शामिल है।
mcpsnoop एक बाइनरी में दो भूमिकाएँ निभाता है। mcpsnoop -- <server> वह पारदर्शी
शिम है जिसे आपका क्लाइंट स्पॉन करता है, बाइट्स को शब्दशः आगे भेजते हुए हर फ्रेम की
एक प्रति हब को भेजता है। बिना किसी तर्क के mcpsnoop वह हब और उसका लाइव TUI है।
वे एक जाने-माने सॉकेट और डिस्क पर मौजूद लॉग्स के माध्यम से जुड़ते हैं, इसलिए किसी को भी पहले शुरू नहीं करना पड़ता।
हब डिफ़ॉल्ट रूप से नवीनतम 100 सहेजे गए सत्र लोड करता है, जिससे स्टार्टअप कार्य
सीमित रहता है बिना पुराने ट्रेसेस को हटाए। कोई अन्य सीमा चुनने के लिए
mcpsnoop --history-limit N उपयोग करें, या पूरा इतिहास लोड करने के लिए
mcpsnoop --history-limit 0 उपयोग करें। पुराने सत्र mcpsnoop open <session-id> और
mcpsnoop export <session-id> के माध्यम से उपलब्ध रहते हैं।
इतिहास सीमा यह तय करती है कि क्या लोड किया जाता है; mcpsnoop prune यह तय करता है कि क्या रखा जाता है।
यह कटऑफ़ से पुराने सहेजे गए सत्र लॉग्स को हटाता है, और अपने आप कभी नहीं चलता।```bash
mcpsnoop prune --older-than 30d --dry-run # list what would go, remove nothing
mcpsnoop prune --older-than 30d # delete after confirming
mcpsnoop prune --older-than 72h --yes # skip the prompt in a script
`--older-than` आवश्यक है (कोई डिफ़ॉल्ट नहीं है जो कुछ भी हटा दे) और यह `30d` जैसी दिनों की संख्या या `72h` जैसी Go अवधि स्वीकार करता है। टूल बेसलाइन को अछूता छोड़ दिया जाता है, क्योंकि बेसलाइन सत्र के बजाय सर्वर लेबल के आधार पर होती है।
क्योंकि यह वास्तविक पाइप में बैठता है, Inspector की तरह किनारे पर नहीं, यह ठीक वही देखता है जो आपका वास्तविक क्लाइंट और सर्वर एक-दूसरे से कहते हैं, चाहे सर्वर किसी भी भाषा में लिखा गया हो।
## कीबाइंडिंग
| कुंजी | क्रिया | | कुंजी | क्रिया |
|---|---|---|---|---|
| `enter` | निरीक्षण करें / अंदर जाएं | | `/` | फ़िल्टर करें |
| `esc` | वापस | | `:` | कमांड |
| `j` / `k` | नेविगेट करें | | `r` | कॉल दोबारा चलाएँ |
| `g` / `G` | ऊपर / नीचे | | `c` | क्षमताएँ |
| `ctrl-f` / `ctrl-b` | पेज | | `s` | टूल सारांश |
| `p` | रोकें | | `y` | कॉपी करें |
| `shift`+`<key>` | कॉलम के अनुसार क्रमबद्ध करें | | `e` | निर्यात करें |
| `ctrl-d` | सत्र हटाएँ | | `f` | अनुसरण करें |
| `?` | सहायता | | | |
पूरी सूची के लिए ऐप में `?` दबाएँ।
## स्ट्रीम को फ़िल्टर करना
किसी सत्र में `/` दबाएँ और स्पेस-सेपरेटेड टोकन को AND के साथ जोड़ें। सादा टेक्स्ट method, tool, id और payload से मेल खाता है।
| टोकन | फ़िल्टर का आधार | उदाहरण |
|---|---|---|
| `tool:` | टूल का नाम | `tool:search` |
| `method:` | JSON-RPC मेथड | `method:tools/call` |
| `id:` | अनुरोध id, और उसे जारी रखने वाला कोई भी रीट्राय | `id:7` |
| `task:` | टास्क id | `task:01J...` |
| `dir:` | दिशा (`c2s`, `s2c`) | `dir:s2c` |
| `kind:` | फ्रेम प्रकार (`req`, `resp`, `notify`, `stderr`, `invalid`) | `kind:invalid` |
| `status:` | कॉल परिणाम (`ok`, `error`, `cancel`, `late`, `cancelled`, `pending`, `bad`, `warn`, `mismatch`, या `401` जैसा HTTP स्टेटस) | `status:error` |
विशिष्ट परिणाम पाने के लिए टोकन को स्टैक करें।```text
tool:search status:pending # in-flight calls to one search tool
status:cancel # calls the client gave up on (status:cancelled is a cancelled task)
status:late # results that arrived after the cancellation
method:tools/call status:error # tool calls that failed
dir:s2c kind:req # server-initiated requests (servers before 2026-07-28)
अंतिम वाला केवल 2025-11-25 या उससे पहले बोलने वाले सर्वर पर ही कुछ ढूंढता है। यह 2026-07-28 संशोधन ने सर्वर-आरंभित अनुरोधों को हटा दिया, और जिस सर्वर को क्लाइंट से कुछ चाहिए होता है वह अब क्लाइंट के अपने अनुरोध का उत्तर देकर उसे मांगता है, फिर क्लाइंट पुनः प्रयास करता है। mcpsnoop उन पुनः प्रयासों को उस अनुरोध से जोड़ता है जिसे वे आगे बढ़ाते हैं, जिससे यह आदान-प्रदान कई कॉलों के बजाय एक ही कॉल के रूप में पढ़ा जाता है।
किसी भी कैप्चर किए गए सत्र को पोर्टेबल फ़ाइल में बदलें।```bash mcpsnoop export -T json|html|text|har|otlp [-o file|-] [session-id|log.jsonl|-]
| Format | आपको क्या मिलता है |
|---|---|
| `json` | सहसंबंधित कॉल, प्रति-टूल गणना और p50/p95/p99 विलंबता, सबसे धीमी कॉल, क्षमताएँ, और कच्चे फ़्रेम |
| `html` | खोज और संक्षिप्त/विस्तार योग्य JSON के साथ एक स्व-निहित ब्राउज़र फ़ाइल |
| `text` | एक सुव्यवस्थित सादा-पाठ डंप |
| `har` | प्रति सहसंबंधित कॉल एक प्रविष्टि, ब्राउज़र डेवटूल्स और HAR पढ़ने वाली किसी भी अन्य चीज़ में खोलने योग्य |
| `otlp` | OTLP JSON जिसमें प्रति सहसंबंधित कॉल एक स्पैन होता है; W3C ट्रेस संदर्भ कॉलर ट्रेस को जोड़ता है, अन्यथा प्रति सत्र एक ट्रेस उपयोग किया जाता है |
MCP HTTP नहीं है, इसलिए HAR प्रविष्टि का URL, स्थिति कोड और टाइमिंग प्रत्येक कॉल का एक जानबूझकर मानचित्रण है, न कि वायर ट्रांसक्रिप्ट।
OTLP के लिए, एक अनुरोध का `_meta.traceparent` उस कॉल के ट्रेस और पैरेंट स्पैन आईडी प्रदान करता है, और `_meta.tracestate` स्पैन के साथ जुड़ा रहता है। जब traceparent अनुपस्थित या अमान्य होता है, mcpsnoop सत्र-व्युत्पन्न ट्रेस को बनाए रखता है और कोई स्टेट नहीं रखता। mcpsnoop भाग लेने के बजाय अवलोकन करता है, इसलिए यह अपनी ओर से कोई वेंडर प्रविष्टि नहीं जोड़ता और कॉलर के स्टेट को अपरिवर्तित पास करता है।```bash
mcpsnoop export -T html -o out.html # an HTML file to open in a browser
mcpsnoop export -T text server.py-48213-7f3a1c9e2b04 # a specific session, as text
mcpsnoop export -T json | jq # the newest session, piped to jq
mcpsnoop export -T har -o session.har # a HAR file to open in browser devtools
mcpsnoop export -T otlp -o trace.json # import into an OTLP-compatible tracing backend
-o छोड़ने पर stdout पर लिखा जाता है, और सत्र छोड़ने पर सबसे नया लिया जाता है, या stdin से JSONL पढ़ने के लिए
- पारित करें। TUI में, चयनित सत्र को HTML के रूप में निर्यात करने के लिए e दबाएँ,
या कमांड मोड से :export json|html|text|har|otlp [path] चलाएँ।
निरीक्षण या साझा करने से पहले किसी मौजूदा कैप्चर को साफ़ करने के लिए, कैप्चर के दौरान उपयोग किए गए
वही रिडक्शन फ़्लैग export या open को पारित करें:```bash
mcpsnoop export session.jsonl --redact-secrets --redact-key project_token -o shared.json
mcpsnoop open session.jsonl --redact-path '$.params.arguments.password'
ये फ़्लैग निर्यातित फ़ाइल या इन-मेमोरी TUI दृश्य को फिर से लिखते हैं, कभी भी
स्रोत JSONL को नहीं। `export` उस आउटपुट को अस्वीकार करता है जो अपने इनपुट के समान फ़ाइल का नाम रखता है,
और एक अस्थायी फ़ाइल के माध्यम से लिखता है जिसे स्थान पर नामांतरित किया जाता है, इसलिए एक रन जो
विफल होता है पिछली फ़ाइल को वैसे ही छोड़ देता है।
किसी टूल के `inputSchema` और `outputSchema`, जैसा कि एक `tools/list`
परिणाम में विज्ञापित है, `--redact-key` और `--redact-secrets` द्वारा छोड़ दिए जाते हैं। स्कीमा के अंदर एक नाम
मान के बजाय एक प्रकार की घोषणा है, नाम स्वयं
लॉग में किसी भी तरह रहता है, और `token` नामक प्रॉपर्टी के अंतर्गत सबस्कीमा को स्क्रब करना
टूल की अपनी जाँचों को भी साथ ले जाएगा। छूट केवल उसी स्थिति के लिए है,
इसलिए जो तर्क संयोगवश `inputSchema` कहलाता है, वह किसी भी अन्य की तरह स्क्रब किया जाता है,
और यह `default`, `const`, `examples` और `enum` पर रुकता है, जो धारण करते हैं
संरचना के बजाय डेटा। `--redact-path` का उपयोग करें किसी चीज़ का नाम देने के लिए
स्कीमा के अंदर, या `--redact-value` का उपयोग करें, जो टेक्स्ट से कहीं भी मेल खाता है सिवाय
उन दो कीवर्ड्स के जिन्हें mcpsnoop पार्स करता है, `type` और `x-mcp-header`।
प्रत्येक फ़्लैग जहाँ तक पहुँचता है वह अलग है, इसलिए मान लेने के बजाय परिणाम जाँचें। सभी
चारों JSON-RPC पेलोड्स को स्क्रब करते हैं, और `--redact-key`, `--redact-path` और
`--redact-secrets` केवल उन्हीं तक पहुँचते हैं। केवल `--redact-value` stderr को भी स्क्रब करता है,
अन्य गैर-JSON टेक्स्ट, और स्ट्रिंग के अंदर की चीज़ों को। एक `Mcp-Param-*` हेडर
उस बॉडी वैल्यू के साथ स्क्रब किया जाता है जिसे वह दर्शाता है; बाकी एनवेलप मेटाडेटा,
सर्वर लेबल, `Mcp-Name`, `Mcp-Method` और HTTP स्थिति, जैसे कैप्चर की गई थी वैसे ही
छोड़ दी जाती है। रिडक्शन बेस्ट-एफर्ट है, इसलिए एक अलग आउटपुट पथ का उपयोग करें और
परिणाम को साझा करने से पहले पढ़ें।
### OTLP कलेक्टर पर पूर्ण कॉल्स स्ट्रीम करें
प्रॉक्सी चलते समय उसे OTLP/HTTP JSON की ओर इंगित करके spans भेजें
ट्रेसेस एंडपॉइंट पर। कलेक्टर प्रमाणीकरण या टेनेंट
हेडर के लिए `--otlp-header` दोहराएँ।```bash
mcpsnoop \
--otlp-endpoint http://localhost:4318/v1/traces \
--otlp-header "Authorization=Bearer $OTLP_TOKEN" \
-- node build/index.js
mcpsnoop http \
--target http://localhost:3000/mcp \
--otlp-endpoint http://localhost:4318/v1/traces
डिलीवरी बेस्ट-एफर्ट है और प्रॉक्सी किए गए MCP ट्रैफिक को कभी ब्लॉक नहीं करती। यदि कलेक्टर उपलब्ध नहीं है, तो mcpsnoop बैकग्राउंड में पुनः प्रयास करता है और नए ट्रेस फ्रेम छोड़ देता है जब इसकी सीमित कतार भर जाती है। सामान्य JSONL सत्र लॉग ही स्थायी रिकॉर्ड बना रहता है।
सहेजे गए दो सत्रों की तुलना id या JSONL पथ के द्वारा करें।```bash mcpsnoop diff before-session after-session mcpsnoop diff old.jsonl new.jsonl
रिपोर्ट उन टूल्स को दिखाती है जिन्हें जोड़ा या हटाया गया था, विवरण और `inputSchema`
परिवर्तन, मेल खाने वाले टूल कॉल्स जिनकी स्थिति बदली है, और उल्लेखनीय अवधि परिवर्तन। कॉल्स
का मिलान टूल नाम और तर्कों से किया जाता है, इसलिए पुनः क्रमबद्ध कॉल्स की तुलना फिर भी सही ढंग से होती है।
डिफ़ॉल्ट रूप से, अवधि परिवर्तन कम से कम 100 ms और 2x से भिन्न होने चाहिए;
उन सीमाओं को समायोजित करने के लिए `--duration-threshold` और `--duration-ratio` का उपयोग करें।
प्रतिगमन पर CI को गेट करने के लिए `--exit-code` पास करें: यह गैर-शून्य कोड के साथ बाहर निकलता है जब after
सत्र किसी टूल को हटाता है, टूल विवरण, शीर्षक, input schema, output
schema या एनोटेशन बदलता है, किसी कॉल की स्थिति खराब हो जाती है, या धीमा हो जाता है।
सुधार (जोड़े गए टूल्स, ठीक किए गए कॉल्स, गति वृद्धि) फिर भी शून्य कोड के साथ बाहर निकलते हैं, और आइकन
परिवर्तन भी ऐसा ही करता है, जो टूल के दिखने के तरीके को बदलता है बिना उसके कार्य को बदले।
## CI में सत्रों की जाँच करना
किसी रिकॉर्ड किए गए एजेंट रन को त्रुटियों, स्ट्रीम भ्रष्टाचार, प्रोटोकॉल चेतावनियों,
routing-header बेमेल, उन कॉल्स जिन्हें कभी प्रतिक्रिया नहीं मिली, गिराए गए फ्रेम्स जो
कैप्चर को अधूरा छोड़ देते हैं, टूल-परिभाषा विचलन, या अप्रचलित (deprecated)
प्रोटोकॉल सुविधाओं के उपयोग पर गेट करें।```bash
mcpsnoop check [--format text|junit|sarif] [--fail-on error,invalid,warn,mismatch,pending,late-result,drift,deprecated,incomplete,schema] [session-id|log.jsonl|-]
error, invalid और warn अपने आप में जाँच को विफल कर देते हैं। बाकी वैकल्पिक हैं।
केवल उन संकेतों को सक्षम करने के लिए अल्पविराम से अलग किया गया उपसमुच्चय पास करें जिनकी किसी जॉब को परवाह है, सत्र को छोड़ दें तो नवीनतम कैप्चर की जाँच होगी, या stdin से JSONL पढ़ने के लिए - का उपयोग करें।
हर सिग्नल की गणना की जाती है चाहे वह गेटिंग कर रहा हो या नहीं, इसलिए एक रन बताता है कि उसे क्या मिला, इससे पहले कि आप तय करें कि उस पर क्या विफल होना चाहिए।``` session build-agent: errors=1 invalid=0 warnings=0 mismatches=0 pending=0 late_results=0 deprecated=0 missing_frames=0 schema_findings=1 schema findings: oneOf: search check failed: error
ड्रॉप किए गए फ्रेम की गिनती भी आर्टिफैक्ट्स के साथ यात्रा करती है, इसलिए एक कैप्चर जो
खुद को कम दर्शाता है, वह जहाँ भी खोला जाता है वहाँ यह बताता है: JSON
एक्सपोर्ट में `missing_frames`, HAR में `log.comment`, और OTLP में
`mcpsnoop.session.missing_frames` रिसोर्स एट्रिब्यूट।```bash
mcpsnoop check build-agent
mcpsnoop check --fail-on error,invalid artifacts/session.jsonl
mcpsnoop check --fail-on mismatch gateway-run.jsonl
सिग्नल गणनाओं के अलावा, रन की संरचना को सत्यापित करें। ये एक-दूसरे के साथ और --fail-on के साथ संयोजित होते हैं, और कोई भी विफलता गैर-शून्य कोड के साथ समाप्त होती है।
| Flag | विफल होता है जब |
|---|---|
--max-duration <dur> | एक या अधिक पूर्ण टूल कॉल ने बजट से अधिक समय लिया; यह उनकी संख्या और सबसे खराब कॉल की रिपोर्ट करता है |
--expect-tool <name> | नामित टूल को कभी कॉल नहीं किया गया (दोहराने योग्य) |
--forbid-tool <name> | नामित टूल को कॉल किया गया (दोहराने योग्य) |
mcpsnoop check --expect-tool search --forbid-tool delete --max-duration 2s run.jsonl
### इसे वहाँ रिपोर्ट करें जहाँ CI पहले से देखता है
`--format junit` प्रत्येक सिग्नल और सत्र के लिए एक `<testcase>` लिखता है, और इसकी विफलताएँ टेक्स्ट आउटपुट के समान `--fail-on` चयन का पालन करती हैं।```yaml
- name: Check captured MCP session
run: |
mkdir -p test-results
mcpsnoop check --format junit artifacts/session.jsonl > test-results/mcpsnoop.xml
- name: Upload mcpsnoop JUnit report
if: always()
uses: actions/upload-artifact@v4
with:
name: mcpsnoop-junit
path: test-results/mcpsnoop.xml
--format sarif इसके बजाय SARIF 2.1.0 लॉग लिखता है। जहाँ junit प्रति सिग्नल एक समग्र रिपोर्ट देता है, वहीं SARIF प्रति निष्कर्ष एक परिणाम रिपोर्ट करता है, जिसमें सत्र, फ़्रेम Seq और फ़्रेम का अपना चेतावनी या ड्रिफ्ट टेक्स्ट होता है, और वह लॉग की उस पंक्ति की ओर इशारा करता है जिससे फ़्रेम डिकोड किया गया था। --fail-on में नामित सिग्नल को error स्तर पर रिपोर्ट किया जाता है और उसके बाहर के सिग्नल को note स्तर पर, ताकि रिपोर्ट और गेट कभी असहमत न हों।
एक परिणाम लॉग की ओर कार्यशील निर्देशिका के सापेक्ष पथ के साथ इशारा करता है, जिसे कोड स्कैनिंग फिर रिपॉजिटरी रूट के विरुद्ध हल करती है। अलर्ट केवल तभी अपनी आस-पास की पंक्तियों के साथ प्रदर्शित होता है जब वह पथ विश्लेषित कमिट में एक फ़ाइल हो, इसलिए वर्कफ़्लो द्वारा artifacts/ में उत्पन्न कैप्चर एक अलर्ट खोलता है जिसमें संदेश, नियम और पंक्ति संख्या होती है लेकिन कोई स्रोत दृश्य नहीं होता। जिस कैप्चर को आप पूर्ण रूप से प्रदर्शित करना चाहते हैं उसे कमिट करना ही उसे पाने का एकमात्र तरीका है। स्टेट निर्देशिका या stdin से पढ़ा गया लॉग बिल्कुल कोई पथ नहीं पाता।
कोड स्कैनिंग उस फ़ाइल को अस्वीकार कर देती है जिसके रन में 25,000 से अधिक परिणाम हों और स्वीकार किए गए परिणामों में से केवल शीर्ष 5,000 प्रदर्शित करती है, इसलिए रिपोर्ट 5,000 पर सीमित है: पहले वे निष्कर्ष जिन पर गेट विफल हुआ, फिर एक mcpsnoop/report-truncated परिणाम जो बताता है कि कितने छोड़ दिए गए। टेक्स्ट और junit प्रारूप पूर्ण रहते हैं।
निष्कर्षों को Security टैब में रखने के लिए, SARIF लॉग को upload-sarif को सौंपें। जॉब को security-events: write की आवश्यकता होती है, अन्यथा अपलोड 403 उत्तर देता है। check किसी निष्कर्ष पर गैर-शून्य निकास करता है, इसलिए अपलोड चरण को उन रनों पर बिल्कुल चलाने के लिए if: always() की आवश्यकता होती है जिनमें रिपोर्ट करने के लिए कुछ हो; continue-on-error निर्णय को कोड स्कैनिंग जाँच को सौंप देता है, जो error-स्तर के अलर्ट पर विफल होती है और उसे अनिवार्य जाँच बनाया जा सकता है। यदि आप चाहें कि चेक स्टेप स्वयं ही जॉब को लाल करे, तो इसे हटा दें।```yaml
permissions:
security-events: write
actions: read contents: read
steps:
### ऐसे रूटिंग हेडर को पकड़ें जो बॉडी से मेल नहीं खाता
स्ट्रीमेबल-HTTP ट्रांसपोर्ट पर एक गेटवे `Mcp-Method` और `Mcp-Name` के आधार पर रूट करता है, जबकि सर्वर बॉडी पढ़ता है, इसलिए एक हेडर जो बॉडी से मेल नहीं खाता, इसका मतलब है कि दोनों दो अलग-अलग अनुरोधों को देख रहे हैं। `mismatch` सिग्नल इस स्थिति, एक ऐसे बैच से जुड़ा हेडर जिसे वह संबोधित नहीं कर सकता, और एक आवश्यक हेडर के पूरी तरह से गायब होने को कवर करता है।
2026-07-28 में, एक लापता रूटिंग हेडर एक सत्यापन विफलता है, और एक अनुरूप सर्वर अनुरोध को `400` और `-32020` के साथ अस्वीकार कर देता है। mcpsnoop इसे केवल तभी रिपोर्ट करता है जब सत्र उस संशोधन या उससे बाद के संशोधन का समर्थन करता है, क्योंकि पहले के संशोधन इन हेडरों को बिल्कुल परिभाषित नहीं करते हैं और वहाँ उन्हें छोड़ देना सही है। सर्वर की अपनी `-32020` अस्वीकृति भी उसी सिग्नल के रूप में गिनी जाती है।
ऐसा नाम या संसाधन URI जो HTTP फ़ील्ड मान में फिट नहीं होगा, `=?base64?…?=` सेंटिनल में Base64 रूप में यात्रा करता है, जिसे तुलना से पहले डिकोड किया जाता है, इसलिए जो क्लाइंट सही ढंग से एन्कोड करता है, उसे कभी फ़्लैग नहीं किया जाता।
HTTP `tools/call` अनुरोधों पर mcpsnoop प्रत्येक `Mcp-Param-{Name}` हेडर भी दिखाता है और, जब मिलान वाली विज्ञापित टूल परिभाषा ज्ञात होती है, तो उसकी तुलना एनोटेटेड तर्क पथ से करता है। नेस्टेड प्रॉपर्टीज़, Base64 सेंटिनल, बूलियन और संख्यात्मक-समतुल्य सुरक्षित पूर्णांकों को बिना स्ट्रिंग-तुलना के गलत-सकारात्मक परिणामों के संभाला जाता है। अज्ञात पैरामीटर हेडर और बिना मिलान वाली टूल परिभाषा वाले सत्र अवलोकन-मात्र बने रहते हैं। कुंजी- और मान-आधारित रिडक्शन कैप्चर किए गए पैरामीटर-हेडर मानों पर उनके सिंक तक पहुँचने से पहले लागू होता है, और एक मान जिसे mcpsnoop ने स्वयं साफ़ किया है, उसे कभी असहमति के रूप में रिपोर्ट नहीं किया जाता।
### टूल परिभाषा विचलन का पता लगाएं
किसी सर्वर लेबल के लिए देखी गई पहली पूर्ण `tools/list` उसका विश्वसनीय आधार बन जाती है। बाद के सत्र उस आधार की तुलना फ़ील्ड-दर-फ़ील्ड करते हैं: विवरण, शीर्षक, इनपुट और आउटपुट स्कीमा, एनोटेशन और आइकन, साथ ही जोड़े या हटाए गए टूल। एनोटेशन सबसे महत्वपूर्ण हैं, क्योंकि `readOnlyHint` के साथ स्वीकृत एक टूल जो बाद में स्वयं को विनाशकारी घोषित करता है, वही धोखा है जिसके लिए यह जाँच मौजूद है, और स्पेक क्लाइंटों को एनोटेशन को अविश्वसनीय मानने का निर्देश देता है। शीर्षक और आइकन इसलिए ट्रैक किए जाते हैं क्योंकि उपयोगकर्ता उन्हीं को देखता है, और स्पेक एक टूल के `title` को `annotations.title` और उसके नाम से ऊपर रैंक करता है। सत्रों की तालिका और टूल सारांश MCP ट्रैफ़िक को ब्लॉक या बदलने के बिना विचलन को चिह्नित करते हैं।
एनोटेशन की तुलना उनके स्पेक डिफ़ॉल्ट के माध्यम से की जाती है, इसलिए एक सर्वर जो एक ऐसे संकेत को स्पष्ट रूप से लिखना शुरू कर देता है जिस पर वह पहले से निर्भर था, रिपोर्ट नहीं किया जाता। mcpsnoop द्वारा किसी फ़ील्ड को ट्रैक करने से पहले दर्ज किया गया आधार उन फ़ील्डों के लिए काम करता रहता है जिन्हें वह दर्ज करता है, और बताता है कि किन फ़ील्डों के बारे में वह उत्तर नहीं दे सकता; जब आपको वर्तमान परिभाषाओं पर भरोसा हो, तो `mcpsnoop baseline --accept` से दोबारा रिकॉर्ड करें।
रिडक्शन जो रिकॉर्ड करता है, उसे बदलने से विचलन की तुलना भी बदल जाती है। `--redact-value` के बिना लिया गया और फिर उसके साथ लिए गए कैप्चर के विरुद्ध जाँचा गया आधार, साफ किए गए फ़ील्डों को बदले हुए रिपोर्ट करता है, जो सही है, क्योंकि दर्ज की गई परिभाषा वास्तव में बदल गई थी। रिडक्शन सेटिंग्स बदलने के बाद `--accept` के साथ दोबारा रिकॉर्ड करें।
प्रत्येक सर्वर के लिए एक स्थिर, अद्वितीय `--label` उपयोग करें जिसका कमांड नाम या लक्ष्य होस्ट अन्यथा टकराएगा। आधार सामान्य mcpsnoop स्टेट निर्देशिका के अंतर्गत संग्रहीत होते हैं, इसलिए `MCPSNOOP_HOME` और `XDG_STATE_HOME` लागू होते हैं।```bash
mcpsnoop check --fail-on drift session.jsonl
mcpsnoop baseline session.jsonl
mcpsnoop baseline --accept session.jsonl # trust a legitimate definition change
mcpsnoop baseline --reset session.jsonl # trust the next complete tools/list
अस्थायी CI में स्टेट डायरेक्टरी खाली शुरू होती है, इसलिए पहला रन केवल बेसलाइन रिकॉर्ड करता है
और कोई ड्रिफ्ट रिपोर्ट नहीं करता। बेसलाइन को रनों के बीच बनाए रखना आवश्यक है ताकि
बाद के रन इसके विरुद्ध सत्यापित कर सकें। --baseline को checked-in या cached
डायरेक्टरी पर इंगित करें, या MCPSNOOP_HOME को persisted पथ पर सेट करें।```bash
mcpsnoop check --fail-on drift --baseline .mcpsnoop/baselines session.jsonl
`drift` `check` के लिए ऑप्ट-इन है; डिफ़ॉल्ट `error,invalid,warn` गेट अपरिवर्तित है।
### अप्रचलित प्रोटोकॉल सुविधाओं को फ़्लैग करें
2026-07-28 संशोधन Roots, Sampling और Logging को अप्रचलित करता है। वे कम से कम एक वर्ष तक काम करते रहते हैं, इसलिए mcpsnoop उन्हें त्रुटियों के रूप में मानने के बजाय चिह्नित करता है। स्ट्रीम, क्षमता निरीक्षक, और एक्सपोर्ट सभी उन्हें फ़्लैग करते हैं, और प्रत्येक मार्कर प्रतिस्थापन का नाम बताता है।
तीनों में से दो अब केवल मल्टी राउंड-ट्रिप अनुरोध के माध्यम से पहुंच योग्य हैं, जहां विधि का नाम फ्रेम पर ही न होकर सर्वर के `inputRequests` मैप के अंदर होता है। उन्हें भी फ़्लैग किया जाता है, ताकि जो सर्वर नए पैटर्न पर स्थानांतरित हो गया है वह चुपचाप रिपोर्ट करना बंद न कर दे।```bash
mcpsnoop check --fail-on deprecated session.jsonl
जिस तरह drift, उसी तरह deprecated भी opt-in (वैकल्पिक) है। एक डिफ़ॉल्ट रन गिनती की रिपोर्ट करता है और हरा (green) बना रहता है, इसलिए एक सत्र जो अभी भी वैध deprecated सुविधा का उपयोग करता है, अपने आप CI को लाल नहीं करता।
एक सर्वर पूरी तरह से मान्य हो सकता है और फिर भी एजेंट के लिए उपयोग करना कठिन हो सकता है। क्लाइंट इस बात में भिन्न होते हैं कि वे वास्तव में JSON Schema का कितना समर्थन करते हैं, और एक टूल जिसे मॉडल बार-बार गलत तरीके से कॉल करता रहता है, अक्सर वह टूल होता है जिसकी स्कीमा ने क्लाइंट की क्षमता से अधिक माँग की हो।
s से खोला गया टूल सारांश, एक SCHEMA कॉलम रखता है जो प्रत्येक विज्ञापित टूल की स्कीमा के बारे में सबसे उल्लेखनीय बात का नाम बताता है, जिसमें एक से अधिक प्रकार होने पर अंत में + जुड़ा होता है।
पहले को छोड़कर बाकी सभी निर्णय (verdicts) के बजाय अवलोकन हैं। oneOf का उपयोग करने वाली स्कीमा गलत नहीं है, केवल संभावना है कि इसे विभिन्न क्लाइंट अलग-अलग तरीके से पढ़ेंगे, और एक स्कीमा अपनी पसंद का कोई भी डायलेक्ट घोषित कर सकती है। no root अपवाद है: Tool परिभाषा के लिए inputSchema आवश्यक है और इसके रूट प्रकार को "object" पर पिन करती है, इसलिए एक क्लाइंट जो लिस्टिंग को मान्य करता है, उस टूल को पूरी तरह से अस्वीकार कर देता है और यह कभी कॉल करने योग्य नहीं बनता, और वायर (wire) पर यह बताने के लिए कुछ भी नहीं होता कि क्यों। no root इसी कारण कॉलम की अगुवाई करता है, और mcpsnoop के अपने रिडक्शन द्वारा साफ़ की गई स्कीमा की कभी रिपोर्ट नहीं की जाती, क्योंकि एक अपठनीय स्कीमा गलत स्कीमा नहीं है।
यह विभाजन तय करता है कि check उनके साथ क्या करता है। no root tools/list फ्रेम पर एक चेतावनी है, इसलिए यह बिना किसी फ्लैग के डिफ़ॉल्ट error,invalid,warn गेट पर विफल हो जाता है, और यही बात है: एक सर्वर जो एक अनुपयोगी टूल भेजता है, हर हैंडशेक का सामान्य रूप से उत्तर देता है और बस कभी tools/call प्राप्त नहीं करता। अवलोकनों को schema_findings के रूप में गिना जाता है और schema findings: के अंतर्गत रिपोर्ट किया जाता है, और केवल तब रन को विफल करते हैं जब आप --fail-on में schema जोड़ते हैं। दोनों --format junit और --format sarif तक पहुँचते हैं, और export प्रति-टूल सूची को summary.definitions.per_tool[].findings के अंतर्गत रखता है।```bash
mcpsnoop check session.jsonl # a non-object root already fails this
mcpsnoop check --fail-on schema session.jsonl # and now so do the observations
कॉलम चेतावनी रंग धारण करता है और कभी भी ERR कॉलम का लाल रंग नहीं, और mcpsnoop अभी भी अपने अग्रेषित ट्रैफ़िक के बारे में कुछ भी नहीं बदलता है।
कुछ भी हल या प्राप्त नहीं किया जाता। एक बाहरी `$ref` को केवल उसके रूप से पहचाना जाता है, और जिस स्कीमा की ओर वह इंगित करता है उसे कभी नहीं पढ़ा जाता।
### देखें कि सर्वर आपको संदर्भ में कितना खर्च करता है
टूल परिभाषाएँ हर वार्तालाप पर मॉडल के संदर्भ में प्रवेश करती हैं, और टूल परिणाम हर कॉल पर। टूल सारांश (`s`) आपके वास्तव में कैप्चर किए गए सत्र से दोनों को मापता है।
`definitions` पंक्ति निश्चित लागत है: एक भी कॉल किए जाने से पहले इस सर्वर का `tools/list` कितना वज़न रखता है। `DEF` कॉलम इसे प्रति टूल तोड़ता है, और `RESULT` वह है जो अब तक प्रत्येक टूल के उत्तरों की लागत रही है। तालिका त्रुटियों और विलंबता द्वारा क्रमबद्ध रहती है, इसलिए महंगी परिभाषाओं को खोजने के लिए `DEF` स्कैन करें; निर्यात उन्हें सबसे भारी पहले सूचीबद्ध करता है। तालिका के नीचे एक पंक्ति सबसे भारी एकल परिणाम का नाम बताती है, जिसे कुल योग छिपा देता है।
परिभाषा आंकड़े वे JSON हैं जिनमें से महत्वहीन रिक्त स्थान हटा दिया गया है, इसलिए जो सर्वर अपने `tools/list` को pretty-print करता है उसे उस सर्वर से अधिक महंगा नहीं गिना जाता जो नहीं करता, और वही सर्वर विभिन्न कैप्चरों में समान मापता है। `RESULT` वे बाइट्स हैं जैसे वे आए: एक परिणाम एक बार का पेलोड है, न कि सामान्यीकृत करने लायक अनुबंध।```bash
mcpsnoop export -T json | jq '.summary.definitions'
निर्यात में समान आँकड़े होते हैं, प्रति टूल और विवरण तथा स्कीमा बाइट्स में विभाजित, ताकि एक भारी विवरण और एक भारी स्कीमा अलग-अलग रहें और दोनों में से कोई भी कैप्चर के बीच ट्रैक किया जा सके। mcpsnoop diff आपको बताता है कि क्या दो सत्रों के बीच कोई विवरण या स्कीमा बदला है; निर्यात वह जगह है जहाँ उस बदलाव का आकार रहता है।
ये बाइट्स हैं, टोकन नहीं। टोकन गणना मॉडल पर निर्भर करती है, इसलिए उसे मापने का मतलब होगा एक टोकनाइज़र शिप करना और यह चुनना कि किसका। बाइट्स सटीक हैं और आप अपना स्वयं का अनुपात लागू कर सकते हैं। एक अधूरा tools/list जो देखा उसे फ़्लोर के रूप में रिपोर्ट करता है और ऐसा कहता है, बजाय आंशिक योग को कुल के रूप में पेश करने के।
मल्टी राउंड-ट्रिप पैटर्न के तहत सर्वर क्लाइंट को एक अपारदर्शी requestState देता है और क्लाइंट को पुनः प्रयास पर उसे बिना छेड़े वापस भेजना होता है। सर्वर को इसे हमलावर-नियंत्रित इनपुट मानने के लिए कहा गया है, क्योंकि जो क्लाइंट इसमें छेड़छाड़ करता है वह सर्वर व्यवहार बदलने या प्राधिकरण जाँच को दरकिनार करने का प्रयास कर सकता है।
पाइप में बैठा mcpsnoop मान को जाते और वापस आते देखता है, इसलिए वह बता सकता है कि अनुबंध कब तोड़ा गया। तीन तरीके हैं जिनसे यह टूट सकता है, प्रत्येक को पुनः प्रयास पर एक प्रोटोकॉल चेतावनी के रूप में रिपोर्ट किया जाता है।
| Reported | Means |
|---|---|
MRTR retry changed requestState | क्लाइंट ने सर्वर द्वारा जारी की गई चीज़ के अलावा कुछ और वापस भेजा |
MRTR retry is missing requestState | सर्वर ने एक जारी किया था और पुनः प्रयास में उसे छोड़ दिया गया |
MRTR retry invented requestState | पुनः प्रयास में वह ले जाया गया जो सर्वर ने कभी जारी नहीं किया |
ये हमारे अवलोकनों के बजाय क्लाइंट द्वारा प्रोटोकॉल उल्लंघन हैं, इसलिए ये सामान्य चेतावनी संकेत पर चलते हैं और डिफ़ॉल्ट check रन उनमें से एक पर विफल होता है। यह जानबूझकर है। सर्वर स्थिति के साथ छेड़छाड़ करने वाला क्लाइंट बिल्ड रोकने लायक है।
मान स्वयं कभी प्रदर्शित या लॉग नहीं किया जाता, और कोई भी चीज़ उसे डिकोड या पार्स नहीं करती। यह एक एन्क्रिप्टेड ब्लॉब हो सकता है जिसमें एक प्रिंसिपल और एक टोकन हो, और अपारदर्शी बाइट्स की तुलना करना ही पूरी जाँच है।
एक मामला पहुँच से बाहर है। जब कोई सर्वर requestState के साथ उत्तर देता है और कोई inputRequests नहीं देता, तो छेड़छाड़ किया गया पुनः प्रयास किसी से मेल नहीं खाता और किसी कुंजी का उत्तर नहीं देता, इसलिए उसे मूल अनुरोध से जोड़ने के लिए कुछ भी नहीं बचता और यह उल्लंघन के बजाय असंबंधित कॉल के रूप में पढ़ा जाता है।
कैप्चर को उस मशीन पर स्थानीय रखें जहाँ ट्रैफ़िक होता है और नेटवर्क हॉप के लिए SSH का उपयोग करें, ताकि mcpsnoop को कभी अपने स्वयं के रिमोट ट्रांसपोर्ट की आवश्यकता न पड़े।
TUI को अपने वर्कस्टेशन पर चलाएँ और रिमोट मशीन के mcpsnoop सॉकेट को वापस उस पर फ़ॉरवर्ड करें। लाइव टनल SSH यूनिक्स-सॉकेट फ़ॉरवर्डिंग का उपयोग करता है, इसलिए दोनों छोर Linux या macOS पर चलने चाहिए। Windows पर, नीचे दी गई पोस्ट-मॉर्टम लॉग प्रति का उपयोग करें।```bash
mcpsnoop
ssh remote-user@remote-host 'mkdir -p ~/.local/state/mcpsnoop'
mcpsnoop remote remote-user@remote-host
mcpsnoop -- node build/index.js
सॉकेट रिमोट की स्टेट डायरेक्टरी के अंतर्गत रहता है, जिसे `MCPSNOOP_HOME` के रूप में हल किया जाता है,
अन्यथा `XDG_STATE_HOME/mcpsnoop`, अन्यथा `~/.local/state/mcpsnoop`। डिफ़ॉल्ट रूप से mcpsnoop
आपके `user@host` से Linux होम `/home/<user>` मान लेता है और जब भी वह उस अनुमान पर
वापस आता है, stderr पर एक अनुस्मारक प्रिंट करता है। यदि रिमोट कहीं और हल होता है,
तो उस एक गैर-डिफ़ॉल्ट भाग का नाम बताएं।```bash
# a non-Linux or custom home, macOS is /Users/<user> and root is /root
mcpsnoop remote --remote-home /Users/remote-user remote-user@remote-host
# an explicit MCPSNOOP_HOME on the remote
mcpsnoop remote --remote-mcpsnoop-home /srv/mcpsnoop remote-user@remote-host
# an explicit XDG_STATE_HOME on the remote
mcpsnoop remote --remote-xdg-state-home /var/lib/state remote-user@remote-host
SSH के माध्यम से किसी दूरस्थ सत्र को सीधे TUI में स्ट्रीम करें, किसी स्थानीय प्रतिलिपि की आवश्यकता नहीं है।```bash ssh remote-user@remote-host 'cat ~/.local/state/mcpsnoop/sessions/session.jsonl' | mcpsnoop open -
इसके बजाय एक स्थानीय प्रति रखने के लिए, लॉग्स को अपनी sessions निर्देशिका में scp करें और
सामान्य रूप से TUI चलाएँ।```bash
# copy the remote logs into your local sessions directory
mkdir -p ~/.local/state/mcpsnoop/sessions
scp remote-user@remote-host:'~/.local/state/mcpsnoop/sessions/*.jsonl' \
~/.local/state/mcpsnoop/sessions/
# open the TUI, it backfills the copied sessions
mcpsnoop
mcpsnoop आपके द्वारा लपेटे गए सर्वर कमांड को चलाता है, इसलिए केवल उन्हीं सर्वरों को लपेटें जिन पर आप भरोसा करते हैं, और अविश्वसनीय सर्वरों को कंटेनर में चलाएँ। यह कभी भी ऐसी कोई चीज़ निष्पादित नहीं करता जो आपने अपने क्लाइंट कॉन्फ़िग में नहीं डाली है।
कैप्चर किए गए फ़्रेम में प्रॉम्प्ट, टूल आर्गुमेंट, क्रेडेंशियल और टूल परिणाम शामिल हो सकते हैं। यदि पेलोड रहस्य ले जा सकते हैं, तो अवलोकित ट्रेस प्रतियों को साफ़ करने के लिए रिडक्शन का विकल्प चुनें, जबकि प्रॉक्सी किए गए बाइट्स बिना बदले पास होते रहते हैं।
कुंजी-आधारित रिडक्शन मेल खाने वाली JSON ऑब्जेक्ट कुंजियों के अंतर्गत संपूर्ण मानों को बदल देता है, और
यही कुंजी सेट लपेटे गए सर्वर के कमांड-लाइन आर्गुमेंट पर भी best effort लागू किया जाता है,
इसलिए --api-key=sk-x और --token sk-x को --redact-secrets के अंतर्गत साफ़ कर दिया जाता है।
ऐसा आर्गुमेंट जो बिना पहचाने जाने योग्य फ़्लैग नाम के कोई रहस्य ले जाता है,
उसका पता नहीं लगाया जा सकता।
पथ-आधारित रिडक्शन केवल उन्हीं मानों को बदलता है जिन्हें JSONPath एक्सप्रेशन द्वारा चुना गया हो,
जो तब उपयोगी होता है जब कोई सामान्य कुंजी नाम एक स्थान पर संवेदनशील हो लेकिन दूसरे में
सुरक्षित हो। एक से अधिक स्थानों को साफ़ करने के लिए --redact-path को दोहराएँ।
मान-आधारित रिडक्शन अवलोकित स्ट्रिंग मानों, stderr टेक्स्ट और गैर-JSON टेक्स्ट फ़्रेम पर रेगुलर एक्सप्रेशन लागू करता है।
ये तीनों ही best effort हैं। रेगेक्स रहस्यों को चूक सकते हैं, हानिरहित टेक्स्ट का अत्यधिक मिलान कर सकते हैं, या रूपांतरित या एन्कोडेड मानों को देखने में विफल हो सकते हैं।
रिडक्शन कभी आरोप में नहीं बदलता। हर वह जाँच जो किसी अवलोकित चीज़ की तुलना किसी दूसरी से करती है,
रूटिंग हेडर की तुलना बॉडी से, Mcp-Param मान की तुलना उस आर्गुमेंट से जिसे वह प्रतिबिंबित करता है,
किसी टूल के स्कीमा की तुलना उससे जो रिवीज़न उससे अपेक्षा करती है,
जानती है कि mcpsnoop ही वह पक्ष था जिसने बाइट्स को दोबारा लिखा, और
उपयोगकर्ता की अपनी गोपनीयता सेटिंग के कारण किसी सर्वर की रिपोर्ट करने के बजाय चुप रहती है।
टूल-परिभाषा ड्रिफ़्ट अपवाद है, और जानबूझकर ऐसा है, क्योंकि रिडक्शन चालू करने से यह बदल जाता है कि क्या रिकॉर्ड किया जाता है
और इसलिए बेसलाइन में क्या दर्ज रहता है।
टूल-परिभाषा ड्रिफ़्ट का पता लगाएँ देखें।```bash
mcpsnoop --redact-secrets -- node build/index.js
mcpsnoop --redact-key token,api_key,password -- node build/index.js
mcpsnoop --redact-path '$.params.arguments.password' -- node build/index.js
mcpsnoop --redact-path '$.params.arguments.accounts[*].password' -- node build/index.js
mcpsnoop --redact-value 'sk-[A-Za-z0-9]+' -- node build/index.js
mcpsnoop http --target http://localhost:3000/mcp --redact-secrets --redact-value 'Bearer\s+\S+'
For remote workflows, use SSH tunnelling or SSH file transfer so transport auth, encryption, host verification, key rotation, and audit policy stay in your existing SSH setup.
रिमोट वर्कफ़्लो के लिए, SSH टनलिंग या SSH फ़ाइल ट्रांसफ़र का उपयोग करें ताकि परिवहन प्रमाणीकरण, एन्क्रिप्शन, होस्ट सत्यापन, कुंजी रोटेशन, और ऑडिट नीति आपके मौजूदा SSH सेटअप में बनी रहे।
## Contributing
## योगदान
Issues and pull requests are welcome. See [CONTRIBUTING.md](https://github.com/kerlenton/mcpsnoop/blob/HEAD/CONTRIBUTING.md) for the details.
इश्यू और पुल रिक्वेस्ट का स्वागत है। विवरण के लिए [CONTRIBUTING.md](https://github.com/kerlenton/mcpsnoop/blob/HEAD/CONTRIBUTING.md) देखें।
## License
## लाइसेंस
[MIT](https://github.com/kerlenton/mcpsnoop/blob/HEAD/LICENSE)
[MIT](https://github.com/kerlenton/mcpsnoop/blob/HEAD/LICENSE)
| कमांड | यह क्या करता है |
|---|
mcpsnoop -- <server> | stdio सर्वर को पारदर्शी शिम के रूप में लपेटता है |
mcpsnoop | लाइव TUI खोलता है |
mcpsnoop http --target <url> | स्ट्रीमेबल-HTTP सर्वर को प्रॉक्सी करता है |
mcpsnoop export | सत्र को json, html, text, har, या otlp में रेंडर करता है |
mcpsnoop check | त्रुटियों, अमान्य फ़्रेम, चेतावनियों, रूटिंग विसंगतियों, हैंग हुए कॉल, या देर से आने वाले परिणामों पर CI को विफल करता है |
mcpsnoop baseline | विश्वसनीय टूल परिभाषाओं का निरीक्षण, स्वीकार या रीसेट करता है |
mcpsnoop diff | दो कैप्चर किए गए सत्रों में टूल और कॉल की तुलना करता है |
mcpsnoop open | TUI में सहेजे गए सत्र को खोलता है |
mcpsnoop prune | कटऑफ़ से पुराने सहेजे गए सत्र लॉग को हटाता है |
mcpsnoop wrap <server> | Claude Desktop के किसी एक सर्वर को mcpsnoop के माध्यम से रूट करता है |
mcpsnoop unwrap <server> | उस सर्वर की प्रविष्टि को पहले जैसी स्थिति में लौटा देता है |
mcpsnoop remote <user@host> | SSH टनल कमांड प्रिंट करता है |
mcpsnoop demo | एक स्क्रिप्टेड सत्र चलाता है |
| MCP Inspector | mcpsnoop |
|---|
| आपके वास्तविक क्लाइंट और सर्वर ट्रैफ़िक को देखता है | नहीं | हाँ |
| हैंग हुए कॉल और स्ट्रीम त्रुटियों को फ़्लैग करता है | नहीं | हाँ |
| स्ट्रीम को दूषित करने वाले आउटपुट को फ़्लैग करता है | नहीं | हाँ |
| अमान्य JSON-RPC फ़्रेम को फ़्लैग करता है | नहीं | हाँ |
| स्वीकृति के बाद टूल परिभाषा में ड्रिफ्ट का पता लगाता है | नहीं | हाँ |
| इंटरैक्टिव टर्मिनल UI | नहीं | हाँ |
| शून्य-कॉन्फ़िग, न फ़्लैग, न क्रम | नहीं | हाँ |
| क्षमता निरीक्षक | आंशिक | हाँ |
| कैप्चर किए गए कॉल को रीप्ले करता है | नहीं | हाँ |
| सत्र निर्यात (json / html / text / otlp) | नहीं | हाँ |
| एकल बाइनरी, कोई रनटाइम निर्भरता नहीं | नहीं | हाँ |
| Signal | Fails on |
|---|
error | एक कॉल जिसका उत्तर JSON-RPC त्रुटि के साथ दिया गया, एक परिणाम जो isError चिह्नित है, या एक कार्य जो विफलता में समाप्त हुआ |
invalid | प्रोटोकॉल चैनल पर एक फ्रेम जो मान्य JSON-RPC नहीं है, आमतौर पर सर्वर stdout पर लॉगिंग कर रहा हो |
warn | एक फ्रेम जो MCP या JSON-RPC विनिर्देश द्वारा निर्धारित किसी अपेक्षा को तोड़ता है |
mismatch | एक रूटिंग हेडर जो बॉडी से असहमत है, बैच पर सवार है, या जहाँ संशोधन की आवश्यकता है वहाँ अनुपस्थित है |
pending | एक अनुरोध जो कैप्चर समाप्त होने पर भी खुला था, जिससे कॉल करने वाला प्रतीक्षा में रह गया |
late-result | एक प्रतिक्रिया जो उसके अनुरोध को रद्द करने के बाद आई |
drift | एक विज्ञापित टूल परिभाषा जो बेसलाइन स्वीकृत होने के बाद बदल गई |
deprecated | एक सुविधा जिसे विनिर्देश ने हटा दिया है |
incomplete | ऊपर से गिराए गए फ्रेम, जो हर अन्य गणना को कुल के बजाय न्यूनतम सीमा बनाते हैं |
schema | एक विज्ञापित स्कीमा जो किसी ऐसे निर्माण या बोली का उपयोग करती है जो क्लाइंट्स के बीच खराब यात्रा करती है |
| दिखाया गया | अर्थ |
|---|
no root | inputSchema अनुपस्थित है, JSON ऑब्जेक्ट नहीं है, या रूट प्रकार "object" के अलावा कुछ और है |
dialect | एक $schema जो रिवीज़न द्वारा डिफ़ॉल्ट रूप से उपयोग किए जाने वाले 2020-12 के अलावा किसी अन्य डायलेक्ट का नाम देता है |
ext ref | एक $ref जो दस्तावेज़ के बाहर इंगित करता है, जो वह स्थिति भी है जिसके बारे में स्पेक कार्यान्वयनकर्ताओं को चेतावनी देता है कि वे आँख मूंदकर पालन न करें |
oneOf, anyOf, allOf, not | एक संरचना कीवर्ड, जिसे विभिन्न क्लाइंट असंगत रूप से संभालते हैं |
ref | एक $ref जो उसी दस्तावेज़ के भीतर इंगित करता है |
untyped | एक प्रॉपर्टी जो कोई प्रकार घोषित नहीं करती और यह बताने का कोई अन्य तरीका भी नहीं देती कि यह क्या स्वीकार करती है |