एमसीपी कॉन्फॉर्मेंस इंजीनियरिंगः वर्शनिंग, सबूत और संचालन
Type: Build
Languages: Python
Prerequisites: Phase 13 · 09 (transports), Phase 13 · 17 (gateways), Phase 13 · 30 (registry admission)
Time: ~100 minutes
सीखने के लक्ष्य
- मानदंडात्मक एमसीपी नियमों को स्वर्ण और नकारात्मक तार प्रतिलेखन में बदल दें।
- कठोर रहें
2026-07-28सीमित विरासत से अलग व्यवहार। - अमान्य अनाम से अदभूत अज्ञात क्षेत्रों को अलग करें
resultType. . - कच्चे JSON-RPC सबूत की तुलना SDK-मानकीकृत दृश्य के साथ करें।
- एक वास्तविक प्रॉक्सी सीमा के माध्यम से सिर और शरीर की अखंडता साबित करें।
- संपादित प्रतिलिपि, स्वास्थ्य, और रोलबैक सबूतों के साथ गेट रिलीज़।
समस्या
आपका ग्राहक कॉल करता हैtools/listएक SDK के माध्यम से और उपकरण प्राप्त करता है। एकीकरण परीक्षण पास.
इस नतीजे से महत्वपूर्ण प्रश्नों का उत्तर नहीं मिलता हैः
- क्या अनुरोध में प्रति अनुरोध प्रोटोकॉल के आधुनिक मेटाडेटा थे?
- किया था
MCP-Protocol-Version,Mcp-MethodऔरMcp-NameJSON-RPC शरीर के साथ मेल खाता है? - क्या प्रतिक्रिया में एक मान्य शामिल है
resultTypeतार पर, या SDK एक संश्लेषित किया? - क्या ग्राहक भविष्य में एक योजक क्षेत्र को बनाए रखेगा?
- क्या आधुनिक समय की मान्यता प्राप्त त्रुटि गलती से एक विरासत में मिला हाथ मिलाकर शुरू कर देगी?
- क्या प्रॉक्सी ने मूल स्थिति और JSON-RPC त्रुटि को संरक्षित किया?
- क्या सूचना सीरियलाइजर ने एक निषिद्ध प्रतिक्रिया जारी की?
- क्या ऑपरेशन साबित कर सकते हैं कि रहस्यों को संग्रहीत किए बिना रिहाई को बढ़ावा दिया गया या वापस रोल किया गया?
अनुपालन अवलोकन योग्य अपरिवर्तकों का एक सेट है। उत्पादन यातायात उन्हें खोजने से पहले उन अपरिवर्तकों को पकड़ने के लिए एक हर्नर बनाएं।
संस्करण युग से शुरू करें
एमसीपी 2026-07-28एक आधुनिक अनुरोध में शामिल है params._meta.io.modelcontextprotocol/protocolVersionऔर params._meta.io.modelcontextprotocol/clientCapabilities. नामों के बीच सटीक कुंजी महत्वपूर्ण है; खाली protocolVersionया clientCapabilitiesजब HTTP सीमा पर दर्पण रूटिंग हेडर मौजूद होते हैं, तो उनके मानों को JSON-RPC शरीर के साथ सहमत होना चाहिए। आधुनिक सफल परिणाम ले जाते हैं resultType. .
के माध्यम से संस्करण2025-11-25पहले के आरंभिकरण युग का उपयोग करें. बिना एक विरासत परिणाम resultTypeग्राहक द्वारा उस पूर्व युग को चुनने के बाद ही इसे पूर्ण के रूप में व्याख्या किया जाता है।
एक अनुमतिक सत्यापनकर्ता न बनाएं जो दोनों आकारों को एक साथ स्वीकार करता है। दो शाखाओं का उपयोग करेंः
| Branch | Entry evidence | Missing resultType | Initialization |
|---|---|---|---|
| Modern | Successful server/discover or recognized modern response | Invalid | Not the default path |
| Legacy | Configured allowlist plus a valid legacy initialize result after an inconclusive modern probe | Interpreted as complete | Required by that era |
अलग होने से एक गलत रूप से बने आधुनिक साथी को कमज़ोर प्रमाणन के साथ पुरस्कृत नहीं किया जाता है।
कड़ा मोड
सख्त मोड आधुनिक व्यवहार का प्रमाण की आवश्यकता होती है।server/discoverआधुनिक शाखा साबित करता है. एक मान्यता प्राप्त आधुनिक JSON-RPC त्रुटि भी यह साबित करता है. अनुरोध को सुधारें या रोकें. कभी भी डाउनग्रेड न करें क्योंकि सर्वर वापस आ गया है-32020,-32021या -32022. .
रिवर्स मोड
Fallback मोड एक सीमित आधुनिक जांच करता है। एक टाइमआउट, खाली उत्तर, बंद कनेक्शन या अनजान प्रतिक्रिया निष्कर्षहीन है। यह साबित नहीं करता है कि साथी विरासत है। केवल एक स्पष्ट रूप से कॉन्फ़िगर या संगतता के लिए अनुमत अंत बिंदु तब एक सीमित विरासत जांच प्राप्त कर सकता है, और क्लाइंट उस जांच की पुष्टि करने के बाद ही विरासत शाखा का चयन करता है।initializeपरिणाम और वार्ता की गई विरासत संशोधन।
किसी भी त्रुटि के बाद फ़ॉलबैक प्रयास विरासत नहीं है। एक मान्यता प्राप्त आधुनिक त्रुटि में उपयोगी सुधार जानकारी होती है। इसके बाद डाउनग्रेड करना हेडर असंगतता, अनुपलब्ध क्षमता घोषणा या असमर्थित संस्करण को छिपा सकता है।
यह एक हमलावर, आउटेज या फ़िल्टरिंग प्रॉक्सी को आधुनिक प्रतिक्रिया को छोड़कर डाउनग्रेड करने से रोकता है। अंत बिंदु नीति, अनिश्चित आधुनिक अवलोकन, सटीक सकारात्मक विरासत साक्ष्य और चयनित युग को एक साथ रिकॉर्ड करें।
प्रत्येक प्रतिलेख के साथ चयनित युग को रिकॉर्ड करें। इस तथ्य के बिना, एक परीक्षण रन में एक गायब क्षेत्र स्वीकार्य और दूसरे में अमान्य लग सकता है।
एक प्रतिलेख का निर्माण करें
एक ट्रांसक्रिप्ट फिक्स्चर रिकॉर्ड करता है कि सीमा पार क्या है, न केवल SDK कॉलः
json{
"name": "golden-modern-list",
"era": "modern",
"headers": {
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tools/list"
},
"request": {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {}
}
}
},
"responseStatus": 200,
"responseBody": {
"jsonrpc": "2.0",
"id": 1,
"result": {
"resultType": "complete",
"tools": []
}
}
}दो वर्गों के सामान रखें।
स्वर्ण प्रतिलेख
स्वर्ण प्रतिलेख स्वीकार्य व्यवहार साबित करते हैंः
- समकालीन खोज या विधि अनुरोध जो मेल खाने वाले मेटाडेटा और हेडर के साथ है
- आवश्यक फ़ील्ड के साथ पूर्ण परिणाम
input_requiredपरिणाम जब विधि अधिक इनपुट का अनुरोध कर सकती है- विस्तार परिणाम केवल तभी जब संबंधित क्षमता की घोषणा की गई हो
- बिना
resultType, लेकिन केवल चयनित विरासत युग में - JSON-RPC प्रतिक्रिया के बिना सूचना प्रसंस्करण
एक स्वर्ण प्रतिलेख सटीक है, बड़ा नहीं है। अस्थिर आईडी और समय टिकटों को निर्धारित रखें या तुलना से पहले उन्हें सामान्य बनाएं।
नकारात्मक प्रतिलेख
नकारात्मक प्रतिलेखन अस्वीकार व्यवहार साबित करते हैंः
- सिर और शरीर में असंगति
- अनुरोध पर अनुपलब्ध क्षमताएं
- असमर्थित मेल खाता प्रोटोकॉल संस्करण
- आधुनिक गायब
resultType - अज्ञात या अवकाशित
resultType - प्रतिक्रिया
jsonrpc2.0या एक आईडी जो मूल्य या JSON प्रकार में भिन्न है - दोनों को युक्त प्रतिक्रिया
resultऔरerror, या कोई भी - एक पूर्णांक के बिना त्रुटि
codeऔर स्ट्रिंगmessage - एक ज्ञात प्रोटोकॉल त्रुटि गलत HTTP स्थिति के लिए मैप की गई
- सूचना के लिए जारी प्रतिक्रिया
- गलत रूप से तैयार JSON-RPC लिफाफा
- प्रोटोकॉल त्रुटि का प्रॉक्सी विफलता
प्रत्येक नकारात्मक मामले के लिए, अस्वीकृति सीमा और स्थिर त्रुटि कोड का दावा करें। कॉल विफल बहुत कमजोर है। प्रॉक्सी-जनरेट 500 और एक मूल -32020आप दोनों को एक साथ असफलता की तरह देख सकते हैं जबकि ऑपरेटरों को पूरी तरह से अलग-अलग कहानियां बता रहे हैं।
हेडर-असमानता फिक्स्चर में सर्वर की वास्तविक HTTP 400 JSON-RPC प्रतिक्रिया को मिलान अनुरोध आईडी और त्रुटि कोड के साथ शामिल करना चाहिए -32020. जब भी स्थानीय सत्यापनकर्ता ध्यान देता है कि स्वचालित रूप से लागू करें HeaderMismatch; प्रतिक्रिया सत्यापन को वैकल्पिक फिक्स्चर फ्लैग न बनाएं। HTTP 500 के साथ एक मामला और कोई शरीर विफल रहता है भले ही स्थानीय अस्वीकृति कोड सही हो। एक हर्न जो अपने स्वयं के अनुरोध सत्यापनकर्ता के फेंकने के बाद रुक जाता है, ने केवल खुद का परीक्षण किया है, सर्वर के तार व्यवहार नहीं।
आधिकारिक MCP अनुरूपता परियोजना एक बाहरी सूट और संस्करणित संदर्भ के रूप में उपयोगी है। अपने स्थानीय प्रतिलेखन को भी रखें। वे आपके प्रॉक्सी, एसडीके, प्रमाणीकरण, एक्सटेंशन और रिलीज पथ को कैप्चर करते हैं, जिन्हें एक सामान्य सूट नहीं जान सकता है।
हेडर वैल्यूज आरपीसी बॉडी से मेल खाती होनी चाहिए
आधुनिक स्ट्रीम करने योग्य HTTP में, मध्यस्थ दर्पण हेडर का उपयोग करके नीति को रूट या लागू कर सकते हैं। JSON-RPC शरीर सत्य का प्रोटोकॉल स्रोत बना रहता है। एक असंगतता एक अखंडता विफलता है, एक मान चुनने का संकेत नहीं है।
इस क्रम में मान्य करेंः
- JSON-RPC लिफाफे और मेटाडेटा प्रकारों का विश्लेषण और सत्यापन करें।
- तुलना करें
MCP-Protocol-Versionके साथparams._meta.io.modelcontextprotocol/protocolVersion. . - तुलना करें
Mcp-Methodके साथmethod. . - यदि विधि का एक राउटिंग नाम है, तो तुलना करें
Mcp-Nameसंबंधित शरीर मूल्य के साथ। - समानता स्थापित होने के बाद, तय करें कि क्या मैच संस्करण और क्षमता सेट समर्थित हैं।
इस क्रम में असंगति को अलग करता है-32020असमर्थित संस्करण से -32022. यह एक गेटवे को हेडर नाम को अधिकृत करने से भी रोकता है जबकि मूल एक अलग शरीर नाम निष्पादित करता है।
HTTP फ़ील्ड नाम केस-अनसुलभ होते हैं, जबकि उनके मान केस-संवेदनशील रहते हैं। खोज से पहले हेडर नामों को सामान्य बनाएं और असंगत डुप्लिकेट को अस्वीकार करें। असुरक्षित, गैर-एएससीआईआई या अग्रणी-या-पछाड़-सफेद स्थान के लिए Mcp-Name, सटीक को डिकोड =?base64?{Base64EncodedValue}?=शरीर के साथ तुलना करने से पहले UTF-8 sentinel। एक अपूर्ण sentinel, अमान्य Base64, अमान्य UTF-8 या कच्चे असुरक्षित मान के साथ खारिज करें -32020. कच्चे आसपास के सफेद स्थान अमान्य है भले ही शरीर में समान वर्ण हों क्योंकि उस मूल्य को परिवहन से पहले सेंटीनेल एन्कोडिंग की आवश्यकता होती है।
एक मध्यस्थ एक गलत HTTP को अस्वीकार कर सकता है जब तक कि एक अनुरोध MCP सर्वर तक नहीं पहुंच जाता है, इसलिए इसकी विफलता JSON-RPC के बिना एक HTTP त्रुटि हो सकती है। यह कैप्चर करें कि क्या अस्वीकृति मध्यस्थ या मूल से आई है। मूल MCP सर्वर को एक मान्य JSON-RPC अनुरोध को संभालने के लिए प्रोटोकॉल त्रुटि अनुबंध का उपयोग करना चाहिए।
अज्ञात क्षेत्र अज्ञात परिणाम नहीं हैं
आगे की संगतता के लिए दो अलग-अलग नियम आवश्यक हैं।
अदिश अज्ञात क्षेत्र
परिणाम वस्तुओं और _metaमानचित्रों में क्षेत्र प्राप्त हो सकते हैं। एक सत्यापितकर्ता को अपनी भूमिका के अनुसार एक योजक क्षेत्र को संरक्षित या अनदेखा करना चाहिए, जब तक कि क्षेत्र एक आरक्षित अनुबंध का उल्लंघन नहीं करता है। नमूना सबूत में पूर्ण कच्चे परिणाम को रखता है और स्वीकार करता है futureHintऔर एक ज्ञात परिणाम के साथ।
यदि आप पारदर्शी प्रॉक्सी हैं, तो एक अज्ञात फ़ील्ड को संरक्षित करना आमतौर पर इसे हटाने से अधिक सुरक्षित होता है। यदि आप एक एप्लिकेशन क्लाइंट हैं, तो इसे अनदेखा करना मान्य हो सकता है। आपके अंतर परीक्षण को अभी भी पता लगाना चाहिए कि एसडीके ने इसे छोड़ दिया है इसलिए व्यवहार जानबूझकर है।
अज्ञात resultType
resultTypeआधुनिक परिणामों का उपयोगcompleteया input_required. एक एक्सटेंशन केवल तभी एक और मूल्य जोड़ सकता है जब इसकी क्षमता का विज्ञापन किया गया हो. उदाहरण के लिए, कार्य एक्सटेंशन जोड़ सकता है taskउस वार्ता क्षमता के संदर्भ में।
एक अज्ञात या गैर-प्रशंसित भेदभाव को सुरक्षित रूप से पूर्ण नहीं माना जा सकता है। ग्राहक को यह नहीं पता कि जीवन चक्र को वह त्याग देगा। इसे अस्वीकार करें।
इसी कच्चे उत्तर में एक स्वीकार्य अज्ञात क्षेत्र और एक अस्वीकार्य अज्ञात परिणाम प्रकार हो सकता है। दोनों मामलों का परीक्षण करें।
भेदभाव केवल पहला परत है। इसके बाद विधि-विशिष्ट उपयोगिता भार को मान्य करें। एक पूर्ण tools/listपरिणाम की आवश्यकता होती है toolsसरणी जिसके वर्णकों में अद्वितीय गैर-खाली नाम, उपयोगी विवरण और वस्तु-मूल हैं inputSchemaमूल्य।taskपरिणाम केवल पात्र व्यक्ति के लिए मान्य है tools/callकार्य क्षमता के साथ और आवश्यकताओं के साथtaskId, ज्ञात स्थिति, निर्माण और अद्यतन समयशीर्षक, तथा ttlMs, प्लस एक वैध वैकल्पिक मतदान अंतराल. एक पूर्ण completion/completeपरिणाम के लिए एक completion100 स्ट्रिंग मानों से अधिक नहीं होने वाला वस्तु, एक वैकल्पिक गैर-नकारात्मक पूर्णांक totalजो लौटाए गए मानों से छोटा नहीं है, और एक वैकल्पिक बुल hasMore. एक अच्छी तरह से लिखा गया .resultTypeएक गलत रूप से अनुकूलित उपयोगिता लोड नहीं बना सकते।
अधिसूचना अपरिवर्तनीय
JSON-RPC सूचना में कोई id. रिसीवर को JSON-RPC सफलता या त्रुटि प्रतिक्रिया नहीं भेजना चाहिए।
स्वीकार किए गए HTTP सूचना के रूप के लिए, हर्नस HTTP की अपेक्षा करता है 202एक खाली शरीर के साथ।2026-07-28स्ट्रीम करने योग्य HTTP पर कोई कोर क्लाइंट-टू-सर्वर सूचनाएं परिभाषित नहीं करती हैं। नमूना केवल एकतरफा सीरियलाइज़र अपरिवर्तित का परीक्षण करने के लिए नाम-स्थानित पाठ्यक्रम विस्तार सूचना का उपयोग करता है। इसे एक नई कोर विधि के रूप में प्रस्तुत न करें।
सिरियललाइजर का परीक्षण करें, न केवल हैंडलर।Noneजबकि मध्यवेयर इसे JSON सफलता वस्तु में लपेटता है. अंतिम प्रस्थान बाइट्स कैप्चर करें.
एक SDK अंतर जोड़ें
एसडीके अक्सर तार वस्तुओं को सुविधाजनक भाषा प्रकारों में बदल देते हैं। यह उपयोगी है, लेकिन एक सामान्य वस्तु यह साबित नहीं कर सकती कि क्या प्राप्त हुआ था।
प्रत्येक उच्च जोखिम वाले उपकरण के लिए, पकड़ेंः
- एसडीके डिकोडिंग से पहले कच्चे स्थिति, हेडर और प्रतिक्रिया निकाय।
- SDK-नर्मलाइज्ड रिटर्न वैल्यू या अपवाद।
- चयनित युग के लिए अपेक्षित अर्थिक अनुमान।
- SDK द्वारा उठाए गए, संश्लेषित किए गए, हटाए गए या बदले गए फ़ील्ड।
नमूना केवल SDK के लिए ज्ञात वायर अकाउंटिंग को हटाने की अनुमति देता है जैसे resultType,_meta,ttlMsऔर cacheScopeअनुप्रयोगों के उपयोगिता भार की तुलना करते समय। यह एक गिरावट की रिपोर्ट करता हैfutureHintक्योंकि यह अज्ञात अर्थिक क्षेत्र गायब हो गया।
यह मत मानो कि हर अंतर एक एसडीके बग है। यह परिवर्तन को दृश्यमान बनाना है। यह तय करें कि आपका घटक एक अनुप्रयोग एंडपॉइंट है, जो एक योजक क्षेत्र को अनदेखा कर सकता है, या पारदर्शी मध्यस्थ है, जिसे इसे संरक्षित करना चाहिए।
यदि दो एसडीके एक ही ट्रांसक्रिप्ट को अलग तरीके से सामान्य करते हैं, तो रिलीज़ नीति को यह कहना चाहिए कि तथ्य के बाद सबसे सुविधाजनक आउटपुट चुनने के बजाय कौन सा व्यवहार स्वीकार्य है।
प्रॉक्सी साक्ष्य प्राप्त करें
अधिकांश उत्पादन MCP विफलता एक से अधिक प्रक्रियाओं में होती है। तीन दृश्य दर्ज करेंः
| View | Minimum evidence |
|---|---|
| Ingress | request headers, JSON-RPC body, content type, authenticated route, receive time |
| Origin | forwarded headers and body digest, origin status, response headers and body |
| Egress | client-visible status, headers, body, and send time |
नमूना दो आम परिवर्तनों का पता लगाता हैः
- एक मूल HTTP 400 या 404 JSON-RPC त्रुटि एक सामान्य प्रॉक्सी 500 बन जाता है
- निकासी JSON-RPC निकाय मूल निकाय से भिन्न होता है
सामग्री प्रकार के लिए तैनाती-विशिष्ट कथन जोड़ें, AcceptTLS समाप्ति के दोनों पक्षों को जब नीति अनुमति देता है कैप्चर करें। केवल पथ साबित करने के लिए कभी भी क्रेडेंशियल लॉग नहीं।
सबूतों से पहले पुनर्लेखित करें
संपादन अनुपालन कार्यों का हिस्सा है, बाद में सफाई कार्य नहीं। इसे क्रमबद्ध करने, हैशिंग, लॉग, परीक्षण कलाकृतियों या विफलता अपलोड से पहले लागू करें।
नमूना केस में कुंजी नामों को फोल्ड किया जाता है और मिलान से पहले विभाजक हटा दिए जाते हैं, फिर फिर पुनरावर्ती रूप से कुंजी के तहत मानों को बदल दिया जाता है जैसे Authorization,Cookie,Set-Cookie,X-Api-Key,accessToken,clientSecret,registrationAccessToken,token,password,secretऔर api_key. कैनोनाइजेशन और डेनिलस्ट को एक ही रूप का उपयोग करना चाहिए ताकि camelCase, हाइफ़ेन, हाइफेन, और डॉट वेरिएंट एक दूसरे की नीति को बायपास नहीं कर सकें। एक उत्पादन कलेक्टर को विधि-विशिष्ट तर्क नीति जोड़नी चाहिए, क्योंकि एक हानिरहित कुंजी जैसे queryइसमें व्यक्तिगत या विनियमित डेटा भी हो सकता है।
संसाधित साक्ष्य बंडल को हिट करें। कच्चे कैप्चर को केवल एक स्वीकृत अल्पकालिक प्रणाली में रखें जब एक विशिष्ट जांच के लिए उन्हें आवश्यक हो। एक डाइजेस्ट साबित करता है कि किस संसाधित बंडल ने निर्णय लिया; यह हटाए गए मूल्य का खुलासा नहीं करता है।
स्वास्थ्य और रोलबैक को द्वार का हिस्सा बनाएं
प्रोटोकॉल अनुपालन आवश्यक है लेकिन रिलीज़ के लिए पर्याप्त नहीं है। एक अनुरूप उम्मीदवार अभी भी समय आउट, मेमोरी लीक या निर्भरता को ओवरलोड कर सकता है।
प्रक्षेपण से पहले एक स्वास्थ्य विंडो को परिभाषित करेंः
- न्यूनतम नमूना संख्या
- अधिकतम त्रुटि दर
- अधिकतम विलंबता प्रतिशत
- संतृप्ति या संसाधन सीमा
- अवलोकन की अवधि
- स्वीकार किए गए मूल मानदंड के साथ तुलना
रोलआउट से पहले भी रोलआउट सबूतों को परिभाषित करेंः
- पूर्ववर्ती संस्करण
- प्रवेश प्रमाण का पचास
- SHA-256 कलाकृतियों और वर्णक पिन
- वर्तमान रजिस्ट्री की स्थिति
- वर्तमान स्वास्थ्य परिणाम
- मार्ग बहाली प्रक्रिया
- एक विश्वसनीय रिहाई नियंत्रक पहचान से उन सटीक क्षेत्रों पर एक प्रमाण पत्र
उम्मीदवार की विफलता के बाद ही नहीं, पदोन्नति से पहले उस रोलबैक लक्ष्य की पुष्टि और स्वस्थ होने की आवश्यकता है। उपयोग योग्य वसूली पथ के बिना एक सफल रिलीज उत्पादन के लिए तैयार नहीं है।
यदि कोई उम्मीदवार असफल हो जाता है और रोल-बैक लक्ष्य में उस सबूत का अभाव होता है, तो अनुमान लगाने के बजाय ट्रैफ़िक को रोकें।
सत्यता जांच के लिए तैयारता को कम न करें जैसे कि गैर-खाली संस्करण, healthy: "yes", या एक मनमाने सबूत स्ट्रिंग। नमूना को सटीक प्रकार, एक सक्रिय स्थिति, तीन SHA-256 डिजेस्ट, एक विश्वसनीय हस्ताक्षरकर्ता और पूर्ण रोलबैक उपयोगिता लोड पर एक मान्य HMAC-SHA-256 प्रमाण पत्र की आवश्यकता होती है। इसकी निर्णायक डेमो कुंजी एक गैर-गुप्त फिक्स्चर है। उत्पादन में रिलीज सीमा पर एक संरक्षित कुंजी, KMS सत्यापन परिणाम, या सार्वजनिक कुंजी प्रमाण पत्र सत्यापनकर्ता इंजेक्ट करें।
रिलीज़ गेट भी खाली ट्रांसक्रिप्ट, एसडीके अंतर, या प्रॉक्सी सबूतों से इनकार करता है। प्रत्येक स्रोत में वैध सबूत डाइजेस्ट होना चाहिए। एक हरे स्वास्थ्य विंडो एक सीमा को भर नहीं सकती है जो कभी नहीं देखी गई थी।
इसे बनाओ
मानक पुस्तकालय हर्नेस चलाएंः
bashcd phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations
python3 code/main.pyडेमो में वैध और गलत रूप से तैयार किए गए परिणामों सहित ठीक पंद्रह स्वर्ण और नकारात्मक प्रतिलेखन चल रहे हैं, एक एसडीके दृश्य के साथ कच्चे परिणाम की तुलना करता है, एक प्रॉक्सी की जांच करता है जो एक मूल त्रुटि से ढह गया है, स्वास्थ्य का मूल्यांकन करता है, रिलबैक साक्ष्य को प्रमाणित करता है, और उस लक्ष्य का चयन करता है।
अपेक्षित आकारः
json{
"transcriptsPassed": 15,
"transcriptsTotal": 15,
"sdkDroppedFields": ["futureHint"],
"proxyIssues": [
"proxy collapsed a protocol error into HTTP 500",
"proxy changed the origin JSON-RPC body"
],
"releaseAction": "rollback",
"evidenceDigest": "..."
}पढ़िए code/main.pyइस क्रम मेंः
validate_request()युग-विशिष्ट अनुरोध और शीर्षक नियम लागू करता है।validate_result()अनुपस्थित विरासत भेदभाव, वैध आधुनिक मूल्य, विस्तार और अज्ञात मूल्य को अलग करता है।select_era()सख्त और सीमित वापसी नीति लागू करता है।run_transcript()स्वर्ण और नकारात्मक फिक्स्चर का मूल्यांकन करता है।compare_sdk_view()सामान्यीकरण अंतर का खुलासा करता है।inspect_proxy()प्रवेश, उत्पत्ति और प्रस्थान के प्रमाणों की तुलना करता है।redact()सबूत हैशिंग से पहले स्पष्ट रहस्यों को हटा देता है।rollback_evidence_ready()सटीक पिन फ़ील्ड और विश्वसनीय रिलीज़ प्रमाणपत्र को मान्य करता है।ReleaseGate.evaluate()गैर-खाली अनुपालन, SDK, प्रॉक्सी, स्वास्थ्य और रोलबैक सबूतों को जोड़ता है।
इसका प्रयोग करें
चार बिंदुओं पर हार्नेस चलाएंः
- प्रक्रिया में परीक्षण एडाप्टर के साथ प्रत्येक कार्यान्वयन परिवर्तन पर।
- वास्तविक परिवहन पर निर्मित क्लाइंट और सर्वर द्विआधारी के खिलाफ।
- एक मंचन वातावरण में तैनात प्रॉक्सी या गेटवे के माध्यम से।
- जीवित स्वास्थ्य और रिलैक्स सबूत के साथ कैनरी रोलआउट के दौरान।
परतों के पार एक ही स्थिर मामले के नाम रखें। negative-header-body-mismatchइकाई, अंत-से-अंत, प्रॉक्सी और कैनरी रिपोर्ट में एक ही अपरिवर्तनीय का अर्थ होना चाहिए। सबूत डाइजेस्ट अलग होगा क्योंकि सीमा बदल गई है; आवश्यकता नहीं होनी चाहिए।
संस्करण नियंत्रण में फिक्स्चर योजनाओं को स्टोर करें। अपने रिलीज़ सिस्टम में संपादित रन सबूत स्टोर करें। केवल घटना पहुंच नियंत्रण के तहत अल्पकालिक कच्चे कैप्चर स्टोर करें।
इंटरैक्टिव लैब
लैब एः युग की सीमा साबित करें
codeनिर्देशिका, खुला पायथनः
bashcd phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations/code
python3 -qदौड़ें:
pythonfrom main import *
validate_result({"tools": []}, "legacy")
validate_result({"tools": []}, "modern")विरासत कॉल अंत होता है complete. आधुनिक कॉल उठता है ProtocolViolationअब परीक्षण वापसीः
pythonselect_era({"kind": "timeout"}, "fallback")
select_era(
{"kind": "timeout"},
"fallback",
legacy_allowed=True,
legacy_evidence={"kind": "initialize_success", "protocolVersion": LEGACY_VERSION},
)
select_era({"kind": "jsonrpc_error", "code": -32021}, "fallback")पहला टाइमआउट बंद नहीं होता है क्योंकि चुप्पी विरासत प्रमाण नहीं है। दूसरा कॉल विरासत का चयन केवल इसलिए करता है क्योंकि कॉन्फ़िगरेशन इसे अनुमति देता है और एक मान्य विरासत आरंभिकरण परिणाम देखा गया है। मान्यता प्राप्त गायब क्षमता त्रुटि आधुनिक शाखा साबित करती है।
लैब बीः योजक क्षेत्र बनाम भेदभावकर्ता
pythonvalidate_result({"resultType": "complete", "tools": [], "futureHint": True}, "modern")
validate_result({"resultType": "future_mode", "tools": []}, "modern")पहला परिणाम संरक्षित करता है futureHint. दूसरा अस्वीकार कर दिया गया है क्योंकि जीवन चक्र भेदभाव अज्ञात है.
लैब सी: एसडीके परिवर्तन की जांच करें
pythoncompare_sdk_view(
{"resultType": "complete", "tools": [], "futureHint": {"mode": "new"}},
{"tools": []},
)यह तय करें कि क्या आपका घटक अनदेखा कर सकता है futureHintया इसे आगे बढ़ाना है। उस विकल्प को रिलीज नीति में लिखें. मौन रूप से अंतर को मिटाएं नहीं।
लैब डीः प्रॉक्सी की मरम्मत
डेमो विनिमय को संशोधित करें ताकि बाहर निकलने मूल स्थिति और शरीर को संरक्षित करता है।python3 main.pyप्रॉक्सी समस्याएं गायब हो जाना चाहिए, लेकिन एसडीके अंतर अभी भी प्रचार को अवरुद्ध करता है।futureHintSDK दृश्य में और कार्रवाई परिवर्तन का अवलोकन करने के लिए promoteजब हर सबूत का स्रोत बीत जाएगा
अभ्यास प्रयोगशाला
हर्नस में अनुरोध-स्केप एसएसई प्रतिलेख जोड़ें।
आवश्यकताएँः
- प्रतिक्रिया की स्थिति, सामग्री प्रकार, आदेशित SSE घटनाओं और स्ट्रीम समाप्ति को कैप्चर करें।
- प्रत्येक JSON-RPC घटना में एक मान्य युग-विशिष्ट परिणाम या त्रुटि है।
- एक प्रॉक्सी के लिए एक नकारात्मक मामला जोड़ें जो आगे बढ़ाने से पहले पूरे प्रवाह को बफर करता है।
- SSE घटना के लिए एक नकारात्मक मामला जोड़ा जाए जिसका JSON-RPC id अनुरोध से भिन्न हो।
- साक्ष्य लिखने से पहले घटना डेटा को पुनः लिखें।
- स्वास्थ्य विंडो में स्ट्रीम अवधि, पहली घटना की विलंबता और घटना गणना शामिल करें।
- रिलीज़ गेट को केवल एक प्रमाणित रोलबैक लक्ष्य चुनने दें जब स्ट्रीम विफल हो जाता है।
सफलता का अर्थ है एक ही मामला सीधे और प्रॉक्सी के माध्यम से चलता है, एक रिपोर्ट के साथ जो व्यवहार को बदलने वाली सटीक सीमा की पहचान करता है।
शिप की गई कलाकृतियाँ
यह सबक जहाजों outputs/skill-mcp-conformance-release-gate.md. इसका उपयोग सर्वर, क्लाइंट, गेटवे या एसडीके परिवर्तन को एक संस्करण अनुरूप मैट्रिक्स में बदलने और रिलीज निर्णय करने के लिए करें। कलाकृतियों को कच्चे तार सबूत, नकारात्मक मामलों, स्पष्ट युग चयन, एसडीके अंतर, प्रॉक्सी प्रूफ, संपादन, स्वास्थ्य सीमाओं और रॉलबैक सबूत की आवश्यकता होती है।
जाँचें
डेमो और निर्धारक सूट चलाएंः
bashcd phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations
python3 code/main.py
python3 -m unittest discover -s code/tests -vसत्यापन से साबित होना चाहिएः
- प्रत्येक शामिल स्वर्ण और नकारात्मक प्रतिलेख अपनी अपेक्षित परिणाम तक पहुँचता है
- आधुनिक अनुरोधों के लिए नाम के साथ सटीक मेटाडेटा कुंजी की आवश्यकता होती है
- HTTP हेडर नाम मामले के लिए असुरक्षित रूप से मेल खाते हैं और एन्कोड होते हैं
Mcp-Nameमानों को सटीक रूप से डिकोड किया जाता है - हेडर और शरीर असंगतता आधुनिक असंगतता कोड लौटाता है
- प्रतिक्रिया संस्करण, आईडी, परिणाम या त्रुटि की अनन्यता, त्रुटि आकार, और HTTP मानचित्रण सत्यापित हैं
- विधि-विशिष्ट उपकरण सूची, कार्य और पूर्णता के उपयोगिता भार की आवश्यकताएं लागू की जाती हैं
- हर देखा गया
HeaderMismatchएक वास्तविक HTTP 400 JSON-RPC की आवश्यकता होती है-32020प्रतिक्रिया - कच्चे
Mcp-Nameसटीक सेंटीनेल-कोड्ड व्हाइटस्पेस राउंड-ट्रिप्स के दौरान व्हाइटस्पेस को अस्वीकार कर दिया जाता है - एक गायब
resultTypeकेवल चयनित विरासत युग में मान्य है - अदभूत क्षेत्र कच्चे सत्यापन से बचते हैं जबकि अज्ञात परिणाम प्रकार विफल होते हैं
- विस्तार परिणाम प्रकारों को उनकी विज्ञापन क्षमता की आवश्यकता होती है
- मान्यता प्राप्त आधुनिक त्रुटियों कभी भी विरासत में गिरावट का कारण नहीं बनती
- सूचनाओं में JSON-RPC प्रतिक्रिया नहीं होती है
- एसडीके की लेखांकन हटाने और अर्थिक क्षेत्र हानि में अंतर किया जाता है
- प्रॉक्सी त्रुटि कोलप का पता लगाया जाता है और क्रेडेंशियल camelCase और विभाजक संस्करणों में पुनरावर्ती रूप से संपादित किया जाता है
- प्रचार के लिए गैर-खाली प्रतिलिपि, एसडीके, प्रॉक्सी और स्वस्थ परिचालन प्रमाण की आवश्यकता होती है
- प्रमोशन और रोलबैक दोनों एक प्रमाणित, पिन, सक्रिय, स्वस्थ रोलबैक लक्ष्य की आवश्यकता होती है
उत्पादन विफलता मोड
| Failure | What the weak test reports | What the harness must prove |
|---|---|---|
| SDK synthesizes a missing discriminator | “tools/list passed” | Raw modern result lacked resultType and is invalid |
Client downgrades after -32021 | “legacy retry worked” | Recognized modern error forbids fallback |
| Unknown result type treated as complete | “response parsed” | Unadvertised lifecycle discriminator is rejected |
| Proxy authorizes one tool and origin executes another | “request reached server” | Mcp-Name equals the body routing name at every hop |
| Harness throws before reading the server response | “header mismatch test passed” | HTTP 400 and JSON-RPC -32020 response are captured and validated |
| Proxy turns origin 400 into generic 500 | “upstream error” | Origin and egress statuses and JSON-RPC bodies are preserved |
Notification middleware emits {result: null} | “handler returned none” | Final egress body is empty and no JSON-RPC response exists |
| SDK strips an additive field | “typed objects match” | Raw and normalized views show the exact dropped field |
| Failure artifact leaks a bearer token | “debug bundle uploaded” | Redaction occurred before hashing, logging, or upload |
| Credential key style bypasses redaction | “denylist contains api_key” | CamelCase and separator variants share one canonical denylist form |
| Canary has no samples but appears healthy | “zero errors” | Minimum sample count is enforced |
| Rollback selects an unknown build | “previous deployment restored” | Target version, admission digest, pins, status, and health are present |
परिचालन नियम
आपके द्वारा भेजे गए बाइट्स का परीक्षण करें, प्रत्येक मध्यवर्ती फॉरवर्ड बाइट्स, प्रत्येक एसडीके के द्वारा उजागर किए गए अर्थशास्त्र, और सबूत संचालन दबाव में उपयोग करेंगे। संगतता एक स्पष्ट शाखा है। रोलबैक एक सबूत-समर्थित रिलीज़ कार्रवाई है। किसी भी अनुमत पार्सर का आकस्मिक दुष्प्रभाव नहीं होना चाहिए।
आगे पढ़ना
- MCP 2026-07-28 base protocol
- MCP version negotiation
- MCP Streamable HTTP
- Official MCP conformance project
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.