FastMCP مقابل MCP SDK: أي إطار عمل Python تستخدم؟

تشترك FastMCP وحزمة MCP Python SDK الرسمية الآن في طبقة البروتوكول، لكنهما لا تشتركان في API. تقارن هذه المقالة بينهما من حيث الاستيراد والمصادقة والتركيب والاختبار وحجم التثبيت وصعوبة الانتقال، لتختار الأنسب لخادم MCP القادم.

FastMCP مقابل MCP SDK: أي إطار عمل Python تستخدم؟
Cristian Da Conceicao
مؤسس Picasso IA

تلصق from mcp.server.fastmcp import FastMCP من درس تعليمي في مشروع جديد، وتشغّله، فتتلقى من Python رسالة ModuleNotFoundError. لا عيب في إعدادك. فقد أعادت SDK الرسمية تسمية تلك الفئة، واستمر مشروع FastMCP المستقل في التطور وحده، والآن تتشارك المكتبتان الاسم وطبقة البروتوكول وعددًا كبيرًا من المطورين المرتبكين.

إليك الجواب المختصر. حتى أكتوبر 2026، بلغت حزمة mcp الرسمية الإصدار 2.3.0، وحزمة fastmcp المستقلة الإصدار 4.0.11. اختر FastMCP عندما تريد تركيب الخوادم، والوكالة (proxying)، واستيراد OpenAPI، ومزودي المصادقة المدمجين، وعميل اختبار داخل العملية. واختر MCP SDK الرسمية عندما تريد أصغر شجرة اعتماديات، وتحكمًا مباشرًا في عناصر البروتوكول الأساسية، وعدم وجود إطار عمل إضافي بين كودك والمواصفة.

💡 الحكم السريع: إذا كنت تبني خادم Model Context Protocol سيستخدمه مستخدمون حقيقيون، وكنت غير متأكد، فابدأ مع FastMCP. أما في حالة الخادم البسيط، فالتحول لاحقًا إلى SDK الرسمية تعديل يستغرق خمس دقائق. أما العكس فيعني إعادة بناء ميزات منحتك إياها FastMCP مجانًا.

لماذا تشترك المكتبتان في اسم واحد

كيف انتهى الأمر بـFastMCP داخل SDK

بنى Jeremiah Lowin مشروع FastMCP بحيث تبدو كتابة خادم MCP كأنها كتابة دالة Python عادية. وكانت هذه API عالية المستوى جيدة بما يكفي لكي تستوعبها حزمة Anthropic الرسمية بلغة Python في عام 2024 بصفتها FastMCP 1.0، وتعيش في mcp.server.fastmcp. لم يتوقف المشروع المستقل أبدًا. فقد واصل إصدار تحديثاته تحت اسم حزمته الخاص، ووصل إلى الإصدار 3.0 GA في 18 فبراير 2026، وانتقل من حساب GitHub شخصي إلى مستودع PrefectHQ/fastmcp حين تبنّته Prefect كبنية تحتية أساسية.

يشرف عليه اليوم Jeremiah Lowin وNate Nowack بموجب ترخيص Apache-2.0. ويقول المشروع إنه يشغّل نحو 70% من خوادم MCP في جميع اللغات، وهو رقم مصدره المشروع نفسه، فخذه بحذر.

أيدي مطور تكتب كود Python لخادم MCP

ما الذي تغيّر في SDK v2

جعلت SDK v2 الفصل رسميًا. أصبحت الفئة المدمجة FastMCP تُسمّى الآن MCPServer، وأُزيل مسار الاستيراد القديم بالكامل:

# SDK v1 (bundled FastMCP, gone in v2)
from mcp.server.fastmcp import FastMCP

# SDK v2
from mcp.server import MCPServer

# Standalone FastMCP
from fastmcp import FastMCP

إذا كنت ما زلت تحتاج السلوك القديم، فسلسلة الإصدار v1 تعمل في وضع الصيانة. ثبّتها باستخدام uv add "mcp[cli]<2".

أنت لا تختار بين تطبيقين متنافسين للبروتوكول. يعتمد FastMCP 4 على طبقة البروتوكول نفسها في SDK v2، لذا فالسؤال الحقيقي هو مقدار الإطار الذي تريد وضعه فوقها.

جنبًا إلى جنب: المقارنة السريعة

إليك كيف تقف المكتبتان أمام الأمور التي تحسم معظم المشاريع:

الميزةMCP SDK الرسمية 2.3.0FastMCP 4.0.11
التثبيتuv add "mcp[cli]"uv add fastmcp
فئة الخادمMCPServerFastMCP
الاستيرادfrom mcp.server import MCPServerfrom fastmcp import FastMCP
إصدار بايثون3.10+3.10+
وسائل النقلstdio، وStreamable HTTP، وSSEstdio، وHTTP، وSSE
أسلوب المزخرِفات@mcp.tool() فقط@mcp.tool أو @mcp.tool()
تركيب الخوادمغير مدمجتركيب خوادم داخل بعضها
وكالة الخوادم الأخرىغير مدمجةمدمجة
تحويل OpenAPI إلى أدواتغير مدمجOpenAPIProvider
إعداد المصادقةثلاثة إعدادات منفصلةمزود واحد auth= (JWT وOAuth وGitHub وGoogle)
المراقبةOpenTelemetry أصيلخطافات middleware
الحجم المثبتنحو 41 ميغابايت، 36 حزمةنحو 65 ميغابايت، 66 حزمة
يشرف عليهمشروع MCPPrefect

تأتي أرقام حجم التثبيت من اختبار جنبًا إلى جنب نُشر في 5 أكتوبر 2026، لذا ستتغير أرقامك بحسب المنصة والإضافات.

منظر علوي لمكتب عليه دفتر فيه مخطط لخيارين متفرعين

خادم بسيط في المكتبتين

الكود في اليوم الأول متطابق تقريبًا. في المكتبتين تتحول تلميحات الأنواع إلى JSON Schema، وتصبح سلاسل التوثيق (docstrings) أوصافًا للأدوات. إليك نسخة SDK الرسمية:

from mcp.server import MCPServer

mcp = MCPServer("Demo")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

ونسخة FastMCP:

from fastmcp import FastMCP

mcp = FastMCP("Demo")

@mcp.tool
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

if __name__ == "__main__":
    mcp.run()

مع الإضافة cli في SDK يمكنك تجربة الأولى باستخدام mcp dev server.py. أما الثانية فتعمل مع python server.py عادي.

اختلافات صغيرة في الصياغة تُوقع في الخطأ

تأتي معظم أخطاء الانتقال من تفاصيل كهذه:

  • الأقواس: تتطلب MCPServer في SDK وجود @mcp.tool(). ويؤدي @mcp.tool المجرد إلى TypeError. أما FastMCP فيقبل الصيغتين.
  • اسم وسيلة النقل: تسميها SDK "streamable-http"، وتسميها FastMCP "http".
  • إعدادات وسيلة النقل: في SDK v2 انتقل المضيف والمنفذ من المُنشئ إلى استدعاء run().
  • خصائص السياق: ctx.mcp_server في SDK تصبح ctx.fastmcp في FastMCP، وتصبح ctx.log(level, data) هي ctx.log(message, level=...).

ما الذي تتفوق فيه SDK الرسمية

بصمة اعتماديات أخف

الحزمة الرسمية هي الأصغر حجمًا في التثبيت. في قياسات أكتوبر 2026، أدخلت mcp 2.3.0 36 حزمة وقرابة 41 ميغابايت إلى site-packages، بينما أدخلت fastmcp 4.0.11 66 حزمة وقرابة 65 ميغابايت. هذه الفجوة هي ثمن الإضافات: مزودو المصادقة، وأدوات OpenAPI، والوكالة، ومكتبة العميل.

ولماذا يهم ذلك عمليًا:

  • حزم أقل لتدقيقها حين يراجع فريق الأمن كل اعتمادية غير مباشرة.
  • صور حاويات أصغر للخوادم التي تعمل كنسخ صغيرة كثيرة.
  • سطح ترقية أقل حين تظهر ثغرة في كود لم يستخدمه خادمك أصلًا.

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

منظور من زاوية منخفضة لممر في مركز بيانات بين رفوف الخوادم

التحكم المباشر في البروتوكول

تحتفظ SDK الرسمية بفئة منخفضة المستوى Server إلى جانب الفئة الأسهل استخدامًا MCPServer. في الإصدار v2 يتبع كل معالج شكلًا واحدًا هو async (ctx, params) -> result، دون مزخرفات ودون تغليف تلقائي:

from mcp.server import Server, ServerRequestContext
from mcp.types import CallToolRequestParams, CallToolResult, TextContent

async def call_tool(ctx: ServerRequestContext, params: CallToolRequestParams) -> CallToolResult:
    return CallToolResult(content=[TextContent(type="text", text="ok")])

server = Server("Bookshop", on_call_tool=call_tool)

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

  • Resolve وElicit: معامل أداة تملؤه دالة تكتبها أنت، ولا يراه النموذج، ويمكنه أن يتوقف ويطرح سؤالًا على المستخدم في منتصف الاستدعاء.
  • Client مدمج بالكامل: يتفاوض from mcp import Client على الاتصال نيابةً عنك، دون ClientSession متداخلة ودون تهيئة يدوية.
  • OpenTelemetry مدمج: يُتتبَّع كل طلب عبر middleware.
  • تخزين مؤقت للاستجابات: cache_hints على الخادم، ودعم للتخزين المؤقت في العميل.
  • دعم بروتوكولين: يمكن لنشر واحد أن يخدم عملاء بمراجعتي البروتوكول لعامي 2025 و2026.

تُلغي مراجعة البروتوكول 2026-07-28 مصافحة initialize ومعرّفات الجلسات في Streamable HTTP، فيستطيع موازن أحمال عادي توزيع الطلبات على نسخ عديمة الحالة. تقف المكتبتان على طبقة البروتوكول نفسها، لكن SDK هي المكان الذي تضبطه فيه مباشرة.

لقطة مقربة جدًا لتروس ساعة ميكانيكية مع ملقط

ما الذي تضيفه FastMCP فوق ذلك

عرض FastMCP بسيط: الأشياء التي ستضطر إلى كتابتها حول الخادم على أي حال، مكتوبة لك مسبقًا.

التركيب والوكالة

يستطيع FastMCP تركيب خادم داخل آخر، فيمكن أن يعيش خادم weather وخادم billing في وحدتين منفصلتين، ويظهران مع ذلك كنقطة نهاية واحدة بادئات مسارات. ويستطيع أيضًا توكيل خادم MCP تابع لطرف ثالث، ما يتيح لك لف خادم قائم بمصادقتك الخاصة. لا تملك SDK الرسمية أيًا من الأمرين كميزة مدمجة.

أعاد الإصدار 3.0 بناء هذه الفكرة حول المزودين. لم تعد الأدوات مضطرة للعيش في ملف واحد: إذ يجدها FileSystemProvider داخل مجلد ويعيد تحميلها عند تغييرها.

مطوران يراجعان لوحًا بيضاء عليها صناديق وأسهم

استيراد OpenAPI ومزودو المصادقة

إذا كانت شركتك تشغّل واجهة REST API بالفعل، فإن OpenAPIProvider يحوّل مواصفة OpenAPI أو تطبيق FastAPI إلى أدوات MCP دون أن تعيد كتابة كل نقطة نهاية يدويًا.

وتنال المصادقة المعاملة نفسها. يدمج FastMCP المعاملات الثلاثة المنفصلة في SDK (token_verifier، وauth_server_provider، وauth=AuthSettings) في مزود واحد auth=، مع دعم مدمج لأنواع JWT وOAuth وGitHub وGoogle. يصبح إضافة تسجيل الدخول عبر GitHub خيارًا في الإعدادات بدلًا من مشروع عطلة نهاية أسبوع. ويمكن للأدوات أيضًا أن تطلب المساعدة من نموذج LLM الخاص بالعميل عبر ctx.sample().

الاختبار دون شبكة

يقبل Client في FastMCP كائن الخادم مباشرة، فيعمل الاختبار داخل العملية دون منافذ، ودون عمليات فرعية، ودون مهلات زمنية غير مستقرة:

import asyncio
from fastmcp import Client, FastMCP

mcp = FastMCP("Demo")

@mcp.tool
def add(a: int, b: int) -> int:
    return a + b

async def main():
    async with Client(mcp) as client:
        result = await client.call_tool("add", {"a": 2, "b": 3})
        print(result.data)  # 5

asyncio.run(main())

الاختبار داخل العملية من المزايا التي تذكرها ملاحظات الترحيل الخاصة بمشروع FastMCP نفسه، وهو ما يجعل بناء مجموعة اختبارات pytest سريعة أمرًا سهلًا.

شاشة طرفية على حاسوب محمول تعرض صفًا من نتائج اختبارات ناجحة

أين يقصر كل منهما

لا يأتي أي من الخيارين مجانًا. ولكل منهما ثمن يظهر لاحقًا. الفرق التي تختار FastMCP تدفع من خلال تقلب الإصدارات وعدد أكبر من الاعتماديات، والفرق التي تختار SDK تدفع من خلال الكود الذي تكتبه بنفسها.

FastMCP يتحرك بسرعة

انتقل FastMCP من الإصدار 3.0 GA في فبراير 2026 إلى 4.0.11 بحلول أكتوبر، لذا توقع أن تصل الإصدارات الرئيسية بسرعة. ثبّت النطاق في ملف المشروع، مثلًا fastmcp>=4,<5، واقرأ ملاحظات الإصدار قبل كل ترقية.

كما يثبّت نحو 30 حزمة إضافية مقارنة بحزمة SDK. تبيع Prefect منصة مستضافة اسمها Horizon للنشر والتحكم في الوصول. والمكتبة نفسها مرخصة بموجب Apache-2.0 وتعمل في أي مكان يمكنك فيه تشغيل Python.

SDK v2 تكسر الكود القديم

إذا كنت تُرقّي خادم v1، فخصص وقتًا حقيقيًا. تسرد ملاحظات إصدار v2 التغييرات الكاسرة التالية:

  • أُزيل ناقل WebSocket (mcp[ws]).
  • أُزيلت Tasks API التجريبية ونُقلت إلى إضافة.
  • أصبح McpError الآن MCPError، وأي MCPError يُثار داخل أداة يتحول إلى خطأ في البروتوكول لا يراه النموذج أبدًا.
  • لم يعد معامل mount_path موجودًا.
  • تعمل المعالجات المتزامنة الآن على خيط عمل (worker thread) بدلًا من حلقة الأحداث.
  • في Streamable HTTP، يعمل دورة الحياة (lifespan) مرة واحدة عند بدء التشغيل، لا مرة لكل جلسة.
  • انتقل عميل HTTP من httpx إلى httpx2.

فريق صغير من شركة ناشئة يناقش مشروعًا حول طاولة طويلة

اختر الأنسب في دقائق

متنزه يحمل خريطة ورقية عند مفترق طريق في غابة

تخطَّ البحث في الميزات، وطابق وضعك بهذا الجدول:

وضعكاختر
لف واجهة REST API قائمة أو تطبيق FastAPIFastMCP
دمج عدة خوادم خلف نقطة نهاية واحدةFastMCP
إضافة تسجيل دخول عبر GitHub أو Google أو OAuthFastMCP
مراجعة صارمة للاعتماديات في بيئة مغلقةMCP SDK الرسمية
سلوك بروتوكول مخصص على مستوى المعالجMCP SDK الرسمية
نموذج أولي لعطلة نهاية أسبوع بأداة واحدةأي منهما

تخيّل فريقًا من ثلاثة أشخاص يريد مساعدًا بالذكاء الاصطناعي يقرأ واجهة API الخاصة بالطلبات الداخلية. وبوجود مواصفة OpenAPI جاهزة، يزيل OpenAPIProvider معظم العمل المتعلق بكل نقطة نهاية على حدة، ويتولى مزود auth= الواحد تسجيل دخول الشركة. تخيّل الآن فريق منصة يبني بوابة خاضعة للتدقيق، ويجب أن تجتاز مراجعة صارمة للاعتماديات. ينتهي ذلك الفريق إلى SDK الرسمية ويحصل على المعالجات ذات المستوى الأدنى التي يحتاجها. لم يرتكب أي من الفريقين خطأ، لقد بدآ من قيود مختلفة.

اختر FastMCP عندما

  • تطلق شيئًا سيسجّل المستخدمون الدخول إليه.
  • تريد إعدادًا واحدًا من auth= بدلًا من ثلاثة.
  • تتوقع أن تنتقل من خادم واحد إلى عدة خوادم.
  • تفضّل مزخرف @mcp.tool الأقصر واختبارات داخل العملية السريعة.

اختر MCP SDK الرسمية عندما

  • تريد أقل عدد من الاعتماديات وأصغر صورة.
  • تحتاج إلى معالجة الطلبات والاستجابات الخام بنفسك.
  • يعتمد فريقك على التطبيق المرجعي من مشروع MCP.
  • تريد OpenTelemetry ودعم Resolve أو Elicit مباشرة من الحزمة الأساسية.

التبديل بينهما لاحقًا

تتشارك المكتبتان طبقة البروتوكول، لذا فالانتقال بينهما آلي في معظمه. والانتقال من SDK إلى FastMCP يبدو هكذا:

- from mcp.server import MCPServer
+ from fastmcp import FastMCP

- mcp = MCPServer("orders")
+ mcp = FastMCP("orders")

- @mcp.tool()
+ @mcp.tool

ثم غيّر "streamable-http" إلى "http" في استدعاء run()، وأعد تسمية ctx.mcp_server إلى ctx.fastmcp، ودمج إعدادات المصادقة الثلاثة في مزود واحد. أما في الاتجاه المعاكس، فاعكس هذه التعديلات، وخطّط لاستبدال التركيب والوكالة واستيراد OpenAPI بكودك الخاص.

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

ابنِ خادمك الخاص مع Picasso IA

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

صمّم خادمك على PicassoIA

يمكنك أن تجعل نموذج LLM يكتب المسودة الأولى لأي من الإصدارين. إليك الطريق السريع مع Claude Sonnet 5، وهو نموذج مصمم لمهام البرمجة:

  1. افتح صفحة Claude Sonnet 5 على PicassoIA.
  2. املأ حقل الأمر النصي (Prompt) المطلوب، مثلًا: "اكتب خادم MCP بلغة Python باستخدام FastMCP، يضم أداتين: إحداهما تجمع الأرقام والأخرى تجلب ملخص الطقس، مع ملف pytest يستخدم العميل داخل العملية."
  3. اضبط الجهد (effort): أبقه على low للتعديلات السريعة، أو ارفعه لخطأ صعب يمتد عبر عدة ملفات.
  4. أبقِ الحد الأقصى للتوكنات (max tokens) على القيمة الافتراضية 8,192 لملف خادم كامل، واستخدم الأمر النصي للنظام (system prompt) لتثبيت أسلوب البرمجة مرة واحدة.
  5. أرفق صورة إن كانت لديك، مثل لقطة شاشة لخطأ، ثم ولّد الكود والصقه في مشروعك.

اطلب النسختين في طلب واحد وقارن الفرق بنفسك. وإن أردت رأيًا ثانيًا في الكود، فإن GPT 5.6 Sol مصمم لمهام البرمجة المعقدة، ويصلح مراجعًا جيدًا.

مطور مسترخٍ يغلق حاسوبه المحمول عند الساعة الذهبية

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

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

اختر لغتك

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