معايير دمج التطبيقات المرتبطة ببروتوكول MCP

يحدّد خادم MCP إطار العمل لربط وظائف تطبيقك (أدوات MCP) بـ "منصة التطبيقات المرتبطة". لتمكينه من اختيار نتائج خدمتك واستدعائها ومعالجتها بشكل أكثر موثوقية، يجب أن تلتزم إعدادات MCP بدقة بالمعايير التالية.

المبادئ التوجيهية

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

تحديد الإصدار

لإتاحة عمليات نشر MCP قابلة للتوسّع وفعّالة، ننصحك باستخدام بنية معرّف موارد منتظم (URI) منظَّمة تستخدم الإصدارات المستندة إلى المسار، مثل ‎/v1 و‎/v2. يساعدك ذلك في الحفاظ على التوافق مع الأنظمة القديمة وحظر الميزات الجديدة. ويتيح استكمال ذلك بنطاقات فرعية خاصة بمقدّمي الخدمات، مثل https://gemini.mcp.company.com/mcp/v1، إدارة دقيقة لعدد الزيارات وتحسين تعريفات الأدوات المخصّصة للسياق الفريد وسلوكيات المعالجة لنماذج الذكاء الاصطناعي المختلفة.

التوافق مع إصدار بروتوكول MCP

تتوافق "منصة التطبيقات المرتبطة" مع مواصفات "بروتوكول سياق النموذج" (MCP) حتى الإصدار 2025-11-25. ولا تتوفّر بعد الإصدارات الأحدث من المواصفات.

  • مسؤولية المطوّر: تقع على عاتقك مسؤولية التأكّد من أنّ خادم MCP يلتزم بدقة بإصدار بروتوكول متوافق مع "منصة التطبيقات المتصلة" (2025-11-25) أثناء تأكيد الاتصال في initialize وعبر جميع تعريفات الأدوات والمخططات.
  • التوافق مع الأنظمة القديمة: مع اعتماد "منصة التطبيقات المرتبطة" لإصدارات أحدث من مواصفات MCP في المستقبل، سيحافظ عميلنا على التوافق مع الأنظمة القديمة لإصدارات البروتوكول المتوافقة سابقًا، وبالتالي ستستمر عمليات الدمج الحالية في قناة الإصدار العلني في العمل بدون انقطاع.
  • إدارة الترقيات: عندما تكون مستعدًا لاعتماد مواصفات MCP جديدة أو إجراء تغييرات على المخطط، يمكنك عرض هذه التحديثات على مسار URI جديد (على سبيل المثال، /mcp/v2) مع الحفاظ على نقطة النهاية الحالية (/mcp/v1) للزيارات النشطة.

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

مواصفات بروتوكول النقل

تتوافق منصة التطبيقات المرتبطة بشكل صارم مع مواصفات بروتوكول سياق النموذج (MCP) لنقل البيانات عبر Streamable HTTP الإصدار 2025-03-26 والإصدارات الأحدث. لا يتيح بروتوكول HTTP القديم مع بروتوكول النقل SSE الموضّح في مواصفات 2024-11-05.

  • نقطة نهاية HTTP واحدة: نقطة نهاية MCP المقدَّمة في "وحدة التحكّم الشاملة" (على سبيل المثال، https://api.example.com/mcp) هي عنوان URL الوحيد الذي ترسل إليه منتجات Google المعنيّة جميع طلبات JSON-RPC (initialize، tools/list، tools/call) من خلال HTTP POST العادي.
  • بث SSE ضمن Streamable HTTP لا يتوفّر نقل SSE القديم المتعدّد النقاط، ولكنّ أحداث Server-Sent Events، مثل text/event-stream، متاحة ضمن Streamable HTTP. تتضمّن الطلبات الصادرة من منتجات Google المعنيّة Accept: application/json, text/event-stream، ما يعني أنّ الخادم يمكنه إمّا عرض حمولة بيانات application/json عادية أو بثّ ردود تزايدية باستخدام Content-Type: text/event-stream مباشرةً في نص الردّ HTTP POST.
  • GET stream & 405 Method Not Allowed. قد يحاول العملاء استخدام بث GET اختياري على نقطة النهاية لإرسال الإشعارات من الخادم إلى العميل. إذا كان الخادم عديم الحالة أو يقتصر على الطلب والاستجابة، فإنّ عرض HTTP 405 Method Not Allowed يكون متوافقًا بشكل صريح ويتم التعامل معه بشكل واضح من خلال الخادم الوكيل للعميل في منتج Google المعنيّ.

تعليمات الخادم

تم تحسين "منصة التطبيقات المرتبطة" لتلقّي تعليمات الخادم، ما يتيح درجة من التحكّم في سلوك النموذج لا تتوفّر بوسائل أخرى.

اتّبِع تعليمات الخادم.

التعامل معها على أنّها "تلميح للنموذج" مع سياق الاستخدام

اتّبِع الإرشادات التالية في ما يتعلق بتقديم تلميحات للنماذج.

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

التكامل وليس التكرار

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

أمثلة على تعليمات الخادم

توضّح الأمثلة التالية الممارسات التي يجب اتّباعها وتلك التي يجب تجنّبها في ما يتعلّق بكتابة تعليمات الخادم بشكل صحيح.

يُنصح بها غير مقترَحة

أريدك أن تؤدي دور مشرف متخصص على مستودعات GitHub. يوفّر هذا الخادم وصولاً عميقًا إلى البيانات الوصفية للمستودعات وIssue Tracker وسير عمل طلبات الدمج. يمكنك استخدامها للحفاظ على سلامة المشروع وأتمتة عملية الفرز وضمان معايير الرموز البرمجية. يُفترض أن يتم تنفيذ جميع الإجراءات في سياق المؤسسة التي تمت مصادقتها ما لم يتم تحديد غير ذلك. امنح الأولوية لتحديد سلاسل المحادثات القديمة أو طلبات الدمج غير المرتبطة للحفاظ على تنظيم المستودع.

موجزة وتوجيهية ومكمّلة للنموذج

  • تحديد "ماذا" (سلامة المشروع، الفرز) بدلاً من "كيف"
  • يذكر نطاق المصادقة الذي ينطبق على جميع الأدوات

يحتوي هذا الخادم على أدوات لـ GitHub. يجب استخدام أداة "list_issues" عندما يطلب المستخدم الاطّلاع على المشاكل. يمكنك استخدام create_pull_request لإنشاء طلب دمج. استخدِم هذه الأدوات بعناية لمساعدة المستخدم في إدارة الرمز البرمجي. يجب دائمًا التحقّق من اسم المستودع قبل استدعاء أداة. إذا طلب المستخدم ملخّصًا، عليك استدعاء الأدوات أولاً ثم تلخيص الناتج

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

إرشادات الأداة

توضّح الإرشادات التالية أفضل الممارسات لإنشاء إعدادات خادم MCP لمختلف الوظائف أو الأدوات داخل تطبيقك.

اصطلاحات تسمية الأدوات

اتّبِع الإرشادات التالية لتسمية أداتك:

استخدام أسماء بديهية يمكن لشخص عادي قراءتها

استخدِم أسماء يمكن لشخص عادي قراءتها وذات معانٍ واضحة وبديهية بدلاً من الأسماء الغامضة. على سبيل المثال، get_user_information أكثر وضوحًا من userInfo.

اتّباع أسلوب الكتابة الصحيح للأحرف الكبيرة والصغيرة

يجب الالتزام بقواعد حالة الأحرف التالية لأسماء دوال الأدوات ومفاتيح تشغيل التطبيقات:

  • حالة الأحرف في وظيفة الأداة: استخدِم snake_case أو camelCase لأسماء وظائف الأدوات المحدّدة في مخطط MCP (على سبيل المثال، get_user_information أو publishDraft).
  • حالة مقبض مشغّل التطبيق لا تكون مشغّلات التطبيقات والإشارات إليها (مثل @MyTwoWordApp) غير حساسة لحالة الأحرف. تعمل المنصة على توحيد مدخلات المستخدمين عبر الأحرف الصغيرة (@mytwowordapp) وPascalCase (@MyTwoWordApp) و camelCase (@myTwoWordApp).
  • تنسيق الاسم المعروض: سجِّل عنوان تطبيقك الرسمي باستخدام PascalCase أو المسافات العادية لعرض مرئي واضح في عنصر في واجهة المستخدم.
  • التعامل مع الأخطاء الإملائية: في حين تتم معالجة الاختلافات في حالة الأحرف تلقائيًا، تعتمد الأخطاء الإملائية في الأحرف (مثل @mytwowrodapp) على التعرّف على العبارات الاحتياطية بدلاً من مطابقة السلسلة المباشرة. على المطوّرين تشجيع كتابة أسماء المعرّفات بشكل صحيح في المستندات

استخدام تسمية صريحة للفعل والاسم

استخدِم أسماء محدّدة لـ verb_noun وتجنَّب الغموض، على سبيل المثال، publish_draft أفضل من handle_content.

دقة الأداة

اتّبِع الإرشادات التالية في ما يتعلّق بدقة الأداة.

التعامل مع الأدوات كنقاط نهاية ذرية

يجب التعامل مع الأدوات كنقاط نهاية ذرية بدون شروط داخلية للأداة أو وظائف متعددة مع المَعلمات المطلوبة لكل منها. تتيح الأدوات الدقيقة للنموذج ربط الخطوات بشكل منطقي، ما يقلّل من الهلوسة.

استخدام مخططات أكثر بساطة

إذا كنت بحاجة إلى كائنات متداخلة بشكل عميق أو منطق مخطط oneOf / anyOf معقّد للتحقق من صحة المدخلات، فمن المرجح أن تكون أداتك واسعة النطاق للغاية.

مراعاة ضوابط التجميع المُسبَق والحمولة

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

  • الفلترة والتلخيص في الخلفية: يجب دائمًا فلترة مجموعات البيانات الكبيرة أو تجميعها مسبقًا أو تلخيصها على خادم MCP قبل إرسال الردود إلى منتجات Google المعنيّة.
  • تجنَّب عمليات التفريغ الأولية. يجب عدم تفريغ صفوف قاعدة البيانات الأولية أو السجلات الكاملة غير المفهرسة في حمولة عرض الأداة.

حذف الأدوات الداخلية والأدوات الوصفية

يجب عرض الإمكانات الموجّهة للنموذج فقط في استجابة tools/list من الخادم:

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

الإجراءات المسموح بها وغير المسموح بها في ما يتعلّق بدقة الأداة

تعرض الأمثلة التالية الممارسات التي يجب اتّباعها وتلك التي يجب تجنّبها في ما يتعلّق بتسمية الأدوات واستخدام التفاصيل الدقيقة.

يُنصح بها غير مقترَحة

أدوات دقيقة بأسماء ومَعلمات واضحة

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

...
@mcp.tool()
def create_user(email: str, role: str = "viewer") -> str:
    """Register a new user. Returns the new User ID."""
    # Logic is purely creation
    return "user_123"

@mcp.tool()
def delete_user(user_id: str) -> str:
    """Permanently remove a user by their ID."""
    # Logic is purely deletion
    return f"User {user_id} deleted"

@mcp.tool()
def update_user_role(user_id: str, new_role: str) -> str:
    """Change an existing user's permission level."""
    return f"User {user_id} is now {new_role}"

    ...

اسم الأداة: manage_user

الوصف: "استخدِم هذه الأداة لإنشاء مستخدمين أو تعديلهم أو حذفهم أو استردادهم".

...
@mcp.tool()
def manage_user(
    action: Literal["create", "update", "delete", "get"],
    user_id: Optional[str] = None,
    email: Optional[str] = None,
    role: Optional[str] = "viewer"
) -> str:
    """
    Use this to manage users.
    WARNING: logic is hidden inside Python, not visible in the schema.
    """
    if action == "create":
        if not email: return "Error: Email required for creation" # Runtime error, not schema error
        return f"Created user {email}"
    elif action == "delete":
        if not user_id: return "Error: User ID required"
        return f"Deleted {user_id}"
    
    return "Action completed"
    """
    ...

الإعلان عن التعليقات التوضيحية للأدوات من أجل الأمان

يمكنك ضبط تعليقات توضيحية للبروتوكول داخل تعريفات الأدوات لتوضيح سلوك التنفيذ وتفعيل إجراءات الأمان المضمّنة في منتجات Google المعنيّة:

  • بوابات التأكيد أثناء التشغيل: تستخدم منتجات Google المعنيّة annotations.destructiveHint: true وannotations.openWorldHint: true كعلامات رئيسية لتشغيل طلبات تأكيد المستخدم أثناء التشغيل. يجب تحديد السمة destructiveHint: true للإجراءات التي تغيّر الحالة أو إجراءات الكتابة أو الإجراءات المدمّرة، وضبط السمة openWorldHint: true للأدوات التي تتفاعل مع العالم المفتوح أو البيئات الخارجية لكي تطلب الواجهة من المستخدم تأكيد الإجراء قبل تنفيذه.
  • تلميح طلب البحث للقراءة فقط: يمكنك ضبط readOnlyHint: true على أدوات طلب البحث التي تجلب البيانات فقط بدون تعديل حالة الخلفية.
  • الإعدادات التلقائية للتعليقات التوضيحية الصريحة: وفقًا لمواصفات بروتوكول سياق النموذج، يؤدي حذف readOnlyHint إلى افتراض العملاء readOnlyHint: false وdestructiveHint: true تلقائيًا لأغراض الأمان. يضمن الإعلان صراحةً عن التعليقات التوضيحية في جميع الأدوات توجيه النموذج بشكل يمكن توقّعه وتنفيذ الإجراءات بأمان.

أوصاف الأدوات

الوصف هو السياق الوحيد الذي يملكه النموذج لتحديد ما إذا كانت أداتك قادرة على حلّ المشكلة الحالية. اتّبِع الإرشادات التالية لكتابة الأوصاف:

كتابة التعليمات وليس التعليقات

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

شرح "كيفية" حدوث ذلك

يساعد الوصف الجيد في سد الفجوة بين "لديّ أداة" و "أعرف كيفية دمج هذه الأداة في محادثة".

توضيح "السبب"

يجب تمييز هذه الأداة عن الأدوات المشابهة، على سبيل المثال، "استخدِم هذه الأداة للمستخدمين الداخليين، واستخدِم customer_update للمستخدمين الخارجيين".

أخبِر النموذج بمكان العثور على الوسيطات، على سبيل المثال، "من أداة order_search".

تحديد التنسيق

حدِّد الوحدات (أمتار مقابل أقدام) والتنسيقات (تواريخ ISO، والإصدارات الدلالية).

تجنُّب تقدير النموذج

لا تطلب من النموذج استخدام "أفضل تقدير" أو اقتراح إجراءات اختيارية غير موجَّهة.

أمثلة على أوصاف الأدوات

توضّح الأمثلة التالية الممارسات التي يجب اتّباعها وتلك التي يجب تجنّبها في ما يتعلّق بكتابة أوصاف الأدوات.

يُنصح بها غير مقترَحة

المرجع الموثوق

"تعديل عنوان البريد الإلكتروني لمستخدم: يجب استخدام المعرّف الفريد العالمي (UUID) الذي تعرضه أداة search_users بدقة. لا تستنتج أرقام تعريف المستخدمين أو تخمّنها".

(يربط بشكل صريح مخرجات أداة واحدة بمدخلات هذه الأداة.)

"يتم تعديل عنوان البريد الإلكتروني للمستخدم".

(قد يخمّن النموذج معرّفًا مثل 12345).

التنسيق والقيود

"تحديد موعد اجتماع يجب أن يكون "التاريخ" بتنسيق ISO 8601 ‏(YYYY-MM-DD). إذا قال المستخدم "غدًا" أو استخدم إشارة نسبية أخرى، احسب التاريخ استنادًا إلى السياق الحالي".

"تحديد موعد اجتماع في التاريخ المحدّد"

(يبدو صحيحًا للمستخدم (على سبيل المثال، "غدًا") ولكن يتعذّر التحقّق من صحة المخطط (يحتاج إلى "‎2025-10-12"))

توقّعات الناتج

"تسترد هذه الأداة سجلّات الخادم. لعرض آخر 50 سطرًا من النص الأوّلي لإجراء التحليل، اطلب فترات زمنية أصغر لتجنُّب تجاوز الحد الأقصى المسموح به للرموز المميّزة".

"الحصول على سجلّات الخادم"

(قد يستدعي النموذج أداة تتوقّع ملخّصًا، ويحصل على ملف JSON أولي بحجم 5 ميغابايت، وقد يؤدي ذلك إلى تجربة سيئة للمستخدم).

@mcp.tool()
def update_campaign_status(campaign_id: str, status: str) -> str:
    """
    Promotes or pauses an advertising campaign.
    
    CRITICAL USAGE RULES:
    1. 'campaign_id': Must be the 32-character UUID retrieved from 'list_campaigns'.
    2. 'status': Must be exactly one of: ['active', 'paused', 'archived'].
    
    Returns: A confirmation string with the new status and timestamp.
    """
    # Logic...

    ...

هذا الوصف بمثابة دليل مصغّر. وتتعامل مع "المصدر" (مكان الحصول على المعرّف) و"القيود" (التعدادات الصالحة) و"الإجراء".

@mcp.tool()
def update_campaign_status(id: str, status: str) -> str:
    """
    Updates the campaign status in the database.
    """
    # Logic...

يعتمد هذا على أسماء المتغيرات للقيام بكل العمل. يترك هذا النموذج يخمّن القيم الصالحة لـ "status"

مَعلمات الأداة

بالإضافة إلى الأداة نفسها، يجب وصف المَعلمات لجعلها واضحة.

الأنواع الصريحة

استخدِم أنواعًا قوية ومحدّدة (string وinteger وboolean وarray).

استخدام التعدادات لمجموعات القيم الثابتة

إذا كانت المَعلمة تقبل فقط مجموعة ثابتة من القيم (مثل daylight أو cool أو warm)، أدرِجها في مصفوفة enum. يؤدي ذلك إلى تحسين الدقة بشكل كبير.

تحديد المَعلمات المطلوبة بوضوح

حدِّد بوضوح المَعلمات الإلزامية لتشغيل الدالة.

تطبيق مطابقة المخطط الدلالي

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

أمثلة على مَعلمات الأدوات

توضّح الأمثلة التالية الممارسات التي يجب اتّباعها وتلك التي يجب تجنّبها في ما يتعلّق بمعالجة مَعلمات الأدوات.

يُنصح بها غير مقترَحة

تنسيقات الوسيطات ووحداتها

radius: "النطاق الجغرافي بالأمتار. يجب أن تكون القيمة عددًا عشريًا أكبر من 0."

(يمنع هلوسة الوحدات)

radius: "نصف قطر الدائرة"

تنسيقات مستندات التعريف وسياقها

‫user_id: المعرّف الفريد العالمي (UUID) لقاعدة البيانات (على سبيل المثال، ‎550e8400-e29b...). لا تستخدِم عناوين البريد الإلكتروني هنا".

ملاحظة: من أفضل الممارسات التعامل مع جميع حقول أرقام التعريف الرقمية على أنّها قيم "سلسلة". على وجه الخصوص، إذا كان المعرّف يتألف من 10 أرقام أو أكثر، قد يتم اقتطاعه من خلال الأنظمة الداخلية (يتم فرض حاوية 32 بت) ويستخدم النموذج هذه النسخة في طلبات الأدوات المستقبلية.

(يمنع الأخطاء المتعلقة بالأنواع)

user_id: "رقم تعريف المستخدم"

توقّعات قيمة الإرجاع

"يتم تعديل السجلّ وعرض عنصر JSON المعدَّل، بما في ذلك الطابع الزمني الجديد".

(يخبر هذا النموذج بأنّه لا يحتاج إلى استدعاء أداة "get" مباشرةً بعد "update" للتحقّق من التغيير).

"تعديل السجلّ"


@mcp.tool()
def search_logs(query: str, limit: int = 10) -> str:
    """
    Searches server error logs using Lucene syntax (e.g. 'level:ERROR AND service:auth').
    
    Args:
        query: A Lucene-formatted search string.
        limit: Max results to return. capped at 50.
    
    Returns:
        A formatted string of log entries with timestamps.
    """
    ...
  
@mcp.tool()
def search_logs(query: str, limit: int = 10) -> str:
    """Searches the logs."""
    ...

لا يعرف النموذج اللغوي الكبير البنية التي يتيحها "طلب البحث" (SQL؟ هل تريد استخدام تعبير نمطي؟ هل هو نص عادي؟ ولا يعرف ما هو "الحدّ" الأقصى.

الردود ومعالجة الأخطاء

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

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

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

استخدام JSON

تنسيق البيانات المنظَّمة في TextContent (قيد مؤقت) بما أنّ structuredContent غير متاح بعد في "منصة التطبيقات المرتبطة"، يجب إجراء تسلسل للبيانات يدويًا. حتى لو كانت الإجابة قائمة بسيطة، json.dumps().

تضمين عناوين URL في الردّ

يجب أن تكون عناوين URL التي يتم عرضها قصيرة نسبيًا وبدون معلَمات كثيرة. ننصح باستخدام خدمات تقصير عناوين URL لتوفير عدد الرموز المميّزة والحدّ من خطر حدوث هلوسة.

حمولة ذاتية الوصف لمكافحة الهلوسة

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

اتّخاذ إجراءات فعالة لمعالجة الأخطاء

يجب عرض رسائل خطأ واضحة ومفهومة لكي يتمكّن النموذج من فهم المشكلة وإبلاغ المستخدم بها. يُرجى الاطّلاع على معالجة أخطاء MCP.

استخدام try/except

يجب تضمين منطق الأداة في مجموعات try/except وعرض الأخطاء على شكل سلاسل.

تقديم أخطاء قابلة للتنفيذ

اقترِح الخطوة التالية في رسالة الخطأ (على سبيل المثال، "يُرجى محاولة استخدام الأداة X أولاً").

تأكيد الإجراءات

لا تعرض سلاسل فارغة لأدوات التأثيرات الجانبية (الإنشاء/التعديل/الحذف).

أمثلة على الردود ومعالجة الأخطاء

توضّح الأمثلة التالية الممارسات التي يجب اتّباعها وتلك التي يجب تجنّبها في ما يتعلّق بالردود ومعالجة الأخطاء.

يُنصح بها غير مقترَحة

نشر الحلقات على نحو متسلسِل بشكل صريح


...
import json

@mcp.tool()
def query_metrics(metric_id: str) -> str:
    result = {"id": metric_id, "value": 42, "unit": "ms"}
    # GOOD: Returns '{"id": "cpu", "value": 42}' -> Valid JSON
    return json.dumps(result, indent=2)

...
@mcp.tool()
def query_metrics(metric_id: str) -> str:
    result = {"id": metric_id, "value": 42, "unit": "ms"}
    # BAD: Returns "{'id': 'cpu', 'value': 42}" -> Invalid JSON
    return str(result)

رصد المحتوى وإبلاغ المستخدمين


...
@mcp.tool()
def get_user_details(user_id: str) -> str:
    try:
        user = db.get_user(user_id)
        if not user:
             # GOOD: Informative error returned as content
            return f"Error: User with ID '{user_id}' not found. Please verify the ID using 'search_users'."
        return json.dumps(user)
    except Exception as e:
        return f"Error: Database connection failed ({str(e)}). Please try again later."

(تنجح الأداة من الناحية الفنية (تعرض سلسلة)، ولكن السلسلة تحتوي على تفاصيل الخطأ. يقرأ النموذج هذه الرسالة ويدرك أنّ "رقم التعريف هذا غير موجود"، ويمكنه أن يطلب من المستخدم رقم التعريف الصحيح).


...
@mcp.tool()
def get_user_details(user_id: str) -> str:
    # BAD: Unhandled exception if ID not found
    user = db.get_user(user_id)
    return json.dumps(user)

(إذا تعذّر تنفيذ get_user، يعرض الخادم الخطأ 500. يتلقّى نموذج لغوي كبير خطأ تنفيذ عامًا ولا يعرف السبب (هل كان المعرّف خاطئًا؟ هل قاعدة البيانات معطّلة؟ هل تم رفض الإذن؟). ومن المرجّح أن يعيد محاولة إرسال الإدخال السيئ نفسه).

ردود فارغة

...
@mcp.tool()
def post_story(story_content: str) -> str:
    service_name = "story_service"
    api_client.post("/stories", json={"content": story_content})
    # GOOD: Explicit confirmation of state change.
    return f"Service '{service_name}' successfully posted content. Status is now 'posted'."

...
@mcp.tool()
def post_story(storyContent: str):
    subprocess.post(["postsrv", "story", storyContent])
    # BAD: Returns null/empty string. Model is confused.

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

حمولة ذاتية الوصف لمكافحة الهلوسة

يجب دائمًا إقران الرموز الأولية أو أرقام التعريف الداخلية بأسماء معروضة يمكن لشخص عادي قراءتها ووحدات قياس واضحة ونطاقات مرجعية عادية.

{"lab_code": "2345-7", "display_name": "Glucose [Mass/volume] in Blood", "value": 105, "unit": "mg/dL", "reference_range": "70-99 mg/dL"}

(يخبر هذا النموذج بالضبط بما تعنيه القيمة دون إجباره على استنتاج الوحدات أو الحدود المرجعية).

المعرّفات الأولية أو الضغط المخصّص أو الرموز غير المحدّدة

عرض المعرّفات الداخلية الأولية أو اختصارات القاموس المخصّصة أو الرموز الرقمية بدون تصنيفات

{"code": "2345-7", "v": 105}

(يُجبر هذا النموذج على تخمين ما يشير إليه الرقم 105، ما يؤدي إلى هلوسة في الوحدات أو عدم توفّر السياق أو تقديم تفسيرات غير دقيقة).

معالجة أخطاء MCP

من المهم معالجة الأخطاء بسلاسة.

  • بالنسبة إلى الأخطاء التي يمكن إصلاحها (مثل رقم تعريف مستخدم غير صالح أو مَعلمة اختيارية غير متوفّرة)، يجب عرض سلسلة نصية عادية تحتوي على تفاصيل وصفية للخطأ في ردّ الأداة. يتيح ذلك للنموذج فحص الملاحظات وفهم الخطأ وتصحيحه ذاتيًا أو مطالبة المستخدم بالتوضيح.
  • بالنسبة إلى الأخطاء النهائية (مثل الحدّ من معدّل الزحف أو تعذُّر المصادقة أو الأذونات أو انقطاع خدمة الخادم في الخلفية)، يمكنك رفع McpError باستخدام رمز الخطأ المناسب حتى تتمكّن المنصة من معالجة الخطأ بشكل منهجي.

مثال على نص استجابة الخطأ (JSON)

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32302,
    "message": "User permission denied for the requested operation.",
    "data": null
  },
  "id": 1
}

يحتوي Message على تفريغ JSON لحقل ErrorData في MCP. من خلال عرض رمز code الصحيح ورمز message المرئي للنموذج، يمكن لمنصة "التطبيقات المرتبطة" قراءة رسالة الخطأ وإرسال تفسير مفيد بلغة طبيعية إلى المستخدم. على سبيل المثال، "عذرًا، لم أتمكّن من العثور على المكان الذي يحمل رقم التعريف هذا. هل يمكنك التحقق من الاسم؟"

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

الحالة
الرمز
رسالة الاستخدام هل يجب
عرض
المحتوى الفاضح؟
أخطاء المستخدم/العميل
-32300 USER_RATE_LIMITED بلغ المستخدم الحد الأقصى المسموح به للاستخدام. نعم
-32301 MISSING_REQUIRED_INFORMATION لا يتضمّن طلب الإدخال كل المعلومات المطلوبة نعم
-32302 USER_PERMISSION_DENIED رفض المستخدم منح الإذن لاستخدام الأداة. على سبيل المثال، قد يحتاج المستخدم إلى حساب عمل أو حظر على فئات عمرية معيّنة أو موقع جغرافي أو غير ذلك، أو قد لا يكون لديه اشتراك عمل في الأداة. نعم
أخطاء التطبيق/أخطاء المنطق التجاري
-32400 RUNTIME_ERROR حدث خطأ أثناء تنفيذ الرمز البرمجي من جهة الخادم نعم
-32401 NULL_POINTER_EXCEPTION محاولة تشغيل مؤشر/عنصر فارغ نعم
-32402 OUT_OF_MEMORY لا تتوفّر ذاكرة كافية في رمز الخادم لتخصيصها لعنصر معيّن نعم
أخطاء البنية الأساسية
-32500 DEADLINE_EXCEEDED يستغرق الطلب وقتًا أطول من المسموح به. يمكن أن يحدث ذلك لأسباب عديدة، مثل زيادة الحمل على الخادم أو مشاكل في الشبكة أو غير ذلك. نعم
-32501 RESOURCE_EXHAUSTED نفدت سعة الذاكرة أو مساحة القرص أو سلاسل المحادثات أو وقت وحدة المعالجة المركزية أو غير ذلك في الخادم. نعم
-32502 SERVICE_UNAVAILABLE الخدمة التابعة (مثل خدمة مصغّرة أخرى أو قاعدة بيانات أو ذاكرة تخزين مؤقت أو غير ذلك) غير متاحة نعم
أخطاء JSON-RPC (هذه الأخطاء جزء من بروتوكول نقل MCP)
-32700 PARSE_ERROR تعذّر على الخادم تحليل الطلب لا
-32600 INVALID_REQUEST طلب العميل مكتوب بشكل غير صحيح لا
-32601 METHOD_NOT_FOUND اسم أداة MCP غير صالح لا
-32602 INVALID_PARAMS مَعلمات الطلب غير صالحة، وتشمل مَعلمات غير متوفّرة أو أنواع مَعلمات غير متطابقة لا
-32603 INTERNAL_ERROR الرد التلقائي لا

في ما يلي مثال على كيفية إرسال خطأ MCP في خادمك باستخدام حزمة تطوير البرامج (SDK) الرسمية للغة Python (mcp). أرسِل McpError يحتوي على حمولة ErrorData، والتي تحوّلها حزمة تطوير البرامج (SDK) تلقائيًا إلى تنسيق خطأ JSON-RPC المطلوب مع ملء حالة الخطأ.

from mcp import types
from mcp.shared.exceptions import McpError

@mcp.tool()
def foo_tool() -> list[types.TextContent]:
  """Always returns an error."""
  raise McpError(
    types.ErrorData(
        code=-32302, # USER_PERMISSION_DENIED
        message="Message to show to the model."
    ),
  )

سياق الأداة

تتيح منتجات Google المعنيّة استخدام واجهة Tool Context API لإرسال الإشارات إلى خوادم MCP. تُستخدم واجهة برمجة التطبيقات هذه في حالات الاستخدام الصالحة التي تتطلّب معلومات حسّاسة، مثل البيانات الوصفية التي لا تشكّل جزءًا من تعريف الأداة الأساسي، كما هو الحال في لغة الأدوات التي تحتاج إلى أقلمة. لا يمكن الوصول إلى Tool Context API إلا من خلال "وحدة التحكّم الشاملة".

عند تسجيل إشارة مثل current_user_location_fine مع تطبيقك في وحدة التحكّم الشاملة، ستعمل منتجات Google المعنيّة على تعزيز طلبات tools/call في MCP من خلال إدخال _meta إضافي يوفّر البيانات المطلوبة. في ما يلي مجموعة الإشارات المتوافقة:

  • ‫current_user_location_fine (في Gemini فقط، للمجالات المسموح بها)
  • user_locale
  • current_user_location_coarse
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "find-restaurant",
    "arguments": {"query": "restaurants near me"},
    "_meta": {
      "current_user_location_fine": {
        "latitude_degrees": 37.7749,
        "longitude_degrees": -122.4194,
        "accuracy_meters": 112.4221
      },
      "user_locale": {
        "language_code": "en",
        "region_code": "US"
      }
    }
  }
}

لتحليل هذه البيانات:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("remote_mcp")

@mcp.tool()
async def find_restaurants(query: str, ctx: Context) -> str:
   # Access context directly from _meta
   request_context = ctx.request_context
   meta_dict = ctx.request_context.meta.model_dump() if ctx.request_context.meta else {}

   location_context = meta_dict.get("current_user_location_fine", {})
   lat = location_context.get("latitude_degrees")
   lng = location_context.get("longitude_degrees")
   if lat and lng:
       return f"Finding '{query}' near ({lat}, {lng})"
   return f"Finding '{query}' (no location provided)"

عرض تجربة المستخدم

تطبيقات MCP

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

يأتي دمج تطبيقات MCP في منتجات Google السارية مع التحذيرات التالية.

استيراد الموارد عند التسجيل

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

يجب ألا يتجاوز حجم مورد واجهة المستخدم الواحد 15 ميغابايت، ويجب ألا تتجاوز موارد واجهة المستخدم التراكمية على الخادم 100 ميغابايت.

يجب أن تستخدم موارد واجهة المستخدم أحد أنواع MIME المتوافقة: text/html أو text/javascript أو text/css أو text/html;profile=mcp-app. ستتعذّر عملية التحقّق من صحة أنواع MIME غير العادية أو الخاصة بالمنصة عند إرسالها إلى المعاينة.

إرشادات مقدّمي الخدمات لصنّاع المحتوى

تتّبع منتجات Google المعنيّة مواصفات تطبيقات MCP الرسمية، والتي تتضمّن سياسة أمان المحتوى (CSP) [1] و[2]، وستحظر أي طلبات تخالف توجيهات سياسة أمان المحتوى.

تتطلّب منتجات Google السارية أيضًا إضافة blob: وdata: إلى سياسة أمان المحتوى (CSP)، في حال استخدامها. ولن تتم إضافتها تلقائيًا. ويعود للمطوّرين قرار إضافة هذه البيانات إلى CSP (أو عدم إضافتها).

‫Script-src هو استثناء

التوجيهات الوحيدة التي نسمح بها هي: unsafe-inline (تتم إضافتها تلقائيًا) وwasm-unsafe-eval وdata: (إذا كانت مضمّنة في resource_domains). إذا كان iframe يحمّل نصوصًا برمجية خارجية، يمكن حلّ هذه المشكلة إما من خلال تجميع JS في HTML أو استخدام تجزئة سلامة الموارد الفرعية (SRI).

  • الخيار 1: تضمين JavaScript في HTML (الأسهل)

    • رمز JS للحزمة:

      • أدرِج محتوى component-init.js مباشرةً داخل علامات <script> في حمولة HTML المعروضة لمورد واجهة المستخدم:

        <script>
        // Paste component-init.js content directly here
        </script>
        
    • إزالة علامات <script src> عن بُعد

      • احذف <script src="https://api.mycompany.com/..."> مراجع من مستند HTML.
    • أداة إعادة الاستيراد / التعديل

  • الخيار 2: استخدام تجزئة Subresource Integrity (SRI):

    استخدِم هذا الخيار إذا كان يجب أن يظل النص البرمجي مستضافًا خارجيًا على https://api.company.com/....

    • احتساب تجزئة SHA-256 للنص البرمجي
      • إنشاء تجزئة SHA-256 بتنسيق base64 لـ component-init.js
    • إضافة تجزئة إلى resourceDomains (يجب تضمين البادئة sha256- لمطابقة السمة integrity)
    • تعديل علامة HTML ‏<script>
      • أضِف السمتَين integrity وcrossorigin إلى العلامة البرمجية في تطبيق HTML المصغّر
    • التحقّق من عنوان CORS على شبكة توصيل المحتوى أو الخادم
      • يجب التأكّد من أنّ api.company.com يعرض component-init.js مع Access-Control-Allow-Origin: * (أو يسمح بـ scf.usercontent.goog) ليتمكّن المتصفّح من قراءة نص الاستجابة للتحقّق من سلامة الموارد الفرعية (SRI).
    • أداة إعادة الاستيراد / التعديل

إرشادات الأمان لوصف أداة MCP

بما أنّ الوصف هو السياق الوحيد الذي يتيح للنموذج فهم إمكانات الأداة، يجب كتابته بدقة وأمان لمنع أي سلوك غير مقصود. التزم بالإرشادات التالية عند صياغة أوصاف أدواتك.

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

المخاطر الأمنية وكيفية تجنّبها

منطقة الخطر يُنصح بها تجنَّب هذه الممارسة بأي ثمن

حقن الطلبات

استخدِم لغة موضوعية وواضحة لتوضيح الغرض من الأداة ووظائفها.

استخدِم أوامر حتمية لتجاوز سلوك النموذج أو تغيير مسارات النظام (على سبيل المثال، "يجب أن تقول..."، "بعد الركض، عليك..."). لا يُسمح باستخدام المصطلحات الإلزامية مثل "يجب" أو "مهم" إلا عند تحديد قيود المَعلمات المنظَّمة أو قواعد الاستخدام.

استخدِم تنسيقًا عاديًا وبسيطًا لنص وصف الأداة.

استخدام تنسيق يجذب الانتباه، مثل الاستخدام المفرط للأحرف اللاتينية الكبيرة والعلامات، مثل VERY IMPORTANT: أو **CRITICAL**

يجب التركيز فقط على وظيفة الأداة وسلوكها المتوقّع.

تضمين تعليمات لعب الأدوار أو أوامر لتجاهل التعليمات السابقة

التلاعب بالأدوات والاستيلاء عليها

تأكَّد من أنّ الوصف محدّد ويقتصر على الإمكانات الفعلية ذات الصلة بالأداة.

كتابة وصف عام أو غامض للأداة، أو الادّعاء بأنّ أداة واحدة تؤدي العديد من الوظائف غير المرتبطة ببعضها

اختَر اسمًا فريدًا ووصفيًا ومنطقيًا للأداة.

استخدام اسم أداة يختلف قليلاً عن اسم أداة موثوق بها، أو اسم عام (مثل do_everything_tool أو assistant_tool)

لا تذكر أسماء تطبيقات أخرى أو أدوات منصات خارجية في الوصف.

الإشارة صراحةً إلى أدوات أخرى أو وضع قواعد جديدة تفرض وقت وكيفية استخدام تلك الأدوات

السماح لمخطِّط النموذج باختيار الأداة الأنسب استنادًا إلى سياق المستخدم

تضمين لغة مناهضة للمنافسة أو أي نوع من طلبات تحسين محركات البحث التي توجّه النموذج إلى تفضيل أداتك على أدوات مشابهة

التلاعب بالمشغّلات

لا يشير الوصف إلى عبارات سجلّ المحادثات العامة أو يتفاعل معها.

إنشاء منطق شرطي يؤدي إلى تنفيذ إجراء ضار استنادًا إلى عبارات شائعة وغير ضارة يستخدمها المستخدمون (مثل "شكرًا لك" أو "للتلخيص")

إساءة استخدام المَعلمات

يجب تحديد المَعلمات اللازمة لوظيفة الأداة فقط واستخدام أسماء خاصة ببيانات الإدخال (مثل file_id وsearch_term).

حدِّد مَعلمات الدوال بأسماء تعكس الحالة الداخلية للوكيل (على سبيل المثال، system_prompt وconversation_history وfull_context).

استخراج البيانات

تصميم يراعي الخصوصية: معرّفات غير واضحة ومصادقة يديرها المضيف

استخدِم معرّفات غير حساسة، وليس معلومات أولية تكشف الهوية الشخصية. يجب أن تتم جميع عمليات معالجة البيانات ضمن حدود آمنة ومصرَّح بها، وألّا تتم الإشارة إليها في الوصف العام على أنّها يتم إرسالها خارجيًا. سيتم تنفيذ الأداة من خلال منح الأذونات تلقائيًا عبر مصافحة OAUth.

يجب إخفاء أي معلومات حساسة قبل إرسالها إلى منتجات Google المعنيّة.

طلب معلومات تكشف الهوية الشخصية أو معلومات صحية محمية أو أي معلومات شخصية و/أو حساسة أخرى من المستخدم أو بيانات شخصية أو بيانات النشاط الإعلاني أو كيان بأي صفة تنتهك بنود الخدمة لمنتجات Google السارية

ذكر أو طلب إرسال أي بيانات المستخدمين (طلب بحث أو موقع جغرافي أو سياق) إلى عناوين URL التابعة لجهات خارجية غير مصرَّح بها أو خدمات تسجيل أو أنظمة خارجية

أفضل الممارسات المتعلّقة بالوظائف والتسمية

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

  • دقة المَعلمات: تأكَّد من أنّ جميع أسماء المَعلمات وأنواعها في الوصف تتطابق تمامًا مع طريقة تنفيذ الأداة.
  • التسمية المعقولة: يجب أن يكون اسم الأداة تلميحًا قويًا وواضحًا حول وظيفتها. تجنَّب استخدام أسماء عامة جدًا مثل "تنفيذ". يجب أن يكون الاسم أيضًا متسقًا مع منظومة الأدوات الأوسع.

الملحق: إضافة البنية الأساسية والشبكة إلى القائمة المسموح بها

إذا كانت البنية الأساسية للاستضافة أو بوابة واجهة برمجة التطبيقات أو جدار الحماية تفرض قيودًا على الاتصالات الواردة حسب عنوان IP المصدر، أضِف مجموعات CIDR الصادرة التالية من Google إلى القائمة المسموح بها:

  • 108.177.64.0/20
  • 142.250.88.0/22
  • 172.217.80.0/20
  • 192.178.20.0/22
  • 192.179.0.0/20
  • 74.125.232.0/24
  • 136.121.40.0/21

تأكَّد من أنّ بيئتك تسمح بمرور البيانات من نطاقات عناوين IP هذه على منفذ HTTPS‏ 443 لتتمكّن منتجات Google المعنيّة من الوصول إلى خادم MCP عن بُعد لإعداد MCP واكتشاف الأدوات وتنفيذ الطلبات.