Phase 13: Tools & Protocols

एमसीपी मूल बातेंः बिना नागरिकता के अनुरोध और जेएसओएन-आरपीसी

आधुनिक MCP में कोई हाथ मिलाव और कोई प्रोटोकॉल सत्र नहीं है। प्रत्येक अनुरोध में अपने आप को समझने, अधिकृत करने, रूट करने और पुनः परीक्षण करने के लिए पर्याप्त मेटाडेटा होना चाहिए।

Type: Learn

Languages: Python

Prerequisites: Phase 13, Lessons 01 through 05

Time: ~55 minutes

सीखने के लक्ष्य

  • एमसीपी के सर्वर आदिमताओं को उसके क्लाइंट-साइड फीचर्स से अलग करें।
  • MCP के लिए मान्य JSON-RPC 2.0 अनुरोध और प्रतिक्रियाएँ बनाएं 2026-07-28. .
  • प्रत्येक अनुरोध के लिए प्रोटोकॉल संस्करण, क्लाइंट क्षमताओं और क्लाइंट पहचान संलग्न करें।
  • उपयोग करेंserver/discoverऔर संभाल UnsupportedProtocolVersionErrorबिना एक हाथ मिलाए।
  • एक पूर्ण परिणाम के माध्यम से सत्यापन से एक स्वतंत्र अनुरोध का पता लगाएं।

समस्या

एक एमसीपी सर्वर एक ही प्रक्रिया या HTTP वर्कर पर विभिन्न क्लाइंट्स से दो लगातार अनुरोध प्राप्त कर सकता है, जिसमें अलग-अलग क्षमताएं होती हैं। यदि सर्वर याद रखता है कि पिछले अनुरोध ने क्या घोषित किया है, तो यह गलत अनुमति लागू कर सकता है या गलत तार आकार वापस कर सकता है।

एमसीपी 2026-07-28एक सर्वर को यह तय करना होगा कि वर्तमान अनुरोध को वर्तमान अनुरोध से कैसे संभाला जाए, न कि कनेक्शन इतिहास से।

यह मानसिक मॉडल को बदलता है. पुराने अनुक्रम पहले कनेक्शन था, दूसरा हाथ मिलाव, तीसरा संचालन। आधुनिक अनुक्रम सरल हैः

  1. ग्राहक स्वयं वर्णन अनुरोध भेजता है।
  2. सर्वर उस अनुरोध के संस्करण और क्षमताओं को मान्य करता है।
  3. सर्वर विधि को संभालता है।
  4. सर्वर एक टाइप परिणाम या एक JSON-RPC त्रुटि लौटाता है।

अगले अनुरोध में उसी प्रक्रिया को स्क्रैच से दोहराया जाता है।

अवधारणा

सर्वर आदिम

एमसीपी सर्वर तीन प्राथमिक आदिमों को उजागर करते हैंः

  1. Toolstools/listऔर उसके साथ बुलाया गयाtools/call. .
  2. Resourcesक्या यूआरआई- एड्रेस किए गए डेटा हैं, जो कि resources/listऔर के साथ वापस लियाresources/read. .
  3. Prompts के साथ खोजे गए पुनः प्रयोज्य टेम्पलेट्स हैंprompts/listऔर prompts/get. .

2026-07-28संगतता के लिए योजना, लेकिन वे अप्रचलित हैं। नए कार्यान्वयनों में रूट के लिए स्पष्ट उपकरण या संसाधन इनपुट, नमूने लेने के लिए प्रत्यक्ष मॉडल प्रदाता एपीआई और लॉगिंग के लिए स्टेरर या ओपनटेलीमेट्री का उपयोग करना चाहिए। कई राउंड-ट्रिप अनुरोधों के माध्यम से निकासी उपलब्ध रहती है, जहां सर्वर एक इनपुट अनुरोध लौटाता है और क्लाइंट मूल ऑपरेशन को पुनः प्रयास करता है। आधुनिक सर्वर कभी भी स्वतंत्र JSON-RPC अनुरोध शुरू नहीं करता है।

JSON-RPC लिफाफे

MCP JSON-RPC 2.0 का उपयोग करता हैः

  • अनुरोध: {jsonrpc, id, method, params}
  • उत्तर: {jsonrpc, id, result}या {jsonrpc, id, error}
  • अधिसूचना: {jsonrpc, method, params}बिना किसीid

अनुरोध idएक प्रतिक्रिया के साथ संबद्ध है. यह एक प्रोटोकॉल सत्र नहीं बनाता है.

आवश्यक अनुरोध मेटाडेटा

हर आधुनिक अनुरोध में एक _metaवस्तु के अंदर params:

json{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/list",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {},
      "io.modelcontextprotocol/clientInfo": {
        "name": "course-client",
        "version": "1.0.0"
      }
    }
  }
}

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

सर्वर को इन मानों में से किसी को भी एक पूर्व अनुरोध, एक स्टूडियो प्रक्रिया, एक HTTP कनेक्शन या एक परिवहन हेडर से ही निष्कर्षण नहीं करना चाहिए।

पूर्ण परिणाम और सर्वर पहचान

प्रत्येक सफल आधुनिक परिणाम में शामिल हैresultType. एक सामान्य अंतिम परिणाम उपयोग करता है "complete". सर्वर को परिणाम मेटाडेटा में भी खुद को पहचानना चाहिएः

json{
  "jsonrpc": "2.0",
  "id": 7,
  "result": {
    "resultType": "complete",
    "tools": [],
    "ttlMs": 30000,
    "cacheScope": "public",
    "_meta": {
      "io.modelcontextprotocol/serverInfo": {
        "name": "notes-server",
        "version": "1.0.0"
      }
    }
  }
}

tools/list,resources/list,prompts/list,resources/templates/list,resources/readऔर server/discoverवे शामिल हैं ttlMsऔर cacheScope. एक सुरक्षित डिफ़ॉल्ट हैttlMs: 0और cacheScope: "private". सूची वस्तुओं में निर्धारक क्रम होना चाहिए ताकि समकक्ष प्रतिक्रियाएं स्थिर कैश कुंजी और स्थिर मॉडल संदर्भ उत्पन्न करें।

बिना हाथ मिलाए खोज

हर आधुनिक सर्वर को लागू करना चाहिए server/discover. ग्राहक इसे प्राप्त करने के लिए अन्य विधि से पहले कॉल कर सकता हैः

  • supportedVersions
  • सर्वर capabilities
  • वैकल्पिक उपयोग instructions
  • परिणाम में सर्वर पहचान _meta
  • कैश संकेत

खोज उपयोगी है, लेकिन यह एक गेट नहीं है. एक ग्राहक भेज सकते हैंtools/listसबसे पहले क्योंकि उस अनुरोध में पहले से ही अपना प्रोटोकॉल संस्करण और क्षमताएं हैं।

यदि अनुरोधित संस्करण समर्थित नहीं है, तो सर्वर JSON-RPC कोड वापस करता है -32022साथः

json{
  "requested": "2027-01-01",
  "supported": ["2026-07-28"]
}

क्लाइंट एक पारस्परिक रूप से समर्थित आधुनिक संस्करण का चयन करता है और एक नए JSON-RPC अनुरोध आईडी के साथ पुनः प्रयास करता है।

एक अनुरोध जीवन चक्र

इस क्रम में एक आधुनिक अनुरोध का पता लगाएंः

  1. JSON-RPC लिफाफे का एक विश्लेषण करें।
  2. पुष्टि करेंjsonrpcहै "2.0", एक idअस्तित्व में है,methodएक स्ट्रिंग है, और paramsएक वस्तु है।
  3. में संस्करण स्ट्रिंग और क्षमता ऑब्जेक्ट की आवश्यकताparams._meta; गलत रूप से तैयार या गायब मेटाडेटा है -32602. .
  4. HTTP सीमा पर, संस्करण, विधि और लागू नाम के शीर्षकों की तुलना शरीर के साथ करें। एक असंगतता है -32020भले ही दो संस्करण मानों में से एक समर्थित न हो।
  5. समानता स्थापित होने के बाद, एक मेल खाने वाला लेकिन असमर्थित संस्करण को अस्वीकार करें -32022. .
  6. आवश्यक क्षमताओं की जांच करें, फिर मार्ग द्वारा methodऔर विधि-विशिष्ट तर्कों को मान्य करें।
  7. इसके संचालक को चलाने से पहले कंक्रीट ऑपरेशन को प्रमाणित और अधिकृत करें।
  8. सर्वर पहचान के साथ पूर्ण परिणाम लौटाएं।
  9. अनुरोध-स्केप प्रोटोकॉल मेटाडेटा भूल जाओ.

यह आदेश दो घटकों को अलग-अलग कॉल की व्याख्या करने से रोकता है। एक गेटवे को अनुमति नहीं देनी चाहिए।Mcp-Name: notes.readजबकि मूल निष्पादित करता है params.name: notes.delete. यह गलत रूप से इनपुट, हेडर भ्रम, संस्करण बातचीत, क्षमता विफलता, प्राधिकरण और हैंडल विफलता को विशिष्ट सबूत के रूप में रखता है।

स्टडीएन या एचटीटीपी प्रतिक्रिया को बंद करने से परिवहन गतिविधि समाप्त होती है। यह प्रोटोकॉल सत्र को समाप्त नहीं करता है क्योंकि आधुनिक एमसीपी में कोई प्रोटोकॉल सत्र नहीं है।

स्पष्ट विरासत संगतता

के माध्यम से संस्करण2025-11-25उपयोगinitialize,notifications/initialized, कनेक्शन-स्केप क्षमताओं, और, पहले Streamable HTTP पर, वैकल्पिक प्रोटोकॉल सत्रों. यह व्यवहार अभी भी प्रासंगिक है जब एक दोहरे युग क्लाइंट एक पुराने सर्वर से बात करता है.

युगों को अलग रखें. एक आधुनिक अनुरोध प्रति अनुरोध आवश्यक मेटाडेटा द्वारा पहचाना जाता है. एक विरासत कनेक्शन केवल प्रलेखित बैकअप पथ के माध्यम से चुना जाता है. न भेजें initializeएक के लिए डिफ़ॉल्ट के रूप में 2026-07-28सर्वर.

देशहीन का अर्थ युग-विशिष्ट है।2026-07-28, यह एक प्रोटोकॉल अपरिवर्तनीय हैः प्रत्येक साधारण अनुरोध स्वतंत्र रूप से व्याख्या करने योग्य है और कोई MCP सत्र मौजूद नहीं है।2025-11-25, आरंभिकरण और बातचीत क्षमताएं कनेक्शन से संबंधित हैं, इसलिए एक संगतता एडाप्टर उस विरासत कनेक्शन राज्य को बनाए रख सकता है। एक दोहरे युग कार्यान्वयन एक अनुमत राज्य मशीन नहीं है। यह एक अलग विरासत एडाप्टर के साथ एक राज्यहीन आधुनिक कोर है, जिसमें पार्सर चलाने से पहले स्पष्ट चयन निर्णय होता है।

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

इसका प्रयोग करें

code/main.pyएक फ्रेमवर्क के बिना आधुनिक MCP संदेशों का निर्माण, सत्यापन, ट्रैक और भेजता है। चलाएंः

bashpython3 code/main.py
python3 -m unittest discover code/tests -v

आउटपुट में तीन अपरिवर्तित के लिए सावधानः

  • प्रत्येक अनुरोध अपनी प्रतिक्रिया दोहराता है_metaक्षेत्र।
  • हर सफल परिणाम हैresultType: "complete"और सर्वर की पहचान शामिल है।
  • सूची परिणाम निर्धारक क्रमबद्ध है और स्पष्ट कैश संकेत है।

इसे भेजें

यह सबक जहाजों outputs/skill-mcp-handshake-tracer.md. ऐतिहासिक फ़ाइल नाम स्थिर रहता है, लेकिन कलाकृतियों अब एक stateless अनुरोध ट्रैकर है. यह स्वतंत्र रूप से प्रत्येक संदेश का लेखांकन और विरासत में हाथ मिलाव ट्रैफ़िक केवल जब यह वास्तव में मौजूद है लेबल.

व्यायाम

  1. एक अनुरोध के प्रोटोकॉल संस्करण को में बदलें2027-01-01. त्रुटि कोड की पुष्टि करें-32022और डेटा समर्थित संस्करण का विज्ञापन करता है।
  2. हटाएँ io.modelcontextprotocol/clientCapabilitiesपुष्टि करें सर्वर पहले अनुरोध से क्षमताओं का पुनः उपयोग नहीं करता है।
  3. मेमोरी में उपकरण रजिस्ट्री को उलट दें. पुष्टि करें tools/listअभी भी वही निर्धारक क्रम लौटाता है।
  4. परिवर्तनcacheScopeसेpublicprivate. प्रत्येक मामले में प्रतिक्रिया का पुनः उपयोग किस अनुमतिकरण संदर्भ में किया जा सकता है, इसका वर्णन करें।
  5. एक वैकल्पिक जोड़ें clientInfoउपेक्षा परीक्षण. अनुरोध वैध रहना चाहिए क्योंकि ग्राहक की पहचान की सिफारिश की जाती है, आवश्यक नहीं है।

प्रमुख शर्तें

TermMeaning
Stateless protocolEvery request supplies the metadata needed to interpret it
Request metadataVersion, client capabilities, and recommended client identity in params._meta
server/discoverMandatory server method for versions, capabilities, instructions, and identity
resultTypeDiscriminator on every successful modern result
Cacheable resultResult that includes required ttlMs and cacheScope hints
Protocol eraModern per-request metadata or legacy connection-scoped initialization
Transport lifetimeProcess, connection, or response-stream lifetime, not protocol session state
-32022Unsupported protocol version error with requested and supported versions

आगे पढ़ना

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.