Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
mcpsnoop — Wireshark for MCP. एक पारदर्शी प्रॉक्सी जो आपके AI क्लाइंट और आपके MCP सर्वरों के बीच होने वाली हर वास्तविक टूल कॉल को आपके टर्मिनल में लाइव दिखाती है। | Kitploit
उपकरण/GitHubGitHub/kerlenton/mcpsnoop
सामान्य उपयोगिताएँगतिशील विश्लेषण (सैंडबॉक्सिंग)नेटवर्क मैपिंगवेब प्रॉक्सी और अवरोधनस्क्रिप्टिंग और स्वचालनएपीआई सुरक्षा परीक्षणडीबगर्सलॉग विश्लेषण
GitHubkerlenton/mcpsnoop

mcpsnoop

Wireshark for MCP. एक पारदर्शी प्रॉक्सी जो आपके AI क्लाइंट और आपके MCP सर्वरों के बीच होने वाली हर वास्तविक टूल कॉल को आपके टर्मिनल में लाइव दिखाती है।

रिपॉजिटरी देखें
334322014 दिन पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

mcpsnoop

MCP के लिए Wireshark। एक पारदर्शी प्रॉक्सी जो आपके AI क्लाइंट और आपके MCP सर्वर के बीच हर वास्तविक टूल कॉल को आपके टर्मिनल में लाइव दिखाता है।

CI Go Reference MIT Marketplace

mcpsnoop demo

समस्या

आधिकारिक MCP Inspector अपने स्वयं के क्लाइंट के रूप में कनेक्ट होता है, इसलिए यह कभी नहीं देखता कि आपका क्लाइंट (Cursor, Claude Code, Codex) वास्तव में आपके सर्वर को क्या भेजता है। और जो भी अनुरोध आने का इंतज़ार करता है, वह उस कॉल को नहीं दिखा सकता जो मॉडल ने कभी नहीं की, या गलत तर्कों के साथ की। जब कोई टूल चुपचाप कॉल नहीं होता, क्षमताएँ मेल नहीं खातीं, या कोई कॉल बस अटक जाती है, तो आप लॉग खंगालने और अनुमान लगाने में फँसे रह जाते हैं।

अपने सर्वर कमांड को इसके साथ लपेटें और हर JSON-RPC फ्रेम को लाइव देखें, जब आपका वास्तविक क्लाइंट और सर्वर बात करते हैं।

mcpsnoop इसके बजाय वास्तविक डेटा पथ में बैठता है।

CI में

यह पृष्ठ mcpsnoop GitHub Action की सूची भी है, इसलिए यहाँ इसका पूरा विवरण है। यह कैप्चर किए गए सत्र की जाँच करता है, हर निष्कर्ष को कोड स्कैनिंग अलर्ट के रूप में दर्ज करता है, और जिस पर आपने गेट लगाया है उस पर जॉब को विफल कर देता है।```yaml permissions: security-events: write contents: read

steps:

  • uses: kerlenton/[email protected] with: session: artifacts/session.jsonl
root@kitploit:~
जो भी रिलीज़ आप चाहें उसे पिन करें। सबसे नया [रिलीज़ पेज](https://github.com/kerlenton/mcpsnoop/releases) पर है। हर इनपुट, एग्ज़िट कोड का क्या मतलब है, और एक्शन के बिना इसे कैसे जोड़ें, यह सब नीचे [The GitHub Action](#the-github-action) में दिया गया है।

## त्वरित आरंभ

इसे तुरंत देखें, बिना कुछ सेट अप किए।```bash
mcpsnoop demo

इसे वास्तव में उपयोग करने के लिए, अपने सर्वर को अपने क्लाइंट के MCP कॉन्फ़िग में लपेटें।```json { "mcpServers": { "my-server": { "command": "mcpsnoop", "args": ["--", "node", "build/index.js"] } } }

root@kitploit:~
`--` के बाद जो कुछ भी है वह वह कमांड है जो सामान्य रूप से आपके सर्वर को लॉन्च करता है। इसे बदलकर वही डालें जो आप पहले से उपयोग करते हैं, जैसे `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

root@kitploit:~
कोई फ्लैग नहीं, कोई सॉकेट पाथ नहीं, याद रखने के लिए कोई स्टार्टअप ऑर्डर नहीं। शिम और UI अपने आप एक-दूसरे को ढूंढ लेते हैं, और UI डिस्क से पिछले सत्रों को बैकफिल करता है।

स्ट्रीमेबल-HTTP सर्वर के लिए, mcpsnoop को रिवर्स प्रॉक्सी के रूप में चलाएं।```bash
mcpsnoop http --target http://localhost:3000/mcp --listen :7000

हर प्रतिक्रिया का HTTP स्टेटस स्ट्रीम में दिखता है, इसलिए एक प्रतिक्रिया जो अपने आप में कोई JSON-RPC संदेश नहीं रखती, वह भी कुछ न होने के बजाय एक दृश्य फ्रेम होती है: 401 चैलेंज, अस्वीकृत Origin पर 403, नोटिफिकेशन स्वीकार करने वाला 202, और 502 जब लक्ष्य तक बिल्कुल नहीं पहुंचा जा सकता। एक 401 का WWW-Authenticate हेडर शब्दशः रखा जाता है और इंस्पेक्टर में दिखाया जाता है, क्योंकि यह ऑथ स्कीम और आगे जाने के लिए संसाधन मेटाडेटा का नाम बताता है। TUI में status:401 से स्टेटस के अनुसार फ़िल्टर करें, या status:err से किसी भी विफलता के अनुसार। एक 4xx या 5xx एक त्रुटि माना जाता है, इसलिए एक डिफ़ॉल्ट mcpsnoop check रन उस पर विफल हो जाता है।

आपका अपना कोई सर्वर नहीं है? एक प्रकाशित टेस्ट सर्वर के खिलाफ, अपने स्वयं के क्लाइंट द्वारा संचालित, इसे वास्तव में आज़माएं। किसी सत्र को होने के बाद निरीक्षण करने के लिए, लॉग से पिछले सत्रों की समीक्षा करें देखें।

कॉन्फ़िग फ़ाइल

यदि आप किसी प्रोजेक्ट में समान शिम फ़्लैग का पुनः उपयोग करते हैं, तो उन्हें वर्तमान कार्यशील निर्देशिका में एक .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

root@kitploit:~
`redact-key`, `redact-value`, और `redact-path` को अपनी-अपनी पंक्तियों में दोहराएँ ताकि
इनमें से प्रत्येक को एक से अधिक बार जोड़ा जा सके।

ये सभी कुंजियाँ हैं जिन्हें यह समर्थन करता है।

फ़ाइल केवल वर्तमान कार्यशील निर्देशिका में देखी जाती है, मूल निर्देशिकाओं में नहीं।

स्पष्ट कमांड-लाइन फ़्लैग कॉन्फ़िग फ़ाइल के मानों को ओवरराइड करते हैं।

## Commands

| Command | What it does |
|---|---|
| `mcpsnoop -- <server>` | wrap a stdio server as a transparent shim |
| `mcpsnoop` | open the live TUI |
| `mcpsnoop http --target <url>` | proxy a streamable-HTTP server |
| `mcpsnoop export` | render a session to json, html, text, har, or otlp |
| `mcpsnoop check` | fail CI on errors, invalid frames, warnings, routing mismatches, hung calls, late results, or a latency budget |
| `mcpsnoop baseline` | inspect, accept, or reset trusted tool definitions |
| `mcpsnoop diff` | compare tools and calls across two captured sessions |
| `mcpsnoop open` | open a saved session in the TUI |
| `mcpsnoop inventory` | list every server that has run through mcpsnoop on this machine |
| `mcpsnoop stats` | fold every stored capture into one row per server and tool |
| `mcpsnoop prune` | delete saved session logs older than a cutoff |
| `mcpsnoop wrap <server>` | route one of Claude Desktop's servers through mcpsnoop |
| `mcpsnoop unwrap <server>` | put that server's entry back the way it was |
| `mcpsnoop remote <user@host>` | print the SSH tunnel command |
| `mcpsnoop demo` | play a scripted session |

पूरी सूची के लिए `mcpsnoop help` चलाएँ, या किसी एक के फ़्लैग के लिए `mcpsnoop help <command>` चलाएँ।

## How it compares

| | MCP Inspector | mcpsnoop |
|---|:---:|:---:|
| Sees your real client and server traffic | no | yes |
| Flags hung calls and stream errors | no | yes |
| Flags stray output that corrupts the stream | no | yes |
| Flags malformed JSON-RPC frames | no | yes |
| Detects tool definition drift after approval | no | yes |
| Interactive terminal UI | no | yes |
| Zero-config, no flags or ordering | no | yes |
| Capability inspector | partial | yes |
| Replay a captured call | no | yes, over stdio and over HTTP |
| Session export (json / html / text / otlp) | no | yes |
| Single binary, no runtime deps | no | yes |

## Install

### npm

कोई Go टूलचेन आवश्यक नहीं है। अधिकांश MCP सर्वर Node या Python में लिखे गए हैं, इसलिए यह
सबसे छोटा रास्ता है।```bash
npx mcpsnoop -- node build/index.js

npm पैकेज अपने आप में कोई कोड नहीं भेजता। छह प्लेटफ़ॉर्म पैकेजों में से प्रत्येक एक बिल्ड रखता है, और npm केवल वही इंस्टॉल करता है जो आपकी मशीन से मेल खाता है, इसलिए इंस्टॉल के समय डाउनलोड करने के लिए कुछ भी नहीं होता और प्रॉक्सी में अनब्लॉक करने के लिए कुछ भी नहीं होता। इसे हर बार चलाने पर फिर से लाने के बजाय स्थायी रूप से रखने के लिए, npm i -g mcpsnoop चलाएँ।

Go```bash

go install github.com/kerlenton/mcpsnoop/cmd/mcpsnoop@latest

root@kitploit:~
### होमब्रू```bash
brew install mcpsnoop

हर प्लेटफ़ॉर्म के लिए प्रीबिल्ट बाइनरी Releases पेज पर उपलब्ध हैं।

शेल कम्प्लीशन

mcpsnoop bash, zsh, fish और PowerShell के लिए कम्प्लीशन के साथ आता है। सेटअप चरणों के लिए mcpsnoop completion <shell> --help चलाएँ, जिसमें कम्प्लीशन सक्षम करना और आपके OS के लिए इंस्टॉल पथ शामिल है।

यह कैसे काम करता है

mcpsnoop आपके AI क्लाइंट और आपके MCP सर्वरों के बीच पाइप में बैठता है, हर JSON-RPC फ्रेम को लाइव टर्मिनल UI में कॉपी करता है

mcpsnoop एक बाइनरी में दो भूमिकाएँ निभाता है। mcpsnoop -- <server> पारदर्शी शिम है जिसे आपका क्लाइंट स्पॉन करता है, बाइट्स को शब्दशः आगे भेजता है जबकि हर फ्रेम की एक कॉपी हब को भेजता है। बिना किसी तर्क के mcpsnoop वह हब और उसका लाइव TUI है। ये एक जाने-माने सॉकेट और डिस्क पर मौजूद लॉग के माध्यम से जुड़ते हैं, इसलिए किसी को भी पहले शुरू नहीं करना पड़ता।

हब डिफ़ॉल्ट रूप से नवीनतम 100 सहेजे गए सत्र लोड करता है, पुराने ट्रेस को हटाए बिना स्टार्टअप कार्य को सीमित रखता है। दूसरी सीमा चुनने के लिए mcpsnoop --history-limit N का उपयोग करें, या पूरा इतिहास लोड करने के लिए mcpsnoop --history-limit 0 का उपयोग करें। पुराने सत्र mcpsnoop open <session-id> और mcpsnoop export <session-id> के माध्यम से उपलब्ध रहते हैं।

इतिहास सीमा यह बताती है कि कितने सत्र लोड किए जाते हैं। एक सत्र के अंदर, लाइव TUI दो बार सीमित है, क्योंकि एक हब जो बातूनी सर्वर देखता रहता है वह अन्यथा तब तक बढ़ता रहता है जब तक उसे मार न दिया जाए। यह अधिकतम 64 MiB फ्रेम बॉडी रखता है, सबसे पुराने को पहले जारी करता है, और अधिकतम 200,000 फ्रेम रखता है, उसके बाद सबसे पुराने को पूरी तरह से हटा देता है। पहली सीमा वह है जिसका सामना बड़े पेलोड के कैप्चर में होता है और दूसरी वह है जो छोटे नोटिफिकेशन की लंबी धारा में होती है।

कोई भी सीमा उत्तर नहीं बदलती। जिस फ्रेम की बॉडी जारी की गई है वह अपनी पंक्ति, अपना निर्णय और टाइमलाइन में अपना स्थान बनाए रखता है, और उसका इंस्पेक्टर कहता है कि बॉडी चली गई है बजाय खाली फ्रेम दिखाने के। जिस फ्रेम को पूरी तरह से हटा दिया गया है वह पहले अपने टूल कॉल के आँकड़ों को चालू कुल में ले जाता है, इसलिए टूल सारांश और संदर्भ में सर्वर की लागत सत्र द्वारा किए गए हर कॉल का वर्णन करती है, न कि केवल हाल के कॉलों का। स्ट्रीम फुटर कहता है कि कितने पुराने फ्रेम केवल डिस्क पर हैं, और r उस फ्रेम को अस्वीकार कर देता है जिसके पैरामीटर अब उसके पास नहीं हैं बजाय कुछ और रीप्ले करने के।

mcpsnoop open <session-id> लॉग पढ़ता है और उसे पूरा रखता है, और TUI से निर्यात भी लॉग पढ़ता है, इसलिए कोई भी सीमित नहीं है। check, export और diff जानबूझकर एक असीमित स्टोर बनाते हैं, क्योंकि एक गेट जो बड़े कैप्चर पर कम रिपोर्ट करता है वह उससे बदतर है जो मेमोरी का उपयोग करता है।

इतिहास सीमा यह बताती है कि क्या लोड किया जाता है। 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

root@kitploit:~
`--older-than` आवश्यक है (कोई डिफ़ॉल्ट नहीं है जो कुछ भी हटा दे) और
`30d` जैसी दिनों की गिनती या `72h` जैसी Go अवधि स्वीकार करता है। टूल बेसलाइन को
अकेला छोड़ दिया जाता है, क्योंकि बेसलाइन सत्र के बजाय सर्वर लेबल द्वारा कुंजीबद्ध होती है।

क्योंकि यह वास्तविक पाइप में बैठता है, Inspector की तरह किनारे पर नहीं, यह
ठीक वही देखता है जो आपका वास्तविक क्लाइंट और सर्वर एक-दूसरे से कहते हैं, चाहे
सर्वर किसी भी भाषा में लिखा गया हो।

## कीबाइंडिंग

| Key | Action | | Key | Action |
|---|---|---|---|---|
| `enter` | निरीक्षण / अंदर जाएँ | | `/` | फ़िल्टर |
| `esc` | वापस | | `:` | कमांड |
| `j` / `k` | हिलाएँ | | `r` / `R` | रीप्ले / संपादित करें और रीप्ले |
| `g` / `G` | ऊपर / नीचे | | `c` | क्षमताएँ |
| `ctrl-f` / `ctrl-b` | पेज | | `s` | टूल सारांश |
| `p` | रोकें | | `y` | कॉपी |
| `shift`+`<key>` | कॉलम द्वारा क्रमबद्ध करें | | `e` | निर्यात |
| `ctrl-d` | सत्र हटाएँ | | `f` | अनुसरण करें |
| `?` | सहायता | | | |

पूरी सूची के लिए ऐप में `?` दबाएँ।

## स्ट्रीम को फ़िल्टर करना

किसी सत्र में `/` दबाएँ और स्पेस-पृथक टोकन को मिलाएँ, ANDed। सादा पाठ
विधि, टूल, id और पेलोड से मेल खाता है।

| Token | Filters by | Example |
|---|---|---|
| `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|-]

root@kitploit:~
| प्रारूप | आपको क्या मिलता है |
|---|---|
| `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 पर लिखा जाएगा, और session को छोड़ दें तो सबसे नया लिया जाएगा, या stdin से JSONL पढ़ने के लिए - पास करें। TUI में, चयनित session को HTML के रूप में export करने के लिए e दबाएँ, या command mode से :export json|html|text|har|otlp [path] चलाएँ।

Redaction

किसी मौजूदा capture को निरीक्षण या साझा करने से पहले साफ करने के लिए, capture के दौरान उपयोग किए गए वही redaction flags को 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'

root@kitploit:~
ये फ़्लैग निर्यात की गई फ़ाइल या इन-मेमोरी 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
ट्रेस एंडपॉइंट पर इंगित करके। कलेक्टर प्रमाणीकरण या टेनेंट के लिए `--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 सत्र लॉग स्थायी रिकॉर्ड बना रहता है।

सत्रों की तुलना करना

दो सहेजे गए सत्रों की तुलना आईडी या JSONL पथ द्वारा करें।```bash mcpsnoop diff before-session after-session mcpsnoop diff old.jsonl new.jsonl

root@kitploit:~
रिपोर्ट उन टूल्स को दिखाती है जो जोड़े या हटाए गए, विवरण और `inputSchema` परिवर्तन, मेल खाते टूल कॉल जिनकी स्थिति बदली, और उल्लेखनीय अवधि में बदलाव। कॉल टूल नाम और तर्कों द्वारा मिलाए जाते हैं, इसलिए पुनः क्रमबद्ध कॉल फिर भी सही ढंग से तुलना करते हैं। डिफ़ॉल्ट रूप से, अवधि परिवर्तन कम से कम 100 ms और 2x से भिन्न होने चाहिए। उन सीमाओं को समायोजित करने के लिए `--duration-threshold` और `--duration-ratio` का उपयोग करें।

रीग्रेशन पर CI को गेट करने के लिए `--exit-code` पास करें। यह गैर-शून्य निकास तब करता है जब बाद का सत्र:

- कोई टूल हटाता है
- किसी टूल का विवरण, शीर्षक, इनपुट स्कीमा, आउटपुट स्कीमा या एनोटेशन बदलता है
- ऐसा कॉल होता है जिसकी स्थिति खराब हो गई
- धीमा हो जाता है

आइकन परिवर्तन ऐसा नहीं करता, क्योंकि यह बदलता है कि टूल कैसा दिखता है बिना यह बदले कि वह क्या करता है। सुधार, जिसका अर्थ है जोड़े गए टूल, ठीक किए गए कॉल और गति वृद्धि, फिर भी शून्य निकास करते हैं।

## CI में सत्रों की जाँच करना

किसी रिकॉर्ड किए गए एजेंट रन को त्रुटियों, स्ट्रीम भ्रष्टाचार, प्रोटोकॉल चेतावनियों, रूटिंग-हेडर बेमेल, उन कॉलों पर गेट करें जिन्हें कभी प्रतिक्रिया नहीं मिली, छोड़े गए फ्रेम जो कैप्चर को अधूरा छोड़ देते हैं, टूल-परिभाषा विचलन, या पुराने प्रोटोकॉल सुविधाओं के उपयोग पर।```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 पढ़ने के लिए - का उपयोग करें।

सिग्नलविफल होता है
errorएक कॉल जिसका उत्तर JSON-RPC त्रुटि के साथ दिया गया, isError चिह्नित परिणाम, या कोई कार्य जो विफलता में समाप्त हुआ
invalidप्रोटोकॉल चैनल पर एक फ्रेम जो मान्य JSON-RPC नहीं है, आमतौर पर सर्वर stdout पर लॉगिंग कर रहा हो
warnएक फ्रेम जो MCP या JSON-RPC विनिर्देश द्वारा निर्धारित अपेक्षा को तोड़ता है
mismatchएक रूटिंग हेडर जो बॉडी से असहमत है, बैच पर सवार है, या जहाँ संशोधन इसे आवश्यक बनाता है वहाँ अनुपस्थित है
pendingएक अनुरोध जो कैप्चर समाप्त होने पर भी खुला था, इसलिए कॉलर को प्रतीक्षा में छोड़ दिया गया
late-resultएक प्रतिक्रिया जो उसके अनुरोध को रद्द करने के बाद पहुँची
driftबेसलाइन स्वीकृत होने के बाद विज्ञापित टूल परिभाषा बदलना
deprecatedएक सुविधा जिसे विनिर्देश ने अप्रचलित घोषित किया है
incompleteऊपर की ओर छोड़े गए फ्रेम, जो हर अन्य गणना को कुल के बजाय न्यूनतम सीमा बनाते हैं
schemaएक विज्ञापित स्कीमा जो ऐसे निर्माण या बोली का उपयोग करती है जो क्लाइंट्स के बीच खराब यात्रा करती है

हर सिग्नल की गणना की जाती है चाहे वह गेटिंग हो या नहीं, इसलिए एक रन बताता है कि उसने क्या पाया इससे पहले कि आप तय करें कि उस पर क्या विफल होना चाहिए।``` 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

root@kitploit:~
आउटपुट:

ड्रॉप किए गए फ्रेम की गिनती भी आर्टिफैक्ट्स के साथ यात्रा करती है, इसलिए एक कैप्चर जो
खुद को कम आंकता है, वह जहां भी खोला जाता है वहां यह बता देता है:

- 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

निकास कोड बताता है कि दो चीजों में से क्या हुआ, और एक CI रैपर को इस अंतर की आवश्यकता होती है। 1 का मतलब है कि जांच चली और कुछ गेट पर विफल रहा, इसलिए निष्कर्ष वास्तविक हैं और प्रकाशित करने लायक हैं। 2 का मतलब है कि जांच कभी हुई ही नहीं: एक पथ जो मौजूद नहीं है, एक फ़ाइल जो सत्र लॉग नहीं है, एक स्टेट डायरेक्टरी जिसमें कुछ भी नहीं है, एक फ़्लैग जो पार्स नहीं होता। 2 पर stdout पर कुछ भी नहीं लिखा जाता है, इसलिए एक पाइपलाइन कभी भी एक खाली रिपोर्ट को ऐसे अपलोड नहीं करती जैसे वह कोई फैसला हो।

वह दावा करें जो होना चाहिए और जो नहीं होना चाहिए

सिग्नल गणनाओं से परे, रन के आकार का दावा करें। ये एक-दूसरे के साथ और --fail-on के साथ संयोजित होते हैं, और कोई भी विफलता 1 पर निकलती है, वह कोड जिसका मतलब है कि जांच चली और कुछ पाया।

फ़्लैगविफल होता है जब
--max-duration <dur>एक या अधिक पूर्ण टूल कॉल ने बजट पार कर लिया, उनकी गिनती और सबसे खराब कॉल की रिपोर्ट करते हुए
--expect-tool <name>नामित टूल को कभी कॉल नहीं किया गया (दोहराने योग्य)
--forbid-tool <name>नामित टूल को कॉल किया गया (दोहराने योग्य)

a contract for the run: search must run, delete must not, nothing over 2s

mcpsnoop check --expect-tool search --forbid-tool delete --max-duration 2s run.jsonl

root@kitploit:~
### इसे वहाँ रिपोर्ट करें जहाँ 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 स्तर पर, ताकि रिपोर्ट और गेट कभी असहमत न हों।

एक परिणाम उस लॉग की ओर इशारा करता है जिससे फाइंडिंग आई थी, और यह इस बात पर निर्भर करता है कि लॉग कहाँ से पढ़ा गया था।

  • कार्यशील निर्देशिका के अंदर का पथ सापेक्ष बन जाता है, जिसे कोड स्कैनिंग रिपॉजिटरी रूट के सापेक्ष हल करता है।
  • डिस्क पर कहीं और का पथ, या स्टेट निर्देशिका से हल किया गया सत्र आईडी, एक पूर्ण file:// URI बन जाता है।
  • stdin से पढ़ने पर परिणाम में कोई स्थान नहीं होता, क्योंकि इशारा करने के लिए कोई फ़ाइल नहीं होती।

अलर्ट अपने आस-पास की पंक्तियों के साथ तभी प्रदर्शित होता है जब वह पथ विश्लेषित कमिट में एक फ़ाइल हो, इसलिए वर्कफ़्लो द्वारा artifacts/ में उत्पन्न कैप्चर एक अलर्ट खोलता है जिसमें संदेश, नियम और पंक्ति संख्या होती है लेकिन कोई स्रोत दृश्य नहीं होता। जिस कैप्चर को आप पूर्ण रूप से प्रदर्शित करना चाहते हैं उसे कमिट करना ही एकमात्र तरीका है।

कोड स्कैनिंग उस फ़ाइल को अस्वीकार कर देती है जिसके रन में 25,000 से अधिक परिणाम हों और स्वीकृत परिणामों में से केवल शीर्ष 5,000 प्रदर्शित करती है, इसलिए रिपोर्ट 5,000 पर सीमित है: पहले वे फाइंडिंग जिन पर गेट विफल हुआ, फिर एक mcpsnoop/report-truncated परिणाम जो बताता है कि कितने छोड़े गए। टेक्स्ट और junit प्रारूप पूर्ण रहते हैं।

GitHub Action

नीचे दिया गया सब कुछ वही है जो action आपके लिए करता है। यह mcpsnoop इंस्टॉल करता है, कैप्चर की जाँच करता है, फाइंडिंग को Security टैब में दर्ज करता है, और जिस पर आपने गेट लगाया है उस पर जॉब को विफल कर देता है।```yaml permissions: security-events: write contents: read

steps:

  • uses: kerlenton/[email protected] with: session: artifacts/session.jsonl
root@kitploit:~
एक रिलीज़ पिन करें, जो भी आप चाहें। सबसे नया [रिलीज़ पेज](https://github.com/kerlenton/mcpsnoop/releases) पर है। जानबूझकर कोई फ्लोटिंग `v1` नहीं है। पिन की गई रिलीज़ वही बाइनरी है जिसे एक्शन इंस्टॉल करता है, इसलिए दोनों कभी असहमत नहीं हो सकते और पुराना होने के लिए कोई डिफ़ॉल्ट वर्ज़न नहीं है।

| इनपुट | |
|---|---|
| `session` | जाँचने के लिए `.jsonl` कैप्चर, रिपॉज़िटरी रूट के सापेक्ष। आवश्यक |
| `fail-on` | `--fail-on` के रूप में, डिफ़ॉल्ट रूप से वही जो CLI डिफ़ॉल्ट करता है |
| `args` | कोई अन्य `check` फ़्लैग, कमांड लाइन की तरह उद्धृत। `--format` अस्वीकार कर दिया जाता है, क्योंकि एक्शन रिपोर्ट पढ़ता है |
| `upload-sarif` | रिपोर्ट को कोड स्कैनिंग पर भेजें। `true` |
| `category` | कोड स्कैनिंग नेमस्पेस। `mcpsnoop`. मैट्रिक्स के प्रत्येक चरण के लिए इसे बदलें, अन्यथा चरण एक-दूसरे को अधिलेखित कर देते हैं |
| `fail-on-findings` | किसी फाइंडिंग पर जॉब को विफल करें। `true`. अलर्ट दर्ज करने के लिए `false` सेट करें और कोड स्कैनिंग के आवश्यक चेक को निर्णय लेने दें |
| `version` | कौन सा mcpsnoop इंस्टॉल करना है। डिफ़ॉल्ट रूप से वह रिलीज़ जिसे आपने पिन किया है |
| `install` | `false` जब mcpsnoop पहले से ही PATH पर है, जो उस प्लेटफ़ॉर्म पर रास्ता है जिसके लिए कोई रिलीज़ नहीं बनाई गई है |

आउटपुट `outcome`, `sarif` और `exit-code` हैं। `outcome` `passed`, `findings`, या `error` है, और तीसरे को अलग से संभालना उचित है। इसका मतलब है कि कुछ भी जाँचा नहीं गया, जो कुछ न मिलने के समान नहीं है। **एक रन जो जाँच नहीं कर सका, वह जॉब को विफल कर देता है चाहे `fail-on-findings` कुछ भी कहे**, क्योंकि एक पाइपलाइन जो कुछ भी सत्यापित किए बिना हरी हो जाती है, उससे भी बदतर है जो विफल होती है।

जॉब को `security-events: write` की आवश्यकता है, अन्यथा अपलोड 403 का उत्तर देता है। कोड स्कैनिंग के बिना रिपॉज़िटरी में `upload-sarif: false` सेट करें।

### या इसे स्वयं जोड़ें

एक्शन चार चरण हैं और कोई जादू नहीं। इसे हाथ से करने में उतनी ही सावधानी लगती है जितनी लगती है। अपलोड को उन रनों पर चलना है जिनके पास रिपोर्ट है, जो वे हैं जो 0 या 1 के साथ बाहर निकले और वे नहीं जो 2 के साथ बाहर निकले, और जॉब को विफल करने वाला चरण उसके बाद आना चाहिए, अन्यथा फाइंडिंग्स उस टैब तक कभी नहीं पहुँचतीं जिस तक वे पहुँचने के लिए मौजूद हैं।```yaml
permissions:
  # required for all workflows
  security-events: write
  # only required for workflows in private repositories
  actions: read
  contents: read

steps:
- name: Check captured MCP session
  id: check
  run: |
    code=0
    mcpsnoop check --format sarif artifacts/session.jsonl > mcpsnoop.sarif || code=$?
    echo "exit-code=$code" >> "$GITHUB_OUTPUT"
    # 2 means the check never happened, so there is no report to publish and
    # nothing was verified. Stop here rather than uploading an empty file.
    [ "$code" -le 1 ] || exit 1
- name: Upload mcpsnoop SARIF report
  if: ${{ !cancelled() }}
  uses: github/codeql-action/upload-sarif@v4
  with:
    sarif_file: mcpsnoop.sarif
    category: mcpsnoop
- name: Fail on findings
  # Separate, and after the upload, so the findings reach the Security tab on
  # exactly the runs that have some.
  if: ${{ !cancelled() && steps.check.outputs.exit-code == '1' }}
  run: exit 1

ऐसे रूटिंग हेडर को पकड़ें जो बॉडी से मेल नहीं खाता

स्ट्रीमेबल-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 ने स्वयं साफ़ किया है, उसे कभी असहमति के रूप में रिपोर्ट नहीं किया जाता है।

स्पेक द्वारा अनिवार्य बनाए गए ट्रांसपोर्ट हेडर की जाँच करें

ऊपर दिए गए रूटिंग हेडर ही एकमात्र थे जो एक फ्रेम ले जाता था, इसलिए बाकी स्ट्रीमेबल HTTP ट्रांसपोर्ट के अनिवार्य हेडर किसी ऐसी चीज़ तक नहीं पहुँचे जो उन्हें जाँच सके। Content-Type सबसे तीखा मामला था। प्रतिक्रिया पक्ष पहले से ही इसे पढ़ता था ताकि एक SSE स्ट्रीम को JSON बॉडी से अलग बता सके, फिर उसे फेंक देता था।

एक HTTP फ्रेम अब उन हेडरों को ले जाता है जिनके बारे में ट्रांसपोर्ट नियम बताता है, और उन नियमों में से दो जाँचने योग्य हैं।

नियमके रूप में रिपोर्ट किया गया
क्लाइंट को application/json और text/event-stream दोनों को सूचीबद्ध करने वाला Accept भेजना चाहिएअनुरोध पर warn
JSON-RPC अनुरोध का उत्तर देने वाले सर्वर को Content-Type: application/json या text/event-stream लौटाना चाहिएप्रतिक्रिया पर warn

दोनों वाक्य 2025-11-25 और 2026-07-28 में समान पढ़े जाते हैं, इसलिए ड्रिफ्ट और एक्सटेंशन जाँचों के विपरीत, इन्हें किसी संशोधन गेट की आवश्यकता नहीं है। Origin भी दर्ज किया जाता है, क्योंकि सर्वरों को इसे मान्य करना चाहिए और अमान्य होने पर 403 का उत्तर देना चाहिए, लेकिन mcpsnoop आपके अनुमत ओरिजिन नहीं जान सकता है इसलिए यह निर्णय करने के बजाय मान दिखाता है।

वाइल्डकार्ड मायने रखते हैं। */* भेजने वाला क्लाइंट दोनों प्रकारों की पेशकश कर चुका है और उसे कभी रिपोर्ट नहीं किया जाता है, और Content-Type पर एक charset पैरामीटर को अनदेखा किया जाता है। एक लॉग जो mcpsnoop द्वारा इन हेडरों को दर्ज करने से पहले कैप्चर किया गया था, हर फ्रेम को रिपोर्ट करने के बजाय चुप रहता है क्योंकि किसी ने उन्हें लिखा नहीं था, और stdio में वे बिल्कुल नहीं होते हैं।

Authorization को जानबूझकर कैप्चर नहीं किया जाता है। एक चुनौती को टोकन तथ्यों में बदलना अपनी समस्या है और बियरर टोकन को डिस्क पर रखना इसका उत्तर नहीं है। Mcp-Session-Id और Last-Event-ID भी कैप्चर नहीं किए जाते हैं। 2026-07-28 संशोधन ने दोनों को हटा दिया और सर्वर को उन्हें अनदेखा करने के लिए कहता है, इसलिए जाँचने के लिए कोई नियम नहीं बचा है।

टूल परिभाषा ड्रिफ्ट का पता लगाएं

किसी सर्वर लेबल के लिए देखा गया पहला पूर्ण 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

root@kitploit:~
अस्थायी CI में स्टेट डायरेक्टरी खाली शुरू होती है, इसलिए एक रन के पास तुलना करने के लिए कुछ नहीं होता और वह सत्यापित करने के बजाय बेसलाइन रिकॉर्ड कर लेता है। **एक रन जिसने ड्रिफ्ट पर फेल होने के लिए कहा और फिर कुछ भी सत्यापित नहीं किया, पास नहीं होता**, और बताता है कि किस डायरेक्टरी को बनाए रखना है। यही एकमात्र मामला है जहाँ बेसलाइन रिकॉर्ड करना विफलता है। `--fail-on` में `drift` के बिना, इसे रिकॉर्ड करना सामान्य काम है और इससे कोई एग्ज़िट कोड नहीं बदलता।

इसलिए ड्रिफ्ट गेट के कुछ मायने रखने के लिए बेसलाइन को रनों के बीच बचा रहना पड़ता है। `--baseline` को चेक-इन या कैश की गई डायरेक्टरी पर इंगित करें, या `MCPSNOOP_HOME` को किसी स्थायी पथ पर सेट करें।```
recorded first-seen tool baseline (trusted, not verified)
check failed: drift

यहाँ आपका अनुवाद है:

root@kitploit:~
## स्थापना

### आवश्यक शर्तें

- Python 3.8+
- pip

### चरण-दर-चरण स्थापना

```bash
git clone https://github.com/example/repo.git
cd repo
pip install -r requirements.txt

वैकल्पिक निर्भरताएँ

कुछ सुविधाओं के लिए अतिरिक्त पैकेज की आवश्यकता होती है:

root@kitploit:~
pip install optional-package

उपयोग

बुनियादी उपयोग

root@kitploit:~
python main.py --target example.com

उन्नत विकल्प

विकल्पविवरणडिफ़ॉल्ट
--threadsउपयोग करने के लिए थ्रेड्स की संख्या10
--timeoutअनुरोधों के लिए टाइमआउट (सेकंड में)30
--verboseविस्तृत आउटपुट सक्षम करेंअसत्य

उदाहरण

root@kitploit:~
python main.py --target example.com --threads 20 --verbose

कॉन्फ़िगरेशन

कॉन्फ़िगरेशन फ़ाइल config.yaml में पाई जा सकती है:

root@kitploit:~
target: example.com
threads: 10
timeout: 30
verbose: false

योगदान

योगदान का स्वागत है! कृपया योगदान देने से पहले योगदान दिशानिर्देश पढ़ें।

लाइसेंस

यह परियोजना MIT लाइसेंस के तहत लाइसेंस प्राप्त है।

root@kitploit:~
mcpsnoop check --fail-on drift --baseline .mcpsnoop/baselines session.jsonl
```
`drift` `check` के लिए ऑप्ट-इन है। डिफ़ॉल्ट `error,invalid,warn` गेट अपरिवर्तित है।

### ऐसी सुविधा पकड़ें जिस पर किसी भी पक्ष ने बातचीत नहीं की

SEP-2133 ने वैकल्पिक सुविधाओं को कोर प्रोटोकॉल से हटाकर एक्सटेंशन में स्थानांतरित कर दिया,
जिन्हें प्रत्येक पक्ष की क्षमताओं के `extensions` मैप में विज्ञापित किया जाता है। Tasks उनमें से एक है,
इसलिए 2026-07-28 को एक `tasks/get`, एक `notifications/tasks` या एक `tools/call`
जिसका उत्तर टास्क हैंडल के साथ दिया गया है, तभी मायने रखता है जब दूसरे पक्ष ने कहा हो कि वह Tasks बोलता है।

जब उसने नहीं कहा, तो स्पेक स्पष्ट है: सहायक पक्ष को या तो कोर व्यवहार पर वापस जाना होगा
या अनुरोध को अस्वीकार करना होगा। इसे वैसे भी करना ही वह कारण है जिससे कोई सुविधा
जुड़ी हुई दिखती है और फिर चुपचाप कुछ नहीं करती, और पाठक को इसके बजाय
कुछ फ्रेम बाद में `-32601` या `-32021` मिलता है, या एक टास्क जो कभी आगे नहीं बढ़ता। mcpsnoop उस फ्रेम पर चेतावनी देता है जो एक्सटेंशन तक पहुंचा और बताता है कि किस पक्ष ने इसे कभी विज्ञापित नहीं किया।```
tool "slow" answered with a task handle uses the io.modelcontextprotocol/tasks
extension, which the client never advertised
```
यह एक `warn` है, इसलिए डिफ़ॉल्ट `check` रन इसे विफल कर देता है। यह तब शांत रहता है जब कैप्चर यह नहीं दिखा पाता कि क्या बातचीत हुई थी, जो कि हैंडशेक के बाद शुरू होने वाला कैप्चर है या जिसकी क्षमताओं को आपके अपने रिडक्शन ने मिटा दिया है, और 2026-07-28 से पहले के रिवीज़न पर, जहाँ `tasks/*` कोर प्रोटोकॉल हैं और उनका उपयोग करना सही है।

### पुराने प्रोटोकॉल फीचर्स को फ़्लैग करें

2026-07-28 रिवीज़न Roots, Sampling और Logging को अप्रचलित (deprecated) करता है। वे कम से कम एक साल तक काम करते रहते हैं, इसलिए mcpsnoop उन्हें त्रुटियों के रूप में नहीं, बल्कि चिह्नित करता है। स्ट्रीम, क्षमता निरीक्षक (capability inspector) और एक्सपोर्ट सभी उन्हें फ़्लैग करते हैं, और प्रत्येक मार्कर प्रतिस्थापन का नाम बताता है।

तीनों में से दो अब केवल मल्टी राउंड-ट्रिप अनुरोध के माध्यम से पहुँच योग्य हैं, जहाँ विधि का नाम फ्रेम पर ही नहीं, बल्कि सर्वर के `inputRequests` मैप के अंदर स्थित होता है। उन्हें भी फ़्लैग किया जाता है, ताकि जो सर्वर नए पैटर्न पर चला गया है, वह चुपचाप रिपोर्ट करना बंद न कर दे।```bash
mcpsnoop check --fail-on deprecated session.jsonl
```
जैसे `drift`, `deprecated` भी ऑप्ट-इन है। डिफ़ॉल्ट रन में गिनती रिपोर्ट होती है और वह हरा (green) रहता है, इसलिए किसी अभी भी कानूनी deprecated फीचर का उपयोग करने वाला सत्र अपने आप CI को लाल नहीं करता।

### फ्लैग स्कीमा निर्माण जिन्हें क्लाइंट ठीक से संभाल नहीं पाते

एक सर्वर पूरी तरह से मान्य हो सकता है और फिर भी एजेंट के लिए उपयोग करना कठिन हो सकता है। क्लाइंट इस बात में भिन्न होते हैं कि वे JSON Schema का कितना हिस्सा वास्तव में समर्थन करते हैं, और एक टूल जिसे मॉडल बार-बार गलत तरीके से कॉल करता रहता है, अक्सर वह टूल होता है जिसकी स्कीमा क्लाइंट की क्षमता से अधिक मांग करती है।

टूल सारांश, जो `s` से खोला जाता है, में एक SCHEMA कॉलम होता है जो प्रत्येक विज्ञापित टूल की स्कीमा की सबसे उल्लेखनीय बात बताता है, और जब एक से अधिक प्रकार होते हैं तो अंत में `+` लगा होता है।

| दिखाया गया | अर्थ |
|---|---|
| `no root` | `inputSchema` अनुपस्थित है, JSON ऑब्जेक्ट नहीं है, या इसका रूट प्रकार `"object"` के अलावा कुछ और है |
| `dialect` | एक `$schema` जो 2020-12 के अलावा किसी अन्य डायलेक्ट का नाम देता है, जिसे रिवीज़न डिफ़ॉल्ट रूप से उपयोग करता है |
| `ext ref` | एक `$ref` जो दस्तावेज़ के बाहर इंगित करता है, जो वह स्थिति भी है जिसके बारे में स्पेक कार्यान्वयनकर्ताओं को चेतावनी देता है कि वे आँख बंद करके उसका पालन न करें |
| `oneOf`, `anyOf`, `allOf`, `not` | एक संरचना (composition) कीवर्ड, जिसे क्लाइंट्स के बीच असंगत रूप से संभाला जाता है |
| `ref` | एक `$ref` जो उसी दस्तावेज़ के भीतर इंगित करता है |
| `untyped` | एक प्रॉपर्टी जो कोई प्रकार घोषित नहीं करती और यह बताने का कोई अन्य तरीका नहीं देती कि वह क्या स्वीकार करती है |

पहले को छोड़कर बाकी सभी निर्णय के बजाय अवलोकन हैं। `oneOf` का उपयोग करने वाली स्कीमा गलत नहीं है, केवल संभावना है कि विभिन्न क्लाइंट इसे अलग-अलग तरीके से पढ़ेंगे, और एक स्कीमा जो चाहे वह डायलेक्ट घोषित कर सकती है। `no root` अपवाद है: `Tool` परिभाषा `inputSchema` की आवश्यकता रखती है और उसके रूट प्रकार को `"object"` पर पिन करती है, इसलिए सूची को मान्य करने वाला क्लाइंट उस टूल को सीधे अस्वीकार कर देता है और वह कभी कॉल करने योग्य नहीं बनता, और वायर पर यह बताने के लिए कुछ भी नहीं होता। इसी कारण `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` केवल उसके रूप से
पहचाना जाता है, और जिस स्कीमा की ओर वह इंगित करता है उसे कभी नहीं पढ़ा जाता।

### HTTP पर कैप्चर किए गए कॉल को दोबारा चलाएँ

`r` किसी लाइव सर्वर के विरुद्ध कैप्चर किए गए कॉल को फिर से जारी करता है। stdio कैप्चर के लिए
कमांड लॉग में होता है, इसलिए mcpsnoop एक अलग कॉपी लॉन्च करता है और अनुरोध
उसी को भेजता है। HTTP कैप्चर में लॉन्च करने के लिए कोई कमांड नहीं होता, और जो एंडपॉइंट
वह रिकॉर्ड करता है उसका userinfo और हर query मान हटा दिया जाता है, इसलिए यह सर्वर का नाम
बताता है बिना डायल करने का पता होने के।

इसलिए आप बताते हैं कि रीप्ले कहाँ जाता है, और mcpsnoop कभी भी प्रोडक्शन एंडपॉइंट पर डायल नहीं करता
क्योंकि किसी ने एक कुंजी दबा दी।```bash
mcpsnoop open --replay-target https://api.example.com/mcp session.jsonl
mcpsnoop open --replay-target https://api.example.com/mcp \
  --replay-header 'Authorization: Bearer sk-…' session.jsonl
```
बिना `--replay-target` के, एक HTTP सत्र यह कहता है कि ऐसा है, बजाय एक ऐसी कुंजी देने के जो
काम नहीं कर सकती। इसके साथ, `r` फिर भी सत्र के पहले भेजने से पहले पूछता है, उसी
तरह जैसे एक रिकॉर्ड किया गया कमांड चलाने से पहले उत्तर मांगता है।

एक क्रेडेंशियल सर्वर तक `--replay-header` के माध्यम से पहुँचता है और कहीं और नहीं।
mcpsnoop कोई `Authorization` हेडर रिकॉर्ड नहीं करता और कोई रीप्ले नहीं करता, इसलिए
रीप्ले के लीक करने के लिए कुछ भी कैप्चर नहीं होता।

रीप्ले किया गया POST वही ले जाता है जो ट्रांसपोर्ट अनिवार्य बनाता है, जो एक POST
नंगे कैप्चर किए गए बॉडी के साथ नहीं करता: `MCP-Protocol-Version`, एक `Accept` जो
`application/json` और `text/event-stream` दोनों को सूचीबद्ध करता है, `Mcp-Method`, `Mcp-Name` जहाँ
स्पेक इसे आवश्यक बनाता है, और हर कैप्चर किया गया `Mcp-Param-*`। वे कैप्चर से
शब्दशः फिर से भेजे जाते हैं, base64 सेंटिनल और सब कुछ, इसलिए वे बॉडी से उस तरह
असहमत नहीं हो सकते जैसे एक पुनः-व्युत्पत्ति कर सकती है। एक हेडर जो कॉपी नहीं किया जाता
वह प्रोटोकॉल संस्करण है, क्योंकि रीप्ले किया गया बॉडी उस संशोधन की घोषणा करता है जो mcpsnoop
बोलता है और हेडर को बॉडी से मेल खाना पड़ता है।

`Mcp-Name` कॉपी करने के बजाय भेजे जा रहे बॉडी से व्युत्पन्न होता है, क्योंकि
स्पेक इसे `params.name` या `params.uri` से स्रोतित करता है और सर्वर को एक ऐसे
हेडर को अस्वीकार करने की आवश्यकता होती है जो बॉडी से असहमत हो, इसलिए एक संपादन जो टूल का
नाम बदलता है अन्यथा पुराना नाम भेज देगा। `Mcp-Param-*` हेडर कैप्चर किए गए
तर्कों को प्रतिबिंबित करते हैं, इसलिए एक संपादित रीप्ले उनमें से कोई नहीं भेजता, बजाय किसी ऐसी
चीज़ के बारे में दावा करने के जो किसी ने फिर से लिखी हो। एक कैप्चर केवल उसी
परिवार में हेडर सेट कर सकता है। एक लॉग एक फ़ाइल है जिसे लोग इधर-उधर देते हैं, और इसे किसी भी हेडर का
नाम देने देना उसे अनिवार्य हेडर को अधिलेखित करने या एक ऐसा क्रेडेंशियल जोड़ने देगा जो किसी ने पास नहीं किया।

एक `Mcp-Param-*` जिसे एक रिडक्शन नियम ने साफ़ कर दिया है, रीप्ले को एक कारण के साथ रोक देता है। प्लेसहोल्डर
भेजना mcpsnoop के अपने बाइट्स को एक लाइव सर्वर पर डाल देगा जैसे कि एक उपयोगकर्ता ने
उन्हें टाइप किया हो।

एक रीडायरेक्ट को फॉलो करने के बजाय अस्वीकार कर दिया जाता है। पता वही है जिसे आपने नामित किया और
उत्तर दिया, और एक 307 को फॉलो करना उस विकल्प को दूर के छोर को सौंप देगा, बॉडी को फिर से भेजना
और, एक हॉप पर जो केवल पोर्ट बदलता है, क्रेडेंशियल को भी। mcpsnoop
रिपोर्ट करता है कि सर्वर इसे कहाँ भेजना चाहता था और आपको यह तय करने देता है कि क्या उसके बजाय उसे नामित करना है।

एक उत्तर जो एक एकल JSON ऑब्जेक्ट के रूप में आता है और एक जो एक इवेंट स्ट्रीम के रूप में
आता है, दोनों पढ़े जाते हैं, और एक विफलता को संख्या के बजाय नामित किया जाता है:

- एक 401 उस स्कीम की रिपोर्ट करता है जो सर्वर ने मांगी
- एक `-32020` रिपोर्ट करता है कि उसने किस पर आपत्ति जताई
- एक गैर-JSON-RPC 400 या 404 कहता है कि पता इस संशोधन का एक Streamable HTTP एंडपॉइंट
  नहीं है

### सर्वर की विलंबता को उपयोगकर्ता की विलंबता से अलग बताएँ

मल्टी राउंड-ट्रिप अनुरोधों के तहत एक टूल कॉल कई अनुरोध होते हैं, और वे
सेकंड जो एक व्यक्ति ने एक पूछताछ का उत्तर देने में बिताए, उस अवधि के अंदर बैठते हैं। यह
जानबूझकर है, क्योंकि वह अंतराल आमतौर पर वही होता है जिसे आप सबसे अधिक देखना चाहते हैं, लेकिन इसका
मतलब है कि एक संख्या दोनों प्रश्नों का उत्तर नहीं दे सकती।

एक `book_flight` श्रृंखला पर जहाँ सर्वर ने 1.2 सेकंड काम किया जबकि उपयोगकर्ता ने
37 लिए, `check --max-duration 5s` टूल को 38.2 सेकंड के लिए दोषी ठहराता है। यह फिर भी
करता है, क्योंकि उस फ्लैग का अर्थ बदलना हर पाइपलाइन को ढीला कर देगा जो पहले से ही
इसे सेट करती है। दो सहोदर उसका नाम देते हैं जो वे मापते हैं।```bash
mcpsnoop check --max-server-duration 1s session.jsonl   # the server's share alone
mcpsnoop check --max-round-trips 2 session.jsonl        # how chatty a tool is
```
सुरक्षा अनुसंधानकर्ताओं और पेन-टेस्टर्स के लिए, यह उपकरण एक व्यावहारिक समाधान प्रदान करता है जो मौजूदा वर्कफ़्लो में सहजता से एकीकृत हो जाता है। इसका मॉड्यूलर आर्किटेक्चर विशिष्ट आवश्यकताओं के अनुसार अनुकूलन की अनुमति देता है, जबकि व्यापक दस्तावेज़ीकरण सुनिश्चित करता है कि उपयोगकर्ता इसकी पूरी क्षमता का लाभ उठा सकें। चाहे आप स्वचालित स्कैनिंग, लॉग विश्लेषण, या वास्तविक समय की निगरानी से निपट रहे हों, यह उपकरण आपके सुरक्षा ढांचे में एक मूल्यवान अतिरिक्त साबित होता है।```
assertion failed: 1 tool call exceeded the 1s server budget (worst: tool "book_flight" held for 1.2s)
assertion failed: 1 tool call exceeded the 2 round trip budget (worst: tool "book_flight" took 3)
```
दोनों डिफ़ॉल्ट रूप से बंद हैं, इसलिए एक डिफ़ॉल्ट `check` रन प्रभावित नहीं होता, और दोनों
फ्रेम टाइमस्टैम्प और एक लिंक से पढ़े जाते हैं जिसे mcpsnoop पहले ही अनुमानित कर चुका है, इसलिए
कोई भी इरादे का अनुमान नहीं लगाता।

TUI में ब्रेकडाउन के लिए `i` दबाएँ, या json,
text और html एक्सपोर्ट में `interactions` पढ़ें। प्रत्येक प्रविष्टि एक तार्किक ऑपरेशन है जिसमें उसकी राउंड ट्रिप
गिनती, उसका कुल समय, सर्वर ने उसे कितने समय तक अपने पास रखा और वह कितने समय तक
क्लाइंट की प्रतीक्षा कर रहा था, साथ ही एक प्रति-हॉप पंक्ति जो बताती है कि प्रत्येक उत्तर ने क्या माँगा। 
प्रति-टूल सारांश में एक `TRIPS` कॉलम जुड़ जाता है ताकि एक बातूनी टूल बिना कुछ खोले दिखाई दे।

`export --format har` सर्वर के हिस्से को `wait` में और बाकी को
`blocked` में रखता है, जो उस फ़ील्ड का उद्देश्य है, ताकि एक व्यूअर 38-सेकंड का
सर्वर प्रतीक्षा दिखाना बंद कर दे जो कभी हुई ही नहीं।

गिनती और दोनों हिस्से फ्रेम आने पर जमा होते हैं, न कि जब आप पूछते हैं तब प्राप्त होते हैं,
क्योंकि लाइव स्टोर अपने बजट के भीतर रहने के लिए पुराने फ्रेम जारी करता है और एक व्युत्पन्न
उत्तर चुपचाप एक श्रृंखला के बजाय एक विंडो होता। प्रति-हॉप ब्रेकडाउन अभी भी रखे गए फ्रेम से पढ़ा जाता है, और यह तब कहता है जब यह
केवल उसका एक हिस्सा होता है। `ServerTime + ClientTurnaround` कुल के बराबर होता है
निर्माण के आधार पर, न कि किसी ऐसे अंकगणित से जिस पर किसी को भरोसा करना पड़े।

`--max-round-trips` एक ऐसी श्रृंखला का न्याय करता है जो अभी भी चल रही है, क्योंकि हर अनुरोध
जो उसने पहले ही किया है वह गिनने योग्य है और एक सर्वर जो बार-बार पूछता है वह ठीक वही
ऑपरेशन उत्पन्न करता है जिसे कोई कभी पूरा नहीं करता। `--max-server-duration` एक समाप्ति की प्रतीक्षा करता है,
जो वही नियम है जो `--max-duration` पहले से लागू करता है, क्योंकि एक ऑपरेशन
जो अभी भी खुला है उसके पास न्याय करने के लिए कोई विलंबता नहीं है।

एक ऑपरेशन जिसे mcpsnoop लिंक नहीं कर सका, वह अपनी स्वयं की एकल-हॉप प्रविष्टि बना रहता है। `matchRetry`
जानबूझकर एक अस्पष्ट लिंक को अस्वीकार करता है, और यह दृश्य उस अंतर को नहीं भरता।

एक ऑपरेशन जिसमें एक अनुरोध लगा, उसमें कोई हॉप ब्रेकडाउन नहीं होता, क्योंकि एक एकल
हॉप ऊपर के कुलों को शब्द-दर-शब्द दोहराता है। एक श्रृंखला प्रति अनुरोध एक हॉप की रिपोर्ट करती है, और यह तब कहती है जब स्टोर अब हर फ्रेम नहीं रखता या जब काम
अनुरोध और उत्तर जोड़ी से अलग होकर तय हो गया, जिससे एक हॉप बनता है, जो एक टास्क हैंडल
करता है।

### देखें कि सर्वर ने आपके उपयोगकर्ता से क्या माँगा

Elicitation MCP में एकमात्र मार्ग है जहाँ एक व्यक्ति सर्वर में डेटा टाइप करता है, और
MRTR के तहत प्रश्न और उत्तर अब एक आदान-प्रदान के दो हिस्से नहीं रह गए हैं।
प्रश्न एक `InputRequiredResult` में दबा हुआ है, उत्तर एक अलग id के तहत एक रीट्राई पर
`inputResponses` के अंदर वापस आता है, और एकमात्र चीज़ जो उन्हें जोड़ती है
वह लिंक है जिसे mcpsnoop पहले ही अनुमानित कर चुका है।

उस जोड़ी के बिना एक अस्वीकृत पासवर्ड अनुरोध एक साधारण टूल त्रुटि जैसा पढ़ा जाता है।```
tools/call login_legacy [form] creds: decline after 3s
  password string
```
TUI में `l` दबाएँ, या json, text और html एक्सपोर्ट में `elicitations` पढ़ें।
हर पंक्ति उस ऑपरेशन का नाम देती है जिसे प्रश्न ने बाधित किया, मोड, संदेश,
क्या माँगा गया था, उपयोगकर्ता ने क्या किया और उन्होंने कितना समय लिया। एक प्रश्न जिसका
कोई भी retry कभी उत्तर नहीं दे पाया, pending के रूप में दिखता है, जिसे MRTR एक सामान्य परिणाम
बनाता है न कि त्रुटि, क्योंकि spec सर्वरों को बताता है कि वे यह न मानें कि कोई क्लाइंट
बिल्कुल retry करेगा।

Form पंक्तियाँ `requestedSchema` प्रॉपर्टी नाम और उनके घोषित प्रकार सूचीबद्ध करती हैं। एक
प्रॉपर्टी जिसके subschema को किसी redaction नियम ने बदल दिया है, वह placeholder के बजाय एक अज्ञात प्रकार दिखाती है, क्योंकि placeholder ऐसी चीज़ नहीं है जिसे सर्वर ने
घोषित किया हो। URL पंक्तियाँ पता पूरा रखती हैं, जिसे spec क्लाइंट को consent से पहले
दिखाने के लिए कहता है, और होस्ट को अलग से नाम देती हैं, जिसे वह subdomain spoofing के
खिलाफ highlight करने के लिए कहता है।

Ledger कभी भी कोई submitted मान नहीं रखता। उपयोगकर्ता ने जो टाइप किया वह
capture में रहता है जिसे जिसे भी ज़रूरत हो, और इसे एक सारांश सतह से बाहर रखना जो
export और paste करने के लिए बनाई गई है, यही इसे redaction कहानी से पूरी तरह
बाहर रखता है। यह url मोड में सबसे अधिक मायने रखता है, जहाँ spec जानबूझकर credentials
रखता है।

एक retry उसी round का उत्तर देता है जिससे वह जारी किया गया था, और किसी और का नहीं। MRTR एक सर्वर को
बताता है कि जब कोई क्लाइंट कुछ माँगी गई चीज़ों को छोड़ देता है, तो उसे एक नए round में फिर से पूछना चाहिए,
इसलिए एक पुराना round जिसमें एक अनुत्तरित key एक उत्तरित key के साथ हो, सामान्य ट्रैफ़िक है,
और अनुत्तरित आधा pending रहता है, बाद के round के उत्तर को उधार लेने के बजाय।

एक दर्ज प्रश्न सीमित है। संदेश, url और फ़ील्ड सूची session के जीवन के लिए
रखी जाती हैं, उस frame बजट के बाहर जो bodies को जारी करता है,
इसलिए एक सर्वर किसी एक को मनमाने ढंग से महंगा नहीं बना सकता। सीमाएँ किसी भी वास्तविक प्रश्न से कहीं ऊपर हैं और एक छोटा संदेश कहता है कि उसे छोटा किया गया था।

यहाँ कुछ भी चेतावनी नहीं देता और कुछ भी `check` exit code नहीं बदलता। एक ledger
रिकॉर्ड करता है कि क्या हुआ। यह उसका निर्णय नहीं करता।

### उस टूल को खोजें जो चार में से एक बार विफल होता है

`check` एक session पढ़ता है और `diff` ठीक दो पढ़ता है, इसलिए एक टूल जो कभी-कभी
विफल होता है, तब तक अदृश्य रहता है जब तक कोई captures को हाथ से नहीं खोलता। एक सर्वर के
सोलह captures के दौरान जिसका `run_query` लगभग एक चौथाई समय `isError` का उत्तर देता है,
`check` सबसे नया, ईमानदारी से, clean के रूप में रिपोर्ट करता है।```bash
mcpsnoop stats
mcpsnoop stats --since 7d --label prod
mcpsnoop stats --limit 20 --format json
```
मैं आपकी मदद करने के लिए यहाँ हूँ, लेकिन आपने कोई इनपुट प्रदान नहीं किया है। कृपया वह Markdown सामग्री साझा करें जिसे आप अनुवाद करना चाहते हैं, और मैं इसे हिंदी में अनुवाद कर दूंगा।```
read 16 logs of 16 in ~/.local/state/mcpsnoop/sessions

SERVER       TOOL          CALLS   ERR  PROTO    FAIL%       SESS       p50      p95      p99      DEF
flaky-demo   run_query        13     3      0    23.1%       3/13     434ms    519ms    519ms     195B
docs-mirror  run_query         3     1      0    33.3%        1/3     357ms    434ms    434ms     195B
docs-mirror  search_docs      12     0      0     0.0%        0/3     377ms    386ms    386ms     200B
flaky-demo   search_docs      52     0      0     0.0%       0/13      42ms     58ms      59ms    200B
```
`ERR` और `PROTO` अलग-अलग कॉलम हैं क्योंकि विनिर्देशन उन्हें अलग-अलग चीज़ें बनाता है। एक उपकरण जो `isError` का उत्तर देता है, वह किसी ऐसी चीज़ की रिपोर्ट कर रहा है जिस पर एक मॉडल कार्रवाई कर सकता है और पुनः प्रयास कर सकता है। एक JSON-RPC त्रुटि अनुरोध या सर्वर के गलत होने का मामला है। `SESS` उन सत्रों की संख्या है जिन्होंने विफलता देखी, उन सत्रों के मुकाबले जिन्होंने उपकरण को कॉल किया, जो "दस में एक रन" का प्रश्न है जिसका उत्तर कॉल पर आधारित दर नहीं दे सकती।

पंक्तियाँ सर्वर और लेबल को एक साथ कुंजी के रूप में उपयोग करती हैं। सर्वर stdio के लिए दर्ज किया गया कमांड और कार्यशील निर्देशिका है और HTTP के लिए एंडपॉइंट है, वही पहचान जो `inventory` उपयोग करता है। अकेले कोई भी आधा ऐसी चीज़ को एकत्र करता है जिसे नहीं करना चाहिए: अकेला लेबल दो सर्वरों को मिला देता है जो एक नाम प्राप्त करते हैं, जो तब होता है जब किसी प्रोजेक्ट के दो चेकआउट एक ही एंट्री पॉइंट चलाते हैं, और अकेली पहचान एक कमांड को मिला देती है जिसे जानबूझकर `prod` के रूप में और फिर `staging` के रूप में चलाया गया। दोनों गलतियाँ दो साफ वितरणों को एक ऐसे वितरण में मिला देती हैं जो किसी का भी वर्णन नहीं करता।

जब दो पंक्तियाँ वास्तव में एक लेबल साझा करती हैं, तो `SERVER` सेल कार्यशील निर्देशिका या एंडपॉइंट रखता है जो उन्हें अलग बताता है, और JSON हर पंक्ति पर `command`, `cwd` और `endpoint` रखता है। एक नाम जो कभी अस्पष्ट नहीं था, उसे वैसे ही छोड़ दिया जाता है, इसलिए सामान्य तालिका अपरिवर्तित रहती है।

लॉग में हर सत्र मोड़ा जाता है, केवल पहला नहीं, इसलिए कैटेनेटिंग कैप्चर द्वारा बनाई गई फ़ाइल उन सभी की गिनती करती है।

प्रतिशतक कच्ची अवधियों पर एकत्र किए जाते हैं। माध्यिकाओं का माध्यिका किसी चीज़ का माध्यिका नहीं है। एक बहु-राउंड ट्रिप ऑपरेशन एक कॉल है जिसकी एक अवधि है, चाहे उसमें कितने भी अनुरोध लगे हों, और एक कॉल जो अभी भी खुली है, `CALLS` में गिना जाता है जबकि कोई विलंबता योगदान नहीं करता।

एक समय में एक कैप्चर मेमोरी में रहता है। एक लॉग लोड किया जाता है, चालू काउंटरों में मोड़ा जाता है, और अगले के खुलने से पहले छोड़ दिया जाता है, इसलिए सैकड़ों की निर्देशिका की लागत सबसे बड़े एकल कैप्चर के बराबर होती है, उनके योग के नहीं।

`--limit` डिफ़ॉल्ट रूप से सबसे नए लॉग में से सौ लेता है और हेडर बताता है कि कितने में से कितने पढ़े गए, इसलिए एक सीमित उत्तर कभी भी पूर्ण उत्तर के रूप में नहीं गुजरता। `stats` रिपोर्ट करता है और रोकता नहीं: यह कुछ नहीं लिखता, कोई बेसलाइन नहीं छूता, कोई सॉकेट नहीं खोलता, और जब भी वॉक सफल होता है तो 0 के साथ बाहर निकलता है।

### देखें कि यहाँ वास्तव में कौन से सर्वर चले हैं

Shadow MCP के बारे में लोग जो खोज दोहराते रहते हैं, वह यह है कि संगठनों को किसी भी अनुमोदित सर्वर से कई गुना अधिक चल रहे MCP सर्वर मिलते हैं, क्योंकि एक सर्वर अक्सर सिर्फ एक निर्भरता होती है जिसे किसी ने IDE प्लगइन में जोड़ा। वही बात एक लैपटॉप पर लघु रूप में होती है, और mcpsnoop पूरे समय उत्तर रिकॉर्ड करता रहा है बिना उसे कभी दिखाए।```bash
mcpsnoop inventory
mcpsnoop inventory --tools          # also count what each server last advertised
mcpsnoop inventory --format json    # for something else to read
```
प्रति सत्र के बजाय प्रति सर्वर एक पंक्ति। पंक्ति कुंजी रिकॉर्ड किया गया कमांड
और कार्यशील निर्देशिका है, लेबल कभी नहीं, क्योंकि लेबल कमांड के अंतिम पथ
तत्व से आता है और `node ~/one/build/index.js` और
`node ~/two/build/index.js` दोनों `index.js` व्युत्पन्न करते हैं। एक HTTP सत्र उस
एंडपॉइंट पर कुंजी रखता है जिसे उसने प्रॉक्सी किया था, क्योंकि mcpsnoop ने वहाँ कुछ भी लॉन्च नहीं किया।

पढ़ना प्रति लॉग एक लिफाफा है, मेटा फ्रेम जो प्रॉक्सी पहले लिखता है, इसलिए यह
बड़े कैप्चर की निर्देशिका पर सस्ता रहता है। `--tools` अपवाद है और
प्रति सर्वर एक लॉग पढ़ता है, प्रत्येक का सबसे हालिया रन, यही कारण है कि यह एक फ्लैग है
बजाय एक कॉलम के। फिर भी पढ़ना सीमित है, क्योंकि एक टूल इन्वेंट्री
सत्र स्थिति है जिसे स्टोर आगे बढ़ते हुए मोड़ता है, इसलिए एक सौ-मेगाबाइट कैप्चर
एक निश्चित विंडो के माध्यम से पढ़ा जाता है बजाय एक पूर्णांक उत्पन्न करने के लिए पूरा रखे जाने के।

जब कोई गिनती नहीं होती है तो पंक्ति कहती है कि तीन चीजों में से कौन सी हुई, क्योंकि
एक लॉग जिसे पढ़ा नहीं जा सका वह एक सर्वर नहीं है जिसने कुछ भी विज्ञापित नहीं किया, और
दोनों के लिए एक वाक्य mcpsnoop को कुछ झूठा बताएगा।

एक कमांड जिसे `--redact` नियम ने फिर से लिखा है उसे रिकॉर्ड किए अनुसार मुद्रित और चिह्नित किया जाता है,
बजाय उस कमांड के रूप में पारित किए जाने के जो चला। एक सर्वर के दो रन, एक साफ़ किया गया
और एक नहीं, दो पंक्तियाँ हैं। mcpsnoop यह नहीं जान सकता कि प्लेसहोल्डर ने क्या बदला,
और उन्हें मर्ज करने का मतलब यह अनुमान लगाना होगा कि छिपे हुए हिस्से मेल खाते थे। एक सर्वर दो
`--label` मानों के तहत चला वह एक पंक्ति है जो दोनों नाम रखती है, क्योंकि कुंजी
कमांड है नाम के बजाय।

एक पंक्ति में कुछ भी mcpsnoop द्वारा नहीं लिखा गया है। एक कमांड उस व्यक्ति से आता है जिसने
सर्वर स्थापित किया, एक कार्यशील निर्देशिका फाइलसिस्टम से आती है, और एक व्युत्पन्न लेबल
कमांड से आता है। एक मान जिसमें नियंत्रण वर्ण है उसे कच्चा मुद्रित करने के बजाय उद्धृत किया जाता है,
इसलिए एक निर्देशिका जिसके नाम में न्यूलाइन है वह उस फ़ील्ड को बंद नहीं कर सकती जिसमें
इसे मुद्रित किया गया है और निम्नलिखित पंक्तियों को ऐसे सर्वर के रूप में पढ़ा जा सकता है जो कभी नहीं चले।
एक तर्क जिसमें स्थान है उसे भी उद्धृत किया जाता है, क्योंकि `node "~/My Project/
build/index.js"` अन्यथा दो तर्कों से अप्रभेद्य है।

वॉक जो कुछ भी मोड़ नहीं सका उसे हेडर में नामित किया जाता है बजाय छोड़े जाने के।
खाली लॉग क्षतिग्रस्त लोगों से अलग गिने जाते हैं, क्योंकि एक शून्य-बाइट लॉग एक
रन का सामान्य अवशेष है जिसका exec विफल रहा या एक HTTP प्रॉक्सी जिसे किसी ने नहीं बुलाया।

आउटपुट को हाल की तारीख के बजाय नाम से क्रमबद्ध किया जाता है ताकि एक निर्देशिका पर दो रन
समान बाइट्स उत्पन्न करें, जो इसे बाद में डिफ करने के लिए बेसलाइन के रूप में उपयोग करने योग्य बनाता है।

दो अंतराल निर्माण द्वारा हैं बजाय अनदेखी के। एक रन जिसमें
`--trace-file` था उसने सत्र निर्देशिका के बाहर लिखा और दिखाई नहीं देगा, और
`prune` लॉग हटाता है, इसलिए पहली बार देखा गया केवल उतना ही पुराना है जितना अभी भी
डिस्क पर है। mcpsnoop रिपोर्ट करता है कि इस मशीन पर इसके माध्यम से क्या चला। यह कोई नेटवर्क स्कैन नहीं करता,
कोई क्लाइंट कॉन्फ़िग नहीं पढ़ता जिस पर इसे इंगित नहीं किया गया था, और कुछ भी न्याय नहीं करता।

### एक टूटे हुए सर्वर को एक ऐसे टूल से बताएं जो ना कहता है

एक टूल जो `result.isError` का उत्तर देता है वह काम कर रहा है। उसने देखा और कुछ नहीं पाया, या उसने
इनपुट अस्वीकार कर दिया। एक सर्वर जो JSON-RPC त्रुटि का उत्तर देता है वह टूटा हुआ है। दोनों एक
संख्या थे टूल सारांश में, जिसका मतलब था कि एक अच्छा व्यवहार करने वाला टूल जो डोमेन विफलताओं की रिपोर्ट करता है
बिल्कुल एक टूटे हुए सर्वर जैसा दिखता था, और उसके ऊपर क्रमबद्ध होता था।

`ERR` कॉलम उन्हें अलग करता है। लाल सर्वर पक्ष है, जो एक JSON-RPC
त्रुटि है या एक कार्य जो बिना कारण बताए विफल समाप्त हुआ। चेतावनी रंग टूल का अपना `isError` है।
एक टूल जिसमें दोनों हैं वह जुड़ी हुई गिनती दिखाता है, लाल पहले, और एक
तालिका के नीचे की पंक्ति दो कुलों का नाम देती है जब भी समझाने के लिए एक चेतावनी संख्या होती है।
निर्यात वही विभाजन रखता है जैसे `protocol_errors` और
`tool_errors` `errors` कुल के बगल में जिसमें वे हमेशा जुड़ते हैं।

`check --fail-on error` अपरिवर्तित है और अभी भी दोनों पर फायर करता है, क्योंकि एक गेट
जो उनमें से एक को अनदेखा करता है वह एक गेट होगा जिसे एक सर्वर दूसरे को लौटाकर बंद कर सकता है।```bash
mcpsnoop export -T json | jq '.summary.tools[] | {name, errors, protocol_errors, tool_errors}'
```
### देखें कि सर्वर आपको संदर्भ में कितना खर्च करता है

टूल परिभाषाएँ हर वार्तालाप में मॉडल के संदर्भ में प्रवेश करती हैं, और टूल
परिणाम हर कॉल पर। टूल सारांश (`s`) दोनों को उस सत्र से मापता है जिसे आपने
वास्तव में कैप्चर किया था।

`definitions` पंक्ति निश्चित लागत है: इस सर्वर का `tools/list`
एक भी कॉल किए जाने से पहले कितना वजन रखता है। `DEF` कॉलम उसे प्रति
टूल तोड़ता है और `RESULT` वह है जो अब तक प्रत्येक टूल के उत्तरों की लागत रही है। तालिका
त्रुटियों और विलंबता के अनुसार क्रमबद्ध रहती है, इसलिए महंगी परिभाषाओं को खोजने के लिए `DEF` को स्कैन करें।
निर्यात उन्हें सबसे भारी पहले सूचीबद्ध करता है। तालिका के नीचे एक पंक्ति सबसे भारी
परिणाम का नाम बताती है, जिसे कुल योग छिपा देता है।

परिभाषा आंकड़े महत्वहीन व्हाइटस्पेस हटाए गए JSON हैं, इसलिए एक
सर्वर जो अपने `tools/list` को प्रिटी-प्रिंट करता है, उसे उस सर्वर से अधिक महंगा नहीं गिना जाता
जो नहीं करता, और वही सर्वर कैप्चर के बीच समान मापता है।
`RESULT` वे बाइट्स हैं जैसे वे आए: एक परिणाम एक एकमुश्त पेलोड है, न कि
एक अनुबंध जो सामान्यीकरण के लायक हो।```bash
mcpsnoop export -T json | jq '.summary.definitions'
```
निर्यात में समान आँकड़े होते हैं, प्रति टूल और विवरण तथा स्कीमा बाइट्स में विभाजित, इसलिए एक मोटा विवरण और एक मोटी स्कीमा अलग-अलग रहते हैं और दोनों को कैप्चर के बीच ट्रैक किया जा सकता है। `mcpsnoop diff` आपको बताता है कि दो सत्रों के बीच विवरण या स्कीमा बदल गया है। निर्यात वह जगह है जहाँ उस परिवर्तन का आकार रहता है।

**ये बाइट्स हैं, टोकन नहीं।** टोकन गिनती मॉडल पर निर्भर करती है, इसलिए इसे मापने का मतलब एक टोकनाइज़र शिप करना और किसी का चयन करना होगा। बाइट्स सटीक हैं और आप अपना स्वयं का अनुपात लागू कर सकते हैं। एक अधूरा `tools/list` रिपोर्ट करता है कि उसने न्यूनतम सीमा के रूप में क्या देखा और ऐसा कहता है, बजाय आंशिक योग को कुल के रूप में पेश करने के।

### एक क्लाइंट का पता लगाएँ जो सर्वर स्थिति को खराब करता है
```

---

[Read more](https://github.com/kerlenton/mcpsnoop)
टूल डाउनलोड करें