بروتوكول سياق النموذج (MCP)، والملاحظات حول تنفيذ خادم MCP في لغة Go

مقالة مطولة عن مواصفات MCP وتطبيقها في لغة GO

Page content

هنا لدينا وصف بروتوكول سياق النموذج (MCP)، ملاحظات قصيرة حول كيفية تنفيذ خادم MCP في Go، بما في ذلك هيكل الرسالة، ومواصفات البروتوكول.

الروبوتات والمصدر

نظرة عامة على بروتوكول سياق النموذج (MCP)

بروتوكول سياق النموذج (MCP) هو إطار عمل مفتوح ومُعيَّن، (تم تقديمه من قِبل Anthropic في أواخر عام 2024) لربط نماذج لغات الذكاء الاصطناعي بمصادر البيانات الخارجية، والأدوات، والأنظمة. الهدف من ذلك هو حل مشكلة “N×M التكامل” من خلال توفير واجهة عامة لأشياء مثل قراءة الملفات، تنفيذ الوظائف (الأدوات)، واستخدام المحفزات السياقية عبر تطبيقات مختلفة. MCP ليس بروتوكولًا خاصًا أو داخليًا؛ إنه معيار مفتوح مع مواصفة رسمية وتنفيذ مفتوح المصدر. في الواقع، أعلنت شركات الذكاء الاصطناعي الكبرى (بما في ذلك OpenAI وGoogle DeepMind) عن دعمها لـ MCP بعد تقديمه، مما يؤكد أن الهدف منه هو أن يكون معيارًا متبادرًا على نطاق واسع وليس حلًا خاصًا بالشركة المصنعة.

هدف MCP وبنية التصميم

يهدف MCP إلى توحيد طريقة تزويد التطبيقات السياق لـ LLMs – غالبًا ما تُستخدم مقارنة “منفذ USB-C لتطبيقات الذكاء الاصطناعي”. من خلال تحديد بروتوكول مشترك، يسمح MCP للمساعدين الذكاء الاصطناعي والأدوات بالتفاعل بسلاسة مع قواعد البيانات، وأنظمة الملفات، وواجهات برمجة التطبيقات (APIs)، وغيرها من الموارد دون تكاملات مخصصة. هذا يساعد نماذج اللغة على إنتاج استجابات أكثر صلة وتحديثًا من خلال منحها الوصول الآمن إلى البيانات التي تحتاجها.

البنية: يتبع MCP نموذجًا عميل-خادم مع فصل واضح للأدوار:

  • خادم MCP: التطبيق الأبوية (مثل عميل المحادثة أو IDE) الذي يدير الاتصالات. يحتوي على واحد أو أكثر من عملاء MCP (الاتصالات).
  • عميل MCP: مثيل اتصال (داخل الخادم) الذي ينشئ جلسة 1:1 مع خادم MCP. يتعامل العميل مع دورة حياة الجلسة، ويوجه الرسائل، ويفرض أي إذنات المستخدم أو سياسات الأمان.
  • خادم MCP: خدمة خفيفة تكشف عن قدرات معينة (الوصول إلى بيانات معينة أو الوظائف) عبر بروتوكول MCP. يمكن أن يحتوي كل خادم على مصدر بيانات (ملفات، قاعدة بيانات، API، إلخ) أو أداة. يمكن تشغيل عدة خوادم في وقت واحد، كل منها يوفر تكاملات مختلفة.
  • مصادر البيانات/الخدمات: الموارد الفعلية التي يتفاعل معها الخوادم – ويمكن أن تشمل الملفات المحلية والقواعد البيانات أو الخدمات البعيدة (واجهات برمجة التطبيقات، تطبيقات SaaS، إلخ). يعمل خادم MCP كمُحول لهذه الموارد، مما يضمن أن نموذج اللغة يحصل فقط على البيانات عبر البروتوكول المعيَّن.

تُلهم هذه التصميم بروتوكول خادم اللغة (LSP) من عالم IDE. تمامًا كما يسمح LSP لأي محرر بدعم أي لغة برمجة عبر بروتوكول مشترك، يسمح MCP لأي تطبيق ذكاء اصطناعي بالاتصال بأي تكامل بيانات أو أدوات تتحدث MCP. هذا الفصل يعني أن مطوري أدوات الذكاء الاصطناعي يمكنهم كتابة خادم MCP مرة واحدة فقط ليكون مناسبًا لعدد كبير من عملاء الذكاء الاصطناعي، ويمكن لمطوري تطبيقات الذكاء الاصطناعي إضافة تكاملات جديدة فقط من خلال إدراج خادم MCP، مما يتجنب كتابة كود التكامل المخصص.

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

التواصل: يعتمد التواصل في MCP على جلسات مستمرة ومُحَفَّزة باستخدام رسائل JSON-RPC 2.0. تتوافق جميع الطلبات والاستجابات مع تنسيق JSON-RPC (مع حقل "jsonrpc": "2.0"، أسماء الطرق، المعلمات، والIDs المرتبطة). يمكن لأي جانب – العميل أو الخادم – إرسال طلبات أو إشعارات، مما يسمح بالتفاعل ثنائي الاتجاه. تبدأ جلسة MCP عادةً بخطوة التأكيد:

  • يبدأ العميل بطلب initialize، حيث يقترح إصدار بروتوكول معين ويعلن عن ميزاته (الوظائف التي يدعمها). على سبيل المثال، يمكن للعميل أن يشير إلى أنه يمكنه التعامل مع طلبات “Sampling” التي تبدأ من الخادم أو توفير جذور معينة للوصول إلى الملفات. يستجيب الخادم بإصدار بروتوكوله المدعوم وميزاته، مما يحدد الميزات الممكّنة لهذه الجلسة (MCP يستخدم نظام تفاوض على الميزات مشابهًا للميزات الاختيارية في LSP). إذا كانت الميزات الأساسية أو الإصدار غير متوافقين، يتم إنهاء الاتصال بسلاسة.
  • بعد الاتفاق، يرسل العميل إشعارًا initialized لتحديد الاستعداد. بعد ذلك، يمكن أن تبدأ العمليات العادية. تبقى الجلسة مفتوحة لتبادل رسائل JSON-RPC بشكل مستمر حتى يصدر أحد الطرفين طلب إغلاق.

النقل: لا يفرض MCP نقلًا واحدًا فقط – يعمل عبر أي قناة يمكنها نقل نص JSON. عادةً، يُشغل خادم MCP كعملية فرعية ويتواصل عبر STDIO (أنابيب stdin/stdout) للتكاملات المحلية. هذا مشابه لطريقة عمل خوادم اللغة، وهو مفيد لل أدوات المحلية (يمكن للخادم أن يبدأ العملية ويمرر الرسائل). بديلًا لذلك، يمكن تشغيل خوادم MCP كخدمات مستقلة قابلة للوصول عبر HTTP. يحدد مواصفات MCP نقلًا عبر HTTP متدفق حيث يعرض الخادم نقطة وصول HTTP واحدة لطلبات JSON-RPC (يقوم العميل بإرسال طلبات POST، ويمكن للخادم الرد أو تدفق النتائج عبر Server-Sent Events للعمليات طويلة الأمد). في أي من الحالتين، تكون الرسائل نص JSON UTF-8، ويدعم البروتوكول تدفق الاستجابات والرسائل التي تبدأ من الخادم (النهج HTTP+SSE يسمح للخادم بإرسال إشعارات أو نتائج جزئية بشكل غير متزامن). توصي الإرشادات الأمنية بأن الخوادم المحلية تُلصق إلى localhost وتتحقق من رؤوس Origin لمنع الوصول عن بعد غير المرغوب فيه، وأن يتم استخدام المصادقة المناسبة (مثل الرموز أو تدفقات OAuth) للخوادم البعيدة.

هياكل الرسائل: يستخدم MCP أنواع الرسائل الثلاثة في JSON-RPC: الطلبات، الاستجابات، والالإشعارات. تحتوي طلب على id، وسلسلة method، و(اختياريًا) params (عادةً ككائن JSON من المعلمات). يجب على المستقبل الرد برسالة استجابة مطابقة (مع id مطابق) تحتوي إما على result أو كائن error. تشبه الإشعارات الرسائل ذات الاتجاه الواحد مع method وparams ولكن بدون id (إذ لا ترد عليها). يفرض MCP بعض القواعد فوق JSON-RPC الأساسي (على سبيل المثال، يجب أن يكون id غير فارغ وغير مكرر خلال الجلسة) للحفاظ على الوضوح.

الجلسة والحالة: يُعتبر الاتصال حالة مُحَفَّزة – يحافظ العميل والخادم على سياق حول ميزات كل منهما وربما بعض الحالة الخاصة بالجلسة (مثل الاشتراكات في التغييرات، العمليات الجارية، إلخ). هناك أيضًا إجراءات محددة لإنهاء الجلسة بشكل لطيف (على سبيل المثال، يمكن للعميل إرسال طلب إغلاق أو إغلاق القناة مباشرة؛ يجب على الخوادم التعامل مع التنظيف، ويقوم كل طرف بتنفيذ مؤقتات للعمليات المعلقة). تُتبع إجراءات JSON-RPC لإدارة الأخطاء (الاستجابات الخاطئة تحتوي على رمز ورسالة) ويحدد المواصفات رموز أخطاء معيَّنة لبعض الظروف (مثل رفض الإذن، عدم العثور على الأداة، إلخ). يوفر MCP أيضًا أدوات لمعالجة القضايا المترابطة: على سبيل المثال، هناك إشعارات مدمجة لتحديثات التقدم، إلغاء طلب طويل الأمد (CancelledNotification)، الرسائل الخاصة بالتسجيل/التصحيح، وتغييرات التكوين. هذه تساعد في إدارة التفاعلات الطويلة أو المعقدة (يمكن للعميل إلغاء طلب أداة جارية، أو يمكن للخادم إرسال تحذيرات للعميل، إلخ).

ميزات MCP وعمليات التشغيل

بعد التهيئة، تسمح جلسة MCP بتبادل السياق وال الأوامر بطريقة منظمة. الميزات الأساسية لخادم MCP هي المحفزات، المصادر، والأدوات (كل منها يعلن عن دعمه خلال التهيئة):

  • المحفزات: قوالب المحفزات أو التعليمات المُحددة التي يمكن للخادم تقديمها للعميل. عادةً ما تكون هذه محفزات مُحفَّزة من قبل المستخدم (المستخدم يختار محفزًا بشكل صريح لاستخدامه في المحادثة، على سبيل المثال عبر أوامر في الواجهة). يوفر MCP طرقًا لعرض المحفزات المتاحة وجلب محتوى المحفز. على سبيل المثال، يمكن للعميل أن يُجري مكالمة prompts/list للحصول على قائمة قوالب المحفز (كل منها مع اسم، ووصف، ومواصفات معلمة اختيارية). لجلب محفز معين، يستخدم العميل prompts/get مع اسم المحفز وقيم المعلمة؛ ثم يرد الخادم بمحتوى المحفز (غالبًا كمجموعة من الرسائل التي سيحقنها العميل في سياق LLM). تسمح المحفزات بإعادة استخدام تعليمات معقدة أو عمليات (مثل “نموذج مراجعة الكود”) التي يمكن للمستخدم دعوتها عند الحاجة. يشير الخوادم إلى ميزة prompts (مع ميزات فرعية اختيارية مثل listChanged لإعلام العميل إذا تغيرت مجموعة المحفزات ديناميكيًا).

  • المصادر: البيانات المُهيكلة أو المحتوى الذي يوفر سياقًا للنموذج. المصادر عادةً ما تكون أشياء مثل الملفات، الوثائق، وentries قاعدة البيانات – المعلومات التي يمكن لمساعد الذكاء الاصطناعي قراءتها أو مرجعيتها. يُعيِّن MCP طريقة تحديد المصادر ونقلها بشكل معيَّن: كل مورد لديه مُعرِّف URI (مثل file:///path/to/file.txt أو مخطط مخصص لقواعد البيانات). يمكن للعميل استعلام ما المصادر المتاحة عبر resources/list (قد يعرض الخادم شجرة دليل، قائمة الوثائق الأخيرة، إلخ). تشمل استجابة الخادم بيانات لكل مورد (URI، الاسم، النوع، الوصف، إلخ). ثم يمكن للعميل طلب محتوى مورد معين عبر resources/read، مع إرسال URI. يرد الخادم بمحتوى المورد، والذي يمكن أن يكون نصًا (للملفات)، أو بيانات مُهيكلة (MCP يدعم أنواع محتوى مختلفة، مثل النص، JSON، ثنائي، إلخ، مع أنواع MIME). هناك أيضًا دعم لـ قوالب الموارد (مصادر مُهيكلة تُحدد عبر URIs القوالب، والتي يمكن للعميل ملؤها، على سبيل المثال استعلام قاعدة بيانات حيث يوفر المستخدم معلمة). إذا تم تمكينه، يمكن للخوادم إرسال إشعارات عند تغيير الموارد (مثل notifications/resources/updated) أو السماح للعملاء بالاشتراك في تغييرات المورد (resources/subscribe). في تصميم MCP، تكون المصادر مُتحكم بها من التطبيق (التطبيق المضيف (العميل) عادةً ما يقرر أي محتوى من الموارد يحققه فعليًا في محفز النموذج (غالبًا بعد تأكيد المستخدم أو بناءً على سياق الواجهة).

  • الأدوات: الوظائف القابلة للتنفيذ أو العمليات التي يعرضها الخادم للنموذج لاستخدامها. تمثل الأدوات العمليات التي يمكن للذكاء الاصطناعي تنفيذها – على سبيل المثال، استدعاء واجهة برمجة تطبيقات خارجية، تشغيل استعلام قاعدة بيانات، إرسال بريد إلكتروني، أو تعديل ملف. لكل أداة اسم ونموذج JSON للمدخلات (والمخرجات اختياريًا)، لذا يعرف الذكاء الاصطناعي (أو العميل) ما هي المعلمات المتوقعة. عادةً ما تكون الأدوات مُتحكم بها من النموذج: الفكرة هي أن النموذج اللغوي (الوكيل) يقرر هل ومتى استخدام الأداة خلال المحادثة لاستيفاء طلب المستخدم. ومع ذلك، من أجل السلامة، يمكن للمستخدم البشري أو التطبيق المضيف أن يُسيطِر على استخدام الأدوات (على سبيل المثال، يتطلب نقر تأكيد). استخدام الأدوات في MCP يتضمن عمليتين رئيسيتين: القائمة والاتصال. يمكن للعميل أن يُجري مكالمة tools/list للحصول على الأدوات المتاحة ونماذجها. على سبيل المثال، قد يعرض الخادم أداة get_weather مع وصف ونموذج مدخل يتطلب سلسلة “location”. ثم، عندما يقرر النموذج استخدام أداة (أو يُجري المستخدم ذلك)، يرسل العميل طلبًا tools/call مع اسم الأداة وحزمة JSON من المعلمات. ينفذ الخادم الوظيفة ويُرجع النتيجة، والتي تكون غالبًا في حقل result.content ويمكن أن تحتوي على نص أو بيانات مُهيكلة (MCP يدعم عودة أجزاء متعددة من المحتوى، مثل نص مع صورة، إلخ، على الرغم من أن النص هو الشائع). مثال بسيط: استدعاء أداة get_weather قد يُرجع حملة نصية مثل “الطقس الحالي في نيويورك: 72°F، غائم جزئيًا” كمحتوى لعرضه من قبل المساعد. يمكن للأدوات أيضًا إظهار أخطاء (الاستجابة تحتوي على علم isError أو كائن خطأ إذا حدث شيء خاطئ). تمامًا مثل المحفزات والمصادر، يمكن لميزة tools أن تحتوي على علم اختياري listChanged لإعلام المستخدم عند تغيير الأدوات المتاحة في وقت التشغيل (على سبيل المثال، تحميل/إلغاء تحميل وحدة ديناميكية).

بالإضافة إلى الميزات المقدمة من الخادم أعلاه، يحدد MCP أيضًا ميزات مقدمة من العميل (القدرات التي يمكن للخوادم الاستفادة منها إذا دعم العميل ذلك). هذه تشمل العينة، الجذور، والاستخراج:

  • العينة تسمح للخادم بطلب العميل (ونموذج LLM) لإجراء استنتاج نموذجي داخل الجلسة. على سبيل المثال، يمكن للخادم بدء مكالمة LLM (ربما لاستمرار سلسلة التفكير أو لملخص شيء ما) بإرسال طلب مثل sampling/request – ثم يُحفِّز العميل النموذج ويُرجع النتيجة. هذا يسمح بسلوك وكيل حيث يمكن للخادم دفع الذكاء الاصطناعي لمساعدته في مهامه الفرعية. (كل هذه الأفعال تخضع لموافقة المستخدم والسياسات – على سبيل المثال، قد يحتاج المستخدم إلى التسجيل لكي يسمح للخادم بتشغيل النموذج لاستفسارات إضافية.)

  • الجذور تسمح للخادم بالاستفسار أو العمل داخل جذور معينة من نظام الملفات أو URI. يمكن للعميل تقديم قائمة “جذور” من الدليل/URI التي يسمح للخادم بالوصول إليها عبر roots/list. هذا هو ميزة أمان تضمن أن الخادم يعرف الحدود (على سبيل المثال، أي أشجار مجلدات يمكنه قراءتها).

  • الاستخراج يسمح للخادم بالطلب من العميل الحصول على معلومات إضافية من المستخدم إذا لزم الأمر. على سبيل المثال، إذا كانت الأداة بحاجة إلى قطعة معلومات مفقودة لم تُقدَّم، يمكن للخادم إرسال طلب استخراج، والذي سيقوم العميل (الواجهة) بتحويله إلى محفز للمستخدم (“التكامل X يحتاج إلى مفتاح API الخاص بك، يرجى إدخاله”). بهذه الطريقة يمكن للخادم جمع المدخلات تفاعليًا عبر العميل.

هذه الميزات كلها اختيارية ومتفاوضة مسبقًا. من الميزات الرئيسية في تصميم MCP أن تفاوض القدرات يحدث خلال التهيئة – يعلن العميل والخادم عن الميزات التي يدعمانها، لذا يعرف كل طرف ما العمليات المتاحة في الجلسة. على سبيل المثال، إذا لم يعلن الخادم عن ميزة tools، فلن يحاول العميل أي عمليات tools/list أو tools/call معه. هذه المرونة تعني أن MCP يمكن أن يتطور مع ميزات جديدة مع الحفاظ على التوافق الخلفي (الطرق غير المدعومة لن تُستخدم إذا لم يتم التفاوض عليها).

تنفيذات، مكتبات SDK، وبناء خادم MCP (خاصة في Go)

المواصفة الرسمية والتوثيق: المواصفة الرسمية لـ MCP متاحة بشكل مفتوح، بما في ذلك نموذج رسمي لكل أنواع الرسائل. تُدار على موقع بروتوكول سياق النموذج وGitHub. تُعرَّف المواصفة في ملف TypeScript (مع نموذج JSON Schema المقابل) الذي يوثق بدقة جميع الطلبات والاستجابات والهيكل. يوفر الموقع الرسمي (modelcontextprotocol.io) دليلًا، سؤالًا وأجابة، وتحليلًا تفصيليًا لكل ميزة ونوع رسالة، بالإضافة إلى أداة “MCP Inspector” للاستكشاف التفاعلي. على الرغم من أن MCP ليس (بعد) معيارًا IETF أو ISO، إلا أنه يتم تطويره كمعيار مفتوح مع مشاركة المجتمع ويستخدم مصطلحات RFC 2119 المألوفة للطلبات. إنه بروتوكول متغير (يتم وضع علامات على الإصدارات؛ على سبيل المثال، 2025-06-18 هو إصدار حديث)، مع سياسة إصدار لإدارة التغييرات.

التنفيذات المرجعية: عند تقديم MCP، أطلقت Anthropic عددًا من اتصالات خوادم MCP ومكتبات SDK مفتوحة المصدر. هناك منظمة GitHub modelcontextprotocol تُخزن المواصفة وعددًا من المستودعات. لاحظًا، يحتوي مستودع “servers” على مجموعة من تنفيذات خوادم MCP المُعدة مسبقًا لخدمات ومصادر بيانات شائعة. تخدم هذه كمراجع للتكاملات ويمكن استخدامها مباشرة أو كقوالب لخوادم مخصصة. على سبيل المثال، يحتوي المستودع الرسمي على خوادم لـ Google Drive (الوصول إلى الملفات والبحث في Google Drive)، Slack (الرسائل في مساحة العمل والمضمون)، GitHub/Git (سياق مستودعات الكود)، PostgreSQL (استعلامات قاعدة بيانات قراءة فقط مع معلومات المخطط)، Google Maps (API للوصول والاتجاهات)، Puppeteer (التصفح والتنقيب عبر الويب)، وغيرها الكثير. من خلال تثبيت أو تشغيل هذه الخوادم، يمكن لتطبيق ذكاء اصطناعي مثل Claude أو Cursor الحصول على هذه التكاملات فورًا. هناك أيضًا خدمة تسجيل MCP مُدارة من قبل المجتمع (مصدر مفتوح في Go) لفهرسة الخوادم المتاحة، ومساهمات ثالثة توسعة MCP إلى مجالات مختلفة (من CRM إلى بيانات البلوك تشين).

مكتبات SDK: لتسهيل بناء خوادم/عملاء MCP الخاصة بك، هناك مكتبات SDK رسمية في عدة لغات. حتى عام 2025، يوفر المشروع مكتبات SDK لـ TypeScript/Node، Python، Java (وKotlin)، C# (تم تطويرها مع Microsoft)، Ruby (مع Shopify)، Swift، وغيرها. تتعامل هذه المكتبات مع أنابيب البروتوكول – على سبيل المثال، إدارة نقل JSON-RPC، تنفيذ مواصفة النموذج، وتوفير واجهات API مساعدة لتسجيل الأدوات أو تقديم الموارد. على سبيل المثال، يمكن استخدام مكتبة TypeScript SDK لكتابة خادم بسرعة في Node.js، ويمكن استخدام مكتبة Python SDK لدمج MCP في تطبيقات Python. تتيح مكتبة SDK هذه للمطورين ألا يضطروا إلى بناء رسائل JSON-RPC يدويًا أو تنفيذ الآلة الكاملة للحالة؛ بدلًا من ذلك، يُجري المطورون مكالمات إلى وظائف مستوى عالٍ لإرسال الطلبات أو نشر القدرات.

التنفيذ في Go: Go أصبح خيارًا شائعًا لخوادم MCP بسبب قوته في الأداء والقدرة على التعامل مع طلبات متزامنة متعددة (جيد لمعالجة طلبات متعددة في وقت واحد). أصبح SDK Go الرسمي متاحًا الآن، ويتم الحفاظ عليه بالتعاون مع فريق Go في Google. (تم الإعلان عنه حوالي أبريل 2025، والنسخة المستقرة الأولى مخطط لها في أغسطس 2025.) يوفر SDK Go حزمة mcp لبناء العملاء/الخوادم ومساعد jsonschema لمواصفات الأدوات. باستخدام SDK Go، يمكن للمطورين إنشاء خادم MCP ببضع مكالمات فقط. على سبيل المثال، يمكن إنشاء خادم جديد باسم ونسخة، ثم إضافة أدوات عبر AddTool بتقديم تعريف الأداة (الاسم، الوصف، نموذج المدخلات) مع وظيفة Go للتنفيذ عند استدعاء الأداة. يتعامل SDK مع إظهار الأداة في البروتوكول (الإعلان عنها في tools/list ومعالجة طلبات tools/call). بطريقة مماثلة، يمكن إظهار مصادر أو محفزات باستخدام واجهات API مماثلة. في النهاية، تُشغل الخوادم – على سبيل المثال، server.Run(ctx, mcp.NewStdioTransport()) سيبدأ معالجة رسائل JSON-RPC عبر stdio حتى يفصل العميل الاتصال. من جانب العميل، يمكن لـ SDK Go إنشاء عملية فرعية وربطها عبر mcp.NewCommandTransport(exec.Command("myserver"))، ثم يمكن للعميل مكالمة session.CallTool(ctx, params) لاستدعاء الأداة وحصول النتيجة بسهولة في كود Go.

مثال: تُظهر الوثائق الرسمية لـ SDK Go بسيطًا “خادم مرحِّب”. يسجل الخادم أداة "greet" التي تأخذ اسمًا وتعيد سلسلة ترحيب. ثم يُجري العميل استدعاء هذه الأداة باسمها ويطبع النتيجة. هذا يوضح النمط الأساسي: تعريف أداة -> العميل يستدعي الأداة -> الحصول على النتيجة. في الخلفية، هذا يتوافق مع رسائل JSON-RPC ("method": "tools/call", params: {"name": "greet", ...} ورد الاستجابة يحتوي على result.content مع النص) كما يُعرَّف في مواصفات MCP.

قبل إصدار SDK Go الرسمي، أنشأ المجتمع مكتباته الخاصة في Go. لاحظًا، مشروع mcp-go من Ed Zynda (mark3labs/mcp-go) كان شائعًا وتأثيره على تصميم SDK الرسمي. هناك أيضًا مكتبة، mcp-golang من Metoro، تقدم تنفيذًا في Go وواجهة API (مدونة Dev Community من Elton Minetto تستخدم هذه المكتبة حتى أوائل عام 2025). هذه المكتبات المجتمعية ساعدت مطوري Go على تجربة MCP مبكرًا – على سبيل المثال، يوضح أحد الدروس كيفية بناء خادم MCP يبحث عن رموز بريدية برازيلية (CEP) من خلال إظهار أداة “zipcode” عبر مكتبة mcp-golang من Metoro. في هذا المثال، يسجل الخادم Go دالة تُجري استعلامًا لواجهة برمجة تطبيقات خارجية للعثور على عنوان من رمز بريدية، وتعيد النتيجة كنص – مما يسمح لمساعد الذكاء الاصطناعي بطلب معلومات العنوان عند الحاجة عبر MCP. توضح دليل آخر تغليف قاعدة بيانات داخلية مخصصة (DiceDB) كخادم MCP باستخدام SDK mcp-go من mark3labs: تحدد ping أداة لفحص اتصال القاعدة البيانات و أدوات أخرى للعمليات البيانات. هذه الأمثلة توضح مدى سهولة إنشاء تكامل MCP: معظم الكود هو مجرد منطق العمل (طلبات API، استعلامات قاعدة البيانات، إلخ)، بينما يتعامل SDK مع توصيل JSON-RPC.

بناء خادم MCP في Go (موجز الدورة التعليمية)

للتوضيح، إليك تدفقًا نموذجيًا باستخدام Go SDK أو مكتبة مشابهة:

  1. إعداد الخادم: قم بإنشاء خادم جديد مع معلومات أساسية (الاسم، الإصدار، وحدد القدرات المدعومة). على سبيل المثال، في Go: server := mcp.NewServer("MyServer", "1.0.0", nil) سيقوم بإنشاء خادم (بشكل افتراضي) يدعم ميزات بروتوكول الأساسية. يمكنك تمكين ميزات معينة مثل المحفزات/الموارد/الأدوات عبر خيارات أو ببساطة من خلال تسجيل هذه الميزات (إضافة أداة أو مورد يعني هذه القدرة).

  2. تسجيل الميزات: أضف الوظائف التي ترغب في إظهارها:

    • إذا كنت ترغب في إظهار الأدوات، حدد مخطط كل أداة ومُعالجها. على سبيل المثال، باستخدام AddTool في SDK الخاص بـ Go: قم بتوفير mcp.Tool{Name: "...", Description: "..."} ومُعالج دالة تأخذ طلب المكالمة وتعيد نتيجة (قد تشمل النص أو محتوى آخر). سيقوم SDK بتحديث تلقائي لنموذج JSON Schema للإدخالات من أنواع المعلمات الخاصة بمُعالجك (أو يمكنك تحديدها يدويًا).
    • إذا كنت ترغب في إظهار الموارد، قد تستخدم واجهة برمجة تطبيقات لتسجيل قائمة الموارد أو دالة متابعة لقراءة المحتوى. على سبيل المثال، في SDK الخاص بـ Python، يمكنك تخصيص مزود الموارد (ResourceProvider)؛ في Go، لا يزال SDK يتطور، لكنك ستحتاج على الأرجح إلى توفير دوال لعرض وقراءة الموارد. يجب أن يكون لكل مورد عنوان URI مستقر.
    • إذا كنت ترغب في إظهار المحفزات، حدد قوالب المحفزات (قد تكون ملفات ثابتة أو سلاسل نصية) وسجّلها باسم وخيارات معلمات اختيارية. سيقوم الخادم بالإعلان عنها حتى يمكن للعميل تحميلها وعرضها على المستخدمين.
  3. تنفيذ النقل: قرر كيف سيقوم الخادم بالتشغيل. الأبسط للاستخدام المحلي هو استخدام stdio – على سبيل المثال، server.Run(ctx, mcp.NewStdioTransport()) في Go سيبدأ بقراءة JSON-RPC من stdin. إذا كان الخادم يجب أن يكون متصلًا بشبكة، فقد تختار تنفيذ مُعالج HTTP يستخدم SDK الخاص بـ Go لقبول JSON-RPC عبر HTTP (قد يحتوي SDK الرسمي لـ Go قريبًا على مساعدة أيضًا لنقل HTTP/SSE).

  4. اختبار العميل: يمكنك اختبار الخادم باستخدام عميل متوافق مع MCP. على سبيل المثال، Claude 2 من Anthropic (Claude for Desktop) يدعم تحميل خوادم MCP محلية؛ ستقوم بتكوين Claude لتشغيل أو الاتصال بملف ثنائي الخادم الخاص بك. هناك أيضًا أداة سطر الأوامر تسمى mcp-cli والأداة الرسومية MCP Inspector لاختبار الخوادم دون الحاجة إلى عميل ذكاء اصطناعي كامل – هذه الأدوات ترسل طلبات MCP إلى خادمك وتعرض النتائج، مما يساعد في التصحيح.

  5. الأمان والصلاحيات: عند بناء خادم، تأكد من أخذ المصادقة والصلاحيات في الاعتبار. بالنسبة للخوادم المحلية، قد يشغل المضيف الخادم ببعض صلاحيات النظام أو يوفر مفاتيح API عبر البيئة. بالنسبة للخوادم البعيدة، استخدم رؤوس المصادقة أو تدفقات OAuth. يحتوي MCP على مواصفات تفويض للنقل عبر HTTP (يمكن للخادم أن يتطلب رمزًا ويعبر العميل عن إرساله). تأكد دائمًا من أن الخادم لا يوصول إلى البيانات التي لم يسمح بها المستخدم (على سبيل المثال، احترم المجلدات الجذرية التي يوفرها العميل، ولا تتسرب البيانات إلى أماكن أخرى) – تؤكد إرشادات MCP على موافقة المستخدم، خصوصية البيانات، وسلامة الأدوات كأمور أساسية.

باختصار، MCP هو بروتوكول رسمي لكنه مرن لربط نماذج الذكاء الاصطناعي بالعالم الخارجي. إنه ليس واجهة برمجة تطبيقات داخلية مرتبطة بشركة واحدة، بل معيار مفتوح مع اعتماد متزايد ونظام تكامل غني. يحدد البروتوكول هيكل الرسائل الواضح (مبنية على JSON-RPC) ومجموعة من العمليات (طرق للمحفزات، الأدوات، الموارد، إلخ) التي يمكن لأي عميل/خادم متوافق تنفيذها. تتوفر الوثائق الرسمية والمواصفات، وهناك عدد كبير من SDKs، المكتبات، وخدمات الخوادم النموذجية (بما في ذلك في Go) مما يجعل من السهل تنفيذها. من خلال استخدام MCP، يمكن للمطورين بناء تطبيقات مدعومة بـ AI تستخدم البيانات والخدمات الموجودة بأمان دون إعادة اختراع منطق التكامل لكل نموذج أو مجموعة بيانات جديدة.

روابط مفيدة