एमसीपी संसाधन और संकेतः बिना-राज्य सर्वर के लिए पता लगाने योग्य संदर्भ
Type: Build
Languages: Python
Prerequisites: Phase 13, Lesson 07 (Building an MCP Server), Phase 13, Lesson 09 (MCP Transports)
Time: ~60 minutes
सीखने के लक्ष्य
- उपभोक्ता के इरादे से उपकरणों, संसाधनों और संकेतों के बीच चयन करें।
- अनिवार्य माध्यम से संसाधन और शीघ्र सतह का विज्ञापन करें
server/discover. . - निर्धारक बनाओ
resources/listऔरprompts/listपरिणाम। - आवेदन करें
ttlMsऔरcacheScopeउपयोगकर्ता विशिष्ट डेटा लीक किए बिना। - JSON-RPC त्रुटि लौटाएँ
-32602अमान्य या अज्ञात संसाधन URI के लिए। - एक खोलें
subscriptions/listenPOST-प्रतिक्रिया स्ट्रीम और सदस्यता आईडी द्वारा प्रत्येक घटना के साथ सहसंबंधित. - संसाधन सामग्री और शीघ्र टेम्पलेट्स को अविश्वसनीय सर्वर आउटपुट के रूप में व्यवहार करें।
उपभोक्ता से शुरू करें
MCP का दुरुपयोग करने का सबसे आसान तरीका कार्यान्वयन कोड से शुरू करना है। एक डेटाबेस क्वेरी एक उपकरण बन जाती है क्योंकि कार्य परिचित हैं। एक पुनः प्रयोज्य वर्कफ़्लो एक संसाधन बन जाता है क्योंकि यह एक फ़ाइल में संग्रहीत होता है। एक प्रॉम्प्ट छिपी नीति बन जाता है क्योंकि होस्ट इसे इंजेक्ट कर सकता है।
यह चुनें कि कौन चुनता है और वे क्या उम्मीद करते हैं।
| Primitive | Primary intent | Selection owner | Typical result |
|---|---|---|---|
| Tool | Perform an operation | Model or application | Structured action result |
| Resource | Read content at a URI | Host, application, or user | Text or binary content |
| Prompt | Start a reusable message workflow | User through host UI | One or more prompt messages |
notes://note-1यह एक संसाधन है क्योंकि यह एक सम्मोहक सामग्री है। delete_noteयह एक उपकरण है क्योंकि यह राज्य बदलता है।review_noteएक प्रॉम्प्ट है क्योंकि एक उपयोगकर्ता एक तैयार समीक्षा कार्यप्रवाह चुनता है।
एक ऑपरेशन को केवल पूरा दिखने के लिए एक ही ऑपरेशन के रूप में न उजागर करें। प्रत्येक अतिरिक्त सतह को खोज, प्राधिकरण, कैशिंग, त्रुटि प्रबंधन, परीक्षण और दस्तावेज की आवश्यकता होती है।
2026-07-28 देशहीन लिफाफा
यह पाठ एमसीपी प्रोटोकॉल संशोधन को लक्षित करता है 2026-07-28. इस प्रोफ़ाइल में कोई आरंभिकरण हाथ मिलाव या प्रोटोकॉल सत्र नहीं है. प्रत्येक अनुरोध में अपना प्रोटोकॉल संस्करण और क्लाइंट क्षमताएं आरक्षित में हैं _metaकुंजी।
json{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/list",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "course-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}सर्वर को लागू करना होगा server/discover. इसके परिणाम विज्ञापन समर्थित
संस्करण, संसाधन और शीघ्र क्षमताएं, कार्यान्वयन पहचान, और
एक क्लाइंट सीधे एक अन्य विधि को कॉल कर सकते हैं, लेकिन खोज उसे देता है
एक स्थिर स्नैपशॉट इससे पहले कि यह एक UI का निर्माण करता है।
json{
"resultType": "complete",
"supportedVersions": ["2026-07-28"],
"capabilities": {
"resources": {"listChanged": true, "subscribe": true},
"prompts": {"listChanged": true}
},
"ttlMs": 3600000,
"cacheScope": "public"
}एक सामान्य परिणाम घोषित करता है "resultType": "complete". . प्रतिक्रिया _meta के साथ सेवा कार्यान्वयन की पहचान करता हैio.modelcontextprotocol/serverInfo. यह जानकारी निदान के लिए उपयोगी है. यह एक प्रमाणीकरण पहचान नहीं है. एक अनुरोध जिसमें एक असमर्थित संशोधन है, रिटर्न देता है -32022अनुरोधित संशोधन और सर्वर द्वारा समर्थित संशोधन दोनों के साथ।
एक सूची एक कनेक्शन पर एक पूर्व कॉल पर निर्भर नहीं कर सकती है। प्राधिकरण दृश्यमान सेट को बदल सकता है क्योंकि क्रेडेंशियल अनुरोध इनपुट हैं, लेकिन कनेक्शन इतिहास नहीं होना चाहिए।
संसाधन स्थिर यूआरआई अनुबंध हैं
एक संसाधन एक यूआरआई द्वारा पहचाने जाने वाली सामग्री है। हैंडलर से पहले यूआरआई को डिज़ाइन करें।
अच्छी यूआरआई गुणः
- बुकमार्क या अनुरोधों के बीच पारित करने के लिए पर्याप्त स्थिर।
- सर्वर के डोमेन में नाम स्थान।
- प्रक्रिया आईडी या कनेक्शन से स्वतंत्र।
- भंडारण पहुँच से पहले सत्यापित।
- हर पढ़ने पर अधिकृत।
notes://note-1 से बेहतर हैnote-1क्योंकि इसके नामस्थान स्पष्ट है. फ़ाइल सर्वर का उपयोग कर सकते हैं file://यूआरआई, लेकिन यह अभी भी सिम्लिंक और संबंधित खंडों को हल करने के बाद कॉन्फ़िगर किए गए निर्देशिका सीमाओं की जांच करनी चाहिए।
resources/listकॉल करने वाले के लिए वर्तमान में दिखाई देने वाले संसाधनों को लौटाता है। URI जैसे एक स्थिर कुंजी द्वारा क्रमबद्ध करें। निर्धारक क्रम शोर कैश मिस, बदलते स्नैपशॉट और होस्ट UI को रोकता है जो रिफ्रेश के बीच कूदता है।
json{
"resultType": "complete",
"resources": [
{
"uri": "notes: TOK0
"name": "Architecture decision",
"description": "Why the service uses a stateless boundary",
"mimeType": "text/markdown"
}
],
"ttlMs": 300000,
"cacheScope": "public",
"_meta": {
"io.modelcontextprotocol/serverInfo": {
"name": "notes-server",
"version": "2.0.0"
}
}
}resources/readएक या अधिक सामग्री आइटम लौटता है. एक अज्ञात यूआरआई सफल खाली रीड नहीं है. वर्तमान संसाधन विनिर्देश JSON-RPC अमान्य पैरामीटर, कोड के लिए अमान्य या अज्ञात संसाधन यूआरआई आवंटित करता है -32602. .
json{
"jsonrpc": "2.0",
"id": 2,
"error": {
"code": -32602,
"message": "Unknown or invalid resource URI",
"data": {
"uri": "notes://missing"
}
}
}यह अंतर एक क्लाइंट को वैध रिक्त दस्तावेज़ से अनुपस्थिति को अलग करने देता है। यह एक व्यापक खोज पर आकस्मिक वापसी को भी रोकता है।
संसाधन टेम्पलेट
संसाधन टेम्पलेट पैरामीटर यूआरआई के एक परिवार का वर्णन करता है। प्रत्येक ठोस आइटम को सूचीबद्ध करते समय एक का उपयोग करें जो महंगा या असीमित होगा। उदाहरण के लिए, notes://projects/{project}/decisions/{decision}एक ग्राहक को बताता है कि हर निर्णय वापस किए बिना वैध पता कैसे बनाया जाए।
एक टेम्पलेट सत्यापन को कमजोर नहीं करता है। चरों को पार्स करें, प्राधिकरण लागू करें, लंबाई और वर्ण सीमाओं को लागू करें, और टाइप किए गए पैरामीटर के साथ भंडारण क्वेरी बनाएं। कभी भी फ़ाइल सिस्टम पथ या डेटाबेस कथन में एक मनमाना यूआरआई पूंछ को एक साथ नहीं जोड़ें।
सामग्री विश्वसनीय निर्देश नहीं है
संसाधन पाठ में शीघ्र इंजेक्शन, रहस्य, भ्रामक कमांड या गलत रूप से मार्कअप हो सकता है। होस्ट को मूल को संरक्षित करना चाहिए और संसाधन सामग्री को डेटा के रूप में व्यवहार करना चाहिए। सर्वर को सामग्री के आकार को सीमित करना चाहिए, एक सटीक MIME प्रकार लौटा देना चाहिए, कॉल करने वाले के लिए उपयोग नहीं किए जा सकते हैं, और संबंधित रिकॉर्ड लौटा देना चाहिए।
प्रॉम्प्ट उपयोगकर्ता द्वारा नियंत्रित टेम्पलेट्स हैं
MCP प्रॉम्प्ट्स स्पष्ट उपयोगकर्ता चयन के लिए डिज़ाइन किए गए हैं। एक होस्ट उन्हें स्लैश कमांड, मेनू आइटम या वर्कफ़्लो बटन के रूप में प्रस्तुत कर सकता है। प्रोटोकॉल के लिए एक UI की आवश्यकता नहीं होती है।
prompts/listप्रत्येक प्रॉम्प्ट को एक स्थिर नाम, एक उपयोगी विवरण और तर्क घोषणाओं की आवश्यकता होती है जो होस्ट को पहले इनपुट एकत्र करने की अनुमति देती है prompts/get. .
json{
"resultType": "complete",
"prompts": [
{
"name": "review_note",
"title": "Review a note",
"description": "Review one note for a named concern",
"arguments": [
{
"name": "uri",
"description": "The note resource URI",
"required": true
}
]
}
],
"ttlMs": 600000,
"cacheScope": "public"
}prompts/getयह मेजबान के सिस्टम निर्देशों को प्रतिस्थापित नहीं करता है। मेजबान यह तय करता है कि कैसे लौटे संदेश मॉडल संदर्भ में प्रवेश करते हैं और अपनी विश्वसनीय नीति को उच्च प्राथमिकता पर रखता है।
सर्वर सीमा पर प्रॉम्प्ट तर्कों को मान्य करें. प्रॉम्प्ट यूआरआई को प्रत्यक्ष संसाधन पढ़ने के समान प्राधिकरण जांच पास करनी चाहिए. प्रॉम्प्ट को संसाधन पहुंच के आसपास एक साइड चैनल न बनाएं।
कैश सुझाव सही होने का हिस्सा हैं
ttlMsग्राहक को बताता है कि परिणाम का पुनः उपयोग कब तक किया जा सकता है। cacheScopeयह वर्णन करता है कि कौन उस कैश मूल्य को साझा कर सकता है।
| Scope | Meaning | Typical use |
|---|---|---|
public | May be reused across users when authorization permits | Public prompt catalog |
private | Bound to the requesting user or credential context | User-owned note content |
डेटा के परिवर्तन दर और गतिरोध के नुकसान से एक TTL चुनें। पांच मिनट सार्वजनिक शीघ्र सूची के अनुरूप हो सकते हैं। एक निजी नोट पढ़ने में एक मिनट का उपयोग हो सकता है।
एमसीपी केवल परिभाषित करता है publicऔर privateजैसे cacheScopeगुप्त-सहित या तेजी से बदलते परिणाम के लिए, वापसी cacheScope: "private"के साथttlMs: 0, फिर मेजबान कैश नीति में किसी भी सख्त स्टोर नहीं नियम लागू करें। no-storeस्वयं एक एमपीसी नहीं है cacheScopeमूल्य।
कैश सुझाव कभी भी प्राधिकरण की जगह नहीं लेते हैं। एक कैश कुंजी में प्रत्येक अनुरोध आयाम शामिल होना चाहिए जो दृश्यता को बदलता है, जिसमें किरायेदार, उपयोगकर्ता, दायरा, स्थान और पृष्ठीकरण कर्सर शामिल हैं। यदि साझा कैश उन आयामों को सुरक्षित रूप से व्यक्त नहीं कर सकता है, तो उपयोग करें privateशून्य TTL और होस्ट स्तर पर कोई स्टोर नहीं नीति के साथ।
ग्राहक द्वारा खोले गए प्रतिक्रिया प्रवाह का उपयोग करें
आधुनिक सदस्यता पैटर्न पूर्व के स्थान पर है resources/subscribeआरपीसी और पुराने HTTP GET घटना अंत बिंदु।
ग्राहक भेजता है subscriptions/listenसामान्य JSON-RPC अनुरोध के रूप में। स्ट्रीम करने योग्य HTTP पर यह एक POST है जिसका उत्तर SSE स्ट्रीम के रूप में खुला रहता है।notificationsवस्तु एक अनुमति सूची है. सर्वर को सूचना प्रकार नहीं भेजने चाहिए जो अनुरोध नहीं किए गए थे।
json{
"jsonrpc": "2.0",
"id": 17,
"method": "subscriptions/listen",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {},
"io.modelcontextprotocol/clientInfo": {
"name": "course-client",
"version": "1.0.0"
}
},
"notifications": {
"resourcesListChanged": true,
"promptsListChanged": true,
"resourceSubscriptions": [
"notes://note-1"
]
}
}
}अनुरोध आईडी सदस्यता आईडी है. किसी भी अनुरोधित घटना से पहले, सर्वर भेजता है notifications/subscriptions/acknowledged. इसके फ़िल्टर में केवल सर्वर द्वारा स्वीकार किए गए उपसमूह होते हैं.
json{
"jsonrpc": "2.0",
"method": "notifications/subscriptions/acknowledged",
"params": {
"_meta": {
"io.modelcontextprotocol/subscriptionId": 17
},
"notifications": {
"resourcesListChanged": true,
"resourceSubscriptions": [
"notes://note-1"
]
}
}
}उस धारा पर हर बाद की घटना में एक ही मेटाडेटा होता है।
json{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": {
"_meta": {
"io.modelcontextprotocol/subscriptionId": 17
},
"uri": "notes://note-1"
}
}सूचना में संसाधन बदल गया है। ग्राहक इसे फिर से पढ़ता है।resources/readयह नहीं मानता कि घटना में नया दस्तावेज है।
कई सदस्यता एक स्टूडियो चैनल साझा कर सकते हैं। सदस्यता आईडी क्लाइंट को उन्हें डिमल्टिप्लेक्स करने की अनुमति देता है। HTTP पर, प्रतिक्रिया धारा को बंद करने से सदस्यता रद्द हो जाती है। एक सर्वर जो धारा को सुरुचिपूर्ण रूप से समाप्त करता है, एक अंतिम लौटाता है resultType: "complete"मूल अनुरोध के साथ सहसंबंधित प्रतिक्रिया।
एक सदस्यता धारा का उपयोग प्रोटोकॉल सत्र के रूप में न करें। बाद में पढ़ना अभी भी एक पूर्ण अनुरोध है जो किसी भी स्वस्थ सर्वर इंस्टेंस तक पहुंच सकता है।
इंटरैक्टिव लैब
इस आंकड़े का उपयोग करके प्रोजेक्ट ट्रैकर से पांच क्षमताओं को वर्गीकृत करेंः समस्या विवरण, समस्या बनाएं, स्प्रिंट समीक्षा टेम्पलेट, परियोजना नीति और बंद समस्या। फिर तय करें कि कौन सी सूचियों को सार्वजनिक रूप से कैश किया जा सकता है, जो पढ़ता है उसे निजी रहना चाहिए, और कौन से संसाधन अपडेट सूचनाओं के लायक हैं।
प्रत्येक वर्गीकरण के लिए, चयनकर्ता का नाम दें। यदि मॉडल एक कार्रवाई करता है, तो एक उपकरण का उपयोग करें। यदि एक होस्ट यूआरआई-उपदेशित सामग्री पढ़ता है, तो एक संसाधन का उपयोग करें। यदि उपयोगकर्ता एक तैयार संदेश कार्यप्रवाह शुरू करता है, तो एक प्रॉम्प्ट का उपयोग करें।
अभ्यास प्रयोगशाला
भंडारण रूट से सिम्युलेटर चलाएं:
bashcd phases/13-tools-and-protocols/10-mcp-resources-and-prompts/code
python3 main.py
python3 -m unittest discover tests -vइस क्रम में प्रतिलेख की जांच करेंः
- पुष्टि करें
server/discoverवर्तमान संशोधन और दोनों क्षमताओं का विज्ञापन करता है। - पुष्टि करें कि दोनों सूची परिणामों को क्रमबद्ध किया गया है और उपयोग
resultType: "complete". . - सूची की पुष्टि करें और परिणामों को पढ़ने में जानबूझकर कैश संकेत हैं।
- पढ़ी गई URI को में बदलें
notes://missingऔर देखिये-32602. . - संसाधन घटना से पहले सदस्यता पुष्टिकरण की पुष्टि करें।
- घटना की पुष्टि और सुरुचिपूर्ण बंद दोनों सदस्यता आईडी ले
5. .
पायथन मॉडल एक वास्तविक HTTP कनेक्शन नहीं खोलता है। यह संदेशों को दर्शाता है जो एक एसडीके को अनुरोध-स्कोप किए गए प्रतिक्रिया धारा पर रखना चाहिए। उत्पादन में फ्रेमिंग और परिवहन के लिए एक आधिकारिक एसडीके का उपयोग करें।
शिप की गई कलाकृतियाँ
outputs/skill-primitive-splitter.mdयह अब निर्धारात्मक खोज, कैश स्कोप, अमान्य यूआरआई व्यवहार और आधुनिक सदस्यता फ़िल्टर की जांच करता है।
सबक भी जहाजों assets/primitive-split.svg, ऑफलाइन अध्ययन के लिए आदिम और सदस्यता सीमा का एक स्थैतिक संस्करण।
जाँचें
bashcd phases/13-tools-and-protocols/10-mcp-resources-and-prompts/code
python3 main.py
python3 -m unittest discover tests -vअपेक्षित परिणामः मुख्य कार्यक्रम एक JSON प्रतिलिपि प्रिंट करता है और परीक्षण कमांड कम से कम बारह पास परीक्षणों की रिपोर्ट करता है।
कैपस्टोन कनेक्शन
इस अनुबंध का उपयोग करें जब आपका कैपस्टोन सर्वर कार्रवाई के अलावा पता लगाने योग्य ज्ञान को उजागर करता है। एक निर्धारणीय कैटलॉग स्नैपशॉट, एक अधिकृत संसाधन पढ़ने, एक शीघ्र संकल्प, एक अमान्य यूआरआई मामले, और एक सदस्यता प्रतिलिपि शामिल करें।
आपके साक्ष्य से पता चलेगा कि कोई सूची कनेक्शन इतिहास पर निर्भर नहीं करती है और एक सदस्यता घटना कभी भी अंतर्निहित संसाधन तक पहुंच प्रदान नहीं करती है।
व्यायाम
- एक जोड़ें
notes://projects/{project}/notes/{id}संसाधन टेम्पलेट और दोनों चर को मान्य करें। - पृष्ठीकरण जोड़ें
resources/listनिर्धारक क्रम को बनाए रखते हुए। - एक संसाधन को में बदलें
cacheScope: "private"के साथttlMs: 0, होस्ट स्तर पर कोई स्टोर नीति जोड़ें, और खतरे की व्याख्या जो दोनों नियंत्रणों को उचित बनाता है। - एक शीघ्र सूची परिवर्तन सदस्यता जोड़ें और साबित कोई घटना नहीं भेजा जाता है जब फ़िल्टर छोड़ता है
promptsListChanged. . - दो एक साथ सदस्यता बनाएँ और प्रत्येक घटना में सही अनुरोध आईडी है साबित करें।
- रीड हैंडल में एक विषय प्राधिकरण जोड़ें और साबित करें कि कैश प्रविष्टि विषयों को पार नहीं कर सकती है।
प्रमुख शर्तें
- Resource:एक MCP सर्वर द्वारा उजागर यूआरआई-उपदेशित सामग्री।
- Prompt:एक MCP सर्वर द्वारा उजागर उपयोगकर्ता नियंत्रित संदेश टेम्पलेट।
- Deterministic list:एक स्थिर सदस्यता और एक ही अनुरोध इनपुट के लिए आदेश के साथ एक खोज परिणाम।
ttlMs:मिलीसेकंड में ताजापन अवधि कैश करें।cacheScope:कैश परिणाम के लिए साझा सीमा।subscriptions/listen:एक लंबे समय तक चलने वाला अनुरोध जिसका प्रतिक्रिया प्रवाह स्पष्ट रूप से फ़िल्टर किए गए सूचनाएं प्रदान करता है।- Subscription ID:मूल श्रवण अनुरोध आईडी, अधिसूचना मेटाडेटा में दोहराया गया।
- Invalid parameters:JSON-RPC त्रुटि
-32602, अमान्य या अज्ञात संसाधन URI के लिए इस्तेमाल किया जाता है। - Unsupported protocol version:JSON-RPC त्रुटि
-32022, सहितsupportedऔरrequestedसंशोधन। server/discover:अनिवार्य सर्वर विधि जो समर्थित संशोधनों, क्षमताओं, पहचान और वैकल्पिक कैश संकेतों को लौटाती है।
आगे पढ़ना
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.