Phase 13: Tools & Protocols

نطاق واضح وتسجيل العزل

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

Type: Build

Languages: Python

Prerequisites: Phase 13 · 07 (MCP server), Phase 13 · 11 (stateless MRTR)

Time: ~60 minutes

أهداف التعلم

  • استبدل الجذور القديمة بمعايير مساحة العمل الصريحة أو أوراي الموارد أو تكوين الخادم.
  • إشارات مختلفة من الإذن، وتحديد المسار، وتعبئة النظام التشغيلي.
  • وضع الشكلelicitation/createعبر MRTR input_requiredالنتيجة
  • إعلان دعم الإجراءات في إمكانات العميل حسب الطلب ورفض أنماط غير المدعومة.
  • تأكيديaccept،declineوcancelنتيجة واضحة
  • ربط التأكيد المدمر بالرئيسي الموثق والحجج الأصلية ومجموعة المرشحين والانهيار.

مشاكل متشابهة

تتلقى أداة ملاحظات طلباً كهذا: "حذف تقرير TPS القديم".

يجب على الخادم الإجابة على سؤالين مختلفين

  1. أي مساحة عمل يمكن أن تلمس هذه العملية؟
  2. أي من النصوص الثلاث المتناسبة قصدها المستخدم؟

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

الجذور هي سطح الهجرة

تمكن مراجعات MCP السابقة العميل من الإعلان عن الجذور وإخطار خادم عندما تغير القائمة. كانت الجذور توجيهات معلومية. لم تقيد ما يمكن لعملية الخادم قراءته ، ولم تسمح للمدعو ، ولم تخلق صندوقًا رملًا لنظام التشغيل.

المخطط 2026-07-28 يمنعroots/listوnotifications/roots/list_changedفي تصاميم جديدة، تفضل إحدى هذه الاستبدالات الصريحة:

  • أworkspaceUriأوdirectoryحجة الأداة عندما يتغير نطاق المكالمة لكل مكالمة.
  • URI للموارد عندما تستهدف العملية بالفعل الموارد.
  • تكوين الخادم عندما يمتلك تنفيذ واحد مساحة عمل ثابتة واحدة.
  • صندوق رمل العملية أو نظام ملفات محبوس عندما يكون الكود لا يمكن الهرب منه تقنيا.

إذا كان هناك حاجة إلى تكامل موجود في 2026-07-28roots/listخلال نافذة التخفيض ، يقوم الخادم بإدخاله في MRTR inputRequests. لا يجب أن ترسل طلبًا عكسياً مباشراً. هذا هو مُعدل الهجرة؛ يجب على المُعاملين الجدد أن يقبلوا نطاقًا صريحًا بدلاً من ذلك.

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

قاعدة ثلاث طبقات

لا يزال URI صريح لا يسمح نفسه.

  1. Authorization:هل يسمح لهذا المدير الموثق باستخدام هذا المجال؟
  2. Containment:هل يظل الرقم المستهدف المعتاد داخل حدود مساحة العمل المسموح بها؟
  3. Sandbox:هل يمكن أن يمنع النظام التشغيلي خادم مُعرض للخطر من الهروب على أي حال؟

يحافظ الخادم القابل للتشغيل على قائمة مسموحة من أجهزة URI مساحة العمل المسموح بها، ويعادل المسارات المشفورة بنسبة مئوية، ويتحقق من حدود المكونات الحقيقية للمسار، ويعيد التحقق من الحفاظ على الوصول مباشرة قبل الحذف.

التحقق من مخطوطات السطر البديلة خاطئة:

textallowed:   file:///work/notes
attacker:  file:///work/notes-evil/secret.md
traversal: file:///work/notes/%2e%2e/private.md

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

لا يزال هناك طلب، لكن التسليم قد تغير

الإجراء هو ميزة العميل الحالية لجمع مدخلات المستخدم خلال tools/call،prompts/getأوresources/read. اسم الطريقة لا يزالelicitation/createما تغير هو اتجاه تدفق الأسلاك

لا يرسل خادم 2026-07-28 طلب JSON-RPC العكسي. يعيد InputRequiredResult:

json{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "delete_choice": {
        "method": "elicitation/create",
        "params": {
          "mode": "form",
          "message": "Choose one matching note and confirm deletion.",
          "requestedSchema": {
            "type": "object",
            "properties": {
              "note_id": {
                "type": "string",
                "enum": ["note-3", "note-7", "note-14"]
              },
              "confirm": {"type": "boolean"}
            },
            "required": ["note_id", "confirm"]
          }
        }
      }
    },
    "requestState": "integrity-protected-delete-state"
  }
}

يقوم المضيف بتقديم النموذج. يمكن للمستخدم قبوله أو رفضه صراحة أو رفضه. ثم يقوم العميل بإعادة تجربة النموذج الأصلي tools/callمع هوية جديدة:

json{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "notes_delete",
    "arguments": {
      "workspaceUri": "file:TOK0
      "title": "TPS report"
    },
    "inputResponses": {
      "delete_choice": {
        "action": "accept",
        "content": {"note_id": "note-14", "confirm": true}
      }
    },
    "requestState": "integrity-protected-delete-state",
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {
        "elicitation": {"form": {}}
      }
    }
  }
}

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

التفاوض على القدرة هو حسب الطلب

العميل الذي يدعم استدعاء وضع النموذج يعلن:

json{
  "io.modelcontextprotocol/clientCapabilities": {
    "elicitation": {"form": {}}
  }
}

قدرة هباء فارغة"elicitation": {}، لا يزال يعادل دعم للاتساق فقط على شكل."elicitation": {"form": {}}يدعم أيضا وضع النموذج. إعلان فقط على عنوان URL، "elicitation": {"url": {}}لا يجب على الخادم إدراج وضع غائب من قدرات الطلب الحالي، حتى لو كان طلب سابق يعلن عنه.

كل طلب يحمل أيضاًio.modelcontextprotocol/protocolVersion. إصدار مفقود أو غير سلسلة يعود -32602. تعود سلسلة غير مدعومة-32022مع دقةsupportedوrequestedالبيانات. إعادت دعم الإجراءات المفقودة أو فقط على عنوان URL -32021معdata.requiredCapabilitiesالمحددة إلى{"elicitation":{"form":{}}}. . .

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

clientInfoيجب أن يتم تضمينها للتشخيص، ولكنها ذاتية الإبلاغ ولا يمكن تحديد المستخدم للحصول على الموافقة.

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

وضع الشكل

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

استخدام وضع النموذج ل:

  • اختيار واحد من العديد من المرشحين
  • تأكيد عملية مدمرة؛
  • جمع التفضيلات غير الحساسة
  • جمع عدد صغير من القيم يجب على المستخدم، وليس النموذج، أن يقرر.

لا تستخدم وضع النموذج للكلمات المرور، مفتاحات API، رموز الوصول، أو إثباتات الدفع. هذه الأسرار ستمر عبر عميل MCP ويمكن أن تصل إلى السجلات أو سياق النموذج.

يقوم الخادم بتؤكيد المحتوى المرجع مرة أخرى. تحسن التؤكيد من النموذج من جانب العميل UX ولكن لا يخلق الثقة.

وضع URL

وضع URL يرسل عنوان URL على شبكة الإنترنت آمن للتفاعل خارج النطاق:

json{
  "method": "elicitation/create",
  "params": {
    "mode": "url",
    "message": "Connect the report service to continue.",
    "url": "https://mcp.example.com/connect/report-service"
  }
}

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

  • نعمacceptالإجابة تعني المستخدم الذي وافق على فتح عنوان URL. لا يثبت أن التدفق الخارجي قد تم إكماله. عند محاولة أخرى، يقوم الخادم بتحقق من حالته الخاصة وإما أنه يكتمل أو يعيد آخر input_requiredالنتيجة

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

فروع الاستجابة

تعامل الإجراءات كقرارات منتجات وليس كـ"تلقيحات":

ActionMeaningSafe server behavior
acceptUser submitted the interactionValidate content and continue
declineUser explicitly refusedReturn a complete, non-error refusal outcome
cancelUser dismissed or could not finishStop safely and allow a later retry

لا تفسير المحتوى المفقود كإذن، ولا تحويل الرفض إلى حلقة استمرارية.

حماية حالة MRTR المدمرة

قائمة المرشحين لا يمكن أن تعيش فقط في قاعدة64 القيمة أو غير الموقعة. العميل يسيطر على كل شيء يرسل مرة أخرى.

الدرس يُوقع على حمولة دولية تحتوي على:

  • الرئيسي الموثوق به
  • طريقة الأصل
  • هضمworkspaceUriوtitle(إنه)
  • أرقام الملاحظات المسموح بها التي تظهر في النموذج
  • مرحلة التشغيل
  • انتهاء الصلاحية قصير

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

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

تأكيد التفاعل قبل المطالبة بالدفع.cancelلا يؤدي أي طفرة و يترك الحالة قابلة للتحرك حتى ينتهيdeclineهو نهائي، لذلك الدروس تستهلك غير المفردة دون حذف أي شيء.

بناءها

code/main.pyيظهر أنّهnotes_deleteالوسيلة:

  • tools/listيعيد وصف تحديدي، قابلا للتخفيض مع مساحة العمل المطلوبة ونظام العنوان.
  • النطاق هو صريحworkspaceUri-أحاديث
  • تكوين الخادم يسمح بذلك المجال للعمل للمعلم.
  • يرفض تطبيع URI إضطرابات المواصلات والتحول المشفر.
  • كل حذف مدمر يتطلب إثارة وضع الشكل
  • الجهاز السريع يسافر إلى الداخلresultType: "input_required". . .
  • توقيعrequestStateيربط قائمة المرشحين الدقيقة والحجج الأصلية.
  • متجر إعادة التشغيل المحقق يرفض نفس الحالة المقبولة أو المقبولة عبر حالات الخادم.
  • تستخدم محاولة إعادة استخدام هوية طلب جديدة وتعطيresultType: "complete". . .

مخزن البيانات في الذاكرة لذلك سلوك البروتوكول سهل للتفتيش. قواعد الأمن تظل نفسها مع قاعدة البيانات.

استخدمها

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

bashcd phases/13-tools-and-protocols/12-mcp-roots-and-elicitation/code
python3 main.py
python3 -m unittest discover tests -v

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

  • "ديسكفري" تعلن عن أدوات بدون "جذر".
  • أداة اكتشاف تعود notes_deleteمعresultType، هوية الخادم ، وتلميحات التخزين
  • طلب الهوية1يعيد الشكل في inputRequests.delete_choice. . .
  • طلب الهوية2يردد الحالة الموقعة ويؤدي إلى إزالة.
  • مسار المُقبل ومسار التقاطع المشفرين فشلوا في الحفاظ عليه.
  • لا يمكن لإعادة استخدام العنوان المتغير حالة التأكيد الأصلية.
  • إن تراجع يترك النقش غير متغير
  • لا يمكن لمتلكين كائنات الخادم المشتركة في حالة ملاحظة وإعادة تشغيل تنفيذ تأكيد واحد.
  • الإعلانات الفارغة والصريحة تعمل ، بينما يدعم URL فقط يعود دقة -32021متطلبات الشكل.
  • أخطاء الإصدار غير المدعومة تستخدم النسخة المحددة-32022شكل البيانات
  • الإخطار بدون ID لا ينتج استجابة JSON-RPC.

أرسله

outputs/skill-elicitation-form-designer.mdتصميم النطاق الصريح، والتحقق من الموافقة، ونموذج MRTR، فروع الاستجابة، والارتباط الحكومي. يرفض التعامل مع الجذور القديمة كغلاف الرمال أو لجمع الأسرار من خلال وضع النموذج.

التمارين

  1. استبدل متجر إعادة التذكرة في SQLite. استخدم معاملة واحدة للمطالبة بالبيانات ومحذف الملاحظة، ثم أثبت أن عمليتين لا يمكن أن تتعهد.
  2. إضافةurlالتفاوض على القدرة والتيجة خارج النطاق.inputResponses. . .
  3. استبدل خريطة الملاحظات داخل الذاكرة بمقاعدة بيانات SQLite مؤقتة. إعادة التحقق من الإذن والاحتواء داخل معاملة الطفرة.
  4. إضافة سياسة الرمزية لترابط لنظام ملفات حقيقي تنفيذ. شرح لماذا لا يمكن الحفاظ على URI لغوية وحدها منع الهروب من الرمزية.
  5. تصميم مكيّف 2025-11-25 الذي يقوم بتخريط خروج معالج MRTR الحديث إلى إطلاق الخادم القديم. أبقيه بعيدًا عن معالج الحالي.

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

TermMeaning in 2026-07-28
RootsDeprecated informational workspace hints, not authorization or sandboxing
Explicit scopeWorkspace, directory, or resource handle visible in request arguments
ContainmentNormalized path-component check that keeps a target inside a boundary
ElicitationClient feature for obtaining user input during an MCP operation
Form modeIn-band structured user input using a restricted flat schema
URL modeOut-of-band interaction for sensitive or external workflows
MRTRStateless input-required result followed by a fresh retry
requestStateOpaque state echoed exactly and integrity-checked by the server
DeclineExplicit user refusal
CancelDismissal or incomplete interaction without approval

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

بالنسبة لزميل محصن إلى 2025-11-25roots/list،notifications/roots/list_changed، وبدأت الخادم الحيelicitation/createلا تسمح لـ قائمة الجذر القديمة بتجاوز تصريحات الخادم، ولا تحمل افتراضات جلسة البروتوكول إلى المعامل الحديث.

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

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.