كل المقالات

خوادم ⁨MCP⁩ بلغة ⁨PHP⁩: ماذا تقدّم الحزمة الرسمية، ومتى لا تحتاجها

أدوات الذكاء الاصطناعي · 4 دقيقة قراءة ·

حين تفتح تطبيقك لمساعد ذكاء اصطناعي، فأنت لا تضيف ميزة فقط، بل تفتح بابًا يطرقه نموذج لغوي. هذا الأسبوع ظهرت الحزمة الرسمية لبروتوكول ⁨Model Context Protocol⁩ بلغة ⁨PHP⁩ في قائمة المستودعات الرائجة أسبوعيًا على ⁨GitHub⁩، وهي مبنية بالتعاون مع ⁨The PHP Foundation⁩ ومشروع ⁨Symfony⁩. معنى ذلك أنك تستطيع بناء هذا الباب دون أن تغادر لغتك. السؤال الحقيقي هو أين تضعه وما الذي تسمح له بالمرور.

البروتوكول في جملتين

⁨MCP⁩ بروتوكول مفتوح يسمح لتطبيق ذكاء اصطناعي بأن يكتشف أدوات يعرضها خادم ويستدعيها، وأن يقرأ موارد (بيانات)، وأن يستخدم قوالب أوامر جاهزة. التطبيق هو المضيف، وكودك هو الخادم، والتواصل بينهما رسائل منظَّمة بدل أن يخمّن النموذج طريقة استخدام واجهتك من التوثيق.

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

ما الذي تعطيك إياه الحزمة

الحزمة لا ترتبط بإطار عمل بعينه، وتغطي الجهتين: الخادم والعميل. فيها الأدوات والموارد والقوالب، ووسيلتا النقل ⁨STDIO⁩ و⁨HTTP⁩، والجلسات والتفويض. وتدعم جيلي البروتوكول معًا: المصافحة القديمة التي تبدأ بـinitialize، والمراجعة عديمة الحالة الصادرة في 2026-07-28. التثبيت بأمر composer require mcp/sdk، ومعه symfony/finder إن أردت أن تكتشف الحزمة أدواتك بفحص الكود. هذا مثال الخادم من ملف التعريف، مختصرًا:

class Calculator
{
    /** Adds two numbers. */
    #[McpTool]
    public function add(int $a, int $b): int { return $a + $b; }
}

exit(Server::builder()
    ->setServerInfo('Calculator', '1.0.0')
    ->setDiscovery(__DIR__, ['.'], excludeDirs: ['vendor'])
    ->build()
    ->run(new StdioTransport()));

خاصية واحدة فوق الدالة تجعلها أداة، وتعليق التوثيق يصبح وصفها، والمعاملات المحدَّدة الأنواع تصبح مدخلاتها. والمورد بالطريقة نفسها مع #[McpResource] وعنوان يعرّفه. لكن أهم سطر في ملف التعريف ليس في الكود: الحزمة تُعدّ تجريبية إلى أن يصدر أول إصدار رئيسي. ثبّت رقم الإصدار وتوقّع تغييرات.

ولأنها مستقلة عن الأطر، تعمل داخل تطبيق ⁨Laravel⁩ كأي حزمة ⁨Composer⁩ أخرى. يذكر ملف التعريف تكاملات مبنية عليها لـ⁨Symfony⁩ و⁨API Platform⁩ و⁨Drupal⁩ وغيرها، فابحث أولًا عن تكامل جاهز لـ⁨Laravel⁩ قبل أن تكتب طبقة الربط بنفسك.

متى يكون الخادم هو الأداة الصحيحة

الخادم يستحق وجوده حين يعطي النموذج ما لا يصل إليه بغيره: بيانات حيّة من قاعدة بياناتك، أو فعلًا داخل نظامك، كالاستعلام عن حالة طلب أو فتح تذكرة دعم. أما التوثيق الثابت فمكانه ليس هنا. كتب ⁨Cristian Tabacitu⁩، الذي يدير حزمة ⁨Backpack for Laravel⁩، هذا الأسبوع أن خادمًا بنوه للبحث في توثيقهم أعطى نتائج متفاوتة، لأن الوكيل يجب أن يقرر استدعاءه، وغالبًا لا يفعل. إن كانت المعلومة عند النموذج أصلًا، أو يستطيع قراءتها من كودك، فالخادم يضيف جزءًا متحركًا بلا فائدة تُذكر.

كل وسيط يصل إلى أداة مدخل غير موثوق

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

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

تحقّق من كل وسيط كما تتحقق من جسم أي طلب. أعطِ كل أداة أصغر صلاحية تكفي عملها: اتصال قراءة فقط بقاعدة البيانات لأداة استعلام، وجدول واحد لا المخطط كله. لا تعرض أبدًا أداة تنفّذ أي استعلام ⁨SQL⁩ أو أي أمر طرفية يُمرَّر إليها. حدّد هوية المستدعي وافحص الإذن لكل مستخدم كما تفعل وحدات التحكم عندك. وسجّل كل استدعاء، حتى إذا فعلت أداة شيئًا غير متوقع عرفت أي وسائط طلبته.

أن يكون المعامل رقمًا صحيحًا في توقيع الدالة يخبرك أن القيمة رقم، لكنه لا يخبرك أن هذا الرقم يخص من يسأل.

إن أردت التجربة، فابدأ بأداة واحدة للقراءة فقط فوق بيانات لا يراها مساعدك اليوم، وشغّلها عبر ⁨STDIO⁩ على جهازك، واقرأ كل استدعاء في السجل لمدة أسبوع قبل أن تضيف أداة تكتب أي شيء. المصدر: الحزمة الرسمية على ⁨GitHub⁩.

ملاحظات القراء

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