Phase 13: Tools & Protocols

سلسلة إمدادات سجلات المملكة المتحدة: القبول والانحراف والرجوع

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

Type: Build

Languages: Python

Prerequisites: Phase 13 · 17 (gateways and registries), Phase 13 · 18 (production authentication)

Time: ~90 minutes

أهداف التعلم

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

المشكلة

أنت تجدcom.example/inventoryفي سجل، وصفه يبدو صحيحاً، حزمة موجودة، الخادم يردserver/discover. . .

هذه ليست حقيقة واحدة إنها سلسلة من الحقائق من مختلف السلطات

  1. قام الناشر الذي أصدّق لـ "مساحة الأسماء" بإرسال سجل.
  2. كان سجل الحزمة يقدم أداة مع هويت محددة و هضم.
  3. أبلغت نقطة نهاية تعمل عن نسخة بروتوكول، وقدرات، وأدوات، ومعلومات خادم التشخيص.
  4. منظمتك قررت أن هذا المزيج بالضبط هو المسموح به.

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

المُساعد هو مراقب القبول مع أدلة في كل حدود

السجل هو مؤشر، وليس نظامك المعتمد

سجل المكالمة الرسمية MCP تخزين البيانات المعدنية الخادم.server.jsonتسجيل أسماء نسخة الخادم وتعلن عن حزمة أو أكثر أو نقاط نهاية بعيدة. قواعد النشر تضيف مصادقة مساحة الأسماء، ومراقبة ملكية الحزمة، وقواعد السجل المحدود، وموقع البيانات المترتبة للنشر الضيق.

هذه الضوابط تجيب على أسئلة النشر سياسة الإنتاج الخاصة بك لا تزال تجيب على أسئلة التنفيذ:

BoundaryQuestionEvidence owner
NamespaceWas the publisher allowed to use this name?Registry authentication plus your verified namespace input
RecordWhat did the publisher declare for this version?Immutable server.json digest
Execution sourceWhich package or remote endpoint will execute?Declared source fields, verified ownership result, transport, and trusted digest
RuntimeWhat does the endpoint expose now?server/discover and tool descriptors
AdmissionDid your policy approve this exact set?Local pin and ledger entry
OperationsIs it still safe, and what can replace it?Drift checks, status sync, health, and rollback route

نسخة مخطط السجل والنسخة بروتوكول MCP مستقلة.2025-12-11مخطط الخادم بينما الخادم الحي يدعم MCP 2026-07-28لا تقرر أبداً من الآخر

سبعة عمليات مراقبة في قرار واحد

1. التحقق من مساحة الأسماء

تستخدم أسماء السجل الرسمي مساحات الأسماء الموثقة. يمكن للمجال المحقق من التحقق من الخريطة إلى إضافة مستوى مستوى معاكسة. على سبيل المثال، التحكم في example.comيمكن أن يُحددcom.example/*. . .

لا تقبل التحقق من المواصلات السلكية:

pythonserver_name.startswith("com.example")

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

تستخدم مساحات الأسماء المدعومة من GitHub ومساحات الأسماء المدعومة من الدومين مسارات تحديد المصادقة المختلفة. قم بتعديل أي من المسارات إلى مدخل واحد: سلسلة مساحة الأسماء المحققة.

2. الإقتراب من النسب

لتحقيق سجل الحزمة، يجب أن يلتحق الإعلان والشئ المتحضر الذي تم الحصول عليه على حقل صريحة:

  • نوع سجل الحزمة
  • معرف الحزمة
  • إصدار الحزمة
  • نتيجة ملكية مُحققة
  • تحميل الأثاث

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

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

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

3. ضبط القرار، ليس فقط النسخة

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

هذا يعني^1.4ليس محفظة إدخال. ولا آخر. محفظة مفيدة تحتوي على:

json{
  "server": "com.example/inventory",
  "version": "1.0.0",
  "recordDigest": "...",
  "source": {"kind": "package", "registryType": "pypi"},
  "sourceDigest": "...",
  "toolsetDigest": "...",
  "provenanceDigest": "...",
  "registryStatus": "active"
}

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

4. الكشف عن التجرف الحي

يجب أن يلاحظ المدخل الخادم الذي سيحصل على حركة المرور.server/discover، أو الحصول على وصف الأدوات المعروضة من خلال المسار الموثوق به ، والتحقق من:

  • 2026-07-28هو فيsupportedVersions
  • جميع القدرات المطلوبة محليا موجودة
  • كل وصف أداة لديه الهوية المطلوبة والسطح النموذجي
  • يطابق إصدار الموصف المعتاد مع اللوحة المُسَمَحَة في التحققات اللاحقة

النتيجة الاختيارية_meta["io.modelcontextprotocol/serverInfo"]القيمة هي إظهار ذاتية الإبلاغ، السجل، والإصلاح السياق. سجلها كدليل تشخيصي، ولكن لا تستخدمها أبدا لتحديد مساحة الأسماء، ملكية الحزمة، ملكية نقطة النهاية، أو القبول، أو أي قرار أمني آخر.serverInfoاسم مستعار خارج_metaليس مجال العقد ولا ينبغي أن يتم ترقيته إلى دليل تشخيصي.

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

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

5. حالة السجل هي حالة حية

يضم API السجل مستوى استجابة _metaالمواد التي يتم إدارة السجلات تعيش تحت _meta["io.modelcontextprotocol.registry/official"]- أرسلي الإجابة_metaالاعتراض على القبول والقراءة_meta["io.modelcontextprotocol.registry/official"].status- مباشرة_meta.statusلا تخلط بين بيانات الاستجابة والبيانات المتاحة في سجل النشر_meta. الوضع يمكن أن يكون:

  • active: أعيد عن طريق الاختيار وتأهل للقبول المحلي
  • deprecated: لا يزال يمكن اكتشافه مع تحذير ، ولكن لم يعد خيار آمن تلقائي
  • deleted: مخفية افتراضيا بينما سجل تاريخي ما زال متاحا من خلال المشاهدات المحذوفة أو الإضافية

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

المعلومات المخصصة التي يقدمها الناشرين تنتمي فقط إلى _meta.io.modelcontextprotocol.registry/publisher-providedفي سجل نشر. البيانات المعدنية للإجابة التي يديرها السجل منفصلة. لا تدع الناشر يحدد وضعها الرسمي الخاص.

6. الردع يعني استعادة المسار

لا يتم تحرير نشرة لا تتغير أثناء إعادة التدوير. يختار Rollback محاملاً مسبقاً، مؤهلاً حالياً، ويغير المسار النشط.

الهدف الآمن يجب أن:

  1. أن يكون لديك سجل إدخال مكتمل
  2. لا يزال لديك حالة سجل نشط تحت سياسة.
  3. لا يتم احتجازه بسبب وقت التشغيل أو الأدلة الأمنية.
  4. لا يزال يقرر إلى الحزمة المثبتة و بيانات الحي.
  5. اجتياز الفحوصات الصحية الحالية

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

7. إضافة دفتر القبول

قاعدة بيانات القبول تقول ما هو نشط. دفتر دليل يشرح لماذا.

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

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

بناءها

جهاز التحكم المتحرك يعملcode/main.pyيستخدم فقط مكتبة بايثون القياسية

ابدأ بالظهور المحدد:

bashcd phases/13-tools-and-protocols/30-mcp-registry-supply-chain-and-drift
python3 code/main.py

ينفذ المظاهرة خمس عمليات:

  1. اعترف1.0.0مع مساحة الأسماء المقابلة، ومصدر الحزمة، والبروتوكول، والقدرات، والأدوات.
  2. اعترف1.1.0وجعله نشطاً
  3. لاحظ أداة حذف غير متوقعة في وقت تشغيل.
  4. لاحظ حالة السجل1.1.0أصبحdeprecated. . .
  5. استعادة التوجيه إلى المُقبلين بعد1.0.0-أجل

الشكل المتوقع:

json{
  "admitted": [true, true],
  "driftAllowed": false,
  "rollbackAllowed": true,
  "activeVersion": "1.0.0",
  "ledgerValid": true
}

اقرأ التنفيذ في هذا الترتيب:

  1. namespace_for_domain()وnamespace_matches()تحديد سلطة الإسم الدقيقة.
  2. digest()وnormalized_tools()يُقدم دليل تحديد.
  3. RegistryAdmissionController.admit()يضم النشر، والإصدار، والوقت التشغيلي، والسياسة.
  4. check_live()يُقارن ملاحظة جديدة مع اللوحة.
  5. observe_registry_status()نسخة الحجر الصحي التي تتغير حالة السجل.
  6. rollback()يُفعّل فقط هدفًا مؤهلًا مسبقًا.
  7. AdmissionLedger.verify()يكتشف التغييرات في التاريخ المسجل.

استخدمها

ضع جهاز التحكم بين اكتشاف وتوجيه:

textRegistry sync -> artifact verifier -> live discovery -> admission controller -> route table
                                               |                 |
                                               v                 v
                                          evidence store    admission ledger

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

جعل بيان التنفيذ صريحًا. معتمد يعني السياسة التي تم تمرير الأدلة. مفعول يعني المسار الذي يختارها حاليًا. مُحرّر يعني أنه لا يمكن أن يتلقى عملًا جديدًا. مُساعد يعني أن نسخةً أخرى معترف بها نشطة. لا ترميز جميع المعاني الأربعة في لغة بولية واحدة.

إضافة قبل تعريض الخادمtools/listوإلا يمكن للعميل اكتشاف أداة خلال الفجوة بين النشر وتقييم السياسات.

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

ستشاهد حدود واحدة تنفصل في وقت واحد.

المختبر (أ): تصادم في الفضاء الاسم

افتح قذيفة Python من دليل الكود:

bashcd phases/13-tools-and-protocols/30-mcp-registry-supply-chain-and-drift/code
python3 -q

ثمّ إركض:

pythonfrom main import namespace_matches
namespace_matches("com.example/inventory", "com.example")
namespace_matches("com.exampleevil/inventory", "com.example")

النتيجة الأولى هيTrueالثاني هوFalse. استبدل المقارنة الدقيقة بـstartswithفي مكان ما ولاحظ لماذا اسم الثاني يعبر الحدود. استعاد المقارنة الدقيقة قبل الاستمرار.

المختبر ب: التأرجح

pythonfrom main import *
times = iter(f"2026-08-21T12:00:{n:02d}+00:00" for n in range(10))
c = RegistryAdmissionController(clock=lambda: next(times))
meta = {OFFICIAL_META_KEY: {"status": "active"}}
c.admit(sample_record("1.0.0"), meta, "com.example", evidence_for("1.0.0"), sample_live("1.0.0"))
c.check_live("com.example/inventory", "1.0.0", sample_live("1.0.0", True))

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

المختبر (ج): حالة وإعادة التأثير

اعترف1.1.0، علامة أنها قد تمت ، و حاولي كلا الهدفين التراجع:

pythonc.admit(sample_record("1.1.0"), meta, "com.example", evidence_for("1.1.0"), sample_live("1.1.0"))
c.observe_registry_status("com.example/inventory", "1.1.0", "deprecated")
c.rollback("com.example/inventory", "1.1.0", "unsafe retry")
c.rollback("com.example/inventory", "1.0.0", "restore known release")
c.ledger.verify()

يتم رفض الهدف المُحرّص، يتم قبول الرمز النشط السابق، والسجل يبقى صالحًا.

مختبر التدريب

تمديد جهاز التحكم بمرآب موافقة لشخصين.

المتطلبات:

  • تخزين الموافقات كإشارات دليل موقعة، وليس أسماء قابلة للتغيير في اللوحة.
  • تطلب هويات المراجعة المختلفة ل مجموعة أدوات تحتوي على أداة مع destructiveHint: true. . .
  • رفض هويات المراجعة المكررة.
  • الحفاظ على محاولة القبول الأصلية في دفتر التسجيل عندما يكون الموافقة غير مكتملة.
  • إضافة اختبارات صفر، واحد، نسخة مزدوجة، وامتحانات منفصلة.
  • لا تسجل توقيعات أو إثباتات أو حجج أدوات خاصة كاملة.

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

الأثاث المُرسل

هذه الدروس تُسافرoutputs/skill-mcp-registry-admission.md. استخدمها ككتيب عمل مسطح قابل لإعادة الاستخدام عند مراجعة إصدارات السجل الجديدة أو التحقيق في التنحيل. يحدد المدخلات وقواعد الرفض ومجموعة الأدلة وموافقة الحالة و دليل التراجع دون الاعتماد على أسماء الفئات العينة.

تحقق من ذلك

إشغال التظاهر والحزمة التحديدية:

bashcd phases/13-tools-and-protocols/30-mcp-registry-supply-chain-and-drift
python3 code/main.py
python3 -m unittest discover -s code/tests -v

يجب أن تثبت التحقق:

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

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

FailureWhy it happensRequired response
Name looks valid but namespace was never authenticatedPolicy trusted record textReject until a trusted namespace verifier supplies the exact prefix
Same package coordinate returns new bytesMutable upstream or compromised distributionStop activation, retain both digests, investigate the fetch boundary
“Latest” changes without reviewFloating selection escaped the pinResolve only exact admitted versions and digests
New tool appears after approvalRuntime drift or a different deploymentQuarantine the route and capture a fresh descriptor observation
Deprecated version remains activeStatus sync is missing or delayedReconcile status on a schedule and before activation
Deleted record disappears from default syncClient requested only active recordsUse incremental or deleted-aware reconciliation and preserve local history
Rollback target was never admittedRoute control and approval state are disconnectedRefuse rollback and run a new admission for the target
Ledger verifies locally after an attacker rewrites all entriesHash chain has no external anchorPublish signed ledger heads to a separate trust domain
Evidence contains bearer tokens or tool argumentsLogging copied whole requestsRedact at collection time and store only the minimum proof

قاعدة العمليات

الإجابات عن النشر هل يمكن لهذا الهوية أن تنشر هذا الاسم؟ إجابات القبول هل سنقوم بتنفيذ هذا الشيء الدقيق ونكشف هذا السلوك الدقيق؟

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

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.