Bitrix24 تعدّد ثمانية أخطاء شائعة عند تطوير خوادم MCP لنماذج LLM

نشرت Bitrix24 تحليلاً نادر الفائدة عن خوادم MCP، يخلو من التنظير لمجرد التنظير. ويدور حول ثمانية فخاخ عملية: ضعف دعم OAuth لدى العملاء، ومجموعات الأدوات المثقلة، وسلاسل الاستدعاء الهشة، ورسائل الخطأ الخالية من التلميحات، والاختبارات غير المستقرة، وهجمات prompt injection، والاستجابات الثقيلة جداً التي تستهلك سياق النموذج. والخلاصة الرئيسية: لا ينبغي تصميم MCP كنسخة مباشرة من واجهة API، بل يجب أن تعبّر الأدوات عن نيّة المستخدم.

معالج بواسطة الذكاء الاصطناعي من Habr AI؛ بتحرير Hamidun News
Bitrix24 تعدّد ثمانية أخطاء شائعة عند تطوير خوادم MCP لنماذج LLM
المصدر: Habr AI. كولاج: Hamidun News.
استمع للمقال
بطاقة الحقائق والأرقام
المعيارالتفاصيل
المصدر الأصليHabr AI ↗
رئيس التحرير
حقيقة رئيسية #1يطبّق العملاء المصادقة بطرق مختلفة، ولذلك يتصرف الخادم نفسه بشكل لا يمكن التنبؤ به.
حقيقة رئيسية #2كبر مجموعة الأدوات يقلّل احتمال اختيار النموذج للأداة الصحيحة.
حقيقة رئيسية #3تزيد سلاسل الاستدعاء الطويلة من خطر اختلاط ID وتمرير معاملات خاطئة.

نشر مطوّر من فريق AI في Bitrix24 تحليلاً عملياً للأخطاء التي تتسبب في تعطّل خوادم MCP الخاصة بنماذج LLM في أغلب الأحيان. والفكرة الأساسية بسيطة: يبدو MCP كأنه غلاف حتمي (deterministic) فوق واجهة API، لكن من يدير هذه الطبقة نموذج غير حتمي، ولذلك تفشل هنا بانتظام الأساليب الهندسية المعتادة.

أين يتعطّل كل شيء

المشكلة الأولى هي المصادقة. تبدو الأمور مرتبة في المواصفة: يوجد OAuth، وحقول واضحة، وتدفّق (flow) متوقَّع. أما عملياً، فيدعم عملاء MCP المختلفون ذلك بتفاوت: ففي بعضهم تعمل المصادقة جزئياً، وفي بعضهم بامتدادات مخصصة، وفي بعضهم لا تعمل تقريباً على الإطلاق. وهذا ليس بالغ الحرج في خوادم stdio المحلية، لكن بمجرد خروج الخادم إلى الشبكة يبدأ التشتّت. ولهذا تلجأ الفرق غالباً إلى حل أقل أناقة لكنه مستقر: رموز (tokens) تُصدَر مسبقاً ويضيفها المستخدم يدوياً إلى ملف الإعدادات.

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

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

كيف تُصمَّم الأدوات

استنتاج الكاتب حاد لكنه مفيد: يجب تصميم أداة MCP لا بوصفها انعكاساً لبنية قاعدة البيانات، بل بوصفها إجراءً مفهوماً للمستخدم. فإذا أراد الشخص «إسناد مهمة إلى إيفان ليوم الغد»، ينبغي أن تقبل الأداة الاسم والموعد النهائي ونص المهمة، بدلاً من إجبار النموذج على البحث بشكل منفصل عن user_id ثم task_id ثم ربط الكيانات ببعضها. وكلما كانت الأداة أكثر اكتفاءً ذاتياً، زادت فرصة تنفيذ النموذج للسيناريو دون أعطال ودون تنسيق مرتجل داخل الـ prompt.

«يجب أن تعكس الأدوات نيّة المستخدم، لا بنية قاعدة بياناتك».

أما الجزء الثاني من التصميم فهو النصوص. فبالنسبة للنموذج، يحل وصف الأداة واسمها وحقول مخطط الإدخال فعلياً محل الواجهة. فهو لا يرى README، ولا يعرف البنية المعمارية، ولا يفهم مقاصد المؤلف خارج مخطط JSON. ولذلك يجب أن تكون الصياغات كثيفة الدلالة: قصيرة لكن دقيقة. والفرق بين `search_users` و`find_users` و`lookup_user_by_email` ليس شكلياً بالنسبة إلى LLM، بل سلوكي. والأمر نفسه ينطبق على الأخطاء: رسالة الخطأ الجيدة لا تكتفي بالإبلاغ عن الفشل، بل تشرح سببه وتقترح ما يمكن تجربته بعد ذلك.

الاختبارات والحماية

اختبارات الوحدة (unit tests) الكلاسيكية ضرورية هنا، لكنها غير كافية. فهي تختبر شيفرة الأداة، لا الكيفية التي سيختارها بها النموذج ويستدعيها. ولهذا توصي المقالة باستخدام evals: مجموعات من طلبات المستخدمين يمكن من خلالها رصد الأداة التي جرى استدعاؤها، وبأي معاملات، ومدى مطابقة الاستجابة للسيناريو. والمشكلة أن سلوك النماذج غير مستقر ويتغير حتى بين الإصدارات المتجاورة. فما كان يعمل على إصدار معيّن من GPT أو Claude قد يتصرف بشكل مختلف بعد التحديث، ولذلك يظل الاختبار اليدوي في الدردشة جزءاً إلزامياً من التطوير حتى الآن.

ويُخصَّص محور مستقل للأمان. فـ MCP يوسّع سطح الهجوم من جهتين في آن واحد: عبر المستخدم من خلال prompt injection، وعبر البيانات التي يُرجعها الخادم نفسه أو الأنظمة الخارجية. وإذا امتلكت الأداة صلاحيات زائدة، فسيحاول النموذج عاجلاً أم آجلاً فعل أكثر مما ينبغي. والوصفة العملية كالتالي: الحد الأدنى من الصلاحيات، وتصفية المحتوى الخارجي، وتأكيد صريح للإجراءات التي لا رجعة فيها، وتقييد حجم الاستجابة. وينصح المؤلف بإرجاع الحقول المطلوبة فقط، وبحد أقصى 10–20 سجلاً في المرة الواحدة، وبأن نتذكر دائماً أن حتى النموذج القوي يفقد فائدته حين يمتلئ سياقه بـ JSON خام.

ماذا يعني ذلك

تنتقل خوادم MCP بسرعة من مرحلة التجارب إلى الإنتاج، وبالتزامن مع ذلك ترتفع كلفة الأخطاء في تصميم الأدوات. ولن يكون الرابحون هم الفرق التي تملك عدداً أكبر من دوال API، بل التي تعرف كيف تبني إجراءات قصيرة وواضحة وآمنة للنموذج، ثم تعيد التحقق منها باستمرار على سيناريوهات واقعية.

القصة

أسئلة وأجوبة حول الخبر

ما أبرز التفاصيل حول أين يتعطّل كل شيء؟

المشكلة الأولى هي المصادقة. تبدو الأمور مرتبة في المواصفة: يوجد OAuth، وحقول واضحة، وتدفّق (flow) متوقَّع. أما عملياً، فيدعم عملاء MCP المختلفون ذلك بتفاوت: ففي بعضهم تعمل المصادقة جزئياً، وفي بعضهم بامتدادات مخصصة، وفي بعضهم لا تعمل تقريباً على الإطلاق. وهذا ليس بالغ الحرج في خوادم stdio المحلية، لكن بمجرد خروج الخادم إلى الشبكة يبدأ التشتّت. ولهذا تلجأ الفرق غالباً إلى حل أقل أناقة لكنه مستقر: رموز (tokens) تُصدَر مسبقاً ويضيفها المستخدم يدوياً إلى ملف الإعدادات. والفخ الكبير الثاني هو الرغبة في تغليف Swagger داخل MCP كما هو، واحداً لواحد. يبدو ذلك منطقياً للمطوّر: كل نقط

ما أبرز التفاصيل حول كيف تُصمَّم الأدوات؟

استنتاج الكاتب حاد لكنه مفيد: يجب تصميم أداة MCP لا بوصفها انعكاساً لبنية قاعدة البيانات، بل بوصفها إجراءً مفهوماً للمستخدم. فإذا أراد الشخص «إسناد مهمة إلى إيفان ليوم الغد»، ينبغي أن تقبل الأداة الاسم والموعد النهائي ونص المهمة، بدلاً من إجبار النموذج على البحث بشكل منفصل عن user_id ثم task_id ثم ربط الكيانات ببعضها. وكلما كانت الأداة أكثر اكتفاءً ذاتياً، زادت فرصة تنفيذ النموذج للسيناريو دون أعطال ودون تنسيق مرتجل داخل الـ prompt. «يجب أن تعكس الأدوات نيّة المستخدم، لا بنية قاعدة بياناتك». أما الجزء الثاني من التصميم فهو النصوص. فبالنسبة للنموذج، يحل وصف الأداة واسمها وحق

ما أبرز التفاصيل حول الاختبارات والحماية؟

اختبارات الوحدة (unit tests) الكلاسيكية ضرورية هنا، لكنها غير كافية. فهي تختبر شيفرة الأداة، لا الكيفية التي سيختارها بها النموذج ويستدعيها. ولهذا توصي المقالة باستخدام evals: مجموعات من طلبات المستخدمين يمكن من خلالها رصد الأداة التي جرى استدعاؤها، وبأي معاملات، ومدى مطابقة الاستجابة للسيناريو. والمشكلة أن سلوك النماذج غير مستقر ويتغير حتى بين الإصدارات المتجاورة. فما كان يعمل على إصدار معيّن من GPT أو Claude قد يتصرف بشكل مختلف بعد التحديث، ولذلك يظل الاختبار اليدوي في الدردشة جزءاً إلزامياً من التطوير حتى الآن. ويُخصَّص محور مستقل للأمان. فـ MCP يوسّع سطح الهجوم من جهتين

ZK
جمال حميدون — مدير المنتجات في Alpina Digital ومدير منتج AlpinaGPT. يبني منتجات الذكاء الاصطناعي منذ 2019. بدأ Hamidun News كمشروع شخصي ثم أصبح مُجمِّعًا إنتاجيًا بأكثر من 6000 قارئ.
✦ Hands-On AI Engineering · Hamidun Academy

Build & Ship Production AI Agents Without Boilerplate Code

Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.

Start 72h Free Trial →Vibe-Coding Intensive
ما رأيك؟
جارٍ تحميل التعليقات…