فهم بروتوكول سياق النموذج

نظرة عميقة على هندسة MCP

5 دقيقة للقراءة

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

الطبقات الثلاث في خادم MCP

النقل — كيف تنتقل البايتات
البروتوكول — ماذا تعني البايتات
القدرات — منطقك الفعلي

الطبقات الثلاث

1. طبقة النقل

يدعم MCP آليتين للنقل:

النقلحالة الاستخدام
stdioالعمليات المحلية، أدوات CLI
Streamable HTTPالخوادم البعيدة، المستندة إلى الويب (قُدم في مواصفة 2025-03-26)

ملاحظة: تم إهمال نقل HTTP+SSE القديم في تحديث المواصفة لشهر مارس 2025 لصالح Streamable HTTP، الذي يستخدم نقطة نهاية HTTP واحدة ويرقى اختيارياً إلى SSE للبث. خوادم SSE القديمة لا تزال تعمل ولكن المشاريع الجديدة يجب أن تستخدم Streamable HTTP.

# نقل stdio (محلي)
server = Server(name="my-server")
async with stdio_server() as (read_stream, write_stream):
    await server.run(read_stream, write_stream)

# نقل Streamable HTTP (بعيد)
server = Server(name="my-server")
async with streamable_http_server(port=8000) as (read_stream, write_stream):
    await server.run(read_stream, write_stream)

2. طبقة البروتوكول

تتعامل طبقة البروتوكول مع تنسيق الرسائل باستخدام JSON-RPC 2.0:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_database",
    "arguments": {
      "query": "بريد المستخدمين"
    }
  }
}

3. طبقة القدرات

هنا يعيش منطقك - الأدوات والموارد والتعليمات التي تكشفها.

تدفق الرسائل

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

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

ماذا يحدث في طلب واحد — وفي ذلك الطلب وحده

العميل يرسل

الطلب يحمل إصدار البروتوكول وقدرات العميل في ‎_meta. لم يُتفاوض على شيء سابقاً لأنه لا يوجد سابق

الخادم يتحقق

غياب بيانات وصفية مطلوبة يعني ‎-32602، والحاجة إلى قدرة لم يعلنها العميل تعني ‎-32021 مع سرد ما نقص

الخادم قد يُشعر

ما دام الطلب قيد التنفيذ يجوز للخادم إرسال إشعارات مرتبطة به: التقدّم ورسائل السجل. ولا يرسل طلباً من عنده أبداً

الخادم يجيب

نتيجة واحدة أو خطأ واحد، يحمل resultType بقيمة complete أو input_required

تترتب على ذلك نتيجتان مباشرتان، وكلتاهما تظهر عملياً:

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

ملاحظة عن الإصدار. هذا يصف مراجعة المواصفة 2026-07-28. أما المراجعات الأقدم (حتى 2025) فكانت تستخدم مصافحة initialize تفتح جلسة مرتبطة بالاتصال وتسمح للخوادم ببدء الطلبات، والمواصفة الحالية تعرّف تراجعاً متوافقاً يتيح تعايش الحقبتين. فإن قرأت شرحاً أقدم يبدأ بـ initialize فهذا سببه. والمواصفة هي المرجع الموثوق، وهي تتحرك أسرع من أي دورة.

نموذج الأمان

يطبق MCP الأمان من خلال:

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

مهم: لا تكشف أبداً عمليات حساسة بدون المصادقة والتفويض المناسبين في خادم MCP الخاص بك.

في القسم التالي، سنُعد بيئة التطوير الخاصة بك لـ MCP. :::

اختبار

اختبار الوحدة 1: أساسيات MCP

خذ الاختبار
هل كان هذا الدرس مفيدًا؟

سجّل الدخول للتقييم