Phase 13: Tools & Protocols

مدخل نموذج MCP: أخذ العينات الهجرة والمتسابقة غير المقبولة

MCP 2026-07-28 يمنع أخذ العينات من تصميمات جديدة ويزيل قناة طلبات الخادم إلى العميل. إذا كان سير العمل الحالي لا يزال يحتاج إلى نموذج العميل، يعيد الخادم input_requiredنتيجة العميل يحاول مرة أخرى الطلب الأصلي مع إصدار النموذج. حلقة التفكير تصبح صريحة ، محدودة ، وغير ذات الوضع في طبقة البروتوكول.

Type: Build

Languages: Python

Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 10 (resources and prompts)

Time: ~75 minutes

أهداف التعلم

  • شرح سبب تجاهل العينات في MCP 2026-07-28 واختيار الوضع الافتراضي للتكامل المباشر للموديل للخوادم الجديدة.
  • تنفيذ سير عمل التوافق الذي يحمل sampling/createMessageمن خلال طلبات رحلة متعددة (MRTR).
  • ضع مراجعة البروتوكول وإمكانيات العميل في كل طلب _meta-أجسام
  • العودةresultType: "input_required"و حاولي مجدداً الطريقة الأصلية مع معرف JSON-RPC جديد.
  • حماية النزاهةrequestStateوربطها بالرأس المال و الطريقة و الحجج و انتهاء الصلاحية
  • حلقات معتمدة على النموذج مع فحص القدرة والإعتماد والتحقق من التحقق من الاستجابة والحد الملتوي.

القرار قبل البروتوكول

أداة مثلsummarize_repoيحتاج إلى نوعين من العمل:

  1. العمل التحديدي: قائمة الملفات، قراءة الملفات المسموح بها، تأكيد المسارات، وتجميع المحتوى.
  2. العمل النموذجي: اختيار الملفات الممثلة وتجميع الموجب.

لديك الآن اثنين من المعماريات القابلة للتطبيق

خادم جديد: التكامل مع مزود نموذج مباشرة

هذه هي الافتراض الحالي. الخادم يمتلك اختيار النموذج، والإثباتات، والميزانيات، والإعادة المحاولات، واللاحظة. فإنه يعيد واحد عادية tools/callالنتيجة للعميل من MCP.

اختر هذا عندما يكون الخادم بالفعل خدمة مضيفة أو عندما يكون سلوك النموذج المتوقع أكثر أهمية من استخدام نموذج المضيف.

سير عمل العينات الحالي: تحويله إلى MRTR

لا يزال الاختبار موجود خلال نافذة التخلف. لا يمكن لخادم يستهدف 2026-07-28 إرسال إرسال مباشرsampling/createMessageطلب العودة إلى العميل. بدلا من ذلك تضم هذا الطلب فيInputRequiredResult. . .

اختيار هذه المسار التوافق فقط عند استخدام نموذج العميل والإثباتات هو متطلب حقيقي للمنتج. سجل خطة إزالة لأن التنفيذات الجديدة يجب ألا تتبنى العينات القديمة.

العقد على عدم إقامة الجنسية

بروتوكول يوليو 2026 لا يحتوي علىinitializeالتبادل، لا notifications/initializedو لاMcp-Session-Idكل طلب يحمل المعلومات التي كانت تعيش في ضغط اليد

json{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "summarize_repo",
    "arguments": {"audience": "developer"},
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {"sampling": {}},
      "io.modelcontextprotocol/clientInfo": {
        "name": "lesson-client",
        "version": "1.0.0"
      }
    }
  }
}

يقوم الخادم بتؤكيد الإصلاح على كل طلب. نسخة مفقودة أو غير سلسلة هي معايير غير صالحة، -32602. تعود سلسلة غير مدعومة-32022مع بيانات دقيقة{"supported":["2026-07-28"],"requested":"<client version>"}. إمكانية العينة المفقودة تعود-32021معdata.requiredCapabilitiesالمحددة إلى{"sampling":{}}. . .

غلاف بدون JSON-RPC idهو إشعار. قد يعالج المستلمها ، لكنه لا ينبعث من استجابة نجاح ولا استجابة خطأ. يعود مكيّف HTTP التدفقي 202 Acceptedبدون هيئة للإخطار المقبول.

الخادم أيضاً ينفذ server/discoverمع الدقةsupportedVersionsالمفتاح، القدرات،ttlMsوcacheScopeحتى يتمكن العميل من تعلم وتخزين عقد الخادم قبل الاتصال بالأداة. لأن اكتشاف الإعلاناتtools، الخادم أيضا تنفيذ إلزامية tools/list. إنّها تحديديةsummarize_repoالوصف يحتوي على كائن صالح inputSchema،resultType: "complete"، بيانات الهوية الخادم، وتلميحات التخزين العام.

كل نتيجة حديثة ناجحة لها تمييز:

  • resultType: "complete"يعني أن العملية قد انتهت
  • resultType: "input_required"يعني أن العميل يجب أن يستوفى الطلبات المضمنة ويحاول مرة أخرى.
  • قد تحدد التوسعات أنواع النتائج الإضافية."task"في الدروس 13.

جولة واحدة من MRTR

لا يمكن للخادم الاتصال بالعميل أثناء التعامل مع الطلب. يعيد بدلا من ذلك هذا النتيجة:

json{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "pick_files": {
        "method": "sampling/createMessage",
        "params": {
          "messages": [
            {
              "role": "user",
              "content": {
                "type": "text",
                "text": "Choose three representative files and return a JSON array."
              }
            }
          ],
          "systemPrompt": "Return only the requested value.",
          "modelPreferences": {
            "costPriority": 0.8,
            "intelligencePriority": 0.2
          },
          "maxTokens": 400
        }
      }
    },
    "requestState": "opaque-integrity-protected-value"
  }
}

يثبت العميل أنه يدعم أخذ العينات، ويطبق سياسات الموافقة والنموذج، ويستلم استجابة نموذجية. ثم يرسل طلبًا جديدًا مع معرف JSON-RPC مختلف:

json{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "summarize_repo",
    "arguments": {"audience": "developer"},
    "inputResponses": {
      "pick_files": {
        "role": "assistant",
        "content": {
          "type": "text",
          "text": "[\"README.md\", \"server.py\", \"docs/intro.md\"]"
        },
        "model": "host-model",
        "stopReason": "endTurn"
      }
    },
    "requestState": "opaque-integrity-protected-value",
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {"sampling": {}}
    }
  }
}

لا يعد التجربة إعادة استمرارًا في جلسة بروتوكول. إنه طلب جديد يكرر الطريقة والأحجج الأصلية ، ويضيف فقط الجولة الحالية inputResponses، و الترددrequestStateبايت بـ بايت

يُسمح بإجراءات MRTR فقط على tools/call،prompts/getوresources/readلا يجب أن يعود خادمinput_requiredمن طرق غير مرتبطة

حالة متعددة الجولات

هذا الدروس يحتاج إلى اثنين من النماذج:

  1. pick_filesيعيد صف JSON.
  2. summaryيعيد النص النهائي

كل محاولة إعادة تحمل فقط الردود لهذا الجولة. وبالتالي يضع الخادم المرحلة والبيانات المتوسطة المعتمدة في الجولة التالية requestState. . .

تعامل هذه القيمة على أنها تحت سيطرة المهاجمين توقيع اسم مرحلة خام ليس كافياً.

  • الرئيسي الموثق ، غير المبلغ عن نفسه clientInfo(إنه)
  • طريقة الأصل
  • إصدار بيان للدعاوى الأصلية
  • انتهاء الصلاحية القصيرة
  • المرحلة الحالية والقيم المتوسطة المصدقة.

استخدم HMAC عندما لا تكون السرية مطلوبة. استخدم تشفير مصحوب عندما لا يجوز للعميل قراءة الحالة. رفض توقيع سيء، قيمة انتهت، تغيير الرأس، أو تغيير الحجج مع -32602. . .

لا يجوز للعميل تحليل أو تعديلrequestStateوظيفته الوحيدة هي أن تتردد في السلسلة الدقيقة في المحاولة المُجددة

الاختيارات النموذجية هي إشارات

costPriority،speedPriorityوintelligencePriorityهذه التفضيلات مستقلة. إنها ليست توزيعًا محتملًا ولا تحتاج إلى جمع إلى واحد. قد يتجاهلها العميل لأن العميل يملك سياسة نموذج.

إبقincludeContextفي"none"إذا كنت تحافظ على تدفق العينات القديم. أنماط السياق الأخرى تزيد من خطر التسرب وتصبح نفسها مسبقة. اجلب الحد الأدنى من السياق الصريح في الطلب.

المواد الآمنة غير المتغيرة

العميل هو الحد الثقائي لطلبات العينات المضمنة.

  • أظهر للمستخدم ما يطلب منه الخادم أن يفعل عندما تتطلب السياسة موافقة.
  • (سيرفر ضار) بإمكانه خلق حلقة نموذجية
  • تأكيد كل استجابة عن أخذ العينات قبل استخدامها كاسم ملف أو عنوان URL أو إدخال أداة.
  • حد البايتات والرموز لكل جولة
  • رفض طلب إدخال لم يتم إعلانه في قدرات العميل الحالية.
  • أبق النموذج خارج قرارات التصريح.
  • سجل طريقة الأصل و مفتاح طلب المدخل دون سجل محتوى الاستعلام الحساس.

clientInfoوserverInfoهي بيانات استعراضية وتشخيصية. لا تستخدم أبدا كهوية مصححة.

بناءها

code/main.pyتنفيذ التدفق الكامل المكون من جولتين دون حزمة من طرف ثالث:

  • server/discoverالعائداتsupportedVersions، يعلن عن دعم الأدوات ، ويرد إشارات التخزين.
  • tools/listيعود تحديد، قابلة للتخفيض summarize_repoوصف مع مخطط إدخال كائن.
  • tools/callيؤكد بيانات الأساسية حسب الطلب.
  • النتيجة الأولى تضمنتsampling/createMessageلانتخاب الملفات
  • التجربة الأولى تؤكد نتائج النموذج وتضم طلب ثان.
  • محمية من HMAC requestStateيمر في مرحلة بين الطلبات المستقلة.
  • النتيجة النهائية تستخدمresultType: "complete". . .

النموذج المضيف المزيف يجعل المثال محددًا.fake_host_modelيجب أن تبقى آلة الحالة من جانب الخادم تحديدية و قابلة للتحقق

استخدمها

من جذور المخبأ:

bashcd phases/13-tools-and-protocols/11-mcp-sampling/code
python3 main.py
python3 -m unittest discover tests -v

نقاط التفتيش المتوقعة:

  • الاكتشاف يعيد نتيجة كاملة مع ttlMsوcacheScope. . .
  • أداة اكتشاف يعود نفس تصنيف مرتب مع resultType، هوية الخادم ، وتلميحات التخزين
  • إمكانيات مفقودة والنسخ غير المدعومة تستخدم بالضبط -32021و-32022بيانات الخطأ.
  • الإخطار بدون ID لا ينتج استجابة JSON-RPC.
  • هويات الطلبات هي[1, 2, 3]، يثبت أن كل جولة من MRTR مستقلة
  • النتائج الأولى اثنتين هيinput_required. . .
  • النتيجة النهائية هيcompleteويحتوي على الملفات المختارة بالإضافة إلى الملخص.
  • تغيير الحجج الأصلية في محاولة إعادة تفشل في التحقق من حالة الطلب.

أرسله

outputs/skill-sampling-loop-designer.mdهو الآن خطط الهجرة. إنه يقرر أولاً ما إذا كان يجب إزالة العينات لصالح دمج النموذج المباشر. إذا كانت التوافق مطلوبة، فإنه ينتج جولات MRTR، والالتزام بالحالة، وبوابة القدرة، والميزانية، والتحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحقق من التحققق.

التمارين

  1. تغيير رد اختيار الملف إلى JSON غير صالحة. تأكد من استرجاع الخادم -32602بدلاً من الثقة في النموذج
  2. التغييرaudienceبين المكالمة الأولى والإعادة المحاولة، شرح لماذا الحالة المغلقة تمنع إعادة استخدام الطلبات المتقاطعة.
  3. أضف جولة ثالثة تطلب من المضيف انتقاد الموجة، و حمل الموجة السابقة داخل الحالة الموقعة و حدد التدفق بأكمله في ثلاث جولات.
  4. إزالة العينات عن طريق استبدال استدعاء المضيف المزيف مع مكيّف نموذج مملوك للخادم. قم بتقديم قائمة بمسؤوليات الموافقة والفواتير واللاحظة التي تنتقل إلى الخادم.
  5. إضافة اختبار انتهاء الصلاحية باستخدام قيمة حالة تتجاوز مدته ثانية واحدة.

الشروط الرئيسية

TermMeaning in 2026-07-28
SamplingDeprecated feature that asks the client's model for a completion
MRTRStateless retry pattern for client input required during a request
InputRequiredResultResult with resultType: "input_required"
inputRequestsServer-assigned map of embedded elicitation, sampling, or roots requests
inputResponsesCurrent round's client results keyed like inputRequests
requestStateOpaque server state echoed exactly by the client and verified by the server
resultTypeRequired discriminator for modern MCP results
Direct model integrationRecommended replacement for new servers that need model inference
Capability gateRule that prevents sending an embedded request the client did not advertise
Loop budgetMaximum rounds, tokens, bytes, time, and spend allowed for the operation

التوافق مع التراث

العميل المحدد لـ 2025-11-25 قد لا يزال يستخدم الخادم القديم المبدع sampling/createMessageالتدفق عبر اتصال مباشر. احتفظ بهذا السلوك في مُعدّل محدد للنسخة فقط. لا تجعل المسار المُكتمل للجلسة هو بنية لخادم 2026-07-28.

يمكن أن تترجم المجموعات الرسمية للتنمية المتقدمة الحديثة input_requiredهذا الشعور هو حدود التوافق، وليس إذن لإضافة منطق جديد يعتمد على الجلسة.

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

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.