MCP مقابل استدعاء الدوال: الفروق مع أمثلة من OpenAI وClaude
MCP واستدعاء الدوال يحلّان مشكلتين مختلفتين. يتيح استدعاء الدوال للنموذج طلب تنفيذ إجراء، بينما يمنح MCP التطبيقات بروتوكولًا مشتركًا للعثور على الأدوات. يقارن هذا المقال بين الاثنين بأمثلة برمجية من OpenAI وClaude، مع قائمة مراجعة أمنية وقاعدة بسيطة للاختيار.
اختيار الطبقة الخاطئة يعني أنك ستعيد بناء التكامل نفسه مرتين. يبدو MCP مقابل استدعاء الدوال كمفترق طرق، لكنهما يقعان على مستويين مختلفين من المكدّس نفسه. استدعاء الدوال هو الطريقة التي يطلب بها النموذج تنفيذ إجراء. أما بروتوكول سياق النموذج (MCP) فهو الطريقة التي يعثر بها التطبيق على الأدوات التي ينفّذ عليها ذلك الإجراء ويصل إليها.
الجواب المختصر، قبل أي شيفرة: استدعاء الدوال ميزة في النموذج، وMCP بروتوكول اتصال، ومعظم إعدادات MCP تستخدم استدعاء الدوال في الخلفية. مع أداتين أو ثلاث داخل تطبيق واحد، يكون استدعاء الدوال العادي أبسط. أما عندما تحتاج عدة تطبيقات إلى الأدوات نفسها، فإن MCP يُثبت جدواه بسرعة. توضح الأقسام التالية أمثلة من OpenAI وClaude للطريقتين، جنبًا إلى جنب.
ماذا يفعل استدعاء الدوال فعليًا
نموذج اللغة لا يُنتج سوى نص. يمنح استدعاء الدوال هذا النص شكلًا يمكن للشيفرة أن تثق به. مع كل طلب ترسل قائمة من تعريفات الأدوات: اسم، ووصف بلغة بسيطة، ومخطط JSON Schema للمعاملات. عندما يقرر النموذج أن أداة ما مطلوبة، لا يشغّل أي شيء. بل يعيد استدعاءً منظمًا يتضمن اسم الأداة ومعاملاتها، وتقوم شيفرتك بالعمل.
حلقة الطلب والاستجابة
يرسل تطبيقك رسالة المستخدم مع تعريفات الأدوات.
يجيب النموذج باستدعاء أداة بدلًا من نص نهائي.
تشغّل شيفرتك الدالة وتلتقط النتيجة.
ترسل النتيجة مرة أخرى كرسالة جديدة.
يكتب النموذج الإجابة النهائية، أو يطلب أداة أخرى.
💡 نصيحة: النموذج لا ينفّذ الشيفرة أبدًا. هو يقترح استدعاءً، والتطبيق يقرر إن كان سيشغّله. هذه الفجوة بالتحديد هي المكان الذي تُوضع فيه فحوص الصلاحيات وتسجيل الأحداث.
أين يعيش المخطط
تعيش التعريفات في قاعدة الشيفرة الخاصة بك، غالبًا بجوار الدالة التي تصفها. يسمّي OpenAI حقل المخطط parameters. ويسمّيه Claude input_schema. يختلف الغلاف قليلًا بين المزوّدين، لذا تحتاج أداة كُتبت لأحدهم إلى مهايئ خفيف لتعمل مع الآخر.
هذه هي التكلفة الحقيقية لاستدعاء الدوال العادي: كل تطبيق يحتفظ بنسخته الخاصة من كل تعريف، وكل مزوّد يريد صيغته الخاصة. إذا بنيت عملية البحث نفسها عن الطلبات لتطبيق دردشة، وإضافة لمحرر أكواد، وروبوت دعم، فستصون ثلاث نسخ.
ما الذي يضيفه MCP فوق ذلك
أطلقت Anthropic بروتوكول MCP في نوفمبر 2024 كبروتوكول مفتوح، وتبنّته OpenAI في مارس 2025. يوحّد MCP طريقة وصف الأدوات وسردها واستدعائها، فتعمل الأداة المكتوبة مرة واحدة كـ خادم MCP في كل عميل يتحدث البروتوكول. إنه المنفذ القياسي في الصورة أعلاه: شكل موصل واحد لأجهزة كثيرة. فبدلًا من N تطبيق مضروبًا في M أداة من الغراء البرمجي المخصص، تبني N عميلًا وM خادمًا.
المضيف والعميل والخادم
لدى MCP ثلاثة أدوار:
المضيف: التطبيق الذي يراه المستخدم، مثل تطبيق دردشة أو محرر أكواد أو وكيلك الخاص.
العميل: موصل داخل المضيف يحتفظ بجلسة واحدة مع خادم واحد.
الخادم: برنامج صغير يعرض الأدوات والبيانات والأوامر النصية.
تُرسل الرسائل باستخدام JSON-RPC 2.0. تتواصل الخوادم المحلية عبر stdio، وتتواصل الخوادم البعيدة عبر Streamable HTTP. يفتح العميل جلسة، ويسأل الخادم عمّا يقدّمه، ثم يستدعي الأشياء بأسمائها.
الأدوات والموارد والأوامر النصية
يستطيع الخادم أن يعرض ثلاثة أنواع من القدرات:
العنصر
ما هو
من يتحكم فيه
الأدوات
إجراءات أو عمليات حسابية يستطيع النموذج استدعاءها
النموذج
الموارد
بيانات قابلة للقراءة يحددها URI، مثل ملف أو سجل
التطبيق
الأوامر النصية
قوالب رسائل قابلة لإعادة الاستخدام
المستخدم
تتداخل الأدوات وحدها مع استدعاء الدوال. الموارد والأوامر النصية ليس لها ردّ قياسي في استدعاء الدوال العادي، وهذا جزء من السبب الذي يدفع الناس إلى اللجوء إلى MCP.
إليك حركة البيانات على الشبكة لأداة واحدة. يطلب العميل من الخادم أدواته:
يرد الخادم بتعريفات تشبه تلك التي تكتبها بيدك، مع فارق أن حقل المخطط هو inputSchema بصيغة camelCase:
{"jsonrpc": "2.0", "id": 1, "result": {"tools": [{
"name": "get_order_status",
"description": "Look up the shipping status of an order by its ID.",
"inputSchema": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"]
}
}]}}
لاحقًا، عندما يطلب النموذج تلك الأداة، يرسل العميل:
نعم، فالنموذج ما زال يستدعي الأدوات عبر استدعاء الدوال
جهد الإعداد
دقائق
بضع ساعات لأول خادم، ودقائق لخادم موجود
الأنسب في
عدد قليل من الأدوات، ومنطق تطبيق خاص
الأدوات المشتركة والتكاملات مع أطراف ثالثة
كيف تتحول استدعاءات MCP إلى استدعاءات دوال
الاثنان ليسا منافسين، لأن MCP يغذّي استدعاء الدوال. إليك المسار الكامل لطلب واحد في إعداد MCP:
يسرد عميل MCP الأدوات من كل خادم متصل.
يحوّلها إلى صيغة الأدوات الخاصة بالمزوّد، ويرسلها مع الطلب.
يعيد النموذج استدعاء دالة عاديًا.
يمرّره عميل MCP إلى الخادم المناسب باسم tools/call.
تعود نتيجة الخادم إلى النموذج كنتيجة أداة عادية.
من وجهة نظر النموذج، لم يتغير شيء. رأى تعريفات أدوات وأصدر استدعاءً. ما تغيّر هو من كتب التعريفات ومن شغّل الدالة.
💡 قاعدة عامة: إذا استطعت أن تشير إلى سطر من شيفرتك الخاصة الذي يشغّل الدالة، فأنت تستخدم استدعاء الدوال العادي. وإذا كان خادم منفصل هو من يشغّلها، فأنت تستخدم MCP، مع بقاء استدعاء الدوال قائمًا بين النموذج والعميل.
أمثلة OpenAI وClaude بالشيفرة
الأداة نفسها بأربع طرق: البحث عن حالة طلب. تستخدم الأمثلة Python، وعنوان خادم MCP هنا عنصر نائب تستبدله بعنوانك.
استدعاء الدوال في OpenAI
تستخدم هذه النسخة واجهة Responses API مع GPT 5. تعرّف الأداة، وتشغّل الدالة بنفسك، ثم ترسل عنصر function_call_output مرة أخرى.
import json
from openai import OpenAI
client = OpenAI()
def get_order_status(order_id: str) -> dict:
return {"order_id": order_id, "status": "shipped", "eta": "2026-10-09"}
tools = [{
"type": "function",
"name": "get_order_status",
"description": "Look up the shipping status of an order by its ID.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
"additionalProperties": False,
},
"strict": True,
}]
input_items = [{"role": "user", "content": "Where is order 8841?"}]
response = client.responses.create(model="gpt-5", tools=tools, input=input_items)
input_items += response.output
for item in response.output:
if item.type == "function_call":
result = get_order_status(**json.loads(item.arguments))
input_items.append({
"type": "function_call_output",
"call_id": item.call_id,
"output": json.dumps(result),
})
final = client.responses.create(model="gpt-5", tools=tools, input=input_items)
print(final.output_text)
MCP البعيد في OpenAI
السؤال نفسه، دون مخطط ولا حلقة في شيفرتك. تتصل API بالخادم، وتسرد أدواته، وتستدعيها نيابةً عنك.
response = client.responses.create(
model="gpt-5",
tools=[{
"type": "mcp",
"server_label": "orders",
"server_url": "https://mcp.example.com/mcp",
"require_approval": "always",
}],
input="Where is order 8841?",
)
print(response.output_text)
عند ضبط require_approval على "always"، تتضمن الاستجابة طلب موافقة لكل استدعاء، وشيفرتك هي من يقرر السماح به أم لا. استخدم "never" فقط للخوادم التي تثق بها تمامًا.
استخدام الأدوات في Claude
تتبع Messages API الحلقة نفسها بأسماء حقول مختلفة. يوضع المخطط في input_schema، ويشير النموذج إلى الاستدعاء باستخدام stop_reason == "tool_use"، وتجيب ببلوك tool_result.
import json
import anthropic
client = anthropic.Anthropic()
tools = [{
"name": "get_order_status",
"description": "Look up the shipping status of an order by its ID.",
"input_schema": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
}]
messages = [{"role": "user", "content": "Where is order 8841?"}]
response = client.messages.create(
model="claude-sonnet-5-5", max_tokens=1024, tools=tools, messages=messages
)
if response.stop_reason == "tool_use":
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type == "tool_use":
output = get_order_status(**block.input)
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": json.dumps(output),
})
messages.append({"role": "user", "content": results})
response = client.messages.create(
model="claude-sonnet-5-5", max_tokens=1024, tools=tools, messages=messages
)
print(response.content[-1].text)
أرسل كل tool_result من دورة واحدة في رسالة مستخدم واحدة. تقسيمها على رسائل متفرقة يعلّم النموذج التوقف عن استدعاء الأدوات بالتوازي.
موصل MCP في Claude
يحتاج موصل MCP إلى جزأين: الخادم في mcp_servers، وإدخال مطابق mcp_toolset في tools. كما أنه خلف ترويسة beta، ويصل إلى الخوادم البعيدة عبر HTTP، لا عبر الخوادم المحلية من نوع stdio.
قارن بين الأربعة. نسخ MCP أقصر لأن المخطط والحلقة انتقلا خارج شيفرتك. الثمن هنا هو فقدان التحكم: تسلّم الحلقة إلى API وتثق بكل ما يقوله الخادم عن نفسه.
فخاخ الأمان والتكلفة التي يجب الانتباه إليها
أوصاف الأدوات غير الموثوقة
تتدفق أسماء الأدوات وأوصافها ونتائجها كلها إلى سياق النموذج. يستطيع خادم غير حذر أو عدائي أن يخفي فيها تعليمات، وهذا مسار لحقن الأوامر النصية. يحمل استدعاء الدوال العادي الخطر نفسه مع نتائج الأدوات، لكن MCP يوسّعه لأن أطرافًا ثالثة هي من تكتب الأوصاف.
اربط فقط بالخوادم التي تثق بها، وثبّت الإصدارات حيث أمكن.
أبقِ الموافقة البشرية على أي إجراء يكتب أو يرسل أو يحذف.
امنح كل خادم أضيق بيانات اعتماد تظل تعمل.
سجّل كل استدعاء مع معاملاته.
تكلفة التوكنات لقوائم الأدوات الطويلة
يُرسَل كل تعريف كتوكنات إدخال مع كل طلب. أربعون أداة بأوصاف طويلة قد تضيف آلاف التوكنات قبل أن يكتب المستخدم كلمة واحدة. يجعل MCP هذا الأمر سهلًا دون قصد، لأن ربط خادم واحد يسحب كل أدواته دفعة واحدة.
ثلاثة حلول تعمل جيدًا:
اربط فقط الخوادم التي تحتاج إليها مهمة معينة.
اختصر الأوصاف إلى ما يحتاج النموذج إلى معرفته لاختيار الأداة.
حمّل التعريفات عند الطلب، مثلًا باستخدام أداة البحث عن الأدوات في Claude، واجعل الجزء الثابت من القائمة قابلًا للتخزين المؤقت.
💡 أخطاء شائعة: ربط كل خادم بكل طلب، والموافقة التلقائية على إجراءات الكتابة، وتخطي سجلات الاستدعاء. تجنّب كل واحد منها كلفته قليلة في اليوم الأول، وإصلاحه بعد حادثة مكلفة جدًا.
متى تختار كلًا منهما
اختر استدعاء الدوال عندما
لديك عدد قليل من الأدوات يستخدمها تطبيق واحد.
تحتاج الأدوات إلى وصول داخل العملية إلى حالتك الخاصة، مثل جلسة قاعدة البيانات أو المستخدم المسجّل الدخول.
تريد التحكم الكامل في زمن الاستجابة وإعادة المحاولة وشاشات الموافقة.
تبني نموذجًا أوليًا وتريد أقل عدد من الأجزاء المتحركة.
اختر MCP عندما
تحتاج عدة عملاء إلى الأدوات نفسها: تطبيق دردشة، ومحرر أكواد، ووكيل.
يوفّر طرف ثالث خادم MCP جاهزًا للخدمة التي تحتاجها.
تملك فرق مختلفة الأدوات والتطبيقات، ولا ينبغي أن يعيق بعضها بعضًا.
تريد التبديل بين مزوّدي النماذج دون إعادة كتابة غراء الأدوات.
تنتهي أغلب مجموعات الأدوات في بيئات الإنتاج إلى خليط من الاثنين. يبقى المنطق الخاص أدوات استدعاء دوال داخل العملية، وتصل القدرات المشتركة أو القادمة من أطراف ثالثة عبر خوادم MCP. يصل الاثنان إلى النموذج عبر واجهة استدعاء الدوال نفسها، لذا فالمزج بينهما لا يكلّف تقريبًا شيئًا.
خادم MCP حقيقي: PicassoIA
تعرض PicassoIA توليد الصور والفيديو عبر موصل MCP، ما يجعلها مثالًا مفيدًا على خيارات التصميم السابقة. يستغرق التوليد وقتًا، لذا قُسّمت الأدوات إلى أدوات لبدء المهام وأداة لفحص الحالة. هذا هو الشكل نفسه الذي تبنيه يدويًا بدالتين معرّفتين.
ما يعرضه الموصل
الأداة
ماذا تفعل
generate_image
تبدأ مهمة صورة وتعيد معرّف التنبؤ
edit_image
تبدأ تعديل صورة موجودة
generate_video_picassoia
تبدأ مهمة فيديو باستخدام نموذج فيديو PicassoIA
generate_video_seedance
تبدأ مهمة فيديو باستخدام Seedance
get_generation
تستعلم عن تنبؤ حتى ينجح أو يفشل
list_generations
تسرد التوليدات السابقة
cancel_generation
تلغي مهمة ما زالت في قائمة الانتظار أو قيد التشغيل
list_models
تعرض النماذج التي يستطيع حسابك استخدامها
get_account
تعرض خطتك وحدود التشغيل المتوازي
يستحق هذا النمط النسخ في خوادمك الخاصة: أعِد معرّفًا بسرعة، واستعلم عن الحالة بأداة منفصلة، وامنح النموذج أداة إلغاء كي يتمكن من التراجع عن تشغيل فاشل. تسرد وثائق المطوّرين 5 تنبؤات متزامنة لكل حساب، مشتركة بين بيانات اعتماد API واتصالات MCP، لذا يستعلم العميل المنضبط بدلًا من إطلاق كل شيء دفعة واحدة. والمهام نفسها متاحة أيضًا عبر REST API بأسلوب Replicate على https://api.picassoia.com/v1. راجع صفحة الأسعار لمعرفة الخطط التي تشمل الوصول إلى API و MCP.
كيفية استخدام Claude Sonnet 5 على PicassoIA
قبل ربط الشيفرة، يمكنك صياغة مخططات الأدوات وتجربة الأوامر النصية في صفحة Claude Sonnet 5. تعرض صفحة النموذج هذه المدخلات:
الأمر النصي: اكتب الطلب، مثلًا: "اكتب JSON Schema لأداة اسمها get_order_status تأخذ معرّف طلب وتعيد حالة الشحن."
System prompt (اختياري): حدّد دورًا مرة واحدة، مثل "أنت مصمّم API. أجب بصيغة JSON فقط."
الجهد (Effort): القيمة الافتراضية هي low، وهي توقف التفكير لتحصل على أسرع الردود وأرخصها. انتقل إلى high أو max لخطأ معقّد يمتد عبر ملفات متعددة، أو لتصميم يضم أدوات كثيرة. المستويات هي low، medium، high، xhigh، و max.
الحد الأقصى للتوكنات: القيمة الافتراضية هي 8192، وهي كافية لمخطط كامل مع شرح.
الصورة (اختياري): أرفق لقطة شاشة لخطأ أو مخطط تخطيطي أولي للواجهة كسياق إضافي.
التشغيل والمقارنة: أرسل الأمر النصي نفسه إلى GPT 5 وانظر أي المخططين أنظف.
💡 نصيحة: اطلب المخطط أولًا، ثم اطلب من النموذج أن ينتقد وصفه بنفسه. الأوصاف القصيرة والمحددة تجعل الأداة أسهل في الاختيار الصحيح.
أنشئ صورك الخاصة مع Picasso IA
بدأت كل صورة في هذا المقال كأمر نصي: لوحة مثقبة، ولوحة تحويل، وفهرس بطاقات، ومفترق طرق. كل واحدة تحوّل فكرة مجردة إلى شيء يمكنك رؤيته، والوصفة نفسها تنفع لمنشوراتك ووثائقك وعروضك التقديمية.
استخدم هذا الهيكل: الموضوع والحركة، والبيئة، والإضاءة، والكاميرا والعدسة، وتفاصيل الملمس. مثلًا: "لقطة مقرّبة ليد توصل كابلًا بحاسوب محمول على مكتب من خشب البلوط، ضوء نافذة ناعم من اليمين، عدسة ماكرو 100 مم، عمق ميدان ضحل، ملمس ألومنيوم مصقول."
افتح Picasso IA، واختر نموذج تحويل النص إلى صورة من قائمة النماذج الكاملة، والصق أمرًا نصيًا بهذا الشكل، ثم شغّله. غيّر تفصيلة واحدة في كل مرة، مثل العدسة أو اتجاه الضوء، وراقب كيف يتغير الناتج. إذا كنت تعمل بالفعل في Claude، فاربط موصّل PicassoIA MCP من حسابك واطلب الصور مباشرة من المحادثة. جرّب ثلاث تنويعات لفكرة واحدة اليوم، واحتفظ بأفضلها.