بناء أول MCP Server بسيط خاص بك

دقائق القراءة: 6

بناء أول MCP Server بسيط خاص بك

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

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

في هذا المقال سنبني نموذجاً مبسطاً باستخدام Python يقدّم أداة واحدة وظيفتها تحليل عنوان صفحة وإرجاع بيانات أولية مفيدة. ورغم بساطة المثال، إلا أن نفس النمط يمكن تطويره لاحقاً لدمج مهام مثل التدقيق، إنتاج المحتوى، الفحص التقني، أو الربط مع منصات خارجية عبر مفهوم الـ API: كيف نطلب البيانات من Google وOpenAI.

ما هو الهدف من هذا الخادم البسيط؟

الهدف ليس بناء نظام معقد من البداية، بل إنشاء هيكل عملي يفهمك منطق tools وinput schema وserver capabilities. عندما تستوعب هذا التصميم، يمكنك تحويل أي وظيفة متكررة في عملك إلى أداة قابلة للاستدعاء من نموذج ذكاء اصطناعي.

  • سنعرف أداة اسمها analyze_title.
  • تستقبل رابط صفحة في متغير url.
  • تجلب محتوى الصفحة.
  • تستخرج وسم title.
  • تعيد نتيجة منظمة بصيغة JSON.

هذا السيناريو مفيد في الأتمتة المتعلقة بالسيو، خاصة إذا كنت تعمل على مراجعة العناوين أو فحص صفحات كثيرة ضمن خط سير أكبر يشمل استخدام مكتبة Pandas لتحليل بيانات الـ SEO الضخمة أو تحليل الـ Meta Tags لآلاف الصفحات بضغطة زر.

المتطلبات قبل البدء

يفضل أن تكون جهزت بيئة العمل مسبقاً كما في تهيئة بيئة العمل: تثبيت Python والمكتبات الأساسية، وأن تكون مرتاحاً مع بنية أساسيات التعامل مع ملفات JSON (لغة التفاهم بين الأنظمة). كذلك من المهم أن تفكر بعقلية منطق البرمجة المعتمد على المهام (Task-Oriented Programming) لأن كل أداة داخل الخادم يجب أن تؤدي وظيفة محددة بوضوح.

المكتبات التي سنستخدمها

  • requests لجلب الصفحة.
  • beautifulsoup4 لاستخراج العنوان.
  • هيكل بسيط يحاكي منطق MCP بطريقة تعليمية.
pip install requests beautifulsoup4

فكرة البنية الداخلية لـ MCP Server

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

  1. تعريف اسم الأداة ووصفها.
  2. تحديد شكل المدخلات المتوقعة.
  3. ربط الأداة بدالة تنفيذ فعلية.
  4. إرجاع نتيجة موحدة حتى في حالات الخطأ.

عند تصميم أي أداة داخل MCP Server، اسأل نفسك: هل هذه الأداة تقوم بمهمة واحدة واضحة؟ وهل يمكن للنموذج استدعاؤها دون لبس في المدخلات أو المخرجات؟

بناء الخادم خطوة بخطوة

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

import requests
from bs4 import BeautifulSoup
from typing import Dict, Any


class SimpleMCPServer:
    def __init__(self):
        self.tools = {}

    def register_tool(self, name: str, description: str, input_schema: Dict[str, Any], handler):
        self.tools[name] = {
            "description": description,
            "input_schema": input_schema,
            "handler": handler
        }

    def list_tools(self):
        return {
            "tools": [
                {
                    "name": name,
                    "description": tool["description"],
                    "input_schema": tool["input_schema"]
                }
                for name, tool in self.tools.items()
            ]
        }

    def call_tool(self, name: str, arguments: Dict[str, Any]):
        if name not in self.tools:
            return {"error": f"Tool '{name}' not found"}

        try:
            return self.tools[name]["handler"](arguments)
        except Exception as e:
            return {"error": str(e)}


def analyze_title(args: Dict[str, Any]):
    url = args.get("url")
    if not url:
        return {"error": "Missing required field: url"}

    headers = {
        "User-Agent": "Mozilla/5.0 (compatible; SimpleMCPBot/1.0)"
    }

    response = requests.get(url, headers=headers, timeout=15)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")
    title = soup.title.string.strip() if soup.title and soup.title.string else "No title found"

    return {
        "url": url,
        "title": title,
        "length": len(title),
        "status_code": response.status_code
    }


server = SimpleMCPServer()

server.register_tool(
    name="analyze_title",
    description="Fetches a webpage and extracts its title tag",
    input_schema={
        "type": "object",
        "properties": {
            "url": {
                "type": "string",
                "description": "The webpage URL to analyze"
            }
        },
        "required": ["url"]
    },
    handler=analyze_title
)

if __name__ == "__main__":
    print(server.list_tools())
    result = server.call_tool("analyze_title", {"url": "https://example.com"})
    print(result)

كيف تقرأ هذا الكود كمطور أتمتة؟

الجزء الأهم هنا ليس فقط تنفيذ الطلب عبر requests.get()، بل فصل تعريف الأداة عن منطق التشغيل. هذا يعني أنك تستطيع لاحقاً إضافة أدوات أخرى مثل extract_meta_description أو check_status_code أو حتى أداة تربط الخادم مع ربط Python بمنصة WordPress عبر REST API.

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

تطوير الخادم لسيناريوهات SEO وAI

بعد نجاح النسخة الأولى، تستطيع تحويل هذا الخادم إلى محطة مركزية لأعمالك اليومية. على سبيل المثال، يمكنك ربطه بأداة تجمع روابط من ملف، ثم تستدعي analyze_title لكل رابط، ثم تخزن النتائج في جدول أو ترسلها إلى نظام تقارير.

ومن هنا يبدأ الدمج الحقيقي مع الذكاء الاصطناعي. بدلاً من أن يطلب النموذج “حل المشكلة بالكامل” داخل محادثة عامة، يمكنه أن يستدعي أدوات متخصصة بدقة. هذا النمط أكثر استقراراً من التعليمات الحرة، ويتكامل جيداً مع كيفية كتابة “Prompt” برمجي للحصول على نتائج ثابتة (JSON) ومع تقنيات الـ Prompt Engineering المتقدمة (Chain of Thought).

لأفضل النتائج، اجعل النموذج مسؤولاً عن اتخاذ القرار، واجعل MCP Server مسؤولاً عن التنفيذ الموثوق القابل للتكرار.

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

رغم أن المثال بسيط، إلا أن تشغيله في بيئة إنتاجية يتطلب بعض الانضباط. لا تسمح للأداة بالوصول الحر إلى أي عنوان دون تحقق. أضف قائمة نطاقات مسموحة أو قواعد فلترة، واهتم بإدارة المهلات، وتسجيل الأخطاء، والتعامل مع الحدود المرتفعة للطلبات. ويمكنك التوسع أكثر بالرجوع إلى الحماية والأمان: كيف تخفي مفاتيحك السرية في الكود؟ والتعامل مع مشكلات الـ Rate Limit وتجاوز حدود الـ API.

تحسينات مقترحة للنسخة القادمة

الخاتمة

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

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *