Phase 13: Tools & Protocols

هندسة التوافق في MCP: الإصدار والدليل والعمليات

الخادم غير متوافق لأن مسار سعيدة يعمل من خلال SDK واحد. يتوافق يعيش في السلك، عند حدود الإصدار، من خلال الوسطاء، أثناء التداول.

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ويحصل على أدوات، ويمضي اختبار التكامل.

هذا النتيجة تترك أسئلة مهمة دون إجابة:

  • هل كان الطلب يحمل بيانات متطابقة حديثة لكل طلب؟
  • لقد فعلتMCP-Protocol-Version،Mcp-MethodوMcp-Nameيطابق جسم JSON-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يتم تفسيرها ككاملة فقط بعد أن يختار العميل تلك الفترة السابقة.

لا تخلق مؤكدة إذن واحدة تقبل كلا الشكليين في وقت واحد. استخدم فرعين:

BranchEntry evidenceMissing resultTypeInitialization
ModernSuccessful server/discover or recognized modern responseInvalidNot the default path
LegacyConfigured allowlist plus a valid legacy initialize result after an inconclusive modern probeInterpreted as completeRequired 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 الفعلية للخادم مع معرف الطلب المماثل وكود الخطأ -32020. تطبيق ذلك تلقائياً كلما لاحظ المؤكد المحليHeaderMismatchلا تجعل التحقق من الاستجابة علامة إضافية اختيارية. حالة مع HTTP 500 ولا يوجد جسم يفشل حتى عندما كان رمز الرفض المحلي صحيحًا. أسلحة توقف بعد إلقاء مؤكدة الطلب الخاص بها اختبرت نفسها فقط ، وليس سلوك الخيط الخادم.

يستخدم مشروع MCP الرسمي للموافقة كمتجهيز خارجي ومرجح نسخ. احتفظ بنسخك المحلية أيضًا. فإنها تسجل بروكسيك و SDK ووحدة التوثيق والإكشنات ومسار الإفراج ، والذي لا يمكن لمجموعة عامة معرفة ذلك.

يجب أن تتطابق قيم العنوان مع جسم RPC

في HTTP المباشر الحديثة ، يمكن للمساومين توجيه أو إنفاذ السياسة باستخدام عناوين مرآة. يبقى جسم JSON-RPC مصدر بروتوكول الحقيقة. عدم الملاءمة هو فشل في السلامة ، وليس إشارة إلى اختيار قيمة واحدة.

تصحيح في هذا الترتيب:

  1. تحليل وتؤكيد أشكال غلاف JSON-RPC وأنواع البيانات المعدنية.
  2. مقارنةMCP-Protocol-Versionمعparams._meta.io.modelcontextprotocol/protocolVersion. . .
  3. مقارنةMcp-Methodمعmethod. . .
  4. عندما يكون للطريقة اسم توجيه، مقارنة Mcp-Nameمع القيمة الجسدية المقابلة.
  5. بعد أن يتم تأسيس المساواة، قم بتحديد ما إذا كانت الإصدار المماثل ومجموعة القدرات مدعومة.

هذا النظام يميز عدم التطابق-32020من نسخة غير مدعومة -32022كما أنه يمنع البوابة من تفويض اسم العنوان بينما يقوم المصدر بتنفيذ اسم جسم آخر.

أسماء الحقول HTTP غير حساسة للحالة ، في حين تبقى قيمها حساسة للحالة. عادي أسماء العناوين قبل البحث ورفض النسخ المختلفة. بالنسبة لمكان أبيض غير آمن أو غير ASCII أو متبع أو متبع.Mcp-Name، فكّر الرقم المحدد=?base64?{Base64EncodedValue}?=UTF-8 المراقب قبل مقارنته مع الجسم. رفض المراقب غير كاملة، غير صالحة Base64, غير صالحة UTF-8, أو القيمة غير الآمنة الخام مع -32020. المساحة البيضاء المحيطة بالبنية غير صالحة حتى عندما تحتوي الجسم على نفس العلامات لأن هذه القيمة تتطلب تشفير الحارس قبل النقل.

يمكن للمساعد رفض HTTP الملفي قبل وصول طلب إلى خادم MCP ، لذلك قد يكون فشله خطأ HTTP دون JSON-RPC. التقاط ما إذا كان الرفض جاء من الوسيط أو المنشأ. يجب أن يستخدم خادم MCP المنشأ عقد خطأ بروتوكول عندما يتعامل مع طلب JSON-RPC صالح.

الحقول غير المعروفة ليست نتائج غير معروفة

تتطلب التوافق الآجل قواعد مختلفة.

الحقول غير المعروفة الإضافية

أجهزة النتائج و_metaيمكن لخرائط الحصول على حقل. يجب على المحقق الحفاظ على حقل إضافي أو تجاهله وفقا لدوره ، ما لم ينتهك الحقل عقد محجوز. يحتفظ العينة بالنتيجة الخام الكاملة في الأدلة ويقبل futureHintإلى جانب نتيجة معروفة

إذا كنت وكيلًا مرئيًا ، فإن الحفاظ على حقل مجهول عادةً يكون أكثر أمناً من إزالة ذلك. إذا كنت عميلًا للتطبيق ، فإن تجاهله يمكن أن يكون صالحًا. يجب أن يكشف اختبار التفاضل الخاص بك بعد ذلك أن قام SDK بإبعاده لذلك السلوك هو متعمد.

لا نعرفresultType

resultTypeهو تمييز. النتائج الحديثة الأساسية استخدامcompleteأوinput_required. يمكن لمتوسع إضافة قيمة أخرى فقط عندما يتم الإعلان عن قدرته.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 المباشر. تستخدم العينة إشعاراً على امتداد المسار المسمى فقط لاختبار عدم تغير المسلسلات المتسلسلة في الاتجاه الواحد. لا تعرضها كطريقة أساسية جديدة.

اختبر المُسلسل، ليس فقط المُتعامل، قد يعود المُتعاملNoneبينما البرمجيات المتوسطة تضعها في كائن نجاح JSON.

إضافة SDK المختلفة

غالبا ما تحول SDKات الأشياء السلكية إلى أنواع لغة مريحة. هذا مفيد، ولكن لا يمكن لشيء طبيعي أن يثبت ما تم تلقي.

لكل جهاز ذو مخاطر عالية، التقاط:

  1. حالة الخام، العناوين، وجسم الاستجابة قبل فك SDK.
  2. قيمة العائد المعادلة لـ SDK أو استثناء.
  3. التنبؤات المنتظرة للفترة المختارة
  4. الحقول التي رفعها أو sintetized أو stripped أو تغيرها من قبل SDK.

يسمح العينة بإزالة الحسابات المعرفة المكتسبة فقط من خلال SDK مثل resultType،_meta،ttlMsوcacheScopeبينما مقارنة حمولة التطبيق.futureHintلأن هذا الحقل المجهول المفاهيمي اختفى.

لا نفترض أن كل اختلاف هو خطأ SDK. النقطة هي جعل التحول مرئي. قرر ما إذا كان مكونك هو نقطة نهاية التطبيق، والتي قد تتجاهل حقل إضافي، أو وسيط شفاف، والذي يجب أن يحافظ عليه.

قم بتشغيل الفرق ضد كل SDK والإصدار الذي ترسله. إذا كانت SDKs تطبيع نفس النص بشكل مختلف، يجب أن تقول سياسة الإفراج عن السلوك المقبول بدلاً من اختيار الخروج الأكثر ملاءمة بعد الحقيقة.

التقاط أدلة وكالة

تحدث معظم فشلات MCP الإنتاجية في أكثر من عملية واحدة. سجل ثلاثة مشاهدات:

ViewMinimum evidence
Ingressrequest headers, JSON-RPC body, content type, authenticated route, receive time
Originforwarded headers and body digest, origin status, response headers and body
Egressclient-visible status, headers, body, and send time

يكتشف العينة اثنين من التحوّلات الشائعة:

  • خطأ HTTP 400 أو 404 JSON-RPC يصبح محركًا عامًا
  • جسم خروج JSON-RPC يختلف عن جسم الأصل

إضافة تصريحات محددة للتنفيذ لنوع المحتوىAcceptالتقاط كلا الجانبين من إيقاف TLS عندما تسمح السياسة. لا تسجل إثباتات إئتمانات فقط لإثبات المسار.

إعادة كتابة قبل أن تترك الأدلة الذاكرة

إعادة التدوين هو جزء من عمليات التوافق، وليس عمل تنظيف لاحقا. تطبيقها قبل التسلسل، التشويش، السجلات، أدوات الاختبار، أو تحميل الفشل.

يضع القياس العينية أسماء المفاتيح ويزيل المفصلات قبل التطابق، ثم يستبدل القيم بشكل متكرر تحت المفاتيح مثل Authorization،Cookie،Set-Cookie،X-Api-Key،accessToken،clientSecret،registrationAccessToken،token،password،secretوapi_key. يجب أن تستخدم القنونيكية والمنسخة الدينيلية نفس الشكل حتى لا يمكن أن تتجاوز التغيرات المختصرة، المختصرة، المكشوفة، والمزعجة، والنقطة سياسة بعضها البعض. يجب على جمع الإنتاج إضافة سياسة الحجة المحددة للطريقة، لأن مفتاح غير ضار مثل queryلا يزال يمكن أن يحتوي على بيانات شخصية أو تنظيمية.

قم بتحديد مجموعة الأدلة المحذوفة. احتفظ بالقطعات الخامة فقط في نظام مصرح به قصير العمر عندما يتطلب ذلك تحقيق محدد. يثبت التمريض التي دفعت إلى اتخاذ القرار؛ فإنه لا يكشف عن القيمة المزودة.

اجعل الصحة والرجوع جزءا من البوابة

إن الامتثال للبروتوكول ضروري ولكن ليس كافياً للتسريع. لا يزال المرشح المتوافق يمكن أن يخرج الوقت أو يسرق الذاكرة أو يفرض عبءًا زائدًا على الإعتماد.

تحديد نافذة صحية قبل الإطلاق:

  • الحد الأدنى من العينات
  • معدل الخطأ القصوى
  • الحد الأقصى لعدد المئات
  • حدود الاكتفاء أو الموارد
  • مدة المراقبة
  • مقارنة مع خط أساسية مسموح بها

تحديد دليل التردد قبل التنفيذ أيضاً:

  • النسخة السابقة بالضبط
  • إضافة دليل القبول
  • SHA-256 أدوات وملفات تصفية
  • حالة السجل الحالية
  • النتيجة الصحية الحالية
  • إجراء استعادة الطريق
  • شهادة على تلك الحقول الدقيقة من هوية مراقب الإفراج الموثوق بها

تطلب أن يتم التحقق من هدف إعادة التدريب والصحة قبل الترقية، وليس فقط بعد فشل المرشح. الإصدار الناجح دون مسار استعادة قابلة للاستخدام ليس جاهزاً للإنتاج.

إذا فشل المرشح وفقًا لهذه الأدلة، فاعمل على إيقاف حركة المرور بدلاً من التخمين.

لا تقلل من الاستعداد للتحقق من الصدق مثل النسخة غير الفارغةhealthy: "yes"أو سلسلة أدلة تعسفية. يتطلب العينة أنواع دقيقة ، وضع نشط ، ثلاثة إصدارات SHA-256 ، وقائم موثوق ، وشهادة HMAC-SHA-256 سارية الصلاحية على الحمل المفيد الكامل للعودة. مفتاح التجربة التحديدية هو جهاز ثابت غير سري. حقن مفتاح محمي ، نتيجة التحقق من 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في هذا الترتيب:

  1. validate_request()يفرض طلباً محدداً في العصر وقواعد العنوان.
  2. validate_result()يفرق بين المتميزين القديمة المفقودة والقيم الحديثة القائمة والمتوسعات والقيم غير المعروفة.
  3. select_era()تنفذ سياسة صارمة ومحدودة للرد على التداعيات.
  4. run_transcript()يُقيّم الدرجات الذهبية والسلبية.
  5. compare_sdk_view()يظهر اختلافات التطبيع.
  6. inspect_proxy()يُقارن الدخول والصعود والخروج
  7. redact()يزيل الأسرار الواضحة قبل إختراق الأدلة
  8. rollback_evidence_ready()يصدق حقول الحبرة الدقيقة وشهادة الإفراج الموثوق بها.
  9. ReleaseGate.evaluate()يضم الامتثال غير الفارغ، SDK، وكيل، الصحة، والدليل على التراجع.

استخدمها

أطلق الحزام في أربع نقاط:

  1. في كل تغيير تنفيذي مع مُعدّل اختبار في العملية.
  2. ضد المشترك المُبني والخادم الثنائي على النقل الحقيقي
  3. عبر النظام الأساسي أو البوابة المستخدمة في بيئة التنسيق.
  4. أثناء إطلاق القناريات مع صحة حية و أدلة إعادة التدفق

حافظ على نفس أسماء الحالات المستقرة عبر الطبقات. negative-header-body-mismatchيجب أن يعني نفس الثابتة في تقارير الوحدة، من نهاية إلى نهاية، وكالة وكالة الأمن. سوف تختلف هضم الأدلة لأن الحدود قد تغيرت؛ لا يجب أن يكون هذا الطلب.

تخزين مخططات الإصدارات في التحكم في الإصدارات تخزين أدلة تشغيل محذورة في نظام الإصدار تخزين التقاطات الخام قصيرة الأجل فقط تحت التحكم في الوصول إلى الحوادث

المختبر التفاعلي

المختبر "أ": إثبات حدود العصر

منcodeالإرشادات، مفتوحة Python:

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.الثاني يرفض لأن عامل التمييز في دورة الحياة غير معروف.

المختبر (ج): تفتيش تحويل 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، وكيل، والدليل التشغيلي الصحي
  • الترويج والإعادة التأهيل يتطلبان هدفًا مصحّحًا ومُثبتًا ونشطًا وصحيحًا للإعادة التأهيل

أساليب فشل الإنتاج

FailureWhat the weak test reportsWhat 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، وعمليات الأدلة ستستخدم تحت الضغط. التوافق هو فرع صريح. الردف هو عمل إطلاق يدعم الأدلة. لا ينبغي أن يكون أي من التأثيرات الجانبية غير المقصودة من المصفح السماح.

المزيد من القراءة

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.