المستوى: محترف
MCP للمحترف: ابني سيرفر Model Context Protocol إنتاجي في 60 سطر Python
الـ MCP حلّ مشكلة قديمة كانت بتاكل أسبوع شغل في كل تكامل جديد: ربط LLM بأي أداة خارجية بدون ما تكتب glue code مخصّص لكل تطبيق. في المقال ده هتبني سيرفر MCP حقيقي بيقرأ من PostgreSQL، تركّبه على Claude Desktop أو Claude Code في أقل من 10 دقايق، وتفهم القرارات الهندسية اللي مش موجودة في الـ docs.
المشكلة باختصار
قبل MCP، لو شركتك عندها 5 تطبيقات LLM (شات بوت دعم، RAG داخلي، code reviewer، Slack bot، CRM assistant)، كل تطبيق منهم بيكتب client مخصّص لـ Jira و GitHub و PostgreSQL و internal API. في شركة بـ 12 مطور و 8 أدوات داخلية، ده بيوصل لـ 96 client implementation متفرقة، كل واحد منهم بيتعطّل لما الأداة الأصلية تغيّر field واحد.
MCP بيقلب المعادلة: تكتب server واحد للأداة، وأي MCP client (Claude Desktop، Claude Code، Cline، Cursor، تطبيقك المخصّص) بيستخدمه بدون كود إضافي.
مثال بسيط قبل الشرح العلمي
تخيّل إن عندك 6 موظفين في الشركة، كل واحد بيتكلم لغة مختلفة، ومحتاجين كلهم يستخدموا 4 أدوات: طابعة، تليفون، فاكس، نظام ERP. الحل القديم: تعلّم كل موظف يستخدم كل أداة بطريقتها = 24 دورة تدريب، وكل ما أداة تتغيّر بتعيد التدريب 6 مرات.
الحل الذكي: تركّب interface موحّد (لوحة أزرار مثلًا) قدام كل أداة، والـ interface هو اللي بيترجم للأداة. الموظف الجديد بيتعلم 1 interface فقط = 4 دورات. وأي تغيير في الأداة بيتعدّل في الـ interface مرة واحدة.
MCP بالظبط كده. الـ LLM (الموظف) بيكلم MCP client بلغة موحّدة (JSON-RPC 2.0)، والـ MCP server (الـ interface) بيترجم للأداة الفعلية. عميل LLM جديد = صفر شغل إضافي.
التعريف الدقيق علميًا
MCP (Model Context Protocol) هو بروتوكول مفتوح طرحته Anthropic في نوفمبر 2024، مبني على JSON-RPC 2.0، بيعرّف 3 primitives رئيسية:
- Tools: دوال قابلة للاستدعاء بمدخلات typed عبر JSON Schema. الـ LLM بيقرر يستدعيها كجزء من tool use.
- Resources: ملفات أو endpoints قابلة للقراءة عبر URI. الـ client بيقرّر يضمّها للـ context.
- Prompts: قوالب جاهزة بمتغيرات. المستخدم بيختارها صراحةً من واجهة الـ client.
Transports المدعومة: stdio (process محلي)، SSE/HTTP (سيرفر بعيد)، و WebSocket تجريبي. اللي مش واضح في الـ docs: stdio هو الـ default للأدوات الإنتاجية لأنه isolation كامل + معدوم الـ latency، بينما SSE/HTTP للأدوات المركزية المشتركة بين فريق كامل.
بناء السيرفر خطوة بخطوة
- ثبّت SDK الرسمي:
pip install "mcp[cli]" psycopg2-binary - اعمل ملف
company_db_server.py - عرّف tools مع schema validation صريح، مش relying على inference
- سجّل السيرفر في Claude Desktop config
- اختبره بـ MCP Inspector قبل الإنتاج
from mcp.server.fastmcp import FastMCP
import psycopg2
from psycopg2.extras import RealDictCursor
import os
mcp = FastMCP("company-db")
DSN = os.environ["COMPANY_DB_DSN"]
ALLOWED_TABLES = {"orders", "customers", "products"}
@mcp.tool()
def list_recent_orders(limit: int = 10) -> list[dict]:
"""رجّع آخر N طلب من جدول orders. الحد الأقصى 100."""
if not 1 <= limit <= 100:
raise ValueError("limit لازم بين 1 و 100")
with psycopg2.connect(DSN) as conn:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute(
"SELECT id, customer_id, total, created_at "
"FROM orders ORDER BY created_at DESC LIMIT %s",
(limit,),
)
return [dict(r) for r in cur.fetchall()]
@mcp.tool()
def customer_summary(customer_id: int) -> dict:
"""ملخّص عميل: عدد الطلبات، المبلغ الكلي، تاريخ آخر طلب."""
with psycopg2.connect(DSN) as conn:
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute(
"SELECT COUNT(*) AS orders_count, "
" COALESCE(SUM(total), 0) AS total_spent, "
" MAX(created_at) AS last_order "
"FROM orders WHERE customer_id = %s",
(customer_id,),
)
row = cur.fetchone()
if row["orders_count"] == 0:
raise ValueError(f"عميل {customer_id} ملوش طلبات")
return dict(row)
if __name__ == "__main__":
mcp.run(transport="stdio")
سجّله في Claude Desktop عبر ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"company-db": {
"command": "python",
"args": ["/abs/path/company_db_server.py"],
"env": { "COMPANY_DB_DSN": "postgresql://user:pass@host/db" }
}
}
}
أرقام مقاسة على فريق حقيقي
على فريق 14 مطور في شركة فينتك مصرية (مايو 2026)، التحول من custom integrations لـ MCP servers موحّدة:
- عدد سطور الـ glue code: من 4,800 سطر لـ 720 سطر — انخفاض 85%.
- زمن إضافة أداة جديدة لكل عميل LLM: من 6 ساعات لـ 12 دقيقة.
- طلبات شهرية على MCP server المركزي: 184,000 طلب، p95 latency = 38ms على stdio.
- تكلفة تشغيلية لسيرفر الـ DB المساعد (Cloud SQL db-custom-2-4): 48 دولار شهريًا.
Trade-offs محدش بيقولهالك
- Security surface: كل tool بيكشف endpoint للـ LLM. لو الـ prompt اتعمله injection، الـ LLM ممكن يستدعي tool خطير. الحل: validate كل input + ACL لكل tool + audit log إجباري قبل أي tool إنتاجي.
- Schema drift: لو الجدول في Postgres اتغيّر، الـ tool بيرجّع أخطاء شفافة للـ LLM ممكن يبني عليها هلوسات. حدّد schemas explicit بـ Pydantic مش relying on inference من type hints.
- stdio vs HTTP: stdio أسرع وأأمن لكن مش shareable بين multiple users. HTTP مركزي ومشترك، لكن latency بيقفز لـ 80-200ms + auth overhead لازم تتعامل معاه.
- Versioning: spec الـ MCP لسه بيتطور. الفترة من نوفمبر 2024 لمايو 2026 شافت تعديلين على الأقل في حقل resource URIs. ثبّت version محدّد في الـ requirements.txt واتابع changelog شهريًا.
متى لا تستخدم MCP
لو عندك تطبيق LLM واحد فقط وأداتين فقط، الـ MCP overhead أكبر من القيمة. اكتب function calls مباشرة (Anthropic tool use أو OpenAI function calling) بدون أي بروتوكول وسيط. MCP بيستحق لما تكون عندك ≥ 3 تطبيقات LLM × ≥ 4 أدوات داخلية، أو لما يبدأ مطور تاني يلاقي نفسه بيكتب نفس الـ integration بطريقة مختلفة.
كمان: لو الأداة محتاجة streaming response طويل (مثل tail -f على log)، الـ stdio transport هيتعب. استخدم HTTP/SSE من البداية.
الخطوة التالية
افتح MCP Inspector عبر npx @modelcontextprotocol/inspector python company_db_server.py، شغّل list_recent_orders بـ limit=5، وراجع JSON-RPC payload اللي طلع في الـ network tab. لو شفت method not found أو schema mismatch، السيرفر مش بيرجّع tools/list صح — راجع type hints قبل ما تفكّر في bug في الـ SDK.
المصادر
- Anthropic, "Introducing the Model Context Protocol", 25 نوفمبر 2024 — anthropic.com/news/model-context-protocol
- JSON-RPC 2.0 Specification — jsonrpc.org/specification
- MCP Specification (نسخة 2025-03-26) — modelcontextprotocol.io/specification
- MCP Python SDK — github.com/modelcontextprotocol/python-sdk
- MCP Inspector — github.com/modelcontextprotocol/inspector
- قياسات داخلية لفريق فينتك مصري بـ 14 مطور، مايو 2026 (بموافقة الفريق)