بناء خوادم MCP

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

4 دقيقة للقراءة

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

أنواع أخطاء MCP

يحدد MCP رموز خطأ قياسية تتبع اتفاقيات JSON-RPC:

الرمز الاسم الوصف
-32700 خطأ تحليل JSON غير صالح مستلم
-32600 طلب غير صالح طلب مشوه
-32601 الطريقة غير موجودة طريقة غير معروفة مستدعاة
-32602 معلمات غير صالحة معلمات خاطئة
-32603 خطأ داخلي خطأ من جانب الخادم

رفع الأخطاء في الأدوات

عندما تواجه أداة خطأ، ارفعه برسالة وصفية:

from mcp.types import McpError

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "get_user":
        user_id = arguments.get("user_id")

        if not user_id:
            raise McpError(
                code=-32602,
                message="user_id مطلوب"
            )

        user = await db.get_user(user_id)
        if not user:
            raise McpError(
                code=-32603,
                message=f"المستخدم {user_id} غير موجود"
            )

        return [TextContent(type="text", text=user.to_json())]

فئات الأخطاء

تعامل مع الأخطاء على المستوى المناسب:

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    try:
        # أخطاء التحقق
        validate_arguments(name, arguments)

        # أخطاء منطق الأعمال
        result = await execute_tool(name, arguments)

        return result

    except ValidationError as e:
        # خطأ العميل - معلمات سيئة
        raise McpError(code=-32602, message=str(e))

    except NotFoundError as e:
        # المورد غير موجود
        raise McpError(code=-32603, message=str(e))

    except ExternalAPIError as e:
        # فشل الخدمة الخارجية
        raise McpError(
            code=-32603,
            message=f"الخدمة الخارجية غير متاحة: {e}"
        )

    except Exception as e:
        # خطأ غير متوقع - سجله
        logger.exception("خطأ غير متوقع في استدعاء الأداة")
        raise McpError(
            code=-32603,
            message="حدث خطأ غير متوقع"
        )

رسائل خطأ صديقة للمستخدم

الذكاء الاصطناعي يقرأ رسائل الخطأ الخاصة بك. اجعلها مفيدة:

# سيء - غامض
raise McpError(code=-32603, message="ERR_DB_CONN_FAIL")

# جيد - قابل للتنفيذ
raise McpError(
    code=-32603,
    message="فشل اتصال قاعدة البيانات. يرجى التحقق مما إذا كانت خدمة قاعدة البيانات قيد التشغيل."
)

التسجيل لأغراض التصحيح

سجل الأخطاء دائماً مع السياق:

import logging

logger = logging.getLogger("mcp-server")

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    logger.info(f"أداة مستدعاة: {name}", extra={"arguments": arguments})

    try:
        result = await execute_tool(name, arguments)
        logger.info(f"نجحت الأداة: {name}")
        return result

    except Exception as e:
        logger.error(
            f"فشلت الأداة: {name}",
            extra={"arguments": arguments, "error": str(e)},
            exc_info=True
        )
        raise

في القسم التالي، سنبني تمرين مختبر كامل للخادم. :::

اختبار

اختبار الوحدة 2: بناء خوادم MCP

خذ الاختبار