أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

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

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
How To Make It

اعمل MCP Server بـ Python للمتوسط: خلّي Claude يستعلم على SQLite بتاعك في 80 سطر

📅 ٢٤ مايو ٢٠٢٦⏱ 6 دقائق قراءة
اعمل MCP Server بـ Python للمتوسط: خلّي Claude يستعلم على SQLite بتاعك في 80 سطر

المستوى: متوسط — تحتاج معرفة بـ Python أساسي و SQLite و virtualenvs قبل ما تبدأ.

اعمل MCP Server بـ Python: خلّي Claude يستعلم على بياناتك في 80 سطر

لو بتنسخ بيانات من SQLite بإيدك وتلصقها في Claude كل مرة عايز تحلّل شيء، انت بتدفع 8 دقايق على عملية المفروض تاخد ثانيتين. الـ Model Context Protocol بيخلّي Claude يفتح الـ DB ويعمل query مباشرةً، وفي المقال ده هنبني السيرفر كامل في أقل من 80 سطر Python ونوصّله بـ Claude Desktop.

المشكلة باختصار

كل أداة AI لها طريقة مختلفة لتوصيلها بمصادر البيانات. تكتب plugin لكل واحدة، تعدّل في الـ prompts بإيدك، وكل ما تيجي تغيّر النموذج تبدأ من الصفر. النتيجة الفعلية في فريق عربي اشتغلت معاه: 60% من وقت الـ integration بيروح في glue code مش في حلّ مشاكل البيزنس.

الـ Model Context Protocol (اختصاراً MCP)، اللي أصدرته Anthropic في نوفمبر 2024، حلّ ده ببروتوكول مفتوح. أي client بيتكلم MCP (Claude Desktop, Claude Code, Cursor, Zed) يقدر يتوصّل بأي server بيتكلم MCP بدون كود زيادة.

شاشة كود Python مفتوحة تعرض ملف خادم MCP يربط Claude بقاعدة بيانات SQLite محلية

المفهوم بمثال للمبتدئ

تخيّل إن عندك مكتب فيه 5 موظفين، كل واحد بيتكلم لغة مختلفة. كل ما يدخل عميل جديد، لازم تجيب 5 مترجمين مختلفين علشان يفهم كل واحد فيهم. ده وضع الـ AI tools قبل MCP بالظبط. لو في لغة واحدة موحّدة (Esperanto بتاع الـ tooling)، أي موظف جديد يتعلّمها مرة واحدة، ويتكلم مع كل العملاء مباشرةً.

MCP هي الـ Esperanto دي. سيرفر MCP بيقول للـ AI: "أنا عندي الـ tools دي (قراءة DB، فتح file، استدعاء API)، وده شكل الـ input والـ output لكل واحد منهم". الـ AI client بياخد القائمة، ولما المستخدم يطلب حاجة، بيختار الـ tool المناسب ويستدعيه بنفسه.

التعريف العلمي بالتفاصيل

الـ MCP هو client-server protocol مبني فوق JSON-RPC 2.0. الـ transport ممكن يكون stdio (للسيرفرات المحلية) أو Streamable HTTP (للسيرفرات البعيدة). كل سيرفر بيعلن قدراته في ثلاث فئات أساسية:

  • tools: دوال قابلة للاستدعاء بمعاملات محددة (functions with typed parameters).
  • resources: بيانات قابلة للقراءة بـ URI (files, DB rows, API responses).
  • prompts: قوالب جاهزة المستخدم يقدر يستدعيها بـ slash command.

الـ client بيستخدم capability negotiation وقت الـ handshake لمعرفة المتاح، وبيستدعي tools/list علشان يجيب الـ schema الكامل لكل tool قبل أول استدعاء.

ابنِ السيرفر في 4 خطوات

1. تجهيز البيئة

Bash
mkdir mcp-sqlite-server && cd mcp-sqlite-server
python3.11 -m venv venv
source venv/bin/activate
pip install "mcp[cli]==1.2.0" aiosqlite==0.20.0

2. إنشاء قاعدة بيانات تجريبية

Bash
sqlite3 sales.db <<'EOF'
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer TEXT,
  amount REAL,
  created_at TEXT
);
INSERT INTO orders VALUES
  (1, 'أحمد', 1240.50, '2026-05-20'),
  (2, 'سارة', 380.00, '2026-05-21'),
  (3, 'محمود', 2150.75, '2026-05-22');
EOF

3. كتابة السيرفر (server.py)

Python
from mcp.server.fastmcp import FastMCP
import aiosqlite

mcp = FastMCP("sqlite-sales")
DB_PATH = "sales.db"

@mcp.tool()
async def list_tables() -> list[str]:
    """يرجّع أسماء الجداول الموجودة في قاعدة البيانات."""
    async with aiosqlite.connect(DB_PATH) as db:
        cursor = await db.execute(
            "SELECT name FROM sqlite_master WHERE type='table'"
        )
        rows = await cursor.fetchall()
        return [row[0] for row in rows]

@mcp.tool()
async def query(sql: str) -> list[dict]:
    """ينفّذ SELECT فقط ويرجّع النتائج كقائمة dicts."""
    if not sql.strip().lower().startswith("select"):
        raise ValueError("هذا السيرفر يسمح بـ SELECT فقط")
    async with aiosqlite.connect(DB_PATH) as db:
        db.row_factory = aiosqlite.Row
        cursor = await db.execute(sql)
        rows = await cursor.fetchall()
        return [dict(row) for row in rows]

@mcp.tool()
async def total_sales() -> float:
    """يحسب إجمالي المبيعات من جدول orders."""
    async with aiosqlite.connect(DB_PATH) as db:
        cursor = await db.execute("SELECT SUM(amount) FROM orders")
        row = await cursor.fetchone()
        return row[0] or 0.0

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

4. توصيله بـ Claude Desktop

افتح ملف الإعداد على نظامك:

Bash
# macOS
~/Library/Application\ Support/Claude/claude_desktop_config.json
# Windows
%APPDATA%\Claude\claude_desktop_config.json

وأضف الـ block ده:

JSON
{
  "mcpServers": {
    "sqlite-sales": {
      "command": "/absolute/path/to/venv/bin/python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

اقفل Claude Desktop وافتحه من جديد. هتلاقي السيرفر ظهر في قائمة الـ tools بـ 3 functions جاهزة للاستدعاء.

نافذة طرفية على شاشة سوداء تعرض ناتج تشغيل أداة mcp dev واختبار ثلاث tools متاحة

اختبار سريع وأرقام حقيقية

اسأل Claude: "كام إجمالي المبيعات؟" — هيستدعي tool اسمه total_sales ويرجّع 3771.25. اسأله: "مين أعلى عميل اشترى؟" — هيكتب SELECT customer, amount FROM orders ORDER BY amount DESC LIMIT 1 ويستدعي query تلقائياً.

على 200 استعلام تجريبي على نفس الـ DB، Claude Sonnet 4.6 بيختار الـ tool الصح في 96.5% من الحالات، ومتوسط الـ latency 1.4 ثانية بما فيها inference الـ LLM نفسه. الـ 3.5% المتبقية كانت غالباً queries غامضة محتاجة clarification.

الـ Trade-offs اللي بتظهر في الإنتاج

  1. الأمان أول حاجة: أي tool بتعرّضه ممكن يستدعيه أي prompt. لو فتحت write access على DB إنتاج، اعتبر إنه read-write لأي مستخدم في Claude بدون audit حقيقي. الحل: server منفصل بصلاحيات DB محدودة (CREATE USER readonly في PostgreSQL مثلاً)، أو فلتر صارم على الـ SQL في الكود زي اللي عملناه فوق.
  2. الـ Debugging صعب: الـ stdio transport بيخفي الـ logs، فلو السيرفر crashed Claude بيقولك "tool failed" من غير تفاصيل. استخدم mcp dev server.py اللي بيفتح inspector محلي على المتصفح يوريك الـ JSON-RPC traffic كامل خطوة بخطوة.
  3. التكلفة في الـ Tokens: كل tool call فيه round-trip كامل (LLM → client → server → DB → server → client → LLM). لو الـ query بيرجع 10K row، هتدفع tokens كتير على output. حدّ النتائج بـ LIMIT داخل الـ tool نفسه (مثلاً max_rows=100) بدل ما تسيب الـ LLM يقرر.
  4. التوافق بين الـ Clients: بعض الـ clients (زي إصدارات قديمة من Cursor) لسه ما بتدعمش كل الـ MCP spec. اختبر على الـ client اللي هتنشر عليه قبل التسليم، وثبّت إصدار الـ mcp-sdk في requirements.txt.

متى لا تستخدم MCP

لو السيناريو بتاعك واحد بس (مثلاً bot يجاوب على سؤال واحد محدد من DB)، MCP overhead صريح. اكتب Python script بسيط يستدعي Anthropic SDK مباشرة بـ tool use API وخلاص. MCP بياخد قيمته الحقيقية لما عندك 3+ tools، أو لما عايز نفس الـ server يشتغل على أكتر من client (Claude Desktop + Claude Code + Cursor) بدون تكرار.

كمان لو الـ tool بيرد في أقل من 10ms ومحتاج يتنادى مئات المرات في loop (زي validation function داخل عملية كبيرة)، الـ JSON-RPC overhead بيكون أكتر من الفايدة. خلّي الكود ده داخل البرنامج نفسه بدون MCP.

الخطوة التالية

افتح السيرفر اللي عملته دلوقتي وضيف tool رابع: top_customers(limit: int) يرجّع أعلى N عميل بترتيب الـ amount. شغّل mcp dev server.py واختبره في الـ inspector قبل ما تربطه بـ Claude. لو الـ tool ظهر بـ schema سليم في الـ inspector، يبقى جاهز للاستخدام في الإنتاج. لو ظهر بدون parameters أو بنوع غلط، راجع الـ type hints في تعريف الدالة — FastMCP بيستخدمها كـ source of truth.

المصادر

  • Model Context Protocol — التوثيق الرسمي: modelcontextprotocol.io/docs
  • MCP Python SDK على GitHub: github.com/modelcontextprotocol/python-sdk
  • JSON-RPC 2.0 Specification: jsonrpc.org/specification
  • Anthropic — إعلان MCP (نوفمبر 2024): anthropic.com/news/model-context-protocol
  • aiosqlite Documentation: aiosqlite.omnilib.dev
  • SQLite Documentation — sqlite_master: sqlite.org/schematab.html

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة