يعمل خادم MCP الخاص بكل مشروع داخل خدمة web (الوحدة mcp-server) في كل pod من Ayakaleaf Pro. وهو يأتي مع تكامل Git وليس له أي إعداد خاص به. أما طريقة ربط Claude Code وCodex وغيرهما من العملاء فموضّحة في خادم MCP.
الإعداد
أعدّ تكامل Git. يصبح خادم MCP عندئذٍ متاحًا على ${OVERLEAF_SITE_URL}/project/<project id>/mcp، ويجب أن يكون هذا العنوان قابلًا للوصول من المكان الذي يعمل فيه عميل الذكاء الاصطناعي.
عدة نسخ متماثلة
تُجرى الترجمة عبر MCP على النسخة المتماثلة (replica) التي استقبلت الطلب، ولا يوجد سجلّها وملف PDF الناتج إلا هناك. لا يرسل عملاء الذكاء الاصطناعي أي ملف تعريف ارتباط (cookie)، لذا قد يرسل موازن الأحمال الطلب التالي، أي get_compile_log أو رابط تنزيل PDF، إلى نسخة متماثلة أخرى، فتجيب بـ “failed to fetch output file from CLSI” أو 404. في اختبارنا مع ثلاث نسخ متماثلة ومن دون أي قاعدة إضافية، فشل 5 من أصل 6 طلبات للسجل و3 من أصل 4 عمليات تنزيل بهذه الطريقة.
وجّه كل طلبات MCP الخاصة بمشروع ما إلى نسخة متماثلة واحدة، كما هو الحال مع /git/. باستخدام HAProxy من التوسّع الأفقي:
عندئذٍ تُجرى كل عمليات الترجمة عبر MCP على عقدة overleaf-0. ومع متحكّم ingress آخر، وجّه المسار /project/<id>/mcp وكل ما تحته إلى الاسم الخاص بنسخة متماثلة واحدة (overleaf-0.overleaf-hl).
مع هذه القاعدة، نجح الاختبار نفسه (ترجمة واحدة، و6 طلبات للسجل، و4 عمليات تنزيل لملف PDF، وكلها من دون ملف تعريف ارتباط) في كل مرة.
الاختبار على Kubernetes
على Kubernetes 1.37 مع ثلاث نسخ متماثلة خلف HAProxy، تنجح اختباراتنا الشاملة (end-to-end) لخادم MCP (37 حالة): سرد الأدوات، ورفض الرموز الخاطئة أو المحذوفة أو التي لا تملك صلاحية الوصول، والترجمة وقراءة السجل، وعدد الكلمات، وإعدادات المشروع وسجلّه، وروابط تنزيل PDF، وتحرير الملفات مع ظهور التغييرات مباشرةً في المحرّر المفتوح وسحبها إلى نسخة Git مستنسخة، والتعليقات، والوصول حسب الدور، وحدود معدّل الترجمة والإعدادات، والحسابات المعلّقة. جاءت هذه الطلبات من جلسة متصفح، لذا أبقاها موازن الأحمال على نسخة متماثلة واحدة؛ أما بالنسبة إلى العملاء الذين لا يرسلون ملف تعريف ارتباط، فراجع عدة نسخ متماثلة. آخر تعديل في ٢ نوفمبر ٢٠٢٦