MCP مقابل استدعاء الدوال: الفروق مع أمثلة من OpenAI وClaude

MCP واستدعاء الدوال يحلّان مشكلتين مختلفتين. يتيح استدعاء الدوال للنموذج طلب تنفيذ إجراء، بينما يمنح MCP التطبيقات بروتوكولًا مشتركًا للعثور على الأدوات. يقارن هذا المقال بين الاثنين بأمثلة برمجية من OpenAI وClaude، مع قائمة مراجعة أمنية وقاعدة بسيطة للاختيار.

MCP مقابل استدعاء الدوال: الفروق مع أمثلة من OpenAI وClaude
Cristian Da Conceicao
مؤسس Picasso IA

اختيار الطبقة الخاطئة يعني أنك ستعيد بناء التكامل نفسه مرتين. يبدو MCP مقابل استدعاء الدوال كمفترق طرق، لكنهما يقعان على مستويين مختلفين من المكدّس نفسه. استدعاء الدوال هو الطريقة التي يطلب بها النموذج تنفيذ إجراء. أما بروتوكول سياق النموذج (MCP) فهو الطريقة التي يعثر بها التطبيق على الأدوات التي ينفّذ عليها ذلك الإجراء ويصل إليها.

الجواب المختصر، قبل أي شيفرة: استدعاء الدوال ميزة في النموذج، وMCP بروتوكول اتصال، ومعظم إعدادات MCP تستخدم استدعاء الدوال في الخلفية. مع أداتين أو ثلاث داخل تطبيق واحد، يكون استدعاء الدوال العادي أبسط. أما عندما تحتاج عدة تطبيقات إلى الأدوات نفسها، فإن MCP يُثبت جدواه بسرعة. توضح الأقسام التالية أمثلة من OpenAI وClaude للطريقتين، جنبًا إلى جنب.

يد على وشك توصيل كابل USB-C بمنفذ حاسوب محمول بجانب موزّع من الألومنيوم

ماذا يفعل استدعاء الدوال فعليًا

نموذج اللغة لا يُنتج سوى نص. يمنح استدعاء الدوال هذا النص شكلًا يمكن للشيفرة أن تثق به. مع كل طلب ترسل قائمة من تعريفات الأدوات: اسم، ووصف بلغة بسيطة، ومخطط JSON Schema للمعاملات. عندما يقرر النموذج أن أداة ما مطلوبة، لا يشغّل أي شيء. بل يعيد استدعاءً منظمًا يتضمن اسم الأداة ومعاملاتها، وتقوم شيفرتك بالعمل.

حلقة الطلب والاستجابة

  1. يرسل تطبيقك رسالة المستخدم مع تعريفات الأدوات.
  2. يجيب النموذج باستدعاء أداة بدلًا من نص نهائي.
  3. تشغّل شيفرتك الدالة وتلتقط النتيجة.
  4. ترسل النتيجة مرة أخرى كرسالة جديدة.
  5. يكتب النموذج الإجابة النهائية، أو يطلب أداة أخرى.

💡 نصيحة: النموذج لا ينفّذ الشيفرة أبدًا. هو يقترح استدعاءً، والتطبيق يقرر إن كان سيشغّله. هذه الفجوة بالتحديد هي المكان الذي تُوضع فيه فحوص الصلاحيات وتسجيل الأحداث.

يد نجار ترفع مطرقة من مخططها المرسوم على لوحة حائط مثقبة

أين يعيش المخطط

تعيش التعريفات في قاعدة الشيفرة الخاصة بك، غالبًا بجوار الدالة التي تصفها. يسمّي 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.

إليك حركة البيانات على الشبكة لأداة واحدة. يطلب العميل من الخادم أدواته:

{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}

يرد الخادم بتعريفات تشبه تلك التي تكتبها بيدك، مع فارق أن حقل المخطط هو 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"]
  }
}]}}

لاحقًا، عندما يطلب النموذج تلك الأداة، يرسل العميل:

{"jsonrpc": "2.0", "id": 2, "method": "tools/call",
 "params": {"name": "get_order_status", "arguments": {"order_id": "8841"}}}

يد تفتح درج بطاقات فهرس خشبي مليء ببطاقات الفهرسة

MCP مقابل استدعاء الدوال جنبًا إلى جنب

السؤالاستدعاء الدوالMCP
ما هو؟ميزة في API النموذجبروتوكول مفتوح بين التطبيقات وخوادم الأدوات
أين تعيش التعريفات؟في شيفرة تطبيقك، تُرسل مع كل طلبعلى الخادم، وتُدرج عند الطلب باستخدام tools/list
من يشغّل الأداة؟عملية تطبيقكخادم MCP، محليًا أو عن بُعد
إعادة الاستخدام عبر التطبيقاتنسخ وتكييف لكل تطبيقاكتبه مرة واحدة، واتصل به من أي عميل
هل يحتاج إلى الآخر؟لانعم، فالنموذج ما زال يستدعي الأدوات عبر استدعاء الدوال
جهد الإعداددقائقبضع ساعات لأول خادم، ودقائق لخادم موجود
الأنسب فيعدد قليل من الأدوات، ومنطق تطبيق خاصالأدوات المشتركة والتكاملات مع أطراف ثالثة

منظر علوي لجراب مفك براغٍ واحد بجوار مجموعة رؤوس قابلة للتبديل في علبة صلبة

كيف تتحول استدعاءات MCP إلى استدعاءات دوال

الاثنان ليسا منافسين، لأن MCP يغذّي استدعاء الدوال. إليك المسار الكامل لطلب واحد في إعداد MCP:

  1. يسرد عميل MCP الأدوات من كل خادم متصل.
  2. يحوّلها إلى صيغة الأدوات الخاصة بالمزوّد، ويرسلها مع الطلب.
  3. يعيد النموذج استدعاء دالة عاديًا.
  4. يمرّره عميل MCP إلى الخادم المناسب باسم tools/call.
  5. تعود نتيجة الخادم إلى النموذج كنتيجة أداة عادية.

من وجهة نظر النموذج، لم يتغير شيء. رأى تعريفات أدوات وأصدر استدعاءً. ما تغيّر هو من كتب التعريفات ومن شغّل الدالة.

💡 قاعدة عامة: إذا استطعت أن تشير إلى سطر من شيفرتك الخاصة الذي يشغّل الدالة، فأنت تستخدم استدعاء الدوال العادي. وإذا كان خادم منفصل هو من يشغّلها، فأنت تستخدم 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.

response = client.beta.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{
        "type": "url",
        "url": "https://mcp.example.com/mcp",
        "name": "orders",
    }],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "orders"}],
    messages=[{"role": "user", "content": "Where is order 8841?"}],
)

قارن بين الأربعة. نسخ MCP أقصر لأن المخطط والحلقة انتقلا خارج شيفرتك. الثمن هنا هو فقدان التحكم: تسلّم الحلقة إلى API وتثق بكل ما يقوله الخادم عن نفسه.

فخاخ الأمان والتكلفة التي يجب الانتباه إليها

أوصاف الأدوات غير الموثوقة

تتدفق أسماء الأدوات وأوصافها ونتائجها كلها إلى سياق النموذج. يستطيع خادم غير حذر أو عدائي أن يخفي فيها تعليمات، وهذا مسار لحقن الأوامر النصية. يحمل استدعاء الدوال العادي الخطر نفسه مع نتائج الأدوات، لكن MCP يوسّعه لأن أطرافًا ثالثة هي من تكتب الأوصاف.

  • اربط فقط بالخوادم التي تثق بها، وثبّت الإصدارات حيث أمكن.
  • أبقِ الموافقة البشرية على أي إجراء يكتب أو يرسل أو يحذف.
  • امنح كل خادم أضيق بيانات اعتماد تظل تعمل.
  • سجّل كل استدعاء مع معاملاته.

قفل ثقيل وسلسلة على خزانة معدات مقفلة في غرفة شبكات

تكلفة التوكنات لقوائم الأدوات الطويلة

يُرسَل كل تعريف كتوكنات إدخال مع كل طلب. أربعون أداة بأوصاف طويلة قد تضيف آلاف التوكنات قبل أن يكتب المستخدم كلمة واحدة. يجعل MCP هذا الأمر سهلًا دون قصد، لأن ربط خادم واحد يسحب كل أدواته دفعة واحدة.

ثلاثة حلول تعمل جيدًا:

  1. اربط فقط الخوادم التي تحتاج إليها مهمة معينة.
  2. اختصر الأوصاف إلى ما يحتاج النموذج إلى معرفته لاختيار الأداة.
  3. حمّل التعريفات عند الطلب، مثلًا باستخدام أداة البحث عن الأدوات في 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. تعرض صفحة النموذج هذه المدخلات:

  1. الأمر النصي: اكتب الطلب، مثلًا: "اكتب JSON Schema لأداة اسمها get_order_status تأخذ معرّف طلب وتعيد حالة الشحن."
  2. System prompt (اختياري): حدّد دورًا مرة واحدة، مثل "أنت مصمّم API. أجب بصيغة JSON فقط."
  3. الجهد (Effort): القيمة الافتراضية هي low، وهي توقف التفكير لتحصل على أسرع الردود وأرخصها. انتقل إلى high أو max لخطأ معقّد يمتد عبر ملفات متعددة، أو لتصميم يضم أدوات كثيرة. المستويات هي low، medium، high، xhigh، و max.
  4. الحد الأقصى للتوكنات: القيمة الافتراضية هي 8192، وهي كافية لمخطط كامل مع شرح.
  5. الصورة (اختياري): أرفق لقطة شاشة لخطأ أو مخطط تخطيطي أولي للواجهة كسياق إضافي.
  6. التشغيل والمقارنة: أرسل الأمر النصي نفسه إلى GPT 5 وانظر أي المخططين أنظف.

💡 نصيحة: اطلب المخطط أولًا، ثم اطلب من النموذج أن ينتقد وصفه بنفسه. الأوصاف القصيرة والمحددة تجعل الأداة أسهل في الاختيار الصحيح.

أنشئ صورك الخاصة مع Picasso IA

بدأت كل صورة في هذا المقال كأمر نصي: لوحة مثقبة، ولوحة تحويل، وفهرس بطاقات، ومفترق طرق. كل واحدة تحوّل فكرة مجردة إلى شيء يمكنك رؤيته، والوصفة نفسها تنفع لمنشوراتك ووثائقك وعروضك التقديمية.

استخدم هذا الهيكل: الموضوع والحركة، والبيئة، والإضاءة، والكاميرا والعدسة، وتفاصيل الملمس. مثلًا: "لقطة مقرّبة ليد توصل كابلًا بحاسوب محمول على مكتب من خشب البلوط، ضوء نافذة ناعم من اليمين، عدسة ماكرو 100 مم، عمق ميدان ضحل، ملمس ألومنيوم مصقول."

افتح Picasso IA، واختر نموذج تحويل النص إلى صورة من قائمة النماذج الكاملة، والصق أمرًا نصيًا بهذا الشكل، ثم شغّله. غيّر تفصيلة واحدة في كل مرة، مثل العدسة أو اتجاه الضوء، وراقب كيف يتغير الناتج. إذا كنت تعمل بالفعل في Claude، فاربط موصّل PicassoIA MCP من حسابك واطلب الصور مباشرة من المحادثة. جرّب ثلاث تنويعات لفكرة واحدة اليوم، واحتفظ بأفضلها.

شارك هذا المقال

اختر لغتك

مقالات ذات صلة