بروتوكول سياق النموذج (Model Context Protocol - MCP)
MCP بروتوكول مفتوح يوحّد طريقة اتصال تطبيقات الذكاء الاصطناعي بالأدوات والبيانات والأنظمة الخارجية. هذه الصفحة مرجع شامل لمعمارية MCP ورسائله ونماذج الكود الخاصة به.
مقدمة عن MCP
يمكن تشبيه MCP بـمنفذ USB-C للذكاء الاصطناعي: تمامًا كما يوفّر USB-C واجهة فيزيائية موحّدة لتوصيل أجهزة مختلفة، يوفّر MCP واجهة برمجية موحّدة لربط نماذج اللغة بمصادر بيانات وأدوات مختلفة. قبل MCP، كان كل تكامل بين مساعد ذكاء اصطناعي ونظام خارجي يُكتب بشكل مخصص وغير قابل لإعادة الاستخدام. يكسر MCP هذا النمط: أي خادم مكتوب وفق مواصفات MCP يمكن استخدامه من قبل أي تطبيق مضيف يدعم MCP.
المعمارية: Host وClient وServer
تتكوّن معمارية MCP من ثلاثة أدوار متمايزة:
- Host — التطبيق الذي يتعامل معه المستخدم مباشرةً (مثل مساعد ذكاء اصطناعي أو بيئة تطوير). يتولى Host إدارة الأذونات والتنسيق بين عدة اتصالات.
- Client — يعيش داخل Host ويحافظ على اتصال واحد لواحد وذي حالة (stateful) مع خادم واحد بالضبط.
- Server — التطبيق الذي تبنيه أنت؛ يعرض بياناتك وقدراتك لـHost عبر Resources وTools وPrompts.
يمكن لـHost واحد الاتصال بعدة خوادم مختلفة في آنٍ واحد (مثلًا واحد للمخزون وآخر لإدارة علاقات العملاء)، وكل اتصال من هذه الاتصالات مستقل ومعزول تمامًا.
الركائز الأساسية الثلاث لخادم MCP
Resources (الموارد)
البيانات التي يعرضها الخادم لـHost — مثل مستند أو سجل قاعدة بيانات أو ملف إعدادات. يُعرَّف كل Resource بمعرّف URI فريد وعادةً ما يكون مُتحكَّمًا به من قبل التطبيق (application-controlled)، أي أن التطبيق المضيف هو من يقرر متى يقرأه (شبيه بطلب GET).
Tools (الأدوات)
دوال يمكن لنموذج اللغة أن يقرر بنفسه تنفيذها (model-controlled) — مثل check_inventory()
أو book_appointment(). لكل Tool اسم ووصف ومخطط JSON للمدخلات والمخرجات. يقرر النموذج متى يستخدم Tool
بناءً على هذا الوصف، لذا فإن الدقة في كتابته أمر بالغ الأهمية.
Prompts (المحفزات الجاهزة)
قوالب جاهزة وقابلة لإعادة الاستخدام، عادةً ما تكون مُتحكَّمًا بها من قبل المستخدم (user-controlled) — يختارها المستخدم بوعي (مثلًا كأمر سريع في واجهة المستخدم). تساعد Prompts في توحيد طريقة التفاعل الأمثل مع خادمك.
Sampling وRoots (متقدّم)
إضافةً إلى الركائز الثلاث الأساسية، يمتلك MCP قدرتين متقدمتين: Sampling تتيح للخادم، في الاتجاه المعاكس، أن يطلب من نموذج اللغة الخاص بـHost توليد نص؛ وRoots تحدّد حدود نظام الملفات المسموح للخادم بالوصول إليها.
طبقات النقل (Transports)
| طبقة النقل | الاستخدام | الوصف |
|---|---|---|
stdio | الخوادم المحلية | الاتصال عبر المدخل/المخرج القياسي للعملية؛ الحالة الأبسط، مناسبة عندما يعمل الخادم على نفس جهاز المستخدم. |
| قائم على HTTP (Streamable HTTP) | الخوادم البعيدة | الاتصال عبر HTTP، مناسب للخوادم التي تعمل كخدمة مستقلة وبعيدة وتحتاج إلى مصادقة. |
دورة حياة الاتصال
تتبع جميع رسائل MCP تنسيق JSON-RPC 2.0 (ثلاثة أنواع رسائل: request وresponse وnotification). يمر الاتصال النموذجي بهذه الدورة:
- initialize — يُعلن Client عن إصدار البروتوكول وقدراته للخادم
- يرد الخادم بإصدار البروتوكول وقدراته الخاصة
- يرسل Client إشعار initialized لإنهاء الاتصال
- تبدأ العمليات الاعتيادية:
tools/list،tools/call،resources/list،resources/read،prompts/list،prompts/get - وأخيرًا، يُغلق الاتصال بشكل نظيف
البدء السريع: بناء خادم بسيط
يستخدم المثال التالي حزمة بايثون الرسمية لبناء خادم MCP بأداة (Tool) بسيطة واحدة:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Store Inventory")
@mcp.tool()
def check_inventory(sku: str) -> dict:
"""التحقق من مخزون منتج بحسب SKU"""
# اتصل هنا بقاعدة بياناتك الحقيقية
return {"sku": sku, "in_stock": True, "quantity": 12}
if __name__ == "__main__":
mcp.run()
هذه الأسطر القليلة كافية لأي Host متوافق مع MCP لاكتشاف هذه الأداة واستدعائها في الوقت المناسب — دون أي كود تكامل إضافي.
المصادقة والأمان
في طبقة النقل من نوع stdio، يكون الحد الأمني هو نفسه حد عملية نظام التشغيل. أما بالنسبة للخوادم البعيدة عبر HTTP، فمن الضروري مراعاة ما يلي:
- استخدم آلية مصادقة معيارية (مثل OAuth 2.1) للتحقق من هوية Client
- عرّف كل Tool بأقل صلاحية وصول ممكنة؛ لا تبنِ أبدًا أداة "شاملة" تملك وصولًا كاملًا لقاعدة البيانات
- سجّل جميع استدعاءات الأدوات ليتسنى تتبعها في حال حدوث سلوك غير معتاد
- طبّق تحديد معدل الطلبات (Rate Limiting) على الخوادم العامة
حزم التطوير الرسمية (SDKs)
تتوفر حزم تطوير رسمية للغات الرئيسية، بما في ذلك حزمة mcp للغة Python وحزمة
@modelcontextprotocol/sdk للغتي TypeScript/JavaScript. كما يجري تطوير حزم غير رسمية مدعومة من المجتمع للغات أخرى تدريجيًا.
يُنصح دائمًا بالبدء بأحدث إصدار من الحزمة الرسمية.
أفضل الممارسات
- حافظ على صغر الأدوات ووحدة غرضها — أداة واحدة، مهمة واحدة محددة
- اكتب وصفًا دقيقًا — يتخذ النموذج قرار استخدام الأداة بناءً على الوصف، لا على اسمها
- أعِد مخرجات مُهيكَلة — JSON ببنية ثابتة، لا نصًا حرًّا غير قابل للتنبؤ
- أبلِغ عن الأخطاء بوضوح — رسالة خطأ مفهومة للنموذج، لا مجرد رمز حالة
- راعِ إصدار النسخ — نفّذ التغييرات البنيوية على الأدوات بحذر وبتوثيق
الأسئلة الشائعة
هل يحل MCP محل واجهات REST API؟
ليس تمامًا. MCP طبقة معيارية فوق منطقك الحالي؛ خلف الكواليس، عادةً ما تُستدعى نفس واجهتك البرمجية أو قاعدة بياناتك الحالية عبر Tool.
هل يعمل MCP فقط مع نماذج Anthropic؟
لا. MCP معيار مفتوح، والهدف منه التوافق مع أي نموذج أو تطبيق مضيف يدعم تنفيذه.
ما الفرق بين MCP وUCP في OpenCommerce؟
MCP مخصص للوصول الآمن والمتحكَّم به إلى بياناتك الداخلية؛ أما UCP فمصمَّم للمعاملات التجارية العامة (البحث، سلة الشراء، الدفع) التي يمكن لأي عميل ذكي استخدامها.