
بروتوكول سياق النموذج (MCP): نظرة عامة
بروتوكول سياق النموذج (MCP) هو معيار مفتوح قدمته شركة Anthropic بهدف توحيد كيفية ربط تطبيقات الذكاء الاصطناعي (مثل روبوتات المحادثة، ومساعدي بيئات التطوير، والوكلاء المخصصين) بالأدوات الخارجية، ومصادر البيانات، والأنظمة المختلفة.
Table Of Content

يمكن اعتبار MCP بمثابة منفذ USB للذكاء الاصطناعي؛ فقبل ظهور معايير مثل USB، كان ربط الأجهزة الطرفية يتطلب عددًا كبيرًا من المنافذ المختلفة وبرامج تشغيل خاصة. بشكل مماثل، فإن دمج تطبيقات الذكاء الاصطناعي مع الأدوات والأنظمة الخارجية يمثل أو كان يمثل “مشكلة M×N”.
إذا كانت لديك M من تطبيقات الذكاء الاصطناعي المختلفة (روبوتات الدردشة، تطبيقات RAG، وكلاء مخصصون وغيرها)، وN من الأدوات أو الأنظمة الخارجية (مثل GitHub، Slack، Asana، قواعد البيانات، وغيرها)، قد تضطر إلى إنشاء M×N عملية دمج مختلفة، ما يؤدي إلى جهد مكرر بين الفرق وتنفيذات غير متسقة.
يهدف MCP إلى تبسيط هذه العملية عن طريق توفير واجهة برمجية موحدة (API)، وتحويلها إلى “مشكلة M+N”. من خلال هذا البروتوكول، يقوم منشئو الأدوات ببناء N من خوادم MCP (واحد لكل نظام)، في حين يقوم مطورو التطبيقات ببناء M من عملاء MCP (واحد لكل تطبيق ذكاء اصطناعي). يعرّف MCP معمارية “عميل – خادم”، بحيث:
- المضيفون (Hosts): هي التطبيقات التي يتفاعل معها المستخدم بشكل مباشر (مثل Claude Desktop، أو بيئة تطوير برمجية كـ Cursor، أو وكيل مخصص).
- العملاء (Clients): تعمل ضمن تطبيق المضيف، وتدير الاتصال مع خادم MCP واحد محدد، وتحافظ على اتصال واحد لواحد (1:1).
- الخوادم (Servers): برامج خارجية تعرض الأدوات (Tools)، والموارد (Resources)، والتوجيهات (Prompts)، عن طريق واجهة برمجية قياسية (Standard API) إلى نموذج الذكاء الاصطناعي عبر العميل (Client).
المكونات الحالية لخوادم MCP تتضمن:
- الأدوات (Tools) – (تحت تحكم النموذج): هي وظائف أو أدوات يمكن لنماذج اللغة الكبيرة (LLMs) استدعاؤها لتنفيذ إجراءات محددة، مثل واجهة برمجية للطقس (weather API)، وتُشبه خاصية استدعاء الدوال (Function Calling).
- الموارد (Resources) – (تحت تحكم التطبيق): هي مصادر بيانات يمكن لنماذج اللغة الوصول إليها، تشبه نقاط النهاية من نوع GET في واجهات REST البرمجية. توفّر هذه الموارد البيانات دون إجراء حسابات معقّدة أو التسبب بأي آثار جانبية، وتكون جزءًا من سياق الطلب أو الاستعلام.
- التوجيهات (Prompts) – (تحت تحكم المستخدم): هي قوالب محددة مسبقًا تساعد النموذج على استخدام الأدوات أو الموارد بأفضل طريقة ممكنة. يتم اختيارها قبل تشغيل عملية الاستدلال (inference).

كيف يعمل بروتوكول MCP؟
يعمل بروتوكول MCP باستخدام نموذج «العميل-الخادم» المذكور سابقًا. فيما يلي تدفق مبسّط لآلية عمله:

- التهيئة (Initialization): عند بدء تشغيل التطبيق المضيف (Host)، يقوم بإنشاء عدد (N) من عملاء MCP (Clients)، ثم تُجرى عملية «مصافحة» (Handshake) بين العميل والخادم لتبادل المعلومات حول القدرات وإصدارات البروتوكول المدعومة.
- الاكتشاف (Discovery): يطالب العميل الخادم بقائمة القدرات المتاحة (الأدوات Tools، الموارد Resources، والتوجيهات Prompts). يستجيب الخادم (Server) بقائمة تحتوي على هذه العناصر مع وصف لكل منها.
- توفير السياق (Context Provision): يمكن للتطبيق المضيف الآن إتاحة الموارد والتوجيهات للمستخدم، أو تحويل الأدوات إلى صيغة متوافقة مع نموذج اللغة الكبيرة (LLM)، مثل صيغة JSON لاستدعاء الدوال (Function Calling).
- الاستدعاء (Invocation): إذا قرر نموذج اللغة (LLM) أنه يحتاج إلى استخدام أداة معينة (مثل استفسار المستخدم: “ما هي المشكلات المفتوحة في مستودع ‘X’؟”)، يوجه التطبيق المضيف العميل (Client) لإرسال طلب استدعاء (Invocation request) إلى الخادم المناسب (Server).
- التنفيذ (Execution): يتلقى الخادم (Server) الطلب (مثلًا: fetch_github_issues مع تحديد المستودع ‘X’)، وينفّذ المنطق الداخلي المرتبط به (مثل الاتصال بواجهة GitHub API)، ويحصل على النتيجة.
- الاستجابة (Response): يرسل الخادم النتيجة التي حصل عليها إلى العميل (Client).
- الإكمال (Completion): ينقل العميل النتيجة للتطبيق المضيف (Host)، والذي بدوره يُدرج هذه المعلومات في سياق نموذج اللغة (LLM)، مما يسمح للنموذج بتوليد استجابة نهائية للمستخدم بناءً على هذه المعلومات الحديثة القادمة من مصدر خارجي.
خوادم MCP
تُعتبر خوادم MCP بمثابة الجسر أو الواجهة (API) التي تربط بين عالم MCP والوظائف المحددة للأنظمة الخارجية (مثل واجهات API، قواعد البيانات، الملفات المحلية وغيرها). باختصار، هي عبارة عن «غلاف» (wrapper) يوفّر الوصول إلى هذه القدرات الخارجية وفقًا لمواصفات MCP.
يمكن إنشاء هذه الخوادم بلغات برمجة متعددة (مثل Python، TypeScript، Java، Rust وغيرها)، بشرط قدرتها على التواصل باستخدام طرق الاتصال المدعومة. وتتواصل الخوادم مع العملاء (Clients) بشكل رئيسي عبر طريقتين:
- الإدخال والإخراج القياسي (stdio): تُستخدم هذه الطريقة عندما يعمل العميل والخادم على نفس الجهاز. وهي بسيطة وفعّالة للربط المحلي (مثل الوصول إلى ملفات محلية أو تشغيل سكربت محلي).
- بروتوكول HTTP باستخدام Server-Sent Events (SSE): في هذه الطريقة، يتصل العميل بالخادم عبر بروتوكول HTTP. بعد عملية تهيئة أولية، يستطيع الخادم إرسال رسائل أو أحداث (events) إلى العميل بشكل مستمر من خلال اتصال مفتوح وفقًا لمعيار SSE.
مثال توضيحي لبناء خادم MCP باستخدام لغة Python وأداة FastMCP:
from fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add a tool, will be converted into JSON spec for function calling
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a data resource, e.g. displayed on new chats
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# Specific prompt templates for better use
@mcp.prompt()
def review_code(code: str) -> str:
return f"Please review this code:\n\n{code}"
قوائم لخوادم MCP جاهزة ومطوّرة من قِبل المجتمع متاحة على الروابط التالية:
https://github.com/punkpeye/awesome-mcp-servers
https://github.com/modelcontextprotocol/servers
عملاء MCP (MCP Clients)
عملاء MCP هم جزء من تطبيقات المضيف (مثل بيئات التطوير IDEs، روبوتات المحادثة، وغيرها)، مهمتهم الأساسية إدارة الاتصال مع خادم MCP محدد.
دور عملاء MCP:
- إدارة الاتصال (إنشاء وإدارة اتصالات مع الخوادم).
- اكتشاف القدرات (Capability Discovery) التي يوفرها الخادم.
- تمرير الطلبات (Request Forwarding) من التطبيق المضيف إلى الخادم.
- معالجة الردود (Response Handling) القادمة من الخادم وفقًا لمواصفات MCP.
أمثلة على التطبيقات المضيفة وعملاء MCP:
تطبيقات واجهة المستخدم (UI Apps):
- Claude Desktop
- Microsoft Copilot Studio
- LibreChat
- Claude Code
بيئات التطوير البرمجية (IDEs):
- Cursor
- Windsurf
- Continue
- Zed
- Cline
الوكلاء المخصصون (Custom Agents) بلغات مثل Python وTypeScript:
- Firebase Genkit
- LangGraph
- OpenAI Agents SDK
مثال توضيحي لبناء عميل MCP باستخدام Python ومكتبة mcp:
from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client
# Commands for running/connecting to MCP Server
server_params = StdioServerParameters(
command="python", # Executable
args=["example_server.py"], # Optional command line arguments
env=None, # Optional environment variables
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write, sampling_callback=handle_sampling_message
) as session:
# Initialize the connection
await session.initialize()
# List available prompts
prompts = await session.list_prompts()
# Get a prompt
prompt = await session.get_prompt(
"example-prompt", arguments={"arg1": "value"}
)
# List available resources
resources = await session.list_resources()
# List available tools
tools = await session.list_tools()
# Read a resource
content, mime_type = await session.read_resource("file://some/path")
# Call a tool
result = await session.call_tool("tool-name", arguments={"arg1": "value"})
لماذا كل هذه الضجة حول MCP؟ هل فاز بروتوكول MCP بالفعل؟
على الرغم من أن شركة Anthropic أعلنت عن MCP أواخر عام 2024، إلا أن زخمه تسارع بشكل ملحوظ مطلع عام 2025. هذه ليست مجرد ضجة عشوائية، بل نتيجة تداخل عدة عوامل مهمة:
- «مخصص للذكاء الاصطناعي من البداية» (AI-Native):
رغم وجود معايير أقدم مثل OpenAPI أو GraphQL أو SOAP للتعامل مع واجهات API، إلا أن MCP صُمم خصيصًا لتلبية احتياجات الوكلاء الحديثين المعتمدين على الذكاء الاصطناعي. فهو يُبسّط الأنماط التي تظهر باستمرار في تطوير الوكلاء الذكيين:
- الأدوات (Tools): إجراءات يتخذها الذكاء الاصطناعي بنفسه.
- الموارد (Resources): السياق الذي يوفّره التطبيق للذكاء الاصطناعي.
- التوجيهات (Prompts): التفاعلات التي يتحكم بها المستخدم مباشرةً.
2. «معيار مفتوح» مع داعم كبير وواضح:
أي معيار مفتوح يحتاج إلى مواصفات واضحة، وMCP يتمتع بمواصفات مفصلة وعالية الجودة، ما يجعله يتفوق بسهولة على منافسيه الذين يفتقرون إلى مثل هذه المواصفات الدقيقة والشاملة.
3. مبني على أساس قوي ومُجرّب سابقًا:
بدلًا من إعادة ابتكار كل شيء من الصفر، استفادت Anthropic من خبرة سابقة من خلال بروتوكولات معروفة مثل Language Server Protocol (LSP) وJSON-RPC 2.0 الموثوقة والمستخدمة بشكل واسع.
4. بيئة أولية قوية واستخدام داخلي مكثف (Dogfooding):
لم تُطلق Anthropic البروتوكول كمواصفات نظرية فقط، بل استخدمته داخليًا بشكل مكثف وعملي (Dogfooding)، وأطلقته مع بيئة متكاملة وقوية من البداية:
- العملاء (Clients): مثل Claude Desktop.
- الخوادم (Servers): تطبيقات مرجعية عديدة (مثل نظام الملفات، git، Slack، وغيرها).
- أدوات مساعدة (Tooling): مثل MCP Inspector لاختبار وتنقيح التطبيقات، بالإضافة إلى توثيق ممتاز.
- مكتبات برمجية (SDKs): وفرت مكتبات للغات Python وTypeScript، والآن تتوسع لتشمل Java وKotlin وC#.
5. تأثيرات الشبكة (Network Effects):
الطبيعة المفتوحة للبروتوكول أدت إلى خلق مجتمع واسع نشط حول MCP، مما زاد من انتشاره وقوته:
الطبيعة المفتوحة للبروتوكول أدت إلى خلق مجتمع واسع. أدوات مثل Cursor وWindsurf دمجت MCP. شركات مثل Composio وفرت خوادم جاهزة لمئات عمليات الدمج. OpenAI أعلنت دعمها لـ MCP. المطورون قاموا ببناء آلاف خوادم MCP المجتمعية (مثل GitHub، Slack، قواعد البيانات، Docker، إلخ).
مثال عملي باستخدام Gemini ومكتبة Python uSDK:
from typing import List
from google import genai
from google.genai import types
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import os
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))
model = "gemini-2.0-flash"
# Create server parameters for stdio connection
server_params = StdioServerParameters(
command="npx", # Executable
args=[
"-y",
"@openbnb/mcp-server-airbnb",
], # Optional command line arguments
env=None, # Optional environment variables
)
async def agent_loop(prompt: str, client: genai.Client, session: ClientSession):
contents = [types.Content(role="user", parts=[types.Part(text=prompt)])]
# Initialize the connection
await session.initialize()
# --- 1. Get Tools from Session and convert to Gemini Tool objects ---
mcp_tools = await session.list_tools()
tools = types.Tool(function_declarations=[
{
"name": tool.name,
"description": tool.description,
"parameters": tool.inputSchema,
}
for tool in mcp_tools.tools
])
# --- 2. Initial Request with user prompt and function declarations ---
response = await client.aio.models.generate_content(
model=model, # Or your preferred model supporting function calling
contents=contents,
config=types.GenerateContentConfig(
temperature=0,
tools=[tools],
), # Example other config
)
# --- 3. Append initial response to contents ---
contents.append(response.candidates[0].content)
# --- 4. Tool Calling Loop ---
turn_count = 0
max_tool_turns = 5
while response.function_calls and turn_count < max_tool_turns:
turn_count += 1
tool_response_parts: List[types.Part] = []
# --- 4.1 Process all function calls in order and return in this turn ---
for fc_part in response.function_calls:
tool_name = fc_part.name
args = fc_part.args or {} # Ensure args is a dict
print(f"Attempting to call MCP tool: '{tool_name}' with args: {args}")
tool_response: dict
try:
# Call the session's tool executor
tool_result = await session.call_tool(tool_name, args)
print(f"MCP tool '{tool_name}' executed successfully.")
if tool_result.isError:
tool_response = {"error": tool_result.content[0].text}
else:
tool_response = {"result": tool_result.content[0].text}
except Exception as e:
tool_response = {"error": f"Tool execution failed: {type(e).__name__}: {e}"}
# Prepare FunctionResponse Part
tool_response_parts.append(
types.Part.from_function_response(
name=tool_name, response=tool_response
)
)
# --- 4.2 Add the tool response(s) to history ---
contents.append(types.Content(role="user", parts=tool_response_parts))
print(f"Added {len(tool_response_parts)} tool response parts to history.")
# --- 4.3 Make the next call to the model with updated history ---
print("Making subsequent API call with tool responses...")
response = await client.aio.models.generate_content(
model=model,
contents=contents, # Send updated history
config=types.GenerateContentConfig(
temperature=1.0,
tools=[tools],
), # Keep sending same config
)
contents.append(response.candidates[0].content)
if turn_count >= max_tool_turns and response.function_calls:
print(f"Maximum tool turns ({max_tool_turns}) reached. Exiting loop.")
print("MCP tool calling loop finished. Returning final response.")
# --- 5. Return Final Response ---
return response
async def run():
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read,
write,
) as session:
# Test prompt
prompt = "I want to book an apartment in Paris for 2 nights. 03/28 - 03/30"
print(f"Running agent loop with prompt: {prompt}")
# Run agent loop
res = await agent_loop(prompt, client, session)
return res
res = await run()
print(res.text)
ماذا عن الأمان، التحديثات، والمصادقة؟
MCP هو بروتوكول حي ومتطور باستمرار. تتم صيانة المواصفات بنشاط على GitHub، وكان آخر تحديث بتاريخ 26/03، وقد تضمّن تحسينات في الأمان، وقابلية التوسع، وسهولة الاستخدام.
- المصادقة والأمان (OAuth 2.1): يفرض البروتوكول الآن استخدام إطار عمل OAuth 2.1 لمصادقة الخوادم البعيدة عبر HTTP.
- تحسين النقل والكفاءة: سيتم استبدال طريقة النقل السابقة (HTTP مع Server-Sent Events) بنقل أكثر مرونة يسمى Streamable HTTP، بالإضافة إلى دعم التجميع (Batching) باستخدام JSON-RPC.
- سياق وتحكم أكثر ثراءً: توفّر التعليقات التوضيحية الجديدة (Tool Annotations) مزيدًا من البيانات الوصفية حول سلوك الأداة، مثل ما إذا كانت «للقراءة فقط» أو «مدمرة» (تُجري تغييرات).