Phase 11: LLM Engineering

मॉडल संदर्भ प्रोटोकॉल (एमसीपी)

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

Type: Build

Languages: Python

Prerequisites: Phase 11 · 09 (Function Calling), Phase 11 · 03 (Structured Outputs)

Time: ~75 minutes

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

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

समस्या

आपके आवेदन को डेटाबेस क्वेरी, कैलेंडर ऑपरेशन और फ़ाइल रीडर की आवश्यकता होती है। साझा प्रोटोकॉल के बिना, प्रत्येक एआई होस्ट को उन समान क्षमताओं के लिए कस्टम डिस्कवरी, इंकलाश, त्रुटियों, परिवहन और प्राधिकरण चिपकने की आवश्यकता होती है।

MCP उस एकीकरण मैट्रिक्स को कम करता है। एक सर्वर एक मानक JSON-RPC सतह प्रकाशित करता है। एक अनुपालन क्लाइंट सतह की खोज कर सकता है, इसे एक मॉडल या उपयोगकर्ता को प्रस्तुत कर सकता है, इसे कॉल कर सकता है, और परिणाम की व्याख्या कर सकता है सर्वर-विशिष्ट एडाप्टर के बिना।

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

अवधारणा

!MCP host, stateless request, and server primitives

तीन सर्वर आदिम

  1. Toolsप्रत्येक उपकरण का नाम, विवरण, JSON Schema इनपुट और हैंडलर है।
  2. Resourcesनामित, यूआरआई-उपदेशित सामग्री है कि एक ग्राहक पढ़ सकते हैं.
  3. Promptsपुनः प्रयोज्य टेम्पलेट्स हैं जो एक होस्ट उपयोगकर्ता को उजागर कर सकते हैं।

मेजबान एआई एप्लिकेशन है। उस मेजबान के अंदर एक एमसीपी क्लाइंट एक सर्वर से बात करता है। परिवहन उनके बीच JSON-RPC संदेश ले जाता है।

बिना नागरिकता के अनुरोधों को हाथ मिलाकर बदल दिया गया

MCP 2026-07-28 हटाता है initializeऔर notifications/initialized. यह प्रोटोकॉल स्तर के सत्रों को भी हटा देता है. प्रत्येक अनुरोध में संदर्भ होता है जो इसे व्याख्या करने के लिए आवश्यक है।params._meta:

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

प्रोटोकॉल संस्करण और क्लाइंट क्षमताओं की आवश्यकता है. क्लाइंट की पहचान की सिफारिश की जाती है. एक गायब है _meta, एक गायब आवश्यक क्षेत्र, या एक आवश्यक क्षेत्र गलत प्रकार के साथ गलत रूप से तैयार किया गया है और अमान्य पैरामीटर लौटाता है (-32602). एक अच्छी तरह से गठित संस्करण स्ट्रिंग है कि सर्वर समर्थन नहीं करता है रिटर्न UnsupportedProtocolVersionError(-32022) सर्वर एक वैध अनुरोध को पूर्व वार्ता रिकॉर्ड को पुनर्प्राप्त किए बिना संसाधित कर सकता है।

बिना राज्य का मतलब यह नहीं है कि एक आवेदन कभी राज्य बनाए नहीं रख सकता है। इसका मतलब यह है कि राज्य एक MCP कनेक्शन के पीछे छिपा नहीं है याMcp-Session-Id. यदि किसी वर्कफ़्लो को निरंतरता की आवश्यकता होती है, तो सर्वर एक अस्पष्ट हैंडल बनाता है और क्लाइंट बाद के कॉल पर उस हैंडल को एक सामान्य उपकरण तर्क के रूप में पारित करता है।

खोज और संस्करण चयन

हर आधुनिक सर्वर कार्यान्वयन server/discover. परिणाम समर्थित संस्करणों, क्षमताओं और सर्वर पहचान की विज्ञापन देता हैः

json{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "complete",
    "supportedVersions": ["2026-07-28"],
    "capabilities": {
      "tools": {},
      "resources": {},
      "prompts": {}
    },
    "ttlMs": 3600000,
    "cacheScope": "public",
    "_meta": {
      "io.modelcontextprotocol/serverInfo": {
        "name": "demo-server",
        "version": "1.0.0"
      }
    }
  }
}

एक क्लाइंट सीधे किसी अन्य विधि को कॉल कर सकता है और संस्करण त्रुटि को संभाल सकता है, लेकिन खोज क्षमता प्रदर्शन और संस्करण चयन को स्पष्ट बनाती है। एक असमर्थित संस्करण वापस आता है UnsupportedProtocolVersionErrorकोड के साथ -32022. इसमें डेटा शामिल है supported, सर्वर संशोधनों की एक सरणी, और requested, अस्वीकृत संशोधन।

स्टूडियो पर, एक दोहरे युग ग्राहक जांच करता हैserver/discover. एक खोज परिणाम या एक मान्यता प्राप्त आधुनिक त्रुटि जैसेUnsupportedProtocolVersionErrorकिसी भी त्रुटि या समय सीमा जो आधुनिक के रूप में मान्यता प्राप्त नहीं है, 2025-11-25 तक वापस जाने की अनुमति देता है।initializeविरासत व्यवहार संगतता कोड है, आधुनिक डिफ़ॉल्ट नहीं है।

परिणाम स्पष्ट हैं

प्रत्येक कोर 2026-07-28 परिणाम हैresultType:

  • completeऑपरेशन समाप्त हो गया है।
  • input_requiredइसका मतलब है कि सर्वर को मल्टी राउंड-ट्रिप अनुरोध पैटर्न के माध्यम से एक और राउंड-ट्रिप की आवश्यकता है। कोर सर्वर इसे केवल से वापस कर सकते हैं tools/call,resources/readया prompts/get. .

ग्राहकों को एक विरासत परिणाम को इलाज करना चाहिए जो छोड़ देता है resultTypeपूर्ण रूप से.

सर्वरों में शामिल होना चाहिए io.modelcontextprotocol/serverInfoहर परिणाम में _meta. यह पहचान स्वयं रिपोर्ट की जाती है और यह प्रदर्शन, लॉगिंग और डिबगिंग के लिए है, सुरक्षा निर्णयों के लिए नहीं।

सूची और पढ़ने के परिणाम भी ले ttlMsऔर cacheScope. एक निर्धारक tools/listआदेश प्लस एक ताजापन संकेत ग्राहकों को सुरक्षित रूप से खोज कैश करने देता है और शीघ्र कैश स्थिरता में सुधार करता है। cacheScope: publicसाझा कैशिंग की अनुमति देता है; privateपुनः उपयोग को बुलाए जाने वाले संदर्भ तक सीमित करता है।

तार प्रारूप और परिवहन

एमसीपी स्टिडियो या स्ट्रीम करने योग्य HTTP पर JSON-RPC 2.0 का उपयोग करता है।

  • एक अनुरोध हैjsonrpc,id,methodऔर params. .
  • एक प्रतिक्रिया में मेल खाता है idऔर या तो resultया error. .
  • सूचना में कोई idऔर कोई प्रतिक्रिया की उम्मीद नहीं करता है।

आधुनिक स्ट्रीम करने योग्य HTTP एक एंडपॉइंट को उजागर करता है जो POST को स्वीकार करता है। प्रत्येक JSON-RPC संदेश को अपना POST मिलता है। एक अनुरोध POST या तो एक JSON ऑब्जेक्ट या अनुरोध-स्कोप सर्वर-सेंड इवेंट्स स्ट्रीम प्राप्त करता है जो अंतिम प्रतिक्रिया के साथ समाप्त होता है। एक स्वीकार किए गए अधिसूचना POST को कोई प्रतिक्रिया निकाय के बिना HTTP 202 प्राप्त होता है; यह कोर संशोधन Streamable HTTP पर कोई क्लाइंट-सेवर अधिसूचना परिभाषित नहीं करता है।

कोई स्टैंडअलोन एमसीपी जीईटी स्ट्रीम नहीं है, सत्र समाप्ति बिंदु हटाएं, Mcp-Session-Idया Last-Event-ID2026-07-28 में दोहराएं। दीर्घकालिक परिवर्तन सूचनाओं का उपयोग करें subscriptions/listenपोस्ट जिसका उत्तर एसएसई धारा के रूप में खुला रहता है।

सर्वर द्वारा आरंभ किए गए अनुरोधों के बिना क्लाइंट इनपुट

पुराने संशोधनों से सर्वर अनुरोध भेजने की अनुमति देता है जैसे sampling/createMessage,roots/listया elicitation/createएक धारा पर. वर्तमान प्रोटोकॉल के बजाय मल्टी राउंड-ट्रिप अनुरोध का उपयोग करता है. एक पात्र उपकरण कॉल, संसाधन पढ़ने, या शीघ्र रिटर्न प्राप्त करें resultType: input_requiredकम से कम एक के साथ inputRequestsया requestState. क्लाइंट किसी भी अनुरोधित इनपुट को एकत्र करता है, एक नई JSON-RPC आईडी और संबंधित के साथ मूल विधि को पुनः प्रयास करता है inputResponses, और सटीक प्रतिध्वनित करता है requestStateजब एक प्रदान किया गया था।inputRequestsउपस्थित थे, पुनः प्रयास छोड़ दिया inputResponses. .

जड़ें, नमूनाकरण और लॉगिंग कार्यात्मक रहते हैं लेकिन अप्रचलित हैं, इसलिए नए कार्यान्वयनों को उन्हें अपनाना नहीं चाहिए। मौजूदा जड़ें या नमूनाकरण अनुरोध MRTR के भीतर यात्रा करते हैं inputRequests, कभी भी स्वतंत्र सर्वर-से-ग्राहक JSON-RPC अनुरोधों के रूप में नहीं। स्पष्ट फ़ाइल या निर्देशिका मापदंडों, संसाधन यूआरआई, सर्वर कॉन्फ़िगरेशन और प्रत्यक्ष मॉडल-प्रदाता एकीकरण को प्राथमिकता दें। स्टूडियो डायग्नोस्टिक्स के लिए stderr का उपयोग करें और उत्पादन टेलीमेट्री के लिए OpenTelemetry का उपयोग करें।

इसे बनाओ

चरण 1: सर्वर सतह को पंजीकृत करें

पंजीकरण सरल रहता है, भले ही अनुरोध अनुबंध में बदलाव किया गया होः

pythonserver = MCPServer("demo-server")

@server.tool(
    "add",
    "Add two integers.",
    {
        "type": "object",
        "properties": {
            "a": {"type": "integer"},
            "b": {"type": "integer"}
        },
        "required": ["a", "b"]
    }
)
def add(a: int, b: int) -> dict:
    return {"sum": a + b}

code/main.pyयह जानबूझकर मानक पुस्तकालय का उपयोग करता है ताकि आप एक SDK में प्रोटोकॉल को सौंपने के बजाय प्रत्येक लिफाफा देख सकें।

चरण 2: प्रत्येक अनुरोध पर मेटाडेटा संलग्न करें

pythondef request(method, params=None):
    body_params = dict(params or {})
    body_params["_meta"] = {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientCapabilities": {},
        "io.modelcontextprotocol/clientInfo": {
            "name": "demo-client",
            "version": "1.0.0"
        }
    }
    return {
        "jsonrpc": "2.0",
        "id": 1,
        "method": method,
        "params": body_params
    }

इस मेटाडेटा को केवल एक कनेक्शन ऑब्जेक्ट में कैश न करें. सर्वर प्रत्येक अनुरोध पर इसे मान्य करता है।

चरण 3: सूचीबद्ध करने से पहले वैकल्पिक रूप से खोजें

कॉलserver/discover, एक समर्थित संस्करण चुनें, फिर कॉल tools/list. एक प्रत्यक्षtools/listयह भी मान्य है यदि आप पहले से ही संस्करण जानते हैं और संभाल सकते हैं -32022. .

डेमो नाम क्रम में उपकरण सूची वापस करता है और संलग्न करता है ttlMs,cacheScope,resultTypeएक उपकरण कॉल एक पूर्ण, गैर-कैश परिणाम वापस करता है क्योंकि इसके आउटपुट वर्तमान स्थिति पर निर्भर कर सकते हैं।

चरण 4: उसी अनुरोध को HTTP पर मानचित्रित करें

एक रिमोट tools/callPOST में हेडर शामिल हैं जो JSON-RPC शरीर को दर्पण करते हैंः

httpPOST /mcp HTTP/1.1
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: add

MCP-Protocol-Versionशीर्षक में संस्करण से मेल खाना चाहिए _meta. .Mcp-Methodप्रत्येक JSON-RPC अनुरोध पर आवश्यक है और मेल खाना चाहिए method. .Mcp-Nameकेवल tools/call,resources/readऔर prompts/get, जहां यह उपकरण के नाम, संसाधन यूआरआई, या शीघ्र नाम से मेल करना चाहिए. एक गायब आवश्यक हेडर या असंगत HTTP 400 के साथ वापस आता है HeaderMismatchकोड -32020. .

चरण 5: प्रोटोकॉल राज्य के बाहर सुरक्षा लागू करें

  • प्रत्येक HTTP अनुरोध पर प्राधिकरण और दर्शकों को मान्य करें.
  • स्थानीय सर्वर को स्थानीय होस्ट से जोड़ें और सत्यापित करें Originस्ट्रीम करने योग्य HTTP पर।
  • के साथ उत्परिवर्तन उपकरण चिह्नित करेंdestructiveHint: trueऔर मेजबान की स्वीकृति की आवश्यकता होती है।
  • अप्रचलित जड़ों पर निर्भर होने के बजाय निर्देशिका और फ़ाइल दायरा को स्पष्ट रूप से पास करें।
  • संसाधनों और उपकरण आउटपुट को अविश्वसनीय डेटा के रूप में व्यवहार करें।
  • stdio के तहत JSON-RPC के लिए stdout आरक्षित रखें; stderr पर डायग्नोस्टिक्स लिखें।

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

अपनी निर्देशिका से पाठ चलाएंः

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

पहली पंक्ति में पता लगाने की सूचना दी जानी चाहिए demo-serverप्रोटोकॉल पर2026-07-28. . फिर निरीक्षणMCPClient.request: यह पुनर्निर्माण करता है _metaप्रत्येक कॉल के लिए. एक अनुरोध से मेटाडेटा हटाएं और सर्वर इसे अस्वीकार करते हैं।

इसे भेजें

outputs/skill-mcp-server-designer.mdएक डोमेन को एक राज्य रहित MCP डिजाइन में बदल देता है। इसके स्वीकृति गेट के लिए खोज परिणाम, प्रति अनुरोध मेटाडेटा नीति, निर्णायक कैश-जाहिर सूचियों, स्पष्ट राज्य हैंडल, परिवहन हेडर, प्राधिकरण और अनुमोदन नियमों की आवश्यकता होती है।

एमसीपी गहरी गोताखोरी जारी रखें

इस पाठ में आपको प्रोटोकॉल मॉडल दिया गया है। चरण 13 चार उत्पादन सीमाओं को अलग-अलग निर्माण और सत्यापन पाठों में बदल देता हैः

  1. MCP Tool Contracts and Contentबंद इनपुट योजनाओं, संरचित सामग्री, रूटिंग मेटाडेटा, अस्पष्ट पृष्ठीकरण, पूर्णता प्राधिकरण और प्रोटोकॉल और टूल-डोमेन त्रुटियों के बीच अंतर को कवर करता है।
  2. MCP Reliability, Cancellation, and Flow Controlअनुरोध रद्द, टिकाऊ कार्य रद्द, समय सीमा, अशक्तता, बैकप्रेशर, प्रॉक्सी बफरिंग और पुनः कनेक्ट व्यवहार को कवर करता है।
  3. MCP Registry Supply Chain, Admission, Drift, and Rollbackनामस्थान प्रमाण, कलाकृतियों की उत्पत्ति, अपरिवर्तनीय पिन, लाइव ड्रिफ्ट, रजिस्ट्री स्थिति, प्रवेश प्रमाण और रोलबैक को कवर करता है।
  4. MCP Conformance Engineeringसोने और नकारात्मक तार ट्रांसक्रिप्ट, सख्त संस्करण युग, एसडीके अंतर, प्रॉक्सी सबूत, संपादन, स्वास्थ्य गेट और रिलीज़ रोलबैक को कवर करता है।

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

व्यायाम

  1. एक जोड़ें subtractउपकरण और पुष्टि tools/listवर्णमाला क्रम में रहता है।
  2. प्रोटोकॉल- संस्करण कुंजी को हटा दें और अमान्य पैरामीटर की जांच करें (-32602) फिर अच्छी तरह से तैयार लेकिन समर्थित संस्करण भेजें 2025-11-25, सत्यापित करें-32022, पुष्टि requestedउस संशोधन को प्रतिध्वनित करता है, और चुनें supported. .
  3. सर्वर-मिंट जोड़ें draftIdएक ऑपरेशन बनाने के लिए, फिर इसे अद्यतन करने के लिए एक तर्क के रूप में आवश्यक है। यह क्यों है कि एक प्रोटोकॉल सत्र की बजाय आवेदन राज्य है समझाएं।
  4. लौटेंinput_requiredएक नए आईडी के साथ मूल कॉल को पुनः प्रयास करें, एक inputResponsesप्रविष्टि, और सटीक requestStateसर्वर-से-क्लाइंट JSON-RPC अनुरोध का आविष्कार करने के बजाय।
  5. एक दोहरे युग स्टूडियो क्लाइंट स्केच करें। एक परिणाम या आधुनिक त्रुटि को आधुनिक माना जाता है, और वापस जाने की अनुमति दें।initializeकेवल एक अनजान त्रुटि या समय सीमा के लिए।

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

TermWhat people sayWhat it actually means
MCP"Tool protocol for LLMs"JSON-RPC protocol for server discovery, tools, resources, prompts, and extensions
Host"The AI app"Owns the model and UI and mounts one or more MCP clients
Client"The connector"Speaks MCP to one server on behalf of a host
Stateless MCP"No session"Every request carries version and capabilities; no protocol state is keyed by a connection
server/discover"Capability probe"Required server method advertising versions, capabilities, and identity
resultType"Result state"Marks a result as complete or input_required
State handle"Workflow id"Server-minted application identifier passed as an ordinary argument
Streamable HTTP"Remote transport"One POST endpoint with JSON or request-scoped SSE responses
MRTR"Ask and retry"Input request embedded in a result, followed by a retry of the original operation

आगे पढ़ना

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.