برز بروتوكول سياق النموذج (MCP) بسرعة بوصفه "USB-C للذكاء الاصطناعي"، مما يوفر طريقة قياسية لربط نماذج اللغة الكبيرة (LLMs) بمصادر البيانات والأدوات الخارجية. في حين اعتمدت التطبيقات المبكرة غالبًا على مدخلات/مخرجات القياسية المحلية (stdio) من أجل البساطة، فإن الانتقال إلى نقل HTTP هو تطور حاسم للبيئات الإنتاجية، والأنظمة الموزعة، والبنى متعددة المستأجرين.
يستكشف هذا الدليل آليات MCP عبر HTTP، مع تفصيل البنية الأساسية لـ JSON-RPC، والآثار الأمنية، وأمثلة أكواد لتنفيذ كلا الجانبين: العميل والخادم.
لماذا نتجاوز Stdio؟
نقل stdio القياسي مثالي للتطوير المحلي وأدوات سطر الأوامر (CLI) لمستخدم واحد. ومع ذلك، يواجه قيودًا كبيرة في السيناريوهات القابلة للتوسع:
- العزل: يتطلب Stdio تشغيل النموذج والأداة على نفس الجهاز وشجرة العمليات.
- قابلية التوسع: لا يدعم موازنة الأحمال أو التوسع الأفقي بشكل أصلي.
- الأمان: إنشاء العمليات مباشرةً أقل أمانًا من الخدمات الشبكية التي تملك طبقات مصادقة مناسبة.
يوفر HTTP (تحديدًا HTTP/1.1 أو HTTP/2) اتصالًا بلا حالة، ودعمًا قويًا للوسائط الوسيطة (middleware)، وإمكانية وصول عالمية، مما يجعله الخيار الطبيعي لعرض خوادم MCP على حالات LLM عن بُعد.
البنية: JSON-RPC عبر HTTP
MCP ليس مجرد طبقة نقل؛ إنه بروتوكول دلالي. عند نشره عبر HTTP، يستخدم MCP JSON-RPC 2.0 كصيغة للرسائل. يتكون كل تفاعل من كائن JSON يحتوي على طريقة، ومعاملات، ومعرّف.
الطرق الرئيسية
تشمل القدرات الأساسية التي يعرضها خادم MCP ما يلي:
tools/list: اكتشاف الأدوات المتاحة.tools/call: استدعاء أداة محددة بحجج.resources/list: الوصول إلى موارد البيانات المتاحة.
أمثلة على التنفيذ
1. معالج جانب الخادم (مثال Node.js/Express)
فيما يلي مثال مبسط لكيفية تعامل خادم MCP مع طلب HTTP POST وارد. لاحظ أن MCP عبر HTTP يستخدم عادةً نقطة نهاية واحدة (مثل /mcp) يقوم بالتوجيه بناءً على حقل method في جسم JSON.
const express = require('express');
const app = express();
app.use(express.json());
app.post('/mcp', (req, res) => {
const { method, params, id } = req.body;
// توجيه أساسي بناءً على طرق MCP
switch (method) {
case 'tools/list':
res.json({
jsonrpc: '2.0',
id,
result: {
tools: [
{
name: 'get_weather',
description: 'Get current weather data',
inputSchema: {
type: 'object',
properties: {
city: { type: 'string' }
},
required: ['city']
}
}
]
}
});
break;
case 'tools/call':
// قم بتنفيذ منطق أداتك هنا
const cityName = params.arguments.city;
res.json({
jsonrpc: '2.0',
id,
result: {
content: [{ type: 'text', text: `Sunny in ${cityName}, 75°F` }]
}
});
break;
default:
res.json({
jsonrpc: '2.0',
id,
error: { code: -32601, message: 'Method not found' }
});
}
});
app.listen(3000, () => console.log('MCP Server running on port 3000'));
2. طلب جانب العميل
تعمل تطبيق LLM (أو وسائطه الوسيطة) كعميل MCP. يرسل طلب POST مع حمولة JSON-RPC. من الضروري التعامل مع فترات انتهاء الصلاحية والاستجابات غير المتزامنة بشكل صحيح، حيث يمكن أن تكون استدعاءات الأدوات طويلة.
const fetch = require('node-fetch');
async function callMCPTool(toolName, args) {
const response = await fetch('http://localhost:3000/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: {
name: toolName,
arguments: args
},
id: '12345'
})
});
const data = await response.json();
if (data.error) {
throw new Error(data.error.message);
}
return data.result;
}
// الاستخدام
callMCPTool('get_weather', { city: 'New York' }).then(console.log);
اعتبارات أمنية
تعرض أدوات MCP عبر HTTP أسطح هجوم لا توجد في بيئات stdio المحلية. يجب على المطورين تنفيذ ضوابط أمنية صارمة:
- المصادقة: اطلب دائمًا مفاتيح API، أو رموز OAuth 2.0، أو mTLS. لا تعرض خادم MCP على الإنترنت العام دون مصادقة.
- التفويض: تأكد من أن سياق LLM لا يسمح بترقية الامتيازات. يجب على الخادم التحقق من أن المستخدم الذي يطلب لديه إذن لاستدعاء أدوات محددة.
- التحقق من المدخلات: تحقق بصرامة من جميع الحجج الممررة إلى الأدوات. نظرًا لأن LLM يولد المدخلات، فقد ينتج JSON غير سليم أو خبيث. استخدم التحقق من المخطط (مثل Zod، Joi) على جانب الخادم.
- تقييد المعدل: نفّذ حدود المعدل لمنع الإساءة أو تجاوز التكاليف المرتبطة باستدعاءات API الخارجية التي تقوم بها الأدوات.
أفضل الممارسات للإنتاج
- استخدام HTTPS: قم دائمًا بتشفير حركة المرور أثناء النقل.
- عدم وجود حالة (Statelessness): صمّم خادم MCP ليكون بلا حالة في أي مكان ممكن للسماح بالتوسع الأفقي السهل.
- التسجيل (Logging): سجّل جميع استدعاءات الأدوات لأغراض التدقيق. تتبّع أي حالة LLM استدعت أي أداة وبأي معاملات.
- الإصدارات (Versioning): شمل الإصدارات في عنوان URL أو الترويسات (مثل
/mcp/v1) لإدارة التغييرات الكاسرة لمخططات الأدوات.
خاتمة
الانتقال من stdio إلى HTTP خطوة ضرورية لبناء تطبيقات ذكاء اصطناعي قوية وقابلة للتوسع. من خلال الاستفادة من صيغة JSON-RPC 2.0 القياسية عبر نقاط نهاية HTTP الآمنة، يمكن للمطورين إنشاء أنظمة بيئية للأدوات المعيارية والقابلة لإعادة الاستخدام والتي يمكن مشاركتها عبر مزودي LLM وبيئات النشر المختلفة. مع نضوج نظام MCP البيئي، من المتوقع رؤية ميزات أغنى مثل الاستجابات المتدفقة (streaming) والربط المعقد للموارد تصبح قياسية عبر نقل HTTP.