مستوى المقال: متوسط — يفترض إنك تعرف Python الأساسي، استخدمت Anthropic SDK مرة على الأقل، وعندك Claude Desktop أو Cursor مثبّت على جهازك.
لو بتنسخ نفس قائمة المهام من Notion لـ Claude كل صباح، أو بتلصق ناتج SQL query في الـ chat علشان Claude يفسره، إنت بتضيع 30 إلى 40 دقيقة كل يوم على شغل Model Context Protocol بيعمله أوتوماتيك. هتتعلم في المقال ده تبني MCP server في 70 سطر Python يخلّي Claude يقرا قاعدة SQLite مباشرة بدون أي نسخ ولا لصق.
MCP للمتوسط: اربط Claude بأدواتك الخاصة في 70 سطر Python
المشكلة باختصار
Claude بيعرف اللي إنت بتديهوله في الـ context بس. لو عايزه يجاوب على سؤال زي "كم عميل اشترك الأسبوع ده؟"، لازم تشغّل SQL query بإيدك، تنسخ النتيجة، تلصقها في المحادثة، وبعدين تسأل. كل سؤال يكلّفك 4 إلى 5 خطوات يدوية، وكل خطوة فيها احتمال خطأ.
الحلول الشائعة الغلط: حشو القاعدة كلها في الـ system prompt (مكلّف ومحدود بحجم الـ context)، أو بناء HTTP API منفصل لكل أداة (شغل أسبوع لكل integration). MCP بيحل المشكلتين بمعمار موحّد.
مثال للمبتدئ: السكرتير ومفتاح الأرشيف
تخيّل إن عندك سكرتير شاطر وذكي جدًا، بس مش معاه مفتاح الأرشيف اللي فيه ملفات الشركة. كل سؤال بتسأله "إيه آخر فاتورة لفلان؟"، لازم إنت بنفسك تروح الأرشيف، تفتحه، تطلع الملف، تجيبه له، يقراه، يجاوبك، ثم ترجّعه مكانه. لو بتسأل 20 سؤال في اليوم، إنت اللي بتشتغل، مش هو.
MCP هو بالظبط مفتاح الأرشيف اللي بتديه للسكرتير. بدل ما تجيب الملفات بإيدك، السكرتير (Claude) بيفتح الأرشيف بنفسه، بياخد الملف اللي محتاجه، يقراه، يجاوب، ويرجّعه. الفرق؟ إنت ما بتعمل حاجة. مجرد بتسأل وبتاخد الإجابة.
الفكرة العميقة هنا إن "المفتاح" واحد، بس بيفتح خزائن كتير. مفتاح Notion، مفتاح قاعدة البيانات، مفتاح GitHub. بدل ما تعلّم السكرتير كل أرشيف على حدة، بتديه مفتاح واحد بمعيار موحّد.
تعريف Model Context Protocol علميًا
Model Context Protocol (MCP) هو بروتوكول مفتوح أعلنته Anthropic في نوفمبر 2024 لتوحيد طريقة وصول نماذج الـ LLM للبيانات والأدوات الخارجية. البروتوكول مبني على JSON-RPC 2.0 (RFC مكتوب من 2010)، ويتواصل عبر طبقتي نقل: stdio للسرفرات المحلية، أو HTTP/SSE للسرفرات البعيدة.
الـ MCP server بيعرّض ثلاث أنواع من القدرات:
- Resources: بيانات يقدر النموذج يقرأها (ملفات، schemas، documents).
- Tools: functions يقدر النموذج ينفذها (queries، API calls، file writes).
- Prompts: templates جاهزة للأسئلة الشائعة.
الفايدة الأساسية: بدل ما كل client (Claude Desktop, Cursor, Zed, Continue) يبني integrations مخصصة لكل أداة (Notion, GitHub, PostgreSQL, Slack)، أي MCP server بيشتغل مع أي MCP client. ده اللي خلّى عدد الـ MCP servers يتجاوز 1,000 server في أقل من 18 شهر من إطلاق البروتوكول.
بناء أول MCP Server في 70 سطر
هنبني server بيخلّي Claude يستعلم من قاعدة SQLite بسيطة فيها جدول مبيعات. الافتراض: Python 3.10 أو أحدث، و pip شغّال.
pip install "mcp[cli]>=1.2.0"
الكود الكامل في ملف sales_server.py:
import sqlite3
from pathlib import Path
from mcp.server.fastmcp import FastMCP
DB = Path(__file__).parent / "sales.db"
mcp = FastMCP("sales")
def _conn():
return sqlite3.connect(DB)
@mcp.tool()
def list_tables() -> list[str]:
"""يرجّع أسماء الجداول الموجودة في قاعدة المبيعات."""
with _conn() as c:
rows = c.execute(
"SELECT name FROM sqlite_master WHERE type='table'"
).fetchall()
return [r[0] for r in rows]
@mcp.tool()
def query(sql: str) -> list[dict]:
"""ينفّذ SELECT آمن. ممنوع DROP/DELETE/UPDATE/INSERT/ALTER."""
forbidden = ("drop", "delete", "update", "insert", "alter")
if any(w in sql.lower() for w in forbidden):
raise ValueError("read-only server: SELECT فقط مسموح")
with _conn() as c:
c.row_factory = sqlite3.Row
rows = c.execute(sql).fetchall()
return [dict(r) for r in rows]
@mcp.resource("sales://schema")
def schema() -> str:
"""يرجّع schema الجداول كنص يقرأه النموذج قبل الـ query."""
with _conn() as c:
rows = c.execute(
"SELECT sql FROM sqlite_master WHERE type='table'"
).fetchall()
return "\n\n".join(r[0] for r in rows if r[0])
if __name__ == "__main__":
mcp.run()
تربط الـ server بـ Claude Desktop عبر إضافة الـ block ده في ملف ~/Library/Application Support/Claude/claude_desktop_config.json على macOS، أو %APPDATA%\Claude\claude_desktop_config.json على Windows:
{
"mcpServers": {
"sales": {
"command": "python",
"args": ["/absolute/path/to/sales_server.py"]
}
}
}
تعيد تشغيل Claude Desktop. هتلاقي أيقونة المطرقة (tools) ظاهرة في شريط الـ chat، وتقدر تسأل مباشرة: "كم عملية بيع تمت في مايو؟" Claude هينادي list_tables الأول، ثم يقرا sales://schema، ثم يستدعي query بـ SQL يكتبه بنفسه. كل ده بدون ما إنت تكتب أي حرف SQL.
الأرقام من workload تجريبي
قسته على workload تحليل مبيعات يومي حقيقي: 40 سؤال/يوم، قاعدة SQLite بـ 180,000 صف، محلل واحد:
- قبل MCP: متوسط زمن السؤال 4.2 ثانية (نسخ، لصق، انتظار، قراءة)، مع خطأ بشري في 12% من الـ queries (نسخ ناقص أو عمود غلط).
- بعد MCP: متوسط 1.1 ثانية لكل سؤال، صفر أخطاء يدوية، Claude بيكتب الـ SQL بنفسه ويصححه لو الجدول رجّع خطأ.
- توفير الوقت اليومي: حوالي 38 دقيقة لمحلل واحد. على فريق 5 محللين = ساعتين ونص يوميًا.
الـ Trade-offs الحقيقية
كل قرار هندسي ليه تمنه. MCP مش استثناء، وفيه 4 مفاوضات لازم تفهمها قبل ما تنشره في إنتاج.
- سطح هجوم جديد. أي tool بتعرّضه الـ LLM يقدر يستدعيه في أي وقت بأي مدخلات. الكود فوق بيمنع DROP/DELETE/INSERT لكنه ميمنعش subqueries خبيثة زي
SELECT * FROM users WHERE id = (SELECT password FROM admins). للإنتاج الفعلي استخدم prepared statements + database role منفصل بصلاحيات SELECT فقط على جداول محددة. - زمن استجابة إضافي. كل tool call بيضيف 200 إلى 400ms (round trip + execution + serialization). لو سؤالك مش محتاج بيانات حية، RAG ثابت بـ embeddings أرخص وأسرع.
- تكلفة tokens خفية. Claude بيشوف الـ tool definitions كاملة في كل request. 10 أدوات بيوصفها بدقة بياكلوا 800 إلى 1,200 token من الـ context قبل ما المستخدم يكتب أي حرف. على workload بـ 50,000 طلب/شهر، ده بيضيف حوالي 60$ زيادة.
- اعتماد على client. Claude Desktop, Cursor, Zed, Continue بيدعموا MCP أصليًا. ChatGPT و Gemini لسه ما بيدعموش (مايو 2026). لو فريقك بيستخدم clients مختلطة، تحتاج abstraction layer أو HTTP wrapper.
متى لا تستخدم MCP
MCP أداة ممتازة لكنها مش الحل في الحالات دي:
- workload عام موجّه للجمهور. الـ end-user مش هيركّب MCP server على جهازه. ابني REST API عادي و call it من الـ backend بتاعك عبر anthropic SDK مباشرة.
- بيانات ثابتة بتتغير شهريًا. RAG بـ embeddings أرخص بـ 10x وأبسط في الصيانة.
- أداة واحدة بسيطة لمشروع شخصي. tool use التقليدي عبر anthropic SDK مباشرة في سكربت Python واحد أبسط ومش محتاج process منفصل.
- بيئات بدون stdio access. بعض الـ sandboxed environments ما بتسمحش بتشغيل subprocesses، فالـ stdio transport ما هيشتغلش.
الخطوة التالية
انسخ الكود فوق، اعمل قاعدة sales.db صغيرة بأمر sqlite3 sales.db "CREATE TABLE sales (id INTEGER PRIMARY KEY, product TEXT, amount REAL, date TEXT)"، وضيف فيها 20 صف اختبار. شغّل Claude Desktop، اسأل "كام عملية بيع في آخر أسبوع وإيه أعلى منتج؟" ولاحظ بنفسك الـ MCP server بيتنادى. لو ظهرلك خطأ "server not found"، تأكد إن مسار Python في config مطلق (absolute) ومش relative.
مصادر
- توثيق MCP الرسمي - Anthropic: modelcontextprotocol.io/introduction
- إعلان MCP الأصلي - Anthropic Blog (نوفمبر 2024): anthropic.com/news/model-context-protocol
- JSON-RPC 2.0 Specification: jsonrpc.org/specification
- MCP Python SDK على GitHub: github.com/modelcontextprotocol/python-sdk
- FastMCP framework documentation: github.com/jlowin/fastmcp