فهم بروتوكول سياق النموذج
نظرة عميقة على هندسة MCP
ثلاث طبقات تفصل بين النموذج وبياناتك. وعندما يتعطل الخادم، فإن الطبقة التي حدث فيها العطل هي ما يخبرك أي ملف تفتح — ولهذا يستحق الأمر أن تعرف أسماءها قبل كتابة أي كود.
الطبقات الثلاث في خادم MCP
الطبقات الثلاث
1. طبقة النقل
يدعم MCP آليتين للنقل:
| النقل | حالة الاستخدام |
|---|---|
| stdio | العمليات المحلية، أدوات CLI |
| Streamable HTTP | الخوادم البعيدة، المستندة إلى الويب (قُدم في مواصفة 2025-03-26) |
ملاحظة: تم إهمال نقل HTTP+SSE القديم في تحديث المواصفة لشهر مارس 2025 لصالح Streamable HTTP، الذي يستخدم نقطة نهاية HTTP واحدة ويرقى اختيارياً إلى SSE للبث. خوادم SSE القديمة لا تزال تعمل ولكن المشاريع الجديدة يجب أن تستخدم Streamable HTTP.
# نقل stdio (محلي)
server = Server(name="my-server")
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
# نقل Streamable HTTP (بعيد)
server = Server(name="my-server")
async with streamable_http_server(port=8000) as (read_stream, write_stream):
await server.run(read_stream, write_stream)
2. طبقة البروتوكول
تتعامل طبقة البروتوكول مع تنسيق الرسائل باستخدام JSON-RPC 2.0:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_database",
"arguments": {
"query": "بريد المستخدمين"
}
}
}
3. طبقة القدرات
هنا يعيش منطقك - الأدوات والموارد والتعليمات التي تكشفها.
تدفق الرسائل
MCP بروتوكول بلا حالة. هذه الجملة وحدها تفسّر معظم ما يلي. فكل ما يلزم لمعالجة طلب موجود داخل الطلب نفسه، والخادم لا يستنتج شيئاً مما سبقه، ولو على الاتصال ذاته.
يستحق هذا وقفة، لأن النموذج البديهي خاطئ. لا تسجيل دخول ولا جلسة ولا مصافحة افتتاحية. وعملية stdio المفتوحة ليست محادثة — فللعميل أن يمزج طلبات غير مترابطة في الأنبوب نفسه، وعلى خادمك ألا يعامل الاتصال كهوية.
ماذا يحدث في طلب واحد — وفي ذلك الطلب وحده
الطلب يحمل إصدار البروتوكول وقدرات العميل في _meta. لم يُتفاوض على شيء سابقاً لأنه لا يوجد سابق
غياب بيانات وصفية مطلوبة يعني -32602، والحاجة إلى قدرة لم يعلنها العميل تعني -32021 مع سرد ما نقص
ما دام الطلب قيد التنفيذ يجوز للخادم إرسال إشعارات مرتبطة به: التقدّم ورسائل السجل. ولا يرسل طلباً من عنده أبداً
نتيجة واحدة أو خطأ واحد، يحمل resultType بقيمة complete أو input_required
تترتب على ذلك نتيجتان مباشرتان، وكلتاهما تظهر عملياً:
- لا يستطيع خادمك تخزين حالة مرتبطة بالاتصال. فأي شيء يجب أن يتجاوز عمر الطلب الواحد — مهمة طويلة أو مقبض تطبيقي — يحتاج معرّفاً صريحاً يعيده العميل في كل مرة. وتخزينه على الاتصال سينجح في الاختبار ويفشل لحظة فتح العميل اتصالاً ثانياً.
- أوصاف الأدوات تُقرأ من جديد، لا مرة واحدة. في نموذج الجلسة القديم كان الوصف الرديء يترسّخ طوال المحادثة. أما في النموذج الحالي فكل طلب قائم بذاته، وهذا أرحم مع التغيير وأقسى على من يفترض أن العميل يتذكر شيئاً.
ملاحظة عن الإصدار. هذا يصف مراجعة المواصفة
2026-07-28. أما المراجعات الأقدم (حتى 2025) فكانت تستخدم مصافحةinitializeتفتح جلسة مرتبطة بالاتصال وتسمح للخوادم ببدء الطلبات، والمواصفة الحالية تعرّف تراجعاً متوافقاً يتيح تعايش الحقبتين. فإن قرأت شرحاً أقدم يبدأ بـinitializeفهذا سببه. والمواصفة هي المرجع الموثوق، وهي تتحرك أسرع من أي دورة.
نموذج الأمان
يطبق MCP الأمان من خلال:
- الوصول المستند إلى القدرات: الخوادم تكشف فقط ما تختاره
- موافقة المستخدم: يجب على المضيفين التأكيد قبل استدعاء الأدوات
- العزل: الخوادم تعمل في عمليات معزولة
- لا وصول مباشر للشبكة: الخوادم لا يمكنها إجراء طلبات عشوائية
مهم: لا تكشف أبداً عمليات حساسة بدون المصادقة والتفويض المناسبين في خادم MCP الخاص بك.
في القسم التالي، سنُعد بيئة التطوير الخاصة بك لـ MCP. :::
سجّل الدخول للتقييم