एमसीपी परिवहनः स्टूडियो और स्टेटलेस स्ट्रीमेबल HTTP
2026-07-28, स्थानीय स्टूडियो और रिमोट स्ट्रीम करने योग्य HTTP दोनों स्वयं वर्णित अनुरोधों को ले जाते हैं।Type: Learn
Languages: Python
Prerequisites: Phase 13, Lessons 07 and 08
Time: ~65 minutes
सीखने के लक्ष्य
- स्थानीय बाल प्रक्रियाओं के लिए स्टूडियो और नेटवर्क सेवाओं के लिए स्ट्रीम करने योग्य HTTP चुनें।
- आधुनिक एकल-एंडपॉइंट, केवल POST Streamable HTTP अनुबंध को लागू करें।
- JSON-RPC निकाय के खिलाफ MCP संस्करण, विधि और नाम हेडर को दर्पण और सत्यापित करें।
- अनुरोध के अनुसार एसएसई और दीर्घायु प्रदान करें
subscriptions/listenधाराओं सही ढंग से. - पुराने व्यवहार को आधुनिक के रूप में प्रस्तुत किए बिना सत्र आधारित और विरासत HTTP + SSE तैनाती को माइग्रेट करें।
समस्या
पहले स्ट्रीमेबल HTTP संशोधनों ने कनेक्शन और सत्र व्यवहार के साथ प्रोटोकॉल बातचीत को संयुक्त किया। एक सर्वर mint सकता हैMcp-Session-Id, एक स्टैंडअलोन GET स्ट्रीम का खुलासा करें, सत्र समाप्ति के लिए DELETE स्वीकार करें, और SSE को फिर से शुरू करें Last-Event-ID. .
एमसीपी 2026-07-28HTTP हेडर रूटिंग और नीति के लिए चयनित क्षेत्रों को दर्पण करते हैं, लेकिन सर्वर निष्पादन से पहले उन हेडर को शरीर के खिलाफ मान्य करता है।
परिणाम को स्केल करना और तर्क देना आसान है। इसका मतलब यह भी है कि 2025 परिवहन को वर्तमान के रूप में सिखाने वाला एक सर्वर गलत विफलता और सुरक्षा मॉडल सिखा रहा है।
अवधारणा
स्टूडियो
स्टूडियो बंधन क्लाइंट द्वारा शुरू की गई उपप्रक्रिया के लिए हैः
- क्लाइंट stdin के लिए प्रति पंक्ति एक UTF-8 JSON-RPC संदेश लिखता है.
- सर्वर एक UTF-8 JSON-RPC संदेश प्रति पंक्ति stdout के लिए लिखता है.
- सर्वर Stderr के लिए निदान लिखता है.
- सर्वर Stdin EOF पर तुरंत बाहर निकलता है।
- प्रत्येक आधुनिक अनुरोध संस्करण और ग्राहक क्षमताओं को
params._meta. .
प्रक्रिया कई कॉल के लिए जीवित हो सकती है, लेकिन यह एक आधुनिक प्रोटोकॉल सत्र नहीं है। यदि यह अप्रत्याशित रूप से बाहर निकलता है, तो उड़ान में अनुरोध खो जाते हैं। प्रक्रिया को फिर से शुरू करें, फिर से खोजें, रीलिस्ट करें, सदस्यता को फिर से खोलें, और नए अनुरोध आईडी के साथ सुरक्षित संचालन को फिर से प्रयास करें।
2026-07-28 में स्ट्रीम करने योग्य HTTP
एक आधुनिक सर्वर एक MCP अंत बिंदु को उजागर करता है, जैसे /mcp, जो पोस्ट को स्वीकार करता है।
प्रत्येक JSON-RPC अनुरोध या सूचना एक नया HTTP POST है। शरीर में एक JSON-RPC संदेश होता है। क्लाइंट सर्वर को JSON-RPC प्रतिक्रियाएं नहीं भेजते।
अनुरोध के लिए, सर्वर या तो वापस करता हैः
Content-Type: application/jsonएक JSON-RPC प्रतिक्रिया के साथ; याContent-Type: text/event-streamउस अनुरोध से संबंधित सूचनाओं के साथ, जिसके बाद अंतिम JSON-RPC प्रतिक्रिया होगी।
स्वीकार किए गए सूचना के लिए, सर्वर वापस करता है 202 Acceptedबिना शरीर के.
ग्राहक दोनों प्रकार की प्रतिक्रियाओं का विज्ञापन करते हैंः
httpAccept: application/json, text/event-streamकेवल POST का अर्थ है केवल POST
आधुनिक स्ट्रीम करने योग्य HTTP में कोई स्टैंडअलोन GET स्ट्रीम और कोई DELETE सत्र एंडपॉइंट नहीं है।
GET /mcpरिटर्न405 Method Not Allowed. .DELETE /mcpरिटर्न405 Method Not Allowed. .Mcp-Session-Idअनदेखा किया जाता है और कभी भी न तो बनाया जाता है और न ही प्रतिध्वनित किया जाता है।Last-Event-IDइसे अनदेखा किया जाता है क्योंकि आधुनिक धाराओं को फिर से शुरू नहीं किया जा सकता है।
यदि अनुरोध-स्केप स्ट्रीम अंतिम प्रतिक्रिया से पहले टूट जाता है, तो क्लाइंट उस उड़ान अनुरोध को खो देता है। यह एक नया अनुरोध जारी कर सकता है जिसमें एक नया JSON-RPC आईडी है जब पुनः प्रयास सुरक्षित है। इसे स्ट्रीम फिर से शुरू करने का प्रयास नहीं करना चाहिए।
मूल सत्यापन
सर्वर सत्यापित करें OriginDNS रिबेंडिंग को रोकने के लिए आने वाले कनेक्शन पर। यदि हेडर मौजूद है और स्पष्ट रूप से अनुमति नहीं है, तो वापस 403 Forbidden. एक गैर ब्राउज़र क्लाइंट छोड़ सकता है Origin, जो आधिकारिक परिवहन नियमों द्वारा अनुमति दी जाती है।
स्थानीय सर्वर को 127.0.0.1नेटवर्क सेवाओं को अभी भी प्रत्येक अनुरोध पर प्रमाणीकरण और प्राधिकरण की आवश्यकता है. मूल सत्यापन प्रमाणीकरण नहीं है.
कैनोनिक कॉन्फ़िगरेशन के बाद सटीक उत्पत्ति मिलान का उपयोग करें।origin.startswith("https://trusted.example")वे असुरक्षित हैं क्योंकि वे हमलावर नियंत्रित प्रत्यय स्वीकार कर सकते हैं।
आवश्यक HTTP मेटाडेटा हेडर
प्रत्येक आधुनिक POST अनुरोध में शामिल हैंः
httpMCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: notes_searchशीर्षक नियमः
MCP-Protocol-Versionआवश्यक है और बराबर होना चाहिएparams._meta.io.modelcontextprotocol/protocolVersion. .Mcp-Methodआवश्यक है और JSON-RPC के बराबर होना चाहिएmethod. .Mcp-Nametools/call,resources/readऔरprompts/get. .Mcp-Nameबराबरparams.nameयाparams.uriके लिएresources/read. .- हेडर मान केस से संवेदनशील होते हैं भले ही हेडर नाम केस से असुरक्षित होते हैं।
असुरक्षित या गैर-एएससीआई Mcp-Nameमानों में सटीक UTF-8 Base64 sentinel का उपयोग किया जाता हैः
text=?base64?{Base64EncodedValue}?=सर्वर उस मूल्य को शरीर के साथ तुलना करने से पहले डिकोड करता है।
याद, गलत रूप, या असंगत दर्पण हेडर HTTP वापस 400JSON-RPC कोड के साथ -32020. यदि हेडर और बॉडी सर्वर द्वारा समर्थित नहीं किए गए संस्करण पर सहमत हैं, तो HTTP 400के साथ-32022और सटीक त्रुटि डेटा जैसे {"supported":["2026-07-28"],"requested":"2027-01-01"}. .
एक अज्ञात आधुनिक विधि HTTP पर लौटती है 404JSON-RPC के साथ -32601. JSON-RPC शरीर महत्वपूर्ण है क्योंकि एक दोहरे युग क्लाइंट इसे एक आधुनिक त्रुटि को एक विरासत अंत बिंदु त्रुटि से अलग करने के लिए उपयोग करता है।
अनुरोध के आधार पर एसएसई
सर्वर एक लंबे समय तक चलने वाले अनुरोध के लिए SSE चुन सकता हैः
textPOST tools/call id=41
<- notifications/progress related to id=41
<- notifications/progress related to id=41
<- JSON-RPC response id=41
stream closesसर्वर को इस स्ट्रीम पर स्वतंत्र JSON-RPC अनुरोध नहीं भेजना चाहिए। नमूना, उत्प्रेषण और जड़ बातचीत मल्टी राउंड-ट्रिप अनुरोध परिणामों का उपयोग करती है। प्रतिक्रिया धारा को बंद करने से अनुरोध रद्द हो जाता है।
पुनः खेलने के लिए SSE घटना आईडी न जोड़ें। Last-Event-IDपुनरुद्धार आधुनिक संशोधन का हिस्सा नहीं है।
दीर्घकालिक परिवर्तन सदस्यता/सुनने का उपयोग
परिवर्तन सूचनाओं में क्लाइंट द्वारा खोले गए अनुरोध का उपयोग किया जाता है, स्वतंत्र GET नहींः
json{
"jsonrpc": "2.0",
"id": "listen-1",
"method": "subscriptions/listen",
"params": {
"notifications": {
"toolsListChanged": true,
"resourceSubscriptions": ["notes: TOK0
},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {},
"io.modelcontextprotocol/clientInfo": {
"name": "course-client",
"version": "1.0.0"
}
}
}
}POST प्रतिक्रिया एक लंबे समय से चलने वाली SSE धारा है। इसका पहला प्रोटोकॉल संदेश हैnotifications/subscriptions/acknowledged. मान्यता, प्रत्येक परिवर्तन सूचना और अंतिम परिणाम ले जानेio.modelcontextprotocol/subscriptionIdमें _metaसर्वर SSE टिप्पणी को रखरखाव के रूप में जारी कर सकता है। जब स्ट्रीम गिरता है, क्लाइंट पुनः जारी करता है subscriptions/listenएक नया अनुरोध आईडी के साथ और प्रभावित डेटा को फिर से अपडेट करता है।
resources/subscribeऔर resources/unsubscribeआधुनिक संबंध में उनका उपयोग न करें।
स्पष्ट आवेदन की स्थिति
प्रोटोकॉल सत्रों को हटाने से राज्य के साथ वर्कफ़्लो पर प्रतिबंध नहीं होता है। सर्वर एक अस्पष्ट राज्य हैंडल को मचा सकता है और इसे एक सामान्य उपकरण परिणाम के रूप में वापस कर सकता है। बाद में कॉल पर क्लाइंट उस हैंडल को स्पष्ट तर्क के रूप में पारित करता है।
प्रमाणीकृत मूल के लिए हैंडल को बांधें, उन्हें अमूर्त बनाएं, उन्हें समाप्त करें, और प्रत्येक उपयोग को अधिकृत करें। यह राज्य को परिवहन निकटता में छिपाने के बजाय आवेदन परत पर दिखाई देता है।
छिपे हुए प्रतिकृति राज्य के कारण विफलता यांत्रिक हैः
- अनुरोध ए प्रतिकृति 1 तक पहुँचता है और उस प्रक्रिया की स्मृति में एक मसौदा बनाता है।
- उत्तर में एक मसौदा हैंडल नहीं लौटाया जाता है क्योंकि कार्यान्वयन का मान लेना है कि कनेक्शन मसौदा की पहचान करता है।
- अनुरोध बी एक ताजा पोस्ट है और प्रतिकृति 2 तक पहुंचता है।
- प्रतिकृति 2 में मान्य प्रोटोकॉल मेटाडेटा है लेकिन ड्राफ्ट का नाम या लोड करने का कोई तरीका नहीं है, इसलिए वर्कफ़्लो विफल रहता है या गलत स्थानीय वस्तु को पढ़ता है।
- चिपचिपा रूटिंग से लक्षण ठीक हो जाता है जब तक कि एक पुनः आरंभ, रोलआउट, री शेड्यूल, या फेलओवर अगले अनुरोध को स्थानांतरित नहीं करता।
सही सीमा में दो भाग होते हैं। प्रत्येक अनुरोध में प्रोटोकॉल संदर्भ रहता है। टिकाऊ आवेदन राज्य एक साझा स्टोर में रहता है सर्वर-मिंट हैंडल के तहत ग्राहक को लौटाया गया। अगले कॉल में वह आपूर्ति होती है, कोई भी प्रतिकृति उसी रिकॉर्ड को लोड करती है, और प्राधिकरण रिकॉर्ड को प्रमाणित प्रधान और किरायेदार से जोड़ता है। प्रतिकृति स्मृति रिकॉर्ड को कैश कर सकती है, लेकिन यह सटीकता के लिए आवश्यक एकमात्र प्रति नहीं हो सकती है।
जीवनकाल के अनुसार राज्य तंत्र चुनें। अनुरोध-स्थानीय चर एक कॉल पर सेवा कर सकते हैं। एक छोटा MRTR निरंतरता अखंडता-संरक्षित का उपयोग कर सकती है requestState. एक मसौदा या टिकाऊ कार्य को एक स्पष्ट हैंडल और साझा दृढ़ता, समाप्ति, समवर्ती नियंत्रण और निष्क्रियता की आवश्यकता होती है। इनमें से कोई भी वस्तु एमसीपी प्रोटोकॉल सत्र नहीं है।
HTTP दो युग संगतता
आधुनिक और विरासत सर्वर का समर्थन करने वाले क्लाइंट पहले एक आधुनिक POST का प्रयास करता है। यदि यह HTTP प्राप्त करता है 400,404या 405, यह शरीर की जांच करता हैः
- एक मान्यता प्राप्त आधुनिक JSON-RPC त्रुटि सर्वर आधुनिक है साबित करता है. अनुरोध को सुधारें या विज्ञापन संस्करण पुनः प्रयास करें. डाउनग्रेड न करें.
- एक खाली शरीर या एक अनजान प्रतिक्रिया एक विरासत HTTP + एसएसई सर्वर को इंगित कर सकती है। केवल तब पुराने GET एंडपॉइंट की कोशिश करें और इसकी विरासत की उम्मीद करें
endpointघटना।
एक सर्वर आधुनिक मेटाडेटा को आधुनिक POST-केवल कार्यान्वयन में रूट करके और पुराने क्लाइंट के लिए अलग-अलग विरासत अंत बिंदुओं को बनाए रखकर प्रवास के दौरान दोनों युगों का समर्थन कर सकता है। कभी भी विरासत GET, DELETE, सत्र आईडी या रीप्ले व्यवहार को भाग के रूप में वर्णित न करें।2026-07-28. .
इसका प्रयोग करें
code/main.pyयह पायथन मानक पुस्तकालय के साथ एक परिमित, आधुनिक स्ट्रीम करने योग्य HTTP सर्वर को लागू करता है। यह मूल और दर्पण हेडर को मान्य करता है, हटाए गए सत्र हेडरों को अनदेखा करता है, सामान्य कॉल के लिए JSON लौटाता है, और परिमित प्रदर्शित करता है subscriptions/listenएसएसई धारा.
bashcd code
python3 main.py --probe
python3 -m unittest discover tests -vजांच जांचः
- अमान्य उत्पत्ति अस्वीकार कर दी जाती है;
- सत्र आईडी के बिना खोज सफल होती है;
Mcp-Session-IdऔरLast-Event-IDअनदेखा किया जाता है;- हेडर असंगतता रिटर्न
-32020. - असमर्थित संस्करण रिटर्न
-32022सटीक रूप सेsupportedऔरrequestedडेटा; - एक स्वीकार की गई आईडी-कम सूचना HTTP पर लौटती है
202बिना शरीर के; - प्राप्त करें और हटाएँ वापसी
405. subscriptions/listenएक POST प्रतिक्रिया धारा है जिसकी पुष्टि, सूचनाएं और अंतिम परिणाम में उसकी सदस्यता आईडी है।
इसे भेजें
यह सबक जहाजों outputs/skill-mcp-transport-migrator.md. यह आधुनिक प्रोटोकॉल सत्रों को हटा देता है, हेडर-बॉडी वैधता जोड़ता है, स्टैंडअलोन GET को बदल देता है subscriptions/listen, और किसी भी विरासत पुल को दिखाई देने योग्य रूप से अलग रखता है।
व्यायाम
- हटाएँ
Mcp-Methodएक POST से. HTTP की पुष्टि करें400और त्रुटि-32020. . - अनुकूली हेडर और बॉडी संस्करण भेजें
2027-01-01. HTTP की पुष्टि करें400, त्रुटि-32022, और सटीक आंकड़े{"supported":["2026-07-28"],"requested":"2027-01-01"}. . - एक Base64 सेंटीनेल भेजें
Mcp-Nameएक गैर-ASCII संसाधन URI के लिए। पुष्टि करें कि डिकोड मान की तुलनाparams.uri. . - अंतिम प्रतिक्रिया से पहले अंतहीन सुन धारा को तोड़ें, इसे एक नए JSON-RPC आईडी के साथ फिर से प्रकाशित करें और रीफेच टूल के साथ।
- पिंग टूल में एक स्पष्ट वर्कफ़्लो हैंडल जोड़ें। कनेक्शन आत्मीयता का उपयोग किए बिना इसे एक प्राधिकरण विषय से बांधें।
प्रमुख शर्तें
| Term | Meaning |
|---|---|
| stdio | Newline-delimited JSON-RPC over a client-launched subprocess |
| Streamable HTTP | Single endpoint where each modern message is a new POST |
| Request-scoped SSE | POST response stream containing related notifications and final response |
subscriptions/listen | Long-lived POST request for opted-in change notifications |
| Header mismatch | HTTP 400 and JSON-RPC -32020 when mirrored headers disagree with body |
| Origin validation | DNS-rebinding defense for incoming connections, not authentication |
| Explicit state handle | Application token passed as an ordinary argument instead of hidden session state |
| Legacy bridge | Separate earlier-era behavior kept only for compatibility |
आगे पढ़ना
- MCP Transport Overview
- MCP stdio Transport
- MCP Streamable HTTP
- MCP Subscriptions
- MCP 2026-07-28 Changelog
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.