Phase 13: Tools & Protocols

एमसीपी मॉडल इनपुटः नमूना निकासी प्रवासन और बिना नागरिकता एमआरटीआर

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

Type: Build

Languages: Python

Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 10 (resources and prompts)

Time: ~75 minutes

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

  • MCP 2026-07-28 में Sampling को अप्रचलित क्यों किया गया है, इसका वर्णन करें और नए सर्वर के लिए सीधे मॉडल एकीकरण डिफ़ॉल्ट चुनें।
  • एक संगतता कार्यप्रवाह को लागू करें जो sampling/createMessageबहु-राउंड-ट्रिप अनुरोधों (MRTR) के माध्यम से।
  • प्रोटोकॉल संशोधन और ग्राहक क्षमताओं को प्रत्येक अनुरोध में डाल _metaवस्तु।
  • लौटेंresultType: "input_required"और एक ताजा JSON-RPC आईडी के साथ मूल विधि को पुनः प्रयास करें।
  • अखंडता-सुरक्षा requestStateऔर इसे मूल, विधि, तर्क और समाप्ति से जोड़ें।
  • क्षमता जांच, स्वीकृति, प्रतिक्रिया सत्यापन और एक गोल सीमा के साथ बाध्य मॉडल-समर्थित लूप।

प्रोटोकॉल से पहले का निर्णय

जैसे summarize_repoदो प्रकार के काम की आवश्यकता होती हैः

  1. निर्धारक कार्यः फ़ाइलों की सूची, अनुमति प्राप्त फ़ाइलों को पढ़ें, पथों को मान्य करें और सामग्री को इकट्ठा करें।
  2. मॉडल कार्यः प्रतिनिधि फ़ाइलों का चयन करें और सारांश संश्लेषित करें।

अब आपके पास दो वैध वास्तुकला हैं।

नया सर्वरः सीधे मॉडल प्रदाता के साथ एकीकृत करें

यह वर्तमान डिफ़ॉल्ट है. सर्वर मॉडल चयन, क्रेडेंशियल, बजट, पुनः प्रयास और अवलोकन योग्य है. यह एक सामान्य लौटाता है tools/callMCP क्लाइंट के लिए परिणाम।

जब सर्वर पहले से ही एक होस्ट की गई सेवा है या जब होस्ट के मॉडल का उपयोग करने से अधिक भविष्यवाणी योग्य मॉडल व्यवहार महत्वपूर्ण है तो इसे चुनें।

मौजूदा नमूना कार्यप्रवाहः इसे MRTR में माइग्रेट करें

2026-07-28 को लक्षित सर्वर लाइव संदेश नहीं भेज सकता है।sampling/createMessageग्राहक को वापस अनुरोध करने के बजाय यह उस अनुरोध को एकInputRequiredResult. .

ग्राहक के मॉडल का उपयोग करते समय ही इस संगतता पथ का चयन करें और क्रेडेंशियल एक वास्तविक उत्पाद आवश्यकता है। एक हटाने की योजना दर्ज करें क्योंकि नए कार्यान्वयन अप्रचलित नमूनाकरण को अपनाने नहीं चाहिए।

बिना नागरिकता का अनुबंध

जुलाई 2026 के प्रोटोकॉल में कोई नहीं हैinitializeविनिमय, नहीं notifications/initialized, और नहीं Mcp-Session-Idप्रत्येक अनुरोध में वह जानकारी होती है जो पहले हाथ पकड़ने में रहती थी:

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

सर्वर प्रत्येक अनुरोध पर संशोधन को मान्य करता है. एक गायब या गैर-स्ट्रिंग संस्करण अमान्य पैरामीटर है, -32602. एक असमर्थित स्ट्रिंग रिटर्न-32022सटीक आंकड़ों के साथ {"supported":["2026-07-28"],"requested":"<client version>"}. एक यादृच्छिक नमूना क्षमता वापस आ गया है -32021के साथdata.requiredCapabilities पर सेट किया गया{"sampling":{}}. .

JSON-RPC के बिना एक लिफाफा idएक सूचना है. रिसीवर इसे संसाधित कर सकता है, लेकिन यह न तो सफलता प्रतिक्रिया देता है और न ही त्रुटि प्रतिक्रिया। एक स्ट्रीम करने योग्य HTTP एडाप्टर रिटर्न करता है 202 Acceptedस्वीकार किए गए अधिसूचना के लिए कोई निकाय नहीं है।

सर्वर भी लागू करता है server/discoverसटीक के साथ supportedVersionsकुंजी, क्षमताएँ, ttlMsऔर cacheScopeइसलिए एक क्लाइंट सर्वर अनुबंध को जानने और कैश करने के लिए एक उपकरण को कॉल करने से पहले कर सकते हैं। क्योंकि खोज विज्ञापनtools, सर्वर भी अनिवार्य लागू करता है tools/list. . इसकी निर्धारकsummarize_repoवर्णक में एक मान्य वस्तु शामिल है inputSchema,resultType: "complete", सर्वर पहचान मेटाडेटा, और सार्वजनिक कैश संकेत.

प्रत्येक सफल आधुनिक परिणाम का एक भेदभाव होता हैः

  • resultType: "complete"ऑपरेशन समाप्त हो गया है।
  • resultType: "input_required"इसका मतलब है कि ग्राहक को एम्बेडेड अनुरोधों को पूरा करना होगा और फिर से प्रयास करना होगा।
  • विस्तार अतिरिक्त परिणाम प्रकारों को परिभाषित कर सकते हैं। कार्य विस्तार जोड़ता है "task"पाठ 13 में।

एक एमआरटीआर राउंड

सर्वर अनुरोध को संभालते समय क्लाइंट को कॉल नहीं कर सकता है। इसके बजाय यह परिणाम लौटाता हैः

json{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "pick_files": {
        "method": "sampling/createMessage",
        "params": {
          "messages": [
            {
              "role": "user",
              "content": {
                "type": "text",
                "text": "Choose three representative files and return a JSON array."
              }
            }
          ],
          "systemPrompt": "Return only the requested value.",
          "modelPreferences": {
            "costPriority": 0.8,
            "intelligencePriority": 0.2
          },
          "maxTokens": 400
        }
      }
    },
    "requestState": "opaque-integrity-protected-value"
  }
}

ग्राहक सत्यापित करता है कि यह नमूनाकरण का समर्थन करता है, अपनी स्वीकृति और मॉडल नीतियों को लागू करता है, और एक मॉडल प्रतिक्रिया प्राप्त करता है। फिर यह एक अलग JSON-RPC आईडी के साथ एक नया अनुरोध भेजता हैः

json{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "summarize_repo",
    "arguments": {"audience": "developer"},
    "inputResponses": {
      "pick_files": {
        "role": "assistant",
        "content": {
          "type": "text",
          "text": "[\"README.md\", \"server.py\", \"docs/intro.md\"]"
        },
        "model": "host-model",
        "stopReason": "endTurn"
      }
    },
    "requestState": "opaque-integrity-protected-value",
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {"sampling": {}}
    }
  }
}

पुनः प्रयास प्रोटोकॉल सत्र का एक निरंतरता नहीं है। यह एक नया अनुरोध है जो मूल विधि और तर्कों को दोहराता है, केवल वर्तमान दौर के जोड़ता है inputResponses, और इकोस requestStateबाइट के लिए बाइट।

केवल MRTR पर अनुमति है tools/call,prompts/getऔर resources/read. एक सर्वर वापस नहीं किया जा सकता है .input_requiredसंबंधित नहीं विधि से।

बहु-गोल राज्य

इस पाठ को दो मॉडल कॉल की आवश्यकता हैः

  1. pick_filesएक JSON सरणी लौटाता है।
  2. summaryअंतिम गद्य लौटाता है।

प्रत्येक पुनः प्रयास में केवल उस दौर के लिए उत्तर होते हैं। इसलिए सर्वर चरण और सत्यापित मध्यवर्ती डेटा को अगले में रखता है requestState. .

उस मान को हमलावर नियंत्रित मानें. कच्चे चरण नाम पर हस्ताक्षर करना पर्याप्त नहीं है. राज्य को बाध्य करेंः

  • प्रमाणित मूल, स्व-रिपोर्ट नहीं clientInfo.
  • उत्पत्ति विधि;
  • मूल तर्कों का एक अंश;
  • एक छोटी अवधि की समाप्ति;
  • वर्तमान चरण और सत्यापित मध्यवर्ती मान।

HMAC का उपयोग करें जब गोपनीयता की आवश्यकता नहीं है। प्रमाणीकृत एन्क्रिप्शन का उपयोग करें जब क्लाइंट को राज्य नहीं पढ़ना चाहिए। एक खराब हस्ताक्षर, समाप्त मूल्य, मूल परिवर्तन या तर्क में बदलाव से इनकार करें।-32602. .

ग्राहक को विश्लेषण या संशोधन नहीं करना चाहिए requestStateइसका एकमात्र काम पुनः प्रयास पर सटीक स्ट्रिंग को प्रतिध्वनित करना है।

मॉडल वरीयताएं संकेत हैं

costPriority,speedPriorityऔर intelligencePriorityवे एक संभावना वितरण नहीं हैं और एक में योग करने की जरूरत नहीं है। ग्राहक उन्हें अनदेखा कर सकता है क्योंकि ग्राहक मॉडल नीति का मालिक है।

रखोincludeContextपर"none"यदि आप एक विरासत नमूना प्रवाह बनाए रखते हैं। अन्य संदर्भ मोड रिसाव के जोखिम को बढ़ाते हैं और स्वयं अप्रचलित हैं। अनुरोध में न्यूनतम स्पष्ट संदर्भ पारित करें।

सुरक्षा के लिए अपरिवर्तनीय

ग्राहक एम्बेडेड नमूना अनुरोधों के लिए विश्वास सीमा है।

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

clientInfoऔर serverInfoकिसी भी प्रकार की पहचान के रूप में कभी भी उपयोग न करें।

इसे बनाओ

code/main.pyकिसी तीसरे पक्ष के पैकेज के बिना पूर्ण दो-राउंड प्रवाह को लागू करता हैः

  • server/discoverरिटर्न supportedVersions, उपकरण समर्थन का विज्ञापन करता है, और कैश सुझाव वापस करता है.
  • tools/listएक निर्धारक, कैश करने योग्य लौटाता है summarize_repoवस्तु इनपुट योजना के साथ वर्णक।
  • tools/callअनुरोध पर मेटाडेटा को मान्य करता है।
  • पहला परिणाम समाहित करता है sampling/createMessageफ़ाइल चयन के लिए।
  • पहला पुनः प्रयास मॉडल परिणाम को मान्य करता है और दूसरा अनुरोध शामिल करता है।
  • एचएमएसी से संरक्षित requestStateस्वतंत्र अनुरोधों के बीच चरण चलाता है।
  • अंतिम परिणाम का उपयोग करता है resultType: "complete". .

नकली होस्ट मॉडल उदाहरण निर्धारक बनाता है. केवल प्रतिस्थापित करें fake_host_modelसर्वर-साइड स्टेट मशीन निर्धारक और परीक्षण योग्य रहना चाहिए।

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

भंडारण मूल सेः

bashcd phases/13-tools-and-protocols/11-mcp-sampling/code
python3 main.py
python3 -m unittest discover tests -v

अपेक्षित चेक-पोस्टः

  • डिस्कवरी पूर्ण परिणाम देता है ttlMsऔर cacheScope. .
  • उपकरण खोज उसी क्रमबद्ध वर्णक के साथ लौटाता है resultType, सर्वर की पहचान, और कैश संकेत.
  • अनुपलब्ध क्षमताओं और असमर्थित संस्करणों का उपयोग सटीक -32021और -32022त्रुटि डेटा।
  • आईडी-कम सूचना से JSON-RPC प्रतिक्रिया नहीं होती है।
  • अनुरोध आईडी [1, 2, 3], प्रत्येक MRTR राउंड स्वतंत्र है साबित करने के लिए।
  • पहले दो परिणाम हैं input_required. .
  • अंतिम परिणाम है completeऔर चयनित फ़ाइलों के साथ सारांश भी शामिल है।
  • पुनः प्रयास पर मूल तर्कों को बदलना अनुरोध-राज्य जांच में विफल रहता है।

इसे भेजें

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

व्यायाम

  1. फ़ाइल चयन प्रतिक्रिया को अमान्य JSON में बदलें। सर्वर रिटर्न की पुष्टि करें -32602मॉडल आउटपुट पर भरोसा करने के बजाय।
  2. परिवर्तनaudienceपहली कॉल और पुनः प्रयास के बीच. क्यों सील राज्य क्रॉस अनुरोध पुनः उपयोग को रोकता है समझाएं।
  3. एक तीसरा राउंड जोड़ें जो मेजबान से सारांश की आलोचना करने के लिए कहता है। पहले के सारांश को हस्ताक्षरित स्थिति के अंदर ले जाएं और पूरे प्रवाह को तीन राउंड में सीमित करें।
  4. सर्वर के स्वामित्व वाले मॉडल एडाप्टर के साथ नकली होस्ट कॉलबैक की जगह लेकर नमूना निकालें। अनुमोदन, बिलिंग और अवलोकन क्षमता जिम्मेदारियों को सर्वर पर स्थानांतरित करें।
  5. एक राज्य मूल्य का उपयोग करके समाप्ति परीक्षण जोड़ें जो इसकी समय सीमा से एक सेकंड आगे है।

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

TermMeaning in 2026-07-28
SamplingDeprecated feature that asks the client's model for a completion
MRTRStateless retry pattern for client input required during a request
InputRequiredResultResult with resultType: "input_required"
inputRequestsServer-assigned map of embedded elicitation, sampling, or roots requests
inputResponsesCurrent round's client results keyed like inputRequests
requestStateOpaque server state echoed exactly by the client and verified by the server
resultTypeRequired discriminator for modern MCP results
Direct model integrationRecommended replacement for new servers that need model inference
Capability gateRule that prevents sending an embedded request the client did not advertise
Loop budgetMaximum rounds, tokens, bytes, time, and spend allowed for the operation

विरासत संगतता

2025-11-25 पर चिपका हुआ एक क्लाइंट अभी भी पुराने सर्वर-प्रारंभ का उपयोग कर सकता है sampling/createMessageएक लाइव कनेक्शन पर प्रवाह. केवल एक संस्करण विशिष्ट एडाप्टर में उस व्यवहार को रखें. सत्र भर पथ को 2026-07-28 सर्वर के लिए वास्तुकला न बनाएं।

आधिकारिक एसडीके आधुनिक का अनुवाद कर सकते हैं input_requiredपुराने समकक्षों के लिए हैंडलर्स. यह शिम एक संगतता सीमा है, नए सत्र-निर्भर तर्क जोड़ने की अनुमति नहीं है.

आगे पढ़ना

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.