خوادم MCP بلغة PHP: ماذا تقدّم الحزمة الرسمية، ومتى لا تحتاجها
حين تفتح تطبيقك لمساعد ذكاء اصطناعي، فأنت لا تضيف ميزة فقط، بل تفتح بابًا يطرقه نموذج لغوي. هذا الأسبوع ظهرت الحزمة الرسمية لبروتوكول 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.
ملاحظات القراء