پروتکل زمینه مدل (MCP) به سرعت به استاندارد اتصال مدلهای زبانی بزرگ (LLM) به ابزارها و منابع داده خارجی تبدیل شده است. با حرکت توسعهدهندگان فراتر از پرامپتهای ایستا و ورود به جریانهای کاری پویا و عاملمحور (Agentic)، درک نحوه ساخت سرورهای MCP کارآمد دیگر یک انتخاب نیست، بلکه ضروری است. یک سرور MCP به عنوان پل بین موتور استدلال هوش مصنوعی و دنیای واقعی عمل میکند و به آن امکان میدهد تا دادههای زنده را دریافت، کد را اجرا یا با APIهای اختصاصی به صورت ساختاریافته و امن تعامل کند.
سرور MCP چیست؟
در هسته خود، یک سرور MCP یک برنامه سبکوزن است که قابلیتهای خاص (ابزارها) را به کلاینتهای MCP ارائه میدهد. کلاینت، که معمولاً یک رابط LLM یا یک عامل هوش مصنوعی است، این ابزارها را کشف کرده و در زمان مناسب از آنها استفاده میکند. برخلاف APIهای REST سنتی که برای بارهای JSON قابل خواندن توسط انسان طراحی شدهاند، MCP از یک پروتکل استاندارد JSON-RPC 2.0 برای مدیریت چرخههای درخواست/پاسخ، اشتراکگذاری و مدیریت خطا استفاده میکند که به طور خاص برای تعامل با هوش مصنوعی بهینه شده است.
ارزش کلیدی MCP در آگاهی از زمینه آن نهفته است. این پروتکل به LLM امکان میدهد که نه تنها یک تابع را فراخوانی کند، بلکه اسکیمای ورودی مورد انتظار و فرمت خروجی دریافتی را نیز بدون مداخله انسانی در حلقه درک کند.
معماری و پروتکل
مشخصات MCP سه نوع اصلی تعامل را تعریف میکند:
- ابزارها (Tools): توابع قابل اجرا (مثلاً "calculate_sum"، "query_database").
- منابع (Resources): منابع داده فقط خواندنی (مثلاً "get_file_contents"، "fetch_news_headlines").
- پرامپتها (Prompts): قالبهای پرامپت از پیش تعریف شده که کلاینت میتواند آنها را فراخوانی کند.
ارتباط از طریق stdio (ورودی/خروجی استاندارد) یا رویدادهای ارسالشده توسط سرور (SSE) انجام میشود. برای توسعه محلی، stdio روش پیشفرض و سادهترین رویکرد است که آن را برای تست و برنامههای دسکتاپ ایدهآل میکند.
ساخت اولین سرور MCP با پایتون
اگرچه میتوانید سرورهای MCP را از صفر با هر زبانی بسازید، اما کتابخانه fastmcp یک تجربه توسعهدهنده روانتر را ارائه میدهد. در زیر یک مثال عملی از یک سرور MCP آورده شده است که یک ابزار ماشینحساب ساده و یک منبع ایستا را ارائه میدهد.
from fastmcp import FastMCP
mcp = FastMCP("Math Server")
@mcp.tool()
def add(a: float, b: float) -> float:
"""
دو عدد را با هم جمع میکند.
Args:
a: عدد اول.
b: عدد دوم.
Returns:
مجموع a و b.
"""
return a + b
@mcp.resource("config://server_settings")
def get_server_settings() -> dict:
"""
تنظیمات پیکربندی فعلی سرور را برمیگرداند.
"""
return {
"version": "1.0.0",
"environment": "production",
"features": ["addition", "subtraction"]
}
if __name__ == "__main__":
mcp.run(transport="stdio")
در این مثال، تزئینکننده @mcp.tool() یک تابع را تعریف میکند که LLM میتواند آن را فراخوانی کند. Docstring در اینجا حیاتی است؛ کلاینتهای MCP از این توضیحات برای تعیین *زمان* استفاده از ابزار استفاده میکنند. به طور مشابه، تزئینکننده @mcp.resource() دادهها را ارائه میدهد. طرح URI (config://) به دستهبندی منبع برای کلاینت کمک میکند.
بهترین روشها برای توسعه
هنگام ساخت سرورهای MCP درجه تولیدی، موارد زیر را در نظر بگیرید:
- توضیحات شفاف ابزارها: LLMها به شدت به مستندات متکی هستند. در مورد انواع ورودی، محدودیتها و خروجیهای مورد انتظار صریح باشید. از ابهام پرهیز کنید.
- بیحالتی (Statelessness): ایدهآل این است که سرورهای MCP بیحالت باشند. اگر حالت مورد نیاز است (مثلاً مدیریت نشست)، آن را به صورت داخلی از طریق یک پایگاه داده یا کش مدیریت کنید، نه اینکه به کلاینت برای حفظ زمینه در فراخوانیهای مختلف تکیه کنید.
- مدیریت خطا: پیامهای خطای معنادار برگردانید. اگر ابزاری شکست بخورد، LLM باید بداند *چرا* تا بتواند استراتژی خود را تنظیم کند (مثلاً با پارامترهای مختلف دوباره تلاش کند یا ابزاری دیگر را انتخاب کند).
- امنیت: هرگز اعتبارسنجیهای حساس را در تعاریف ابزارها فاش نکنید. از متغیرهای محیطی یا کلیدهای امن استفاده کنید. تمام ورودیها را برای جلوگیری از حملات تزریق اعتبارسنجی کنید، به ویژه زمانی که ابزارها با پایگاههای داده یا دستورات shell تعامل میکنند.
- تست: از MCP Inspector (در دسترس در مخزن GitHub MCP) برای دیباگ سرور خود استفاده کنید. این ابزار یک رابط کاربری برای فهرست کردن ابزارها، مشاهده اسکیموها و تست دستی فراخوانیها ارائه میدهد.
ملاحظات استقرار
برای توسعه محلی، اجرا از طریق stdio کافی است. با این حال، برای دسترسی از راه دور (مثلاً از یک عامل هوش مصنوعی مبتنی بر ابر)، باید سرور را از طریق HTTP/SSE ارائه دهید. کتابخانههایی مانند fastmcp این قابلیت را از ابتدا پشتیبانی میکنند:
if __name__ == "__main__":
# For remote access
mcp.run(transport="sse", host="0.0.0.0", port=8000)
توجه داشته باشید که نقاط پایانی SSE نیاز به پیکربندی CORS مناسب و احراز هویت (مثلاً کلیدهای API، OAuth) دارند تا از دسترسی غیرمجاز جلوگیری شود. همیشه برای پایاندهی TLS و محدودسازی نرخ، پشت یک پروکسی معکوس (مانند Nginx یا Caddy) استقرار دهید.
نتیجهگیری
سرورهای MCP نشاندهنده یک تغییر پارادایم در نحوه یکپارچهسازی هوش مصنوعی با سیستمهای سازمانی هستند. با استانداردسازی رابط، MCP کدهای تکراری مورد نیاز برای اتصال LLMها به ابزارهای جدید را کاهش میدهد و امکان تکرار سریعتر و برنامههای عاملمحور مقاومتر را فراهم میکند. با بلوغ اکوسیستم، انتظار میرود ویژگیهای پیشرفتهتری مانند پخش خروجی ابزارها، جریانهای کاری چندمرحلهای و یکپارچهسازی تنگاتنگتر با ارائهدهندگان بزرگ هوش مصنوعی را مشاهده کنیم. با یک ابزار کوچک شروع کنید، آن را با Inspector اعتبارسنجی کنید و با رشد نیازهایتان مقیاس را افزایش دهید. آینده هوش مصنوعی متصل است و MCP پروتکلی است که این امر را ممکن میسازد.