الأدوات والموارد والتعليمات
قوالب التعليمات في MCP
التعليمات هي أقل القدرات الثلاث استخداماً، وأكثرها استحقاقاً للاستخدام. فهي بدايات محادثة يقدّمها خادمك إلى المستخدم لا إلى النموذج، ما يجعلها المكان الصحيح لتلك التوجيهات التي يعيد فريقك كتابتها كل مرة بصياغة مختلفة قليلاً.
لماذا التعليمات؟
الحجة الصادقة لصالحها: في مؤسستك فقرة من التوجيهات يكتبها شخص واحد جيداً ويكتبها الباقون بشكل رديء. قالب التعليمات هو المكان الذي تذهب إليه تلك الفقرة لتكفّ عن كونها معرفة شفهية متوارثة.
التعليمات مفيدة في:
- توحيد التفاعلات التي تُنسخ حالياً من صفحة ويكي
- منح نقاط بداية متخصصة لمن لا يعرف كيف يسأل
- تغليف توجيهات أطول من أن يعيد أحد كتابتها بدقة
تشريح تعريف التعليمة
أربعة أجزاء، والفصل بين التعريف والتوليد هو ما يخطئ فيه الناس أولاً:
مما يتكوّن تعريف Prompt
- 01 · name
المعرّف الثابت الذي يستدعيه المضيف. عامله كواجهة برمجية، فإعادة تسميته تكسر سير العمل المحفوظ
code_review - 02 · description
ما يراه المستخدم في قائمة التعليمات داخل المضيف. يُكتب لإنسان يختار من قائمة، لا للنموذج
مراجعة الكود بحثاً عن المشكلات وأفضل الممارسات - 03 · arguments
الفراغات التي يملؤها المستخدم. لا تجعل مطلوباً إلا ما يتعذّر عليك فعلاً وضع قيمة افتراضية له
language (مطلوب) · focus (اختياري) - 04 · messages
تُولَّد عند الطلب عبر get_prompt بعد إدراج المعطيات. هذا هو الجزء الذي يقرأه النموذج فعلاً
role: user ← «راجع كود {language} التالي…»
انقر على أي خانة لرؤية مثال.
الأجزاء الثلاثة الأولى تُعلَن مرة واحدة في list_prompts بوصفها مدخلاً في قائمة. أما الرابع فيُبنى من جديد في get_prompt كلما اختاره أحد. ووضوح هذا الفصل هو ما يجعل سرد التعليمة رخيصاً وبناءها مكلفاً.
تعريف التعليمات
from mcp.types import Prompt, PromptArgument, PromptMessage, TextContent
@server.list_prompts()
async def list_prompts():
return [
Prompt(
name="code_review",
description="مراجعة الكود للممارسات الجيدة والمشاكل",
arguments=[
PromptArgument(
name="language",
description="لغة البرمجة",
required=True
),
PromptArgument(
name="focus",
description="ما يجب التركيز عليه (الأمان، الأداء، الأسلوب)",
required=False
)
]
)
]
توليد محتوى التعليمات
عندما يُطلب تعليمات، أرجع الرسائل الفعلية:
@server.get_prompt()
async def get_prompt(name: str, arguments: dict):
if name == "code_review":
language = arguments["language"]
focus = arguments.get("focus", "الممارسات الجيدة العامة")
return [
PromptMessage(
role="user",
content=TextContent(
type="text",
text=f"""يرجى مراجعة كود {language} التالي.
التركيز على: {focus}
قدم اقتراحات محددة مع أرقام الأسطر حيث ينطبق.
قيّم الكود من 1-10 واشرح تقييمك."""
)
)
]
تعليمات متعددة الأدوار
يمكن أن تتضمن التعليمات رسائل متعددة لسير العمل المعقد:
@server.get_prompt()
async def get_prompt(name: str, arguments: dict):
if name == "debug_session":
return [
PromptMessage(
role="user",
content=TextContent(
type="text",
text="سأشارك خطأ. ساعدني في تصحيحه خطوة بخطوة."
)
),
PromptMessage(
role="assistant",
content=TextContent(
type="text",
text="سأساعدك في التصحيح. يرجى مشاركة رسالة الخطأ والكود ذي الصلة."
)
),
PromptMessage(
role="user",
content=TextContent(
type="text",
text=f"الخطأ: {arguments['error']}\nالكود: {arguments['code']}"
)
)
]
وسائط التعليمات الديناميكية
جلب خيارات الوسائط ديناميكياً:
Prompt(
name="query_database",
description="الاستعلام عن جدول محدد",
arguments=[
PromptArgument(
name="table",
description="اسم الجدول",
required=True,
# يمكن التحقق منه مقابل المخطط الفعلي
)
]
)
التالي: خادم واحد يقدّم القدرات الثلاث دون أن تتعثر إحداها بالأخرى. :::
سجّل الدخول للتقييم