مقدمة
Model Context Protocol (MCP) هو معيار مفتوح يُعرّف كيفية تواصل نماذج الذكاء الاصطناعي مع الأدوات ومصادر البيانات الخارجية. قدّمته Anthropic في أواخر 2024، ويهدف MCP إلى حل مشكلة أساسية في تطوير الذكاء الاصطناعي: كل تكامل بين LLM ونظام خارجي يتطلب عملًا مخصصًا. يوحّد MCP هذا التواصل، مما يجعل من الممكن بناء أداة مرة واحدة واستخدامها مع أي عميل ذكاء اصطناعي متوافق مع MCP.
يشرح هذا المقال ما هو MCP، ولماذا يهم، وكيف تبني خادم MCP الخاص بك.
المشكلة التي يحلّها MCP
قبل MCP، كان ربط نموذج ذكاء اصطناعي بأدوات خارجية يتبع نمطًا مجزأًا:
- استدعاء الدوال في OpenAI استخدم تنسيقًا واحدًا
- استخدام الأدوات في Anthropic استخدم تنسيقًا آخر
- أدوات LangChain لها واجهتها الخاصة
- التكاملات المخصصة تُبنى من الصفر في كل مرة
هذا يعني أنك إذا بنيت أداة لواجهة OpenAI، فلا يمكنك استخدامها مع Claude دون إعادة كتابة طبقة التكامل. كل نموذج جديد يتطلب محولات جديدة.
يعالج MCP هذا من خلال تعريف بروتوكول قياسي لتواصل الأدوات. ابنِ خادم MCP مرة واحدة، ويمكن لأي عميل متوافق مع MCP استخدامه.
كيف يعمل MCP
يتبع MCP بنية العميل-الخادم:
خادم MCP
يُعرّض خادم MCP القدرات لعملاء الذكاء الاصطناعي. يمكن للخادم توفير ثلاثة أنواع من القدرات:
- الأدوات: دوال يمكن للذكاء الاصطناعي استدعاؤها (مثل البحث في قاعدة بيانات، إرسال بريد)
- الموارد: بيانات يمكن للذكاء الاصطناعي قراءتها (مثل محتوى الملفات، سجلات قاعدة البيانات)
- المطالبات: قوالب مطالبات مُعرّفة مسبقًا يمكن للذكاء الاصطناعي استخدامها
عميل MCP
عميل MCP (عادةً تطبيق ذكاء اصطناعي أو إطار وكلاء) يتصل بخوادم MCP ويجعل قدراتها متاحة لنموذج الذكاء الاصطناعي. يتعامل العميل مع تواصل البروتوكول، مقدّمًا الأدوات للنموذج بالتنسيق الذي يتوقعه.
البروتوكول
يستخدم MCP تنسيق JSON-RPC 2.0 كصيغة رسائله، متواصلًا عبر stdio أو HTTP مع Server-Sent Events (SSE). هذا يجعله مستقلًا عن اللغة ومرنًا في النقل.
بناء خادم MCP
لنبنِ خادم MCP عمليًا يوفّر أدوات نظام الملفات. سنستخدم MCP Python SDK الرسمي.
التثبيت
pip install mcp
خادم MCP لنظام الملفات
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import os
import json
server = Server("filesystem-server")
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="read_file",
description="قراءة محتوى ملف",
inputSchema={
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "مسار الملف للقراءة"
}
},
"required": ["path"]
}
),
Tool(
name="list_directory",
description="عرض الملفات في مجلد",
inputSchema={
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "مسار المجلد للعرض"
}
},
"required": ["path"]
}
),
Tool(
name="write_file",
description="كتابة محتوى إلى ملف",
inputSchema={
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "مسار الملف للكتابة"
},
"content": {
"type": "string",
"description": "المحتوى للكتابة"
}
},
"required": ["path", "content"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "read_file":
path = arguments["path"]
with open(path, "r") as f:
content = f.read()
return [TextContent(type="text", text=content)]
elif name == "list_directory":
path = arguments["path"]
entries = os.listdir(path)
result = "\n".join(entries)
return [TextContent(type="text", text=result)]
elif name == "write_file":
path = arguments["path"]
content = arguments["content"]
with open(path, "w") as f:
f.write(content)
return [TextContent(type="text", text=f"تمت الكتابة إلى {path}")]
raise ValueError(f"أداة غير معروفة: {name}")
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
الاتصال من عميل
بمجرد تشغيل خادمك، يمكن للعملاء المتوافقين مع MCP الاتصال به. مثلًا، في Claude Desktop، تُهيّئ خوادم MCP في الإعدادات:
{
"mcpServers": {
"filesystem": {
"command": "python",
"args": ["/path/to/your/server.py"]
}
}
}
يمكن لنموذج الذكاء الاصطناعي بعد ذلك استخدام أدواتك مباشرة، مع تعامل عميل MCP مع كل التواصل.
حالات الاستخدام العملية
أداة استعلام قاعدة البيانات
خادم MCP يتيح لنماذج الذكاء الاصطناعي الاستعلام عن قاعدة بياناتك:
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="query_database",
description="تنفيذ استعلام SQL للقراءة فقط",
inputSchema={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "استعلام SQL SELECT"
}
},
"required": ["query"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "query_database":
import sqlite3
conn = sqlite3.connect("app.db")
cursor = conn.execute(arguments["query"])
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
conn.close()
results = [dict(zip(columns, row)) for row in rows]
return [TextContent(type="text", text=json.dumps(results, indent=2))]
خادم تكامل API
اعرض واجهات API الداخلية لنماذج الذكاء الاصطناعي عبر MCP:
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_customer",
description="الحصول على تفاصيل العميل بالمعرف",
inputSchema={
"type": "object",
"properties": {
"customer_id": {"type": "string"}
},
"required": ["customer_id"]
}
),
Tool(
name="create_ticket",
description="إنشاء تذكرة دعم",
inputSchema={
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"subject": {"type": "string"},
"description": {"type": "string"}
},
"required": ["customer_id", "subject", "description"]
}
)
]
لماذا يهم MCP
للمطورين
- ابنِ مرة، استخدم في كل مكان: خادم MCP يعمل مع أي عميل متوافق مع MCP
- واجهة موحدة: لا مزيد من كتابة محولات مخصصة لكل مزود ذكاء اصطناعي
- القابلية للتركيب: يمكن تشغيل عدة خوادم MCP في وقت واحد، كل منها يوفّر قدرات مختلفة
للمنظمات
- الأمان: تعمل خوادم MCP محليًا أو على بنيتك التحتية، مبقيةً البيانات تحت سيطرتك
- إعادة الاستخدام: ابنِ خوادم أدوات داخلية مرة واحدة وشاركها عبر الفرق
- المنظومة: مع بناء المزيد من الأدوات كخوادم MCP، تنمو قيمة المنظومة
المنظومة الحالية
لا يزال MCP في مراحله المبكرة، لكن التبني ينمو:
- Claude Desktop يدعم خوادم MCP أصليًا
- خوادم MCP مفتوحة المصدر موجودة لخدمات شائعة مثل GitHub و Slack و Google Drive
- خوادم المجتمع تُنشر لقواعد البيانات وأنظمة الملفات وواجهات API
- أطر الوكلاء تضيف دعم عميل MCP
خاتمة
يمثّل Model Context Protocol خطوة ذات معنى نحو توحيد كيفية تفاعل نماذج الذكاء الاصطناعي مع العالم الخارجي. من خلال توفير بروتوكول مشترك لتواصل الأدوات، يقلّل MCP عبء التكامل ويجعل أدوات الذكاء الاصطناعي أكثر قابلية للنقل والتركيب.
بناء خادم MCP بسيط، والعائد كبير: يمكن لأي عميل ذكاء اصطناعي متوافق مع MCP استخدام أدواتك دون عمل تكامل مخصص. مع نمو المنظومة، ستصبح خوادم MCP الطريقة القياسية لعرض القدرات لنماذج الذكاء الاصطناعي، تمامًا كما أصبحت REST APIs المعيار لخدمات الويب.