الـ MCP لتوحيد تعامل الـ Agent مع التطبيقات
السلام عليكم ورحمة الله وبركاته
المقدمة
سنتحدث اليوم عن موضوع جديد في عالم الذكاء الاصطناعي وهو الـ MCP أو الـ Model Context Protocol
وهو وسيلة لاعطاء قدرات وافاق جديدة للذكاء الاصطناعي للتعامل مع الأشياء المختلفة بطريقة موحدة
لكن قبل أن نغوص في تفاصيل الـ MCP، دعني أشرح لك كيف كان العالم قبل وجود الـ MCP وما الأمور التي كان يعاني منها المبرمجون والمطورون
لأن بالطبع لا شيء يأتي من فراغ، وكل شيء له سببه التى جعلت المطورين يفكرون في حل معين
معضلة الذكاء الاصطناعي
الـ AI مهما بلغت قدرته ستجده يخطئ في تفاصيل بسيطة مثل المثال المشهور
عندما تسأله كم حرف r في كلمة strawberry ؟
ستجده يقول لك 2 برغم من أن الإجابة الصحيحة هي 3
أو قد تجده يجاوب عليك بشكل صحيح لكن بعد تفكير 10 ثوان
وأحيانًا عندما تريد منه أن يحل مسألة رياضية كبيرة تجده يخطئ
فعلى سبيل المثال عندما نسأله أي الرقمين أكبر: 9.9 أم 9.11 ؟
ستجده يختار 9.11 برغم من أن 9.9 أكبر
لماذا يحدث هذا؟
هذا بسبب أن الذكاء الاصطناعي يعتمد على بيانات مدربة وعلى احتمالات ونسب
وطريقة تقسيم الـ tokens في الكلمات والجمل تؤثر على النتيجة
لذلك فهو لا يفهم النص المكتوب بل يقوم فقط بعمل معادلات واحتمالات ليجد الكلمة أو الجملة المناسبة لسياق الجمل السابقة
إنشاء آلة حاسبة للذكاء الاصطناعي ليستخدمها كأداة
ما رأئك بأن ننشيء آلة حاسبة للذكاء الاصطناعي ليستخدمها كأداة عند الحاجة
ونقول له يا حضرة الذكاء الاصطناعي أو الـ Agent أو الوكيل أو أيًا ما كان: عندما تجد مسألة رياضية استخدم الآلة الحاسبة هذه بدلًا من الاعتماد على الاحتمالات
وهذه الآلة الحاسبة ما هى إلا تطبيق أو API بسيط ننشه نحن بأنفسنا ونجعل صديقنا الذكاء الاصطناعي يستخدمه
هكذا نضمن أنه لن يعتمد على الاحتمالات في المسائل الرياضية بل سيستخدم أداة دقيقة ننشئها نحن
ما رأيك لو طبقنا هذا على مثال عملي بسيط الآن ؟
الفكرة هي:
عمل Server فيه API فيه بعض الـ endpoint بسيطة تقوم باستقبال رقمين وتقوم بعملية حسابية معينة مثل
const express = require('express');
const app = express();
app.use(express.json());
function calculator(operation, x, y) {
switch (operation) {
case '+':
return x + y;
case '-':
return x - y;
case '*':
return x * y;
case '/':
if (y === 0) throw new Error('Cannot divide by zero');
return x / y;
default:
throw new Error('Invalid operation');
}
}
app.post('/calculate', (req, res) => {
const { operation, x, y } = req.body;
try {
const result = calculator(operation, x, y);
res.json({
status: 'success',
result,
});
} catch (error) {
res.status(400).json({
status: 'error',
error: error.message,
});
}
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
هنا قمنا بإنشاء Server بسيط فيه endpoint اسمها /calculate
تستقبل body فيه operation (نوع العملية الحسابية) والرقمين x و y
وتقوم بعمل العملية الحسابية المطلوبة وترجع النتيجة
الآن نقوم بعمل documentation بسيطة للـ API ونشرح للذكاء الاصطناعي كيف يستخدمها بهذا الشكل:
عزيزي الذكاء الاصطناعي، تحية طيبة وبعد،
أود أن أقدم لك API يمكنك استخدامها لإجراء العمليات الحسابية
والذي يمكنك الوصول إليه عبر الرابط التالي: http://localhost:3000/
يمكنك إرسال طلب POST إلى /calculate مع البيانات المطلوبة في الـ body
- operation: نوع العملية الحسابية (+, -, *, /)
- x: الرقم الأول
- y: الرقم الثاني
الرد سيكون على شكل JSON يحتوي على:
- status: حالة الطلب (success أو error)
- result: النتيجة بعد إجراء العملية الحسابية
- error: رسالة خطأ في حالة وجود مشكلة
ما كتبناه للتو يسمى Context أو سياق للذكاء الاصطناعي من أجل أن يفهم كيف يستخدم هذه الأداة
لاحظ أن الذكاء الاصطناعي لا يعرف بوجود هذا الـ API ولا يعرف كيف يستخدمه إلا إذا أخبرناه نحن
لذا عندما نريد من الذكاء الاصطناعي أن يحل مسألة رياضية نقوم بإعطائه هذا الـ Context بالكامل
لكي يعرف بوجوده ثم نسأله السؤال
لأنك إذا سألت الذكاء الاصطناعي فقط كم يساوي 15 + 20 ؟ دون إعطائه الـ Context سيعتمد على الاحتمالات ويعطيك إجابة قد تكون صحيحة أو خاطئة
لكن إذا أعطيته الـ Context ثم سألته السؤال نفسه سيستخدم الـ API الذي أنشأناه ويعطيك الإجابة الصحيحة دائمًا
لأن الـ Context الذي أعطيته له أخبره بوجود هذه الأداة وكيف يستخدمها
برغم من أن هذه الفكرة بسيطة وفعالة لكن عليك أن تدرك أن اعطاءك Context للذكاء الاصطناعي يستهلك من الـ tokens التي تملكها في الـ Model
أساس فكرة الـ MCP
ما قمنا بفعله هو إنشاء أداة بسيطة للذكاء الاصطناعي ليستخدمها
ويمكننا بهذه الطريقة أن نجعل الذكاء الاصطناعي يستخدم أي أداة أو تطبيق نريده
عن طريق إنشاء Server وسيط نربط به API يستطيع الذكاء الاصطناعي استخدامه بسهولة
مثلًا لو أردنا أن نجعل الذكاء الاصطناعي يستطيع الوصول إلى Jira ويقرأ الـ Tickets المفتوحة ويقوم بتنفيذ بعض الأمور
نستطيع أن ننشئ Server وسيط نربطه بالـ API الخاص بـ Jira
ثم ننشيء مجموعة من الـ endpoints التى تقوم بقراءة أو تعديل أو إنشاء tickets
ثم نشرح للذكاء الاصطناعي الـ API الذي أنشأناه ونخبره كيف يستخدمه وهو ما نسميه بالـ Context
ثم عندما نريد من الذكاء الاصطناعي أن يتعامل مع Jira نقوم بإعطائه هذا الـ Context
ثم نسأله السؤال الذي نريده مثلًا اعرض لي الـ tickets المفتوحة في المشروع X
أو أنشئ لي ticket جديد بعنوان Y
فيقوم باستخدام الـ API الذي أنشأناه وينفذ الـ endpoint المناسبة ويعطينا النتيجة
ما نقوم به هو حجر أساس فكرة الـ MCP
هل يوجد مشكلة في ما نقوم به ؟
لا توجد مشكلة في الأسلوب نفسه، بل في كيفية تطبيقه
بمعنى أنك هنا تقوم بإنشاء Server وسيط في كل مرة تريد أن تجعل الذكاء الاصطناعي يتعامل مع تطبيق معين
مثلًا لو أردت أن تجعل الذكاء الاصطناعي يتعامل مع Notion
تقوم بإنشاء Server وسيط جديد وتربطه بـ Notion API
ثم تشرح للذكاء الاصطناعي الـ API الذي أنشأته
وإذا أردت أن تجعل الذكاء الاصطناعي يتعامل مع GitHub
تقوم بإنشاء Server وسيط جديد وتربطه بـ GitHub API
ثم تشرح للذكاء الاصطناعي الـ API الذي أنشأته
المشكلة هنا هي:
كل شخص سيقوم بإنشاء هذا الـ Server بطريقته الخاصة
بالـ configurations التي يراها مناسبة ويجعلها مخصصة جدا للـ Model الذي يستخدمه أو لاستخدام محدد يناسبه هو فقط وطبيعة عمله
وكل مرة يريد أن يجعل الذكاء الاصطناعي يتعامل مع تطبيق معين سيقوم بإنشاء Server مختلف بطريقته الخاصة
وأحيانًا يقوم البعض بربط الـ Model مباشرة داخل الـ Server نفسه
وأحيانًا يكون هذا الربط مخصص جدًا للـ Model الذي يستخدمه فقط
وكل مبرمج يقوم بعمل تفس الشيء بطرق مختلفة عن المبرمج الآخر
هذا يجعل الأمر غير موحد ويصعب على المبرمجين الآخرين اعادة استخدامها في مشاريعهم المختلفة
لأنها كما قلنا تكون مخصصة جدًا لطبيعة عمل المبرمج الأول الذي أنشأها
فيضطر كل شخص إلى تعديله أو إنشاء Server جديد من البداية يناسب حالته
وأسباب كثيرة أخرى تجعل من الصعب على المبرمجين اعادة استخدامها ومشاركتها مع الآخرين
لذلك كان لابد من وجود شيئين مهمين:
- توحيد المعايير: وجود
standardموحد يتبعه الجميع في إنشاء هذه الأدوات - توحيد مصادر الأدوات: أصحاب التطبيقات الأصلية مثل
JiraأوNotionأوGitHubعليهم إنشاء هذه الأدوات بأنفسهم وتوفيرها للمبرمجين
فكرة الـ MCP لتوحيد المعايير
بعد ما زادت الحاجة إلى ربط الـ Agent أو الـ Model بالتطبيقات والخدمات المختلفة
وكان كل مبرمج يعمل Server وسيط بطريقته الخاصة وكل شخص كان يخترع العجلة في كل مرة
كان لابد من وجود standard موحد يتبعه الجميع في إنشاء هذه الأدوات
وهذا ما قامت به شركة Anthropic وهي الشركة التي تقف خلف Claude
بإعلان عن إنشاء standard موحد واسمه Model Context Protocol
وكما يوحي الاسم فالهدف منه هو أن يكون بروتوكول أو طريقة موحدة لإعطاء Context أو سياق لأي Model أو Agent تريده
وكما قلنا أن الـ Context هو مجرد شرح يتم اعطاءه للـ Agent عن وجود أداة معينة وكيف يستخدمها
هذه الأدوات قد تكون تطبيقات موجودة بالفعل مثل Jira أو Notion أو GitHub
أو قد تكون تطبيقات جديدة تقوم أنت بإنشائها بنفسك
بمعنى أنه ليس شرطًا أن يكون تطبيق موجود، بل يمكنك أن تبتكر أنت API بسيط كمثال الآلة الحاسبة وتحوله إلى MCP ليستخدمه أي Agent تريده
بعد الاعلان عن الـ MCP قامت عدة شركات أخرى مثل GitHub و OpenAI بالإعلان عن دعمهم لهذا الـ standard
وكل شركة تقوم بإنشاء MCP خاص بها وتنشره ليستخدمه أي شخص
بالتالي بدلًا من يقوم كل شخص بإنشاء Server وسيط بطريقته الخاصة ليربطه بـ GitHub أو Jira أو Notion بطرق مختلفة
أصبح بأمكانه بشكل مباشر أن يستخدم الـ MCP الذي أنشأته هذه الشركات
بالتالي إذا أراد أي شخص أن يجعل الذكاء الاصطناعي يفهم ويتعامل مع GitHub فسوف يستخدم الـ MCP الذي أنشأته GitHub ويركبه على الـ Agent الذي يستخدمه
وإذا أراد التعامل مع Notion فسوف يستخدم الـ MCP الذي أنشأته Notion وهكذا
الأمر كله أصبح موحد وسهل على الجميع وأصبحت الـ MCP كأنها extension أو إضافة للـ Agent الذي تستخدمه كأنها مجموعة أدوات جاهزة
وتذكر أن الـ MCP هو مجرد Context أو شرح يتم إعطائه للـ Agent ليعرف بوجود هذه الأداة وكيف يستخدمها
مثل فكرة مثال الآلة الحاسبة التي شرحناها في البداية عندما ارسلنا له الـ Context وشرحنا له كيف يستخدمها
كل ما في الأمر أن الـ MCP هو Protocol موحد يتبعه الجميع في إنشاء هذه الأدوات واعطاء الـ Context للـ Agent بشكل موحد بغض النظر عن الـ Model أو الـ Agent الذي يستخدمه
إنشاء MCP خاص بنا
ما بعد أن فهمنا الفكرة الأساسية للـ MCP
يمكننا الآن أن نقوم بإنشاء MCP خاص بنا ونحاول تركيبه على GitHub Copilot في VS Code كمثال عملي
أولاً، هل تذكر المثال الذي قمنا به في بداية المقال بإنشاء Server بسيط فيه API للآلة الحاسبة ؟
// ...
app.post('/calculate', (req, res) => {
const { operation, x, y } = req.body;
try {
const result = calculator(operation, x, y);
res.json({
status: 'success',
result,
});
} catch (error) {
res.status(400).json({
status: 'error',
error: error.message,
});
}
});
// ...
لنقم بتحويل هذا الـ Server إلى MCP ليستخدمه أي Model أو Agent نريده بشكل سلس
وبفضل الانتشار والقبول الكبير على الـ MCP تم عمل سلسلة من المكتبات لكل اللغات لتتناسب مع الـ standard الخاص بالـ MCP
وستجد هذه المكتبات في GitHub
الآن يمكنك استخدام المكتبة الخاصة باللغة التي تبرمج بها لإنشاء MCP خاص بك
في هذا المثال سنستخدم المكتبة الخاصة بـ Node.js لإنشاء MCP خاص بنا
أولًا نقوم بتثبيت المكتبة:
npm install @modelcontextprotocol/sdk
الآن يمكننا أن نحول الـ Server الذي أنشأناه الخاص بالآلة الحاسبة إلى MCP
وبالطبع طالما أننا نستخدم المكتبة فهى سوف تسهل علينا الكثير من الأمور
لأنها تتبع الـ standard الخاص بالـ MCP بطبيعة الحال
const { McpServer } = require('@modelcontextprotocol/sdk/server/mcp.js');
const {
StdioServerTransport,
} = require('@modelcontextprotocol/sdk/server/stdio.js');
const { z } = require('zod');
function calculator(operation, x, y) {
switch (operation) {
case '+':
return x + y;
case '-':
return x - y;
case '*':
return x * y;
case '/':
if (y === 0) throw new Error('Cannot divide by zero');
return x / y;
default:
throw new Error(`Unknown operation: ${operation}`);
}
}
const server = new McpServer({
name: 'calculator',
version: '1.0.0',
});
server.registerTool(
'calculator',
{
title: 'Calculator',
description: 'Perform basic mathematical operations',
inputSchema: {
operation: z.enum(['+', '-', '*', '/']),
x: z.number(),
y: z.number(),
},
},
(args) => {
const { operation, x, y } = args;
try {
const result = calculator(operation, x, y);
return {
content: [
{
type: 'text',
text: `Result: ${x} ${operation} ${y} = ${result}`,
},
],
};
} catch (error) {
return {
content: [
{
type: 'text',
text: `Error: ${error.message}`,
},
],
isError: true,
};
}
}
);
const transport = new StdioServerTransport();
server.connect(transport);
ستلاحظ أننا هنا قمنا بإنشاء متغير server من نوع McpServer
ثم استخدمنا الدالة registerTool لتسجيل الأداة الخاصة بنا
لاحظ أن الدالة توحي لك أنك هنا تقوم بإنشاء أداة ليستخدمها الـ Agent
وأنت الآن تقوم بشرح مواصفات هذه الأداة مثل الاسم والوصف ونوع البيانات التي تستقبلها
ثم أنت تقوم بنفسك بكتابة الكود الخاص بالأداة
نحن لن نركز على تفاصيل الكود هنا لأن الهدف هو شرح فكرة الـ MCP وعمل مثال عملي بسيط لتوضيح الفكرة فقط
هنا لاحظ أننا قمنا بإنشاء MCP خاص بنا للآلة الحاسبة واعطيناها اسم calculator وكتبنا وصف للأداة
ثم في الـ inputSchema قمنا بتحديد نوع البيانات التي تستقبلها الأداة وهي operation و x و y
واستخدمنا مكتبة zod لتساعدنا في تحديد نوع البيانات بشكل بسيط
ثم في النهاية كتبنا الكود الخاص بالأداة نفسها التى سوف ينفذها الـ Agent عندما يستخدم هذه الأداة
تركيب الـ MCP وتجربته
الآن بعد أن أنشأنا الـ MCP الخاص بنا للآلة الحاسبة نحتاج إلى تركيبه وتجربته
هنا سيختلف طريقة تركيب الـ MCP حسب الـ Agent فمثلًا طريقة تركيب الـ MCP في VS Code تختلف عن طريقة تركيبه على Claude Code أو Cursor لذا ابحث عن طريقة تركيب الـ MCP على البيئة التي تستخدمها
على أي حال سنجرب فقط تركيبه على VS Code
يمكنك اتباع الخطوات التالية:
- أنشيء مجلد يدعى
.vscode - أنشيء ملف داخل هذا المجلد يدعى
mcp.json - ضع داخل هذا الملف البيانات التالية لتوضح أننا لدينا
MCPيدعىcalculator-mcpيستخدم الـstdio
ونستطيع تشغيله عن طريق الأمرnode ./calculator-mcp.js{ "servers": { "calculator-mcp": { "type": "stdio", "command": "node", "args": ["./calculator-mcp.js"] } } } - اضغط على
F1فيVS CodeواكتبMCP: List Serversواختارcalculator-mcpمن القائمة - اختار
Start Server - الآن يمكنك استخدام الـ
MCPفي أي مكان فيVS CodeمعGitHub Copilot
الخطوات السابقة خاصة بـ VS Code فقط
الآن عندما تتحدث مع GitHub Copilot وتقول له ما ناتج 15 + 10 ؟
ستجده يطلب منك تصريح أو موافقتك على استخدام الأداة calculator التي أنشأناها
ثم بعد موافقتك ستجده يستخدم الأداة ويعطيك الإجابة الصحيحة 25
هل عليك أن تنشئ MCP خاص بك ؟
ليس بالضرورة، لأن الشركات الكبيرة مثل GitHub و Notion و Jira و Google و Microsoft وغيرهم يقومون بإنشاء MCP خاص بهم
ويمكنك استخدام هذه الـ MCP مباشرة مع الـ Agent الذي تستخدمه
ومعظم المطورين الآن ينشؤون MCP مختلفة وينشرونها ويمكنك الاطلاع عليها واستخدام وتركيب ما تراه مناسبًا لك
لذا عندما تريد استخدام MCP معين ابحث أولًا هل يوجد MCP جاهز له أم لا وغالبًا ما ستجده
الأمر اشبه بعصر الـ API حيث أصبح معظم التطبيقات والخدمات توفر API خاص بها
نفس الأمر نستطيع أن تجده في عالم الـ MCP الآن
قد تضطر إلى إنشاء MCP في حالات معينة مثل أنك تعمل في شركة خاصة بحجز تذاكر لحضور الفعاليات أو المؤتمرات
والشركة لديها ChatBot للعملاء
والشركة تريد منك توفير MCP خاص بها يساعد الـ ChatBot على معرفة قائمة الفعاليات والمؤتمرات المتاحة حاليًا
وهل المعاد الذي اختاره العميل متاح أم لا
كأنك بتبني مجموعة مجموعة من الأدوات خاصة بالشركة
أداة لمعرفة الفعاليات المتاحة والغير متاحة
وأداة لمعرفة هل المعاد المعين متاح أم لا
ومجموعة من الأدوات الأخرى التى تساعد الـ ChatBot على معرفة كل ما يخص الشركة من خدمات وفعاليات والمواعيد المتاحة
وبناءًا عليها يستطيع الاجابة على العملاء بشكل دقيق في نطاق المعلومات التي يحضرها من الأدوات التى يوفرها الـ MCP الخاص بالشركة
أو تنشيء MCP خاص بك لتجعل الـ Agent يقوم بقراءة ملفات Excel وتحليلها ثم يقوم بكتابة تقريب وارساله إلى مدراءك في العمل على الـ Gmail بينما تقوم أنت بشرب كوب القهوة في هدوء وتقرا أحدى مقالات مدونة الطبراني
وهكذا من الحالات التي قد تضطر فيها إلى إنشاء MCP
مجموعة من MCP الجاهزة التى يجب عليك تجربتها
- Context7 هو
MCPيجعل الـAgentعلى اطلاع دائم على أخر نسخة من الـDocsالخاصة بالمكتبات التي تستخدمها في مشروعك - Sequential Thinking هو
MCPيساعد الـAgentعلى التفكير بشكل متسلسل لحل المشاكل المعقدة - Playwright MCP هو
MCPيجعل الـAgentقادر على التفاعل مع المتصفح عن طريق مكتبةPlaywright - Laravel Boost هو
MCPيساعد الـAgentعلى التعرف واستخدام كل مميزاتLaravelوالـCLIالخاصة به وكل ما يخصLaravel - Model Context Protocol servers مجموعة من الـ
MCPالجاهزة التي يمكنك استخدامها - MCP Servers for agent mode مجموعة من الـ
MCPالجاهزة التي يمكنك استخدامها فيVS Code - ... وغيرها الكثير من الـ
MCPالتى يمكنك البحث عنها واستخدامها
ملحوظة:كثرة استخادم الـMCPفي محادثاتك مع الـAgentقد تستهلك من الـtokensالتي تملكها في الـModelالذي تستخدمه
لأن كلMCPهو عبارة عنContextأو شرح يتم اعطائه للـAgentفي كل مرة تريد استخدامه
لذا حاول أن تستخدم الـMCPفقط عند الحاجة لتوفير الـtokensالتي تملكها
الخلاصة
الـ MCP هو standard أو protocol موحد لإنشاء أدوات تساعد الـ Agent أو الـ Model على التعامل مع التطبيقات والخدمات المختلفة بطريقة موحدة وسهلة
بدلًا من أن يقوم كل مبرمج بإنشاء Server وسيط بطريقته الخاصة في كل مرة يريد فيها ربط الـ Agent بتطبيق معين
الآن أصبح بإمكانك استخدام الـ MCP الذي أنشأته الشركات الكبيرة أو من قبل المطورين الآخرين
وإذا لم تجد ما يناسبك يمكنك أن تنشئ MCP خاص بك يناسب حالتك
في نهاية المقالة أرجو أن تكون قد استفدت وفهمت ما هو الـ MCP وكيفية استخدامه
ولما تم إنشاؤه وما هي المشاكل التي يحلها في عالم الذكاء الاصطناعي