MCP Servers بالعربي: اربط Claude بأدواتك من غير ما تبني API لكل أداة
مستوى المقال: متوسط — يفترض إنك جربت function calling قبل كده مع Claude أو OpenAI، وعندك خلفية أساسية في Python و JSON-RPC مش لازمة بس بتساعد.
لو ربطت Claude بـ 3 أدوات داخلية (DB، نظام التذاكر، Notion)، وكل client جديد (Cursor، Claude Desktop، تطبيقك) بيطلب منك تكتب نفس الـ wrappers من جديد، أنت بتدفع ضريبة integration مكررة. Model Context Protocol (MCP) بيحل المشكلة دي ببروتوكول واحد بين النموذج وأدواتك. تكتب الـ server مرة، وأي client متوافق بيستخدمه على طول.
المشكلة باختصار
قبل MCP، لو عندك 4 أدوات و 3 LLM clients، أنت محتاج تبني وتصون 12 integration منفصل. كل client بياخد JSON schema بشكل مختلف شوية، كل API بيرجع errors بصيغة مختلفة، وكل تحديث في أداة بيخليك تعدّل في 3 أماكن. الكود بيتحول لـ glue code أكتر من business logic.
الـ trade-off القديم: يا إما تعمل كود مكرر ومتشتت، يا إما تبني abstraction layer داخلية بنفسك (وتصونها لوحدك). MCP بيقدم layer جاهزة ومفتوحة المصدر بدلًا منك.
مثال للمبتدئ: فكر في MCP زي USB-C
تخيل عندك لابتوب وعايز توصله بشاشة، فلاش، شاحن، وكاميرا. زمان كل جهاز كان له منفذ مختلف: HDMI، USB-A، Mini-DisplayPort، وهكذا. كل ما تشتري لابتوب جديد لازم تشتري dongles جديدة.
USB-C وحّد كل ده في منفذ واحد. أي جهاز يدعم USB-C بيشتغل مع أي لابتوب يدعم USB-C، بدون dongle. MCP هو USB-C في عالم الـ AI tools. النموذج (الـ client) فيه منفذ واحد بياخد توصيلة من أي MCP server، وأنت كمطوّر بتبني server واحد فقط.
التعريف العلمي الدقيق
MCP هو بروتوكول مفتوح أنشأته Anthropic في نوفمبر 2024، ومبني على JSON-RPC 2.0. البروتوكول بيعرّف 3 primitives رسمية:
- Tools — دوال يقدر النموذج يستدعيها (زي function calling لكن standardized).
- Resources — بيانات يقدر النموذج يقراها (ملفات، rows من DB، صفحات Notion).
- Prompts — قوالب جاهزة يقدر المستخدم يختارها من واجهة الـ client.
الـ transport layer بتدعم stdio (للـ servers المحلية)، و HTTP + SSE (للـ servers البعيدة). الـ handshake بيبدأ بـ initialize message والـ client بيستقبل قائمة الأدوات المتاحة عن طريق tools/list.
مثال تنفيذي: MCP server بـ 30 سطر Python
هنبني server بسيط بيوفر أداة واحدة: get_user_orders. الافتراض: عندك Postgres محلي وجدول orders.