مهندسی سازگاری MCP: نسخه سازی، شواهد و عملیات
Type: Build
Languages: Python
Prerequisites: Phase 13 · 09 (transports), Phase 13 · 17 (gateways), Phase 13 · 30 (registry admission)
Time: ~100 minutes
اهداف یادگیری
- قوانین قانونی MCP را به نسخه های نقلی و منفی تبدیل کنید.
- سختگیرانه باش
2026-07-28رفتارهاي جدا از بازپسين هاي محدود و متراضي - تفاوت بین رشته های نامعلوم و نامعلوم غیرفعال را تشخیص دهید
resultType. . - شواهد خام JSON-RPC را با یک نمایش استاندارد SDK مقایسه کنید.
- ثابت کن سر و بدن رو از طریق یک مرزهای واقعی استازیت
- نسخه هاي دروازه با نسخه هاي اصلاح شده، سلامت و شواهد بازپسين
مشکل
موکلتون زنگ ميزنهtools/listاز طریق SDK و ابزارها می گیرد. آزمون ادغام را عبور می دهد.
این نتیجه سوالات مهمی را جواب نداده است:
- آیا درخواست شامل متاداتا پروتکل مدرن هر درخواست بود؟
- - آره
MCP-Protocol-Version،Mcp-MethodوMcp-Nameبا بدن JSON-RPC مطابقت داره؟ - پاسخ شما حاوی یک جواب معتبر بود؟
resultTypeدر سیم، یا SDK همگامش کرد؟ - آیا مشتری یک میدان اضافی آینده را حفظ می کند؟
- آیا یک اشتباه مدرن به طور تصادفی باعث دست دادن به میراث می شود؟
- آیا یک پروکسی وضعیت اصلی و خطای JSON-RPC را حفظ کرد؟
- آیا سریالیزر اطلاعیه یک پاسخ ممنوعه را صادر کرد؟
- آیا عملیات می تواند ثابت کند که چرا یک آزادی به پیش رفت یا برگشت بدون ذخیره راز؟
مطابقت مجموعه ای از انوارئنت های قابل مشاهده است. یک آستانه بسازید که این انوارئنت ها را قبل از اینکه ترافیک تولید آنها را کشف کند، ضبط کند.
با نسخه ای از زمان شروع کنید
MCP 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. .
حالت برگشت
حالت فالبک یک ساند مدرن محدود را انجام می دهد. یک زمان توقف، پاسخ خالی، اتصال بسته یا پاسخ ناشناخته نتیجه ای ندارد. این ثابت نمی کند که همتایی میراث است. تنها یک نقطه پایان صریحاً پیکربندی شده یا برای سازگاری فهرست شده می تواند یک ساند میراث محدود را دریافت کند و مشتری فقط پس از تأیید این ساند شاخه میراث را انتخاب می کند.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 - پاسخ
jsonrpcغیر از2.0یا یک شناسه که با ارزش یا نوع JSON متفاوت است - پاسخي که هر دو را شامل مي شه
resultوerror، یا هیچکدوم - یک خطا بدون عدد کامل
codeو رشتهmessage - یک خطای پروتکل شناخته شده که به وضعیت HTTP اشتباه داده شده است
- پاسخ برای اطلاع رسانی صادر شده
- پاکت JSON-RPC اشتباه شکل گرفته است
- خراب شدن پروکسی یک خطای پروتکل
برای هر مورد منفی، مرز رد و کد خطای ثابت را تأیید کنید. دعوی شکست خورده خیلی ضعیف است. یک 500 و یک منبع تولید شده توسط پروکسی -32020هر دو می توانند به نظر شکست بیایند در حالی که داستان های کاملا متفاوت را به اپراتورها می گویند.
فکسچر عدم مطابقت سر باید پاسخ واقعی HTTP 400 JSON-RPC سرور را با ID درخواست مطابقت و کد خطا شامل کند -32020. هر وقت اعتبارگر محلی مشاهده کنه ، به طور خودکار اجرا کنهHeaderMismatch• تایید پاسخ را یک پرچم فکسور اختیاری نکنید. یک مورد با HTTP 500 و هیچ جسم حتی زمانی که کد رد محلی درست بود شکست می خورد. یک هرنس که پس از درخواست خود تایید کننده می گذارد، فقط خود را آزمایش کرده است، نه رفتار سیم سرور.
پروژه رسمی مطابقت MCP به عنوان یک مجموعه خارجی و مرجع نسخه مفید است. نقل نامه های محلی خود را نیز نگه دارید. آنها پروکسی، SDK، تأیید هویت، تمدید ها و مسیر انتشار شما را ضبط می کنند که یک مجموعه عمومی نمی تواند آن را بداند.
ارزش های عنوان باید با بدن RPC مطابقت داشته باشد
در HTTP Streamable مدرن، واسطه ها می توانند با استفاده از سرنخ های آینه ای، سیاست را هدایت یا اجرا کنند. بدن JSON-RPC منبع پروتکل حقیقت باقی می ماند. عدم مطابقت یک شکست سالمایی است، نه یک اشاره برای انتخاب یک مقدار.
در این ترتیب اعتبار:
- تجزیه و تحلیل و تأیید نوع پاکت JSON-RPC و متاداتا
- مقایسه کنید
MCP-Protocol-Versionباparams._meta.io.modelcontextprotocol/protocolVersion. . - مقایسه کنید
Mcp-Methodباmethod. . - وقتی که روش یک نام رویتینگ دارد، مقایسه کنید
Mcp-Nameبا ارزش بدنی مربوطه. - پس از برابری، تصمیم بگیرید که آیا نسخه و مجموعه قابلیت های مطابقت پذیر پشتیبانی می شود.
اين ترتيب تفاوت ها رو مشخص ميکنه-32020از نسخه ای که پشتیبانی نمی شود-32022همچنین مانع از اجازه دادن به نام سرنخ در حالی است که اصل نام بدن دیگری را اجرا می کند.
نام های زمینه HTTP غیر حساس به پرونده هستند، در حالی که ارزش های آنها حساس به پرونده باقی می مانند. نام های سر را قبل از جستجوی عادی کنید و دوبرابراتی متناقض را رد کنید. برای فضای سفید غیر امن، غیر ASCII یا پیشرو یا عقب ماندهMcp-Name، رمزگشایی دقیق=?base64?{Base64EncodedValue}?=UTF-8 Sentinel قبل از مقایسه آن با بدن. یک Sentinel نامکمل، Base64 ناشناس، UTF-8 ناشناس، یا خام ارزش غیر امن با رد کنید -32020فضای سفید اطراف خام حتی زمانی که بدن حاوی همان شخصیت ها باشد، باطل است زیرا این مقدار قبل از حمل، کد بندی سنتینل را نیاز دارد.
یک واسطه می تواند قبل از اینکه یک درخواست به سرور MCP برسد، HTTP اشتباهات را رد کند، بنابراین شکست آن ممکن است یک خطا HTTP بدون JSON-RPC باشد. تشخیص دهید که آیا رد از واسطه یا اصل آمده است. سرور MCP اصلی باید هنگام پردازش یک درخواست JSON-RPC معتبر از قرارداد خطای پروتکل استفاده کند.
زمین های ناشناخته نتیجه ناشناخته نیستند
مطابقت پیش رو دو قانون مختلف را نیاز دارد.
رشته های نامعلوم
اجسام نتیجه و_metaنقشه ها می توانند زمینه هایی را بدست آورند. یک اعتبار دهنده باید یک میدان افزودنی را به عنوان نقش خود حفظ کند یا نادیده بگیرد، مگر اینکه این میدان یک قرارداد محفوظ را نقض کند. نمونه تمام نتیجه خام را در شواهد حفظ می کند و قبول می کند futureHintو جز نتیجه ای که معلوم است
اگر شما یک نماینده شفاف هستید، حفظ یک میدان ناشناخته معمولاً امن تر از حذف آن است. اگر شما یک مشتری برنامه هستید، نادیده گرفتن آن می تواند معتبر باشد. آزمایش فرقی شما هنوز باید نشان دهد که SDK آن را حذف کرده است بنابراین رفتار عمدا است.
نامعلومresultType
resultTypeاین یک تبعیض است.completeیاinput_required. یک افزونه می تواند ارزش دیگری را فقط زمانی اضافه کند که قابلیت آن تبلیغ شده باشد. افزونه Tasks به عنوان مثال می تواند اضافه کند taskدر این زمینه توانایی مذاکره.
یک تبعیض کننده ناشناخته یا تبلیغ نشده نمی تواند به طور ایمن به عنوان کامل مورد توجه قرار گیرد. مشتری نمی داند که چرخه زندگی آن را از بین می برد. آن را رد کنید.
بنابراین همان پاسخ خام می تواند شامل یک میدان ناشناخته قابل قبول و یک نوع نتیجه ناشناخته قابل قبول باشد. هر دو مورد را آزمایش کنید.
متمایز کننده تنها لایه اول است. بار مفید خاص روش را پس از آن تأیید کنید. یک کامل tools/listنتیجه ای نیاز دارهtoolsصف هایی که توصیف کنندگان آنها دارای نام های منحصر به فرد غیر خالی، توضیحات مفید و ریشه اشیاء هستند inputSchemaارزش هاtaskنتیجه فقط برای یک شرکت واجد شرایط معتبر استtools/callبا قابلیت وظایف و نیاز بهtaskId, وضعیت شناخته شده، ایجاد و بروزرسانی مهر زمان وttlMs، به علاوه وقفه اختیاری معتبر رای گیریcompletion/completeنتیجه ای نیاز به یکcompletionشی با بیش از 100 ارزش رشته، یک عدد کامل غیر منفی اختیاری totalکه کمتر از ارزش های بازگردانده نشده است و یک گزینه ی بولی hasMore. يه حرف خوبيresultTypeنمیتونه یک بار فایدال بد شکل را ساز کنه
تغییر نام اطلاعیه
یک اطلاعیه JSON-RPC هیچidگیرنده نباید پاسخ موفقیت یا خطا JSON-RPC را ارسال کند.
برای یک شکل اطلاع رسانی HTTP پذیرفته شده، هنیز انتظار یک HTTP 202با بدن خالی2026-07-28هیچ اطلاعیه ای از سرور به سرور اصلی را از طریق HTTP Streamable تعریف نمی کند. نمونه از یک اطلاعیه تمدید مسیر با نام صرفا برای آزمایش یکطرفه غیر متغیر سریالیزر استفاده می کند. آن را به عنوان یک روش جدید ارائه ندهید.
نه فقط کنترل کننده رو امتحان کنNoneدر حالی که نرم افزار میانگین آن را در یک JSON موفقیت اشیاء بسته بندی می کند.
اضافه کردن یک SDK تفاوت
SDK ها اغلب اشیاء سیم را به انواع زبان مناسب تبدیل می کنند. این مفید است، اما یک شی عادی نمی تواند آنچه دریافت شده است را ثابت کند.
برای هر دستگاه خطر بالا، گرفتن:
- وضعیت خام، سر و بدن پاسخ قبل از رمزگذاری SDK.
- ارزش بازگشت عادی SDK یا استثناء
- پیش بینی معنوی انتظار می رود برای عصر انتخاب شده.
- زمینه هایی که توسط SDK برداشته، ترکیب، پاک شده یا تغییر داده شده است.
نمونه اجازه می دهد تا فقط SDK از حسابداری شناخته شده مانند resultType،_meta،ttlMsوcacheScopeدر حالی که مقایسه ی بار مفید برنامه ها را گزارش می دهد که یک سقوطfutureHintچون این میدان معنوی ناشناخته ناپدید شد.
فرض نکنید که هر تفاوت یک خطا SDK است. نکته این است که تحول را قابل مشاهده کنید. تصمیم بگیرید که آیا قطعه شما یک نقطه پایان برنامه است که ممکن است یک زمینه اضافی را نادیده بگیرد یا یک واسطه شفاف است که باید آن را حفظ کند.
اگر دو SDK یک نسخه مشابه را به طور متفاوت عادی کنند، سیاست انتشار باید بگوید که کدام رفتار قابل قبول است به جای انتخاب مناسب ترین خروجی پس از واقعیت.
دستگیری شواهد نماینده
اکثر شکست های 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 به عنوان یک پراکسی عمومی تبدیل می شود
- بدن خروج JSON-RPC از بدن اصلی متفاوت است
اضافه کردن ادعاهای خاص برای نوع محتوا، Accept، فشرده سازی، درخواست-اسکاپ SSE، مخابرات پیشخودی و ارتباط ردیابی. هر دو طرف از پایان TLS را ضبط کنید وقتی که سیاست اجازه می دهد. هرگز اعتبارات را ثبت نکنید فقط برای اثبات مسیر.
پیش از اینکه شواهد یادتان را ترک کنند، دوباره بنویسید
ویرایش بخشی از عملیات های مطابق است، نه یک کار تمیز کردن بعد. قبل از سریالیزاسیون، هاشی، لوگ، آثار آزمایش یا بارگذاری های شکست پذیر آن را اعمال کنید.
نمونه پرونده نام های کلیدی را طنین می کند و جداکننده ها را قبل از مطابقت حذف می کند، سپس به صورت تکراری مقادیر را تحت کلید هایی مانند Authorization،Cookie،Set-Cookie،X-Api-Key،accessToken،clientSecret،registrationAccessToken،token،password،secretوapi_key. کانونیکالیزاسیون و دینیلست باید از همان شکل استفاده کنند تا شکل های camelCase، hyphenated، underlined و dotted متغیر نمی توانند از سیاست یکدیگر دور شوند. یک جمع آوری کننده تولید باید سیاست استدلال خاص روش را اضافه کند، زیرا یک کلید بی ضرر مانند queryهنوز می تواند حاوی اطلاعات شخصی یا تنظیم شده باشد.
دسته بندی شواهد اصلاح شده را بازداشت کنید. ضبط های خام را تنها در یک سیستم کوتاه مدت تأیید شده نگه دارید وقتی که یک تحقیق خاص آنها را مورد نیاز است. یک هضم ثابت می کند که بسته اصلاح شده تصمیم را هدایت کرده است؛ ارزش حذف شده را نشان نمی دهد.
سلامتی و بازپرداخت را بخشی از دروازه قرار دهید
مطابقت پروتکل برای آزاد شدن ضروری است اما کافی نیست. یک کاندیدای مطابق هنوز می تواند زمان را خارج کند، حافظه را از بین ببرد یا وابستگی را بیش از حد بارگذاری کند.
قبل از شروع، پنجره ای از سلامت را تعریف کنید:
- حداقل تعداد نمونه ها
- حداکثر میزان خطا
- حداکثر درصد تاخیر
- میزان شتاب یا محدودیت منابع
- مدت زمان مشاهده
- مقایسه با خط پایه پذیرفته شده
قبل از شروع به کار، شواهد بازپسین را هم تعریف کنید:
- نسخه قبلی دقیق
- هضم شواهد پذیرش
- SHA-256 آثار هنری و پین های توصیف کننده
- وضعیت فعلی ثبت
- نتیجه فعلی سلامت
- روش بازسازی مسیر
- گواهی بر روی این زمینه های دقیق از یک هویت کنترل کننده تخلیه معتبر
نیاز به تایید و سالم بودن هدف بازپسین قبل از ارتقاء، نه تنها پس از شکست کاندیداها. یک انتشار موفق بدون یک مسیر بازیابی قابل استفاده آماده تولید نیست.
اگر یک کاندید موفق نشود و هدف بازپسین این شواهد را ندارد، ترافیک را به جای حدس زدن متوقف کنید.
آماده بودن برای بررسی های حقیقت مانند نسخه خالی را کاهش ندهید. healthy: "yes"نمونه ای که در حال تولید است، یک کلید محافظ، نتیجه تأیید KMS یا تایید کننده گواهی کلید عمومی را در مرز انتشار وارد می کند.
دروازه انتشار همچنین از نسخه ی خالی، متمایز SDK یا شواهد پراکسی رد می کند. هر منبع باید هضم شواهد معتبر را داشته باشد. پنجره ی سبز سلامت نمی تواند یک مرز را پر کند که هرگز مشاهده نشده است.
آن را بسازید
. با استفاده از بند استاندارد کتابخانه:
bashcd phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations
python3 code/main.pyنمایش دقیقاً پانزده نسخه طلایی و منفی از جمله نتایج تکمیل معتبر و نادرست را اجرا می کند، یک نتیجه خام را با یک نمایش SDK مقایسه می کند، یک پروکسی را که یک خطا اصلی را خراب کرده است، ارزیابی می کند، صحت را تأیید می کند، شواهد برگشت را تأیید می کند و هدف را انتخاب می کند.
شکل انتظار می رود:
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باید به معنای یک متغیر در گزارش های واحد، پایان به پایان، نماینده و کاناری باشد. هضم شواهد متفاوت خواهد بود زیرا مرز تغییر کرد؛ الزامات نباید.
طرح های نصب در کنترل نسخه ذخیره کنید. شواهد اجرا اصلاح شده را در سیستم انتشار خود ذخیره کنید. ضبط های خام کوتاه مدت را فقط تحت کنترل دسترسی حادثه ذخیره کنید.
آزمایشگاه تعاملی
لابراتوار A: ثابت کردن مرز عصر
از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")اولین زمان توقف بسته نمی شود زیرا سکوت شواهد میراث نیست. تماس دوم فقط به دلیل اینکه پیکربندی اجازه می دهد و نتیجه اصلی سازی معتبر مشاهده شده است، میراث را انتخاب می کند. خطا قابلیت گمشده شناخته شده شاخه مدرن را ثابت می کند.
آزمایشگاه B: میدان اضافی در مقابل متمایز کننده
pythonvalidate_result({"resultType": "complete", "tools": [], "futureHint": True}, "modern")
validate_result({"resultType": "future_mode", "tools": []}, "modern")اولین نتیجه حفظ می کنهfutureHintدومین مورد رد می شود چون عامل تبعیض چرخه زندگی ناشناخته است.
آزمایشگاه C: بررسی یک تحول SDK
pythoncompare_sdk_view(
{"resultType": "complete", "tools": [], "futureHint": {"mode": "new"}},
{"tools": []},
)تصمیم بگیرید که آیا بخش شما می تواند نادیده بگیردfutureHintاین انتخاب را در سیاست آزادسازی بنویسید و تفاوت را خاموشی پاک نکنید.
لابراتوار D: تعمیر پروکسی
تغییر دادن تبادل دمو به طوری که خروج حفظ وضعیت اصلی و بدن.python3 main.pyدوباره. مشکلات پروکسی باید ناپدید شوند، اما فرقی SDK هنوز هم تبلیغ را مسدود می کند. سپس شامل futureHintدر دید SDK و مشاهده تغییر عمل به promoteو هرگاه هر گونه شواهد از آن گذشته باشد
آزمایشگاه تمرین
نقل نامه های SSE که به درخواست انجام شده است را به آستین اضافه کنید.
الزامات:
- وضعیت پاسخ، نوع محتوا، رویدادهای SSE سفارش داده شده و پایان جریان را ضبط کنید.
- ثابت کنید که هر رویداد JSON-RPC دارای یک نتیجه یا خطا خاص دوره معتبر است.
- یک مورد منفی برای یک پراکسی اضافه کنید که قبل از ارسال تمام جریان را بفر کند.
- یک مورد منفی برای یک رویداد SSE که ID JSON-RPC آن از درخواست متفاوت است، اضافه کنید.
- قبل از نوشتن شواهد، اطلاعات مربوط به رویداد را دوباره تهیه کنید.
- مدت جریان، تاخیر اولین رویداد و شمارش رویداد را در پنجره سلامت شامل کنید.
- وقتی جریان خراب می شود، باید دروازه تخلیه فقط یک هدف بازپسین ثابت را انتخاب کند.
موفقیت به این معنی است که یک پرونده به طور مستقیم و از طریق نماینده اجرا می شود، با گزارش که مرز دقیق تغییر رفتار را شناسایی می کند.
آثار هنری ارسال شده
اين درس به ما ميگيرهoutputs/skill-mcp-conformance-release-gate.md. از آن برای تبدیل یک سرور، مشتری، دروازه یا تغییر SDK به یک ماتریس مطابقت ورژن شده و تصمیم انتشار استفاده کنید. این آرتیفاکت نیازمند شواهد سیم خام، موارد منفی، انتخاب عصر صریح، تفاوت های SDK، اثبات پروکسی، ویرایش، آستانه های سلامتی و شواهد برگشت است.
بررسی کنید
مجموعه دمو و تعیین کننده را اجرا کنید:
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 را تولید نمی کنند
- حذف حسابداری SDK و از دست دادن میدان معنوی متمایز می شوند
- خطا پروکسی در حال کشف و حذف اعتبارات به صورت تکراری در camelCase و ویرانت های جدا کننده است
- ارتقاء نیاز به نقل و نقل خالی، SDK، استازی و شواهد عملی سالم دارد
- ارتقاء و بازگشت هر دو نیاز به یک هدف اصلی، ثابت، فعال و سالم بازگشت دارند.
روش های شکست تولید
| 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 |
قاعده عملیاتی
بائتهایی که ارسال می کنید را آزمایش کنید، بائتهایی که هر واسطه ای به جلو می فرستد، معنویت هر SDK را نشان می دهد و عملیات شواهد تحت فشار استفاده می کنند. مطابقت شاخه صریح است. رولبک یک عمل انتشار مبتنی بر شواهد است. هر دو نباید یک اثر جانبی تصادفی یک تجزیه کننده اجازه دهنده باشد.
خواندن بیشتر
- 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.