Model Context Protocol (MCP)

كسر حاجز القابلية للتوسع: تنفيذ اكتشاف وتسجيل الأدوات الديناميكي في خوادم MCP

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

في هذا المنشور، سنستكشف كيفية تنفيذ سجل أدوات ديناميكي في خادم MCP باستخدام لغة Python. سننتقل من التكوين الثابت إلى إنشاء نظام مرن حيث يمكن إضافة الأدوات وإزالتها واكتشافها برمجياً.

التحديات المرتبطة بالتعريفات الثابتة

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

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

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

بنية السجل الديناميكي

لتطبيق الاكتشاف الديناميكي، نحتاج إلى ثلاثة مكونات أساسية:

  1. السجل (Registry): مخزن مركزي (عادةً ما يكون قاموساً أو قائمة) يحتفظ بالبيانات الوصفية والتنفيذات لجميع الأدوات المتاحة.
  2. آلية الاكتشاف: عملية تفحص البحث عن أدوات جديدة، سواء من قاعدة بيانات، أو نظام ملفات، أو نقطة نهاية شبكة.
  3. معالج الخادم: المنطق الذي يقرأ من السجل عند استلام طلب initialize أو tools/list.

مثال على التنفيذ

لنلقِ نظرة على تنفيذ عملي باستخدام لغة Python ووحدة تطوير البرمجيات (SDK) الرسمية لـ MCP. سنقوم بإنشاء زخرفة أداة أساسية تقوم بتسجيل الدوال تلقائياً في سجل عالمي.

from mcp.server import Server
from mcp.types import Tool, TextContent
import asyncio

# سجل عالمي لتخزين الأدوات المكتشفة
tool_registry = {}

def register_tool(name, description):
    """زخرفة لتسجيل الأدوات ديناميكياً."""
    def decorator(func):
        tool_metadata = {
            "name": name,
            "description": description,
            "handler": func
        }
        tool_registry[name] = tool_metadata
        return func
    return decorator

# مثال: أداة مضافة ديناميكياً
@register_tool("get_weather", "Fetches current weather data for a location")
async def get_weather(location: str) -> str:
    # محاكاة استدعاء API
    return f"Weather in {location} is sunny."

# مثال: أداة ديناميكية أخرى
@register_tool("ping_server", "Checks if the server is alive")
async def ping_server() -> str:
    return "Pong!"

# تهيئة خادم MCP
server = Server("dynamic-tool-server")

@server.list_tools()
async def list_tools():
    """
    كشف السجل الديناميكي كقائمة من أدوات MCP.
    يتم استدعاء هذه الطريقة بواسطة العميل لاكتشاف الأدوات المتاحة.
    """
    tools = []
    for name, metadata in tool_registry.items():
        # في التنفيذ الفعلي، ستقوم بربط المعالج بتعريف Tool صحيح مع مخططات الإدخال
        tools.append(Tool(
            name=name,
            description=metadata["description"]
        ))
    return tools

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    """
    توجيه استدعاءات الأدوات إلى المعالج الصحيح في السجل.
    """
    if name not in tool_registry:
        raise ValueError(f"Unknown tool: {name}")
    
    handler = tool_registry[name]["handler"]
    # تنفيذ المعالج بالوسائط المقدمة
    result = await handler(**arguments)
    return [TextContent(type="text", text=str(result))]

async def main():
    async with server.run() as server:
        await server.serve()

if __name__ == "__main__":
    asyncio.run(main())

استراتيجيات اكتشاف متقدمة

يستخدم المثال أعلاه نهجاً قائماً على الزخارف (Decorators)، وهو ممتاز للبنى الشبيهة بالإضافات. ومع ذلك، للحالات الأكثر تعقيداً، قد ترغب في تنفيذ اكتشاف نظام الملفات أو التسجيل المدعوم من قاعدة البيانات. على سبيل المثال، يمكنك مسح دليل plugins/ بحثاً عن وحدات Python، واستيرادها، وتسجيل أي دوال محددة بسمات معينة تلقائياً.

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

أفضل الممارسات للتسجيل الديناميكي

  • التحقق من صحة المخطط (Schema Validation): تأكد دائماً من أن الأدوات المسجلة ديناميكياً تلتزم بتعريفات مخطط JSON الصارمة لوسائط الإدخال. يجب استخدام وحدة mcp.types لتعريف هذه المخططات بدقة.
  • معالجة الأخطاء: نفذ معالجة أخطاء قوية في معالج call_tool الخاص بسجلك. إذا فشلت أداة ديناميكية، يجب أن يعيد الخادم خطأً مهيكلاً بدلاً من التوقف عن العمل.
  • إعادة التحميل الساخن (Hot Reloading): فكر في تنفيذ آلية لمسح السجل وإعادة الفحص بحثاً عن التغييرات. يسمح ذلك للمطورين بإضافة أدوات جديدة دون إعادة تشغيل عملية خادم MCP بأكملها.

الخاتمة

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

Share: