Phase 13: Tools & Protocols

स्पष्ट दायरा और बिना नागरिकता के आवेदन

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

Type: Build

Languages: Python

Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 11 (stateless MRTR)

Time: ~60 minutes

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

  • अप्रचलित रूट को स्पष्ट कार्यक्षेत्र मापदंडों, संसाधन यूआरआई या सर्वर कॉन्फ़िगरेशन से बदलें।
  • प्राधिकरण, पथ प्रतिधारण और ऑपरेटिंग सिस्टम सैंडबॉक्सिंग से अलग-अलग दायरा संकेत।
  • प्रपत्र-प्रसारण मोड elicitation/createएक MRTR के माध्यम से input_requiredपरिणाम।
  • अनुरोध पर ग्राहक क्षमताओं में उत्तेजना समर्थन का विज्ञापन करें और असमर्थित मोड अस्वीकार करें।
  • वैधताaccept,declineऔर cancelअलग-अलग परिणामों के रूप में।
  • विनाशकारी पुष्टि को एक प्रमाणित मूल, मूल तर्क, उम्मीदवार सेट और समाप्ति पर बांधें।

दो समान समस्याएँ

एक नोट्स टूल को यह अनुरोध प्राप्त होता हैः "पुरानी TPS रिपोर्ट को हटा दें।"

सर्वर को दो अलग-अलग सवालों के जवाब देने होंगे।

  1. इस ऑपरेशन से किस कार्यक्षेत्र को छूना चाहिए?
  2. तीनों मेल खाने वाले नोटों में से किसको उपयोगकर्ता ने कहा था?

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

जड़ें प्रवासन की सतह हैं

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

एमसीपी 2026-07-28 अप्रत्याशित है roots/listऔर notifications/roots/list_changedनए डिजाइनों के लिए। निम्नलिखित स्पष्ट प्रतिस्थापनों में से एक को प्राथमिकता देंः

  • ए workspaceUriया directoryउपकरण तर्क जब दायरा प्रति कॉल भिन्न होता है।
  • एक संसाधन यूआरआई जब ऑपरेशन पहले से ही एक संसाधन को लक्षित करता है।
  • सर्वर कॉन्फ़िगरेशन जब एक तैनाती में एक निश्चित कार्यक्षेत्र होता है।
  • एक प्रक्रिया सैंडबॉक्स या कैद फ़ाइल सिस्टम जब कोड तकनीकी रूप से भागने में असमर्थ होना चाहिए।

यदि अभी भी मौजूदा 2026-07-28 के लिए एकीकरण की आवश्यकता है roots/listविघटन विंडो के दौरान, सर्वर इसे MRTR में एम्बेड करता है inputRequests. यह एक लाइव रिवर्स अनुरोध नहीं भेज सकता है. यह एक माइग्रेशन एडाप्टर है; नए हैंडलर्स को इसके बजाय स्पष्ट दायरा स्वीकार करना चाहिए।

मॉडल स्पष्ट हैंडल को देख सकता है और दोहरा सकता है। छिपे हुए परिवहन सत्र के दायरे का निरीक्षण, पुनःप्ले, ऑडिट और मार्ग करना कठिन है।

तीन परतों का नियम

एक स्पष्ट URI अभी भी खुद को अधिकृत नहीं करता है. सभी तीन परतों को लागू करेंः

  1. Authorization:क्या इस प्रमाणित प्रधान को इस कार्यक्षेत्र का उपयोग करने की अनुमति है?
  2. Containment:क्या सामान्य लक्ष्य यूआरआई अनुमत कार्यक्षेत्र सीमा के भीतर रहता है?
  3. Sandbox:क्या ऑपरेटिंग सिस्टम किसी भी तरह से किसी कमजोर सर्वर को बचने से रोक सकता है?

रननेबल सर्वर अधिकृत कार्यक्षेत्र यूआरआई की एक सूची रखता है, प्रतिशत-कोडेड पथ को सामान्य बनाता है, एक वास्तविक पथ-खंड सीमा की जांच करता है, और हटाने से तुरंत पहले प्रतिधारण को फिर से जांचता है।

साफ़ स्ट्रिंग-प्रीफिक्स जांच गलत हैः

textallowed:   file:///work/notes
attacker:  file:///work/notes-evil/secret.md
traversal: file:///work/notes/%2e%2e/private.md

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

मांग अभी भी है, लेकिन वितरण बदल गया

इलिकिटेशन के दौरान उपयोगकर्ता की इनपुट एकत्र करने के लिए वर्तमान क्लाइंट सुविधा हैtools/call,prompts/getया resources/read. विधि का नाम बना रहेगा elicitation/create. जो बदल गया है तार प्रवाह की दिशा है.

2026-07-28 सर्वर रिवर्स JSON-RPC अनुरोध नहीं भेजता है। यह एक InputRequiredResult:

json{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "delete_choice": {
        "method": "elicitation/create",
        "params": {
          "mode": "form",
          "message": "Choose one matching note and confirm deletion.",
          "requestedSchema": {
            "type": "object",
            "properties": {
              "note_id": {
                "type": "string",
                "enum": ["note-3", "note-7", "note-14"]
              },
              "confirm": {"type": "boolean"}
            },
            "required": ["note_id", "confirm"]
          }
        }
      }
    },
    "requestState": "integrity-protected-delete-state"
  }
}

होस्ट फॉर्म को प्रस्तुत करता है। उपयोगकर्ता इसे स्वीकार, स्पष्ट रूप से अस्वीकार या अस्वीकार कर सकता है। फिर क्लाइंट मूल को पुनः प्रयास करता है tools/callएक ताजा आईडी के साथः

json{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "notes_delete",
    "arguments": {
      "workspaceUri": "file:TOK0
      "title": "TPS report"
    },
    "inputResponses": {
      "delete_choice": {
        "action": "accept",
        "content": {"note_id": "note-14", "confirm": true}
      }
    },
    "requestState": "integrity-protected-delete-state",
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {
        "elicitation": {"form": {}}
      }
    }
  }
}

दोनों कॉल के बीच कोई प्रोटोकॉल सत्र नहीं है। सर्वर प्रतिध्वनित स्थिति की पुष्टि करता है, अपेक्षित योजना के खिलाफ प्रतिक्रिया को मान्य करता है, जांच करता है कि चयनित नोट हस्ताक्षरित उम्मीदवार सेट में था, कार्यक्षेत्र को फिर से अधिकृत करता है, फिर से कंटेनमेंट की जांच करता है, और फिर हटा देता है।

क्षमता पर बातचीत अनुरोध पर होती है

फॉर्म मोड इलिकिटेशन का समर्थन करने वाला क्लाइंट घोषित करता हैः

json{
  "io.modelcontextprotocol/clientCapabilities": {
    "elicitation": {"form": {}}
  }
}

एक खाली उत्प्रेरक क्षमता,"elicitation": {}, केवल रूप के लिए संगतता के लिए समर्थन के बराबर है।"elicitation": {"form": {}}केवल URL-केवल घोषणा, "elicitation": {"url": {}}सर्वर को वर्तमान अनुरोध की क्षमताओं से अनुपस्थित मोड को एम्बेड नहीं करना चाहिए, भले ही पहले के अनुरोध में इसे विज्ञापित किया गया हो।

हर अनुरोध में भी शामिल है io.modelcontextprotocol/protocolVersion. एक गायब या गैर स्ट्रिंग संस्करण लौटाता है -32602. एक असमर्थित स्ट्रिंग रिटर्न-32022सटीक रूप सेsupportedऔर requestedडेटा. अनुपस्थित या केवल URL पर निकालने समर्थन रिटर्न -32021के साथdata.requiredCapabilities पर सेट किया गया{"elicitation":{"form":{}}}. .

JSON-RPC के बिना एक लिफाफा idएक संक्षिप्त HTTP पर, एक स्वीकार सूचना प्राप्त होती है 202 Acceptedबिना शरीर के.

clientInfoयह निदान के लिए शामिल किया जाना चाहिए, लेकिन यह स्वयं रिपोर्ट किया जाता है और प्राधिकरण के लिए उपयोगकर्ता की पहचान नहीं कर सकता है।

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

फॉर्म मोड

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

फॉर्म मोड का उपयोगः

  • कई उम्मीदवारों में से एक को चुनना;
  • विनाशकारी ऑपरेशन की पुष्टि करना;
  • गैर संवेदनशील प्राथमिकताएं एकत्र करना;
  • एक छोटी संख्या में मानों को इकट्ठा करना उपयोगकर्ता को, मॉडल को नहीं, तय करना चाहिए।

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

सर्वर वापस की गई सामग्री को फिर से मान्य करता है। क्लाइंट-साइड फॉर्म सत्यापन UX में सुधार करता है लेकिन विश्वास नहीं बनाता है।

यूआरएल मोड

यूआरएल मोड बैंड से बाहर बातचीत के लिए एक सुरक्षित वेब यूआरएल भेजता हैः

json{
  "method": "elicitation/create",
  "params": {
    "mode": "url",
    "message": "Connect the report service to continue.",
    "url": "https://mcp.example.com/connect/report-service"
  }
}

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

एक acceptउत्तर का अर्थ है उपयोगकर्ता URL खोलने के लिए सहमत हुआ। यह बाहरी प्रवाह पूरा हो गया है साबित नहीं करता है। पुनः प्रयास पर, सर्वर अपनी स्थिति की जांच करता है और या तो पूरा करता है या एक और लौटाता है input_requiredपरिणाम।

यूआरएल निकालना एमसीपी क्लाइंट और एमसीपी सर्वर के बीच प्राधिकरण का विकल्प नहीं है। यह एक बाहरी बातचीत के लिए है जिसे एमसीपी सर्वर को उपयोगकर्ता की ओर से करने की आवश्यकता है। सर्वर को ब्राउज़र उपयोगकर्ता को उसी प्रमाणीकृत मूल के साथ बंधना चाहिए जिसने एमसीपी ऑपरेशन शुरू किया था।

प्रतिक्रिया शाखाएँ

कार्रवाई को उत्पाद निर्णय के रूप में व्यवहार करें, उपनाम नहींः

ActionMeaningSafe server behavior
acceptUser submitted the interactionValidate content and continue
declineUser explicitly refusedReturn a complete, non-error refusal outcome
cancelUser dismissed or could not finishStop safely and allow a later retry

कभी भी अनुपस्थित सामग्री को सहमति के रूप में व्याख्या न करें। कभी भी अस्वीकृति को दोहराए गए शीघ्र लूप में परिवर्तित न करें।

विनाशकारी एमआरटीआर राज्य की रक्षा

उम्मीदवार सूची केवल एक शीघ्र या अनसीन Base64 मान में नहीं रह सकती। एक क्लाइंट वह सब कुछ नियंत्रित करता है जो वह वापस भेजता है।

पाठ में राज्य के लिए एक उपयोगी भार शामिल हैः

  • प्रमाणित मूल;
  • उत्पत्ति विधि;
  • workspaceUriऔर title.
  • फॉर्म में दिखाए गए अनुमत नोट आईडी;
  • परिचालन चरण;
  • अल्पकाल समाप्ति।

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

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

नॉनस का दावा करने से पहले बातचीत को मान्य करें।cancelकोई उत्परिवर्तन नहीं करता है और समाप्ति तक स्थिति को पुनः सक्रिय करता है।declineयह टर्मिनल है, इसलिए पाठ कुछ भी हटाने के बिना नॉनस का उपभोग करता है।

इसे बनाओ

code/main.pyआधुनिकता का प्रमाण हैnotes_deleteउपकरणः

  • tools/listआवश्यक कार्यक्षेत्र और शीर्षक योजना के साथ एक निर्धारक, कैश करने योग्य वर्णक लौटाता है।
  • दायरा स्पष्ट है workspaceUriतर्क।
  • सर्वर कॉन्फ़िगरेशन पाठ के प्रधान के लिए उस कार्यक्षेत्र को अधिकृत करता है।
  • यूआरआई सामान्यीकरण पूर्वनिर्धारित भ्रम और एन्कोडेड पारगमन को अस्वीकार करता है।
  • हर विनाशकारी हटाने के लिए फॉर्म मोड उत्प्रेरणा की आवश्यकता होती है।
  • उत्प्रेरणा अंदर से यात्रा करती है resultType: "input_required". .
  • हस्ताक्षरितrequestStateउम्मीदवारों की सटीक सूची और मूल तर्क को जोड़ता है।
  • एक इंजेक्टेड रिप्ले स्टोर सर्वर इंस्टेंस में एक ही स्वीकार या अस्वीकार की गई स्थिति को अस्वीकार करता है।
  • पुनः प्रयास में एक नई अनुरोध आईडी का उपयोग किया जाता है और रिटर्न resultType: "complete". .

डेटा स्टोर मेमोरी में है इसलिए प्रोटोकॉल व्यवहार की जांच करना आसान है। सुरक्षा नियम डेटाबेस के साथ समान रहते हैं।

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

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

bashcd phases/13-tools-and-protocols/12-mcp-roots-and-elicitation/code
python3 main.py
python3 -m unittest discover tests -v

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

  • डिस्कवरी रूट के बिना उपकरण का विज्ञापन करता है।
  • उपकरण खोज रिटर्न notes_deleteके साथresultType, सर्वर की पहचान, और कैश संकेत.
  • अनुरोध आईडी 1 में फॉर्म लौटाता हैinputRequests.delete_choice. .
  • अनुरोध आईडी 2हस्ताक्षरित स्थिति का प्रतिध्वनित करता है और हटाने को पूरा करता है।
  • एक पूर्वावलोकन पथ और एक एन्कोडेड पारगमन पथ दोनों ही रोकथाम में विफल रहते हैं।
  • एक बदलते शीर्षक में मूल पुष्टि स्थिति का पुनः उपयोग नहीं किया जा सकता है।
  • एक गिरावट नोट को अपरिवर्तित छोड़ देती है।
  • नोट और रिप्ले स्टेट साझा करने वाले दो सर्वर ऑब्जेक्ट एक पुष्टि दोनों को निष्पादित नहीं कर सकते।
  • खाली और स्पष्ट रूप से फ़ॉर्म घोषणाएँ काम करती हैं, जबकि केवल URL समर्थन सटीकता देता है -32021फॉर्म की आवश्यकताएं।
  • असमर्थित संस्करण विफलताएँ सटीक उपयोग करें -32022डेटा आकार।
  • आईडी-कम सूचना से JSON-RPC प्रतिक्रिया नहीं होती है।

इसे भेजें

outputs/skill-elicitation-form-designer.mdयह स्पष्ट दायरा, प्राधिकरण जांच, एमआरटीआर फॉर्म, प्रतिक्रिया शाखाओं और राज्य बंधन को डिजाइन करता है। यह पुराने जड़ों को रेत बॉक्स के रूप में इलाज करने या फॉर्म मोड के माध्यम से रहस्य एकत्र करने से इनकार करता है।

व्यायाम

  1. इन-मेमोरी रिप्ले स्टोर को SQLite के साथ बदलें। नॉनस का दावा करने और नोट को हटाने के लिए एक लेनदेन का उपयोग करें, फिर दो प्रक्रियाओं को दोनों प्रतिबद्ध नहीं कर सकते हैं।
  2. जोड़ें urlक्षमता पर बातचीत और बैंड से बाहर सेटअप प्रवाह।inputResponses. .
  3. एक अस्थायी SQLite डेटाबेस के साथ स्मृति में नोट नक्शा बदलें. पुनरावलोकन अनुमतियों और उत्परिवर्तन लेनदेन के अंदर प्रतिधारण.
  4. वास्तविक फ़ाइल प्रणाली कार्यान्वयन के लिए प्रतीकात्मक लिंक नीति जोड़ें। समझाएं कि अकेले यूआरआई शब्दकोश प्रतिधारण सिम्लिंक पलायन को क्यों नहीं रोक सकता है।
  5. 2025-11-25 एडाप्टर डिजाइन करें जो आधुनिक MRTR हैंडलर आउटपुट को विरासत सर्वर द्वारा शुरू किए गए निष्कर्षण के लिए मैप करता है। इसे वर्तमान हैंडलर से अलग रखें।

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

TermMeaning in 2026-07-28
RootsDeprecated informational workspace hints, not authorization or sandboxing
Explicit scopeWorkspace, directory, or resource handle visible in request arguments
ContainmentNormalized path-component check that keeps a target inside a boundary
ElicitationClient feature for obtaining user input during an MCP operation
Form modeIn-band structured user input using a restricted flat schema
URL modeOut-of-band interaction for sensitive or external workflows
MRTRStateless input-required result followed by a fresh retry
requestStateOpaque state echoed exactly and integrity-checked by the server
DeclineExplicit user refusal
CancelDismissal or incomplete interaction without approval

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

2025-11-25 तक एक सहकर्मी के लिए,roots/list,notifications/roots/list_changed, और लाइव सर्वर द्वारा शुरू किया गया elicitation/createएक पुराने रूट सूची सर्वर प्राधिकरण को बायपास करने की अनुमति नहीं है, और आधुनिक हैंडल में प्रोटोकॉल सत्र परिकल्पनाओं को नहीं ले जाने.

आगे पढ़ना

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.