MCP في بيئة الإنتاج: حل تحديات النقل والمصادقة والتوسع
Engineering Team
من النموذج الأولي إلى الإنتاج: ما الذي يتغير
بناء خادم MCP يعمل على حاسوبك المحمول أمر بسيط نسبيًا. تشغيل خادم يتعامل مع آلاف جلسات وكلاء AI المتزامنة عبر بنية تحتية موزعة هو تحدٍ هندسي مختلف تمامًا. يجب أن تعالج عمليات نشر MCP في الإنتاج خمس مسائل يمكن للنماذج الأولية تجاهلها: قابلية توسع النقل، المصادقة والتفويض، إدارة الجلسات على نطاق واسع، مسارات التدقيق، و تنسيق الخوادم المتعددة.
هذا المقال هو دليل تقني لفرق الهندسة التي تنقل خوادم MCP من التطوير إلى الإنتاج. نفترض أنك بنيت خادم MCP واحدًا على الأقل وتفهم أساسيات البروتوكول. إن لم تكن كذلك، ابدأ بمقالنا المصاحب حول بناء أول خادم MCP.
قابلية توسع النقل: stdio مقابل SSE مقابل Streamable HTTP
يحدد MCP ثلاث آليات نقل. اختيار المناسب للإنتاج هو قرارك المعماري الأول.
نقل stdio
يتواصل نقل stdio عبر تدفقات الإدخال/الإخراج القياسية. يطلق تطبيق Host خادم MCP كعملية فرعية ويتبادل رسائل JSON-RPC عبر stdin/stdout.
المزايا:
- صفر تكوين شبكي
- عزل على مستوى العملية
- لا تعارض في المنافذ
- أقل زمن استجابة (بدون مكدس شبكي)
القيود:
- يجب أن يعمل الخادم على نفس الجهاز مع Host
- عملية خادم واحدة لكل جلسة Client
- لا يمكن موازنة الحمل
- لا توسع أفقي
الأفضل لـ: أدوات التطوير المحلية، إضافات IDE، تطبيقات سطح المكتب لمستخدم واحد.
نقل SSE (Server-Sent Events)
يستخدم نقل SSE بروتوكول HTTP لرسائل العميل إلى الخادم و Server-Sent Events لرسائل الخادم إلى العميل. يعمل الخادم كخدمة HTTP.
المزايا:
- يمكن الوصول إليه عبر الشبكة (خادم بعيد)
- متوافق مع البنية التحتية HTTP الموجودة
- يدعم عملاء متعددين في وقت واحد
- يعمل عبر جدران الحماية والبروكسيات
القيود:
- تدفق أحادي الاتجاه (SSE من الخادم إلى العميل فقط)
- يتطلب تقارب الجلسات (اتصال ذو حالة)
- بعض موازنات الحمل تواجه مشاكل مع اتصالات SSE طويلة الأمد
- لا دلالات إعادة اتصال مدمجة في البروتوكول
الأفضل لـ: عمليات النشر الصغيرة إلى المتوسطة، الأدوات الداخلية، الفرق ذات البنية التحتية HTTP الموجودة.
نقل Streamable HTTP
Streamable HTTP هو أحدث نقل، مصمم خصيصًا لعمليات النشر الإنتاجية. يستخدم POST HTTP القياسي لجميع الرسائل، مع تدفق SSE اختياري للعمليات طويلة الأمد.
المزايا:
- نموذج طلب/استجابة عديم الحالة بالكامل
- يعمل مع أي موازن حمل HTTP
- إدارة جلسات مدمجة عبر رأس
Mcp-Session-Id - يدعم الاستجابات المتدفقة وغير المتدفقة
- متوافق مع CDN والبروكسيات
القيود:
- يتطلب تخزين جلسات من جانب الخادم (Redis، قاعدة بيانات)
- حمل إضافي لكل رسالة أعلى قليلًا من stdio
- نقل أحدث — أدوات أقل في النظام البيئي
الأفضل لـ: عمليات النشر السحابية الإنتاجية، المنصات متعددة المستأجرين، البيئات المؤسسية.
مصفوفة مقارنة النقل
| الخاصية | stdio | SSE | Streamable HTTP |
|---|---|---|---|
| دعم الشبكة | لا | نعم | نعم |
| التوسع الأفقي | لا | محدود | نعم |
| موازنة الحمل | لا | تقارب جلسات مطلوب | LB HTTP قياسي |
| إدارة الجلسات | لكل عملية | ذاكرة الخادم | مخزن خارجي |
| زمن الاستجابة | الأقل | منخفض | منخفض |
| متوافق مع جدار الحماية | غ/م | نعم | نعم |
المصادقة والتفويض
تكامل OAuth 2.0
تحتاج خوادم MCP الإنتاجية إلى طريقة للعملاء للمصادقة وتقييد الوصول إلى أدوات وموارد محددة. يدعم بروتوكول MCP بروتوكول OAuth 2.0 للخوادم البعيدة.
يعمل التدفق كالتالي:
- يتصل MCP client بالخادم ويرسل طلب
initialize - يستجيب الخادم بـ
401 Unauthorizedمع رأسWWW-Authenticateيحتوي على عنوان URL لبيانات OAuth الوصفية - يحصل Client على تكوين OAuth من
/.well-known/oauth-authorization-server - يحصل Client على رمز وصول عبر تدفق تفويض قائم على المتصفح
- الطلبات اللاحقة تتضمن رمز Bearer في رأس
Authorization
التفويض على مستوى الأداة
المصادقة وحدها لا تكفي. تحتاج أنظمة الإنتاج إلى تفويض دقيق يتحكم في أي أدوات يمكن للمستخدم استدعاؤها وأي موارد يمكنه الوصول إليها.
الأساليب الموصى بها:
- التحكم في الوصول القائم على الأدوار (RBAC): تعيين أذونات الأدوات للأدوار. مثال: دور
analystيصل إلى أدوات الاستعلام للقراءة فقط، دورadminيصل إلى عمليات الكتابة. - التحكم القائم على النطاقات: استخدام نطاقات OAuth لتقييد الوصول إلى الأدوات. مثال: نطاق
mcp:tools:query:readيسمح فقط باستعلامات SELECT. - تصفية الأدوات الديناميكية: تصفية قائمة الأدوات المتاحة بناءً على أذونات المستخدم المصادق عليه.
التوسع الأفقي مع Redis
باستخدام نقل Streamable HTTP عديم الحالة، يمكنك تشغيل عدة نسخ من خادم MCP خلف موازن حمل. يُخزن حالة الجلسة في Redis ويُشارك بين جميع النسخ.
Client → Load Balancer → MCP Server 1 ↔ Redis
→ MCP Server 2 ↔ Redis
→ MCP Server 3 ↔ Redis
كل طلب يتضمن رأس Mcp-Session-Id، وأي نسخة من الخادم يمكنها استرداد حالة الجلسة من Redis لمواصلة المعالجة.
التوسع التلقائي على Kubernetes
نشر خوادم MCP على Kubernetes يتيح التوسع التلقائي للـ Pods بناءً على عدد الجلسات النشطة أو استخدام CPU. استخدم مقاييس مخصصة مع Horizontal Pod Autoscaler (HPA).
تسجيل التدقيق
تتطلب عمليات النشر المؤسسية مسارات تدقيق مفصلة في كل مرة تستدعي فيها AI أداة خارجية. لكل استدعاء أداة، سجل:
- الطابع الزمني: وقت الاستدعاء
- معرف المستخدم: المستخدم الذي بدأ إجراء AI
- اسم الأداة: أداة MCP المستدعاة
- معلمات الإدخال: البيانات المرسلة إلى الأداة
- نتيجة الإخراج: البيانات التي أعادتها الأداة
- مدة التنفيذ: الوقت الذي استغرقه الاستدعاء
- الأخطاء: أي أخطاء حدثت
استخدم التسجيل المنظم (تنسيق JSON) وأرسل السجلات إلى نظام إدارة سجلات مركزي (ELK Stack، Datadog، CloudWatch).
بنية البوابة
لعمليات النشر واسعة النطاق، فكر في تنفيذ نمط بوابة MCP. تعمل البوابة كوكيل عكسي بين MCP clients وخوادم MCP الخلفية.
مسؤوليات البوابة:
- مركزة المصادقة: معالجة جميع عمليات التحقق من OAuth في البوابة
- تحديد المعدل: تطبيق حدود لكل مستخدم ولكل أداة
- التوجيه: توجيه الطلبات إلى الخوادم الخلفية المناسبة بناءً على اسم الأداة
- جمع سجلات التدقيق: تسجيل جميع استدعاءات الأدوات على مستوى البوابة
- قاطع الدائرة: معالجة الرجوع عند فشل الخوادم الخلفية
الأسئلة الشائعة
س: هل يمكن استخدام نقل stdio في الإنتاج؟ ج: نعم، ولكن في سيناريوهات محدودة فقط. مناسب لتطبيقات سطح المكتب حيث يشغل كل مستخدم عملية خادم MCP محلية خاصة به. للبنية التحتية للخادم المشتركة، استخدم Streamable HTTP.
س: هل يجب الاحتفاظ بجلسات MCP بشكل دائم؟ ج: نعم، عند استخدام Streamable HTTP. تتضمن حالة الجلسة قدرات العميل وإصدار البروتوكول المتفاوض عليه والإشعارات المسجلة. Redis هو مخزن الجلسات الموصى به.
س: كيف يجب إدارة إصدارات خوادم MCP؟
ج: استخدم حقل إصدار الخادم في استجابة initialize. للتغييرات غير المتوافقة (إزالة الأدوات، تغيير المخططات)، ارفع الإصدار الرئيسي وادعم الإصدارين القديم والجديد خلال فترة الانتقال.
س: ما الحد الأقصى لحجم رسالة MCP؟ ج: لا يحدد البروتوكول حدًا أقصى، لكن الحدود العملية تعتمد على النقل. لـ Streamable HTTP، حافظ على الاستجابات أقل من 10 ميجابايت. لـ stdio، قد تتطلب مخازن أنابيب النظام (عادة 64 كيلوبايت) تقسيمًا للاستجابات الكبيرة.