عنوان:

‫معرفی پروتکل زمینه مدل (Model Context Protocol - MCP) در برنامه‌نویسی و توسعه با NET.


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۰۶ ۰۸:۴۶
آدرس: www.dntips.ir
مقدمه
در دنیای توسعه نرم‌افزار و هوش مصنوعی، نیاز به اتصال یکپارچه مدل‌های زبانی بزرگ (Large Language Models - LLMs) به منابع داده خارجی و ابزارها روزبه‌روز افزایش می‌یابد. پروتکل زمینه مدل (Model Context Protocol - MCP) یک استاندارد باز است که با هدف ساده‌سازی این اتصالات طراحی شده است. این پروتکل، که ابتدا توسط شرکت Anthropic توسعه یافت و در نوامبر 2024 به‌صورت متن‌باز منتشر شد، به توسعه‌دهندگان اجازه می‌دهد تا به‌جای ایجاد اتصالات اختصاصی برای هر منبع داده، از یک ساختار استاندارد و مقیاس‌پذیر استفاده کنند. برای توسعه‌دهندگان NET. در اکوسیستم مایکروسافت، MCP فرصتی منحصربه‌فرد برای ایجاد برنامه‌های هوشمند و متنی فراهم می‌کند که می‌توانند با داده‌های محلی به‌صورت امن و کارآمد تعامل داشته باشند.
این مقاله آموزشی به بررسی مفاهیم اصلی MCP، معماری آن، و نحوه پیاده‌سازی آن در محیط NET. می‌پردازد. هدف ما ارائه یک راهنمای سریع و عملی برای توسعه‌دهندگانی است که می‌خواهند از این پروتکل در پروژه‌های خود بهره ببرند. در ادامه، با اصول MCP آشنا شده و یک نمونه کد کاربردی برای ساخت سرور MCP با استفاده از #C ارائه خواهیم داد.

پروتکل زمینه مدل چیست؟
MCP یک پروتکل ارتباطی استاندارد است که تعامل بین برنامه‌های مبتنی بر مدل‌های زبانی و منابع خارجی مانند پایگاه داده‌ها، APIها، و سیستم‌های فایل را تسهیل می‌کند. برخلاف روش‌های سنتی که نیازمند ادغام‌های سفارشی برای هر منبع داده بودند، MCP با ارائه یک رابط واحد، پیچیدگی‌های توسعه را کاهش می‌دهد. این پروتکل از معماری کلاینت-سرور (Client-Server) استفاده می‌کند و بر پایه JSON-RPC 2.0 عمل می‌کند، که امکان تبادل داده‌ها را به‌صورت ساختاریافته و قابل اطمینان فراهم می‌سازد.
برای توسعه‌دهندگان NET.، این پروتکل به‌ویژه جذاب است زیرا با ابزارها و کتابخانه‌های موجود در این اکوسیستم، مانند Microsoft.Extensions و Semantic Kernel، به‌خوبی ادغام می‌شود. MCP به مدل‌های زبانی اجازه می‌دهد تا به‌صورت پویا ابزارها و داده‌ها را شناسایی کرده و با آن‌ها تعامل کنند، بدون اینکه نیاز به دانش از پیش تعریف‌شده درباره هر منبع داشته باشند.

اجزای اصلی MCP
MCP از سه بخش کلیدی تشکیل شده است که درک آن‌ها برای پیاده‌سازی موفق ضروری است:
  1. میزبان‌ها (Hosts): برنامه‌هایی مانند محیط‌های توسعه یکپارچه (IDEs) یا ابزارهای هوش مصنوعی که نیاز به دسترسی به داده‌های خارجی دارند.
  2. کلاینت‌ها (Clients): واسطه‌هایی که ارتباط یک‌به‌یک با سرورها را برقرار می‌کنند و درخواست‌ها را مدیریت می‌کنند.
  3. سرورها (Servers): برنامه‌های سبک که قابلیت‌های خاصی مانند دسترسی به فایل‌ها، پایگاه داده‌ها، یا APIها را از طریق پروتکل MCP ارائه می‌دهند.

این ساختار ماژولار به توسعه‌دهندگان اجازه می‌دهد تا سرورهای MCP را برای نیازهای خاص خود طراحی کنند و آن‌ها را با برنامه‌های NET. ادغام کنند.

مزایای MCP برای توسعه‌دهندگان NET.
  • استانداردسازی: با استفاده از MCP، دیگر نیازی به ساخت اتصال‌های سفارشی برای هر منبع داده نیست. یک سرور MCP می‌تواند چندین ابزار را مدیریت کند و به‌صورت خودکار قابلیت‌های خود را به کلاینت اعلام کند.
  • امنیت: این پروتکل امکان اعمال محدودیت‌های دسترسی و کنترل‌های امنیتی را فراهم می‌کند، که برای برنامه‌های سازمانی در NET. حیاتی است.
  • مقیاس‌پذیری: توسعه‌دهندگان می‌توانند سرورهای جدید را به‌راحتی اضافه کرده و اکوسیستم MCP را گسترش دهند، بدون اینکه نیاز به بازنویسی کدهای موجود باشد.
  • ادغام با اکوسیستم مایکروسافت: MCP با ابزارهایی مانند Copilot Studio و Azure AI Foundry سازگار است و از SDKهای رسمی NET. پشتیبانی می‌کند.

پیاده‌سازی یک سرور MCP در NET.
برای درک بهتر، بیایید یک سرور ساده MCP را با استفاده از #C و کتابخانه mcpdotnet پیاده‌سازی کنیم. این نمونه یک سرور ایجاد می‌کند که ابزاری به نام "echo" را ارائه می‌دهد، که ورودی کاربر را دریافت کرده و آن را بازتاب می‌دهد.
پیش‌نیازها
  • NET 9.0 یا نسخه بالاتر
  • نصب بسته NuGet با دستور:
dotnet add package ModelContextProtocol --version 0.1.0-preview.1.25171.12
کد نمونه
ابتدا یک پروژه کنسول در NET. ایجاد کنید:
dotnet new console -n MCPServer
cd MCPServer
سپس کد زیر را در فایل Program.cs قرار دهید:
using McpDotNet.Protocol.Transport;
using McpDotNet.Protocol.Types;
using McpDotNet.Server;
using Microsoft.Extensions.Logging.Abstractions;

McpServerOptions options = new()
{
    ServerInfo = new() { Name = "MyServer", Version = "1.0.0" },
    Capabilities = new()
    {
        Tools = new()
        {
            ListToolsHandler = async (request, cancellationToken) =>
            {
                return new ListToolsResult()
                {
                    Tools = [
                        new Tool()
                        {
                            Name = "echo",
                            Description = "پیام ورودی را بازتاب می‌دهد.",
                            InputSchema = new JsonSchema()
                            {
                                Type = "object",
                                Properties = new Dictionary<string, JsonSchemaProperty>()
                                {
                                    ["message"] = new JsonSchemaProperty()
                                    {
                                        Type = "string",
                                        Description = "ورودی برای بازتاب."
                                    }
                                }
                            },
                        }
                    ]
                };
            },
            CallToolHandler = async (request, cancellationToken) =>
            {
                if (request.Params?.Name == "echo")
                {
                    if (request.Params.Arguments?.TryGetValue("message", out var message) is not true)
                    {
                        throw new McpServerException("پارامتر 'message' یافت نشد.");
                    }
                    return new CallToolResponse()
                    {
                        Content = [new Content() { Text = $"بازتاب: {message}", Type = "text" }]
                    };
                }
                throw new McpServerException($"ابزار ناشناخته: '{request.Params?.Name}'");
            },
        }
    },
};

await using IMcpServer server = McpServerFactory.Create(new StdioServerTransport("MyServer"), options);
await server.StartAsync();
await Task.Delay(Timeout.Infinite);
توضیحات کد
  • تنظیمات سرور: شیء McpServerOptions اطلاعات سرور و قابلیت‌های آن را تعریف می‌کند.
  • ابزارها: تابع ListToolsHandler ابزارهای موجود (در اینجا "echo") را فهرست می‌کند، و CallToolHandler منطق اجرای ابزار را پیاده‌سازی می‌کند.
  • حمل‌ونقل: از StdioServerTransport برای ارتباط از طریق ورودی/خروجی استاندارد استفاده شده است، اما MCP از HTTP و Server-Sent Events نیز پشتیبانی می‌کند.
  • اجرا: سرور تا زمان توقف توسط کلاینت به‌صورت نامحدود اجرا می‌شود.
برای تست، می‌توانید از ابزار MCP Inspector استفاده کنید:
npx @modelcontextprotocol/inspector dotnet run
این دستور سرور را اجرا کرده و رابط کاربری برای آزمایش ابزار "echo" ارائه می‌دهد.

نکات پیاده‌سازی
  • مدیریت خطا: همیشه از CancellationToken برای مدیریت صحیح خطاها و زمان‌بندی استفاده کنید.
  • گسترش‌پذیری: می‌توانید ابزارهای پیچیده‌تری مانند دسترسی به پایگاه داده یا APIهای خارجی اضافه کنید.
  • امنیت: در محیط‌های عملیاتی، از مکانیزم‌های احراز هویت مانند OAuth 2.0 استفاده کنید.

نتیجه‌گیری
پروتکل زمینه مدل (MCP) یک ابزار قدرتمند برای توسعه‌دهندگان NET. است که اتصال مدل‌های زبانی به داده‌ها و ابزارها را ساده‌تر و استاندارد می‌کند. با استفاده از این پروتکل، می‌توانید برنامه‌های هوشمندی بسازید که به‌صورت پویا با منابع مختلف تعامل دارند، بدون اینکه درگیر پیچیدگی‌های ادغام‌های سفارشی شوید. پیاده‌سازی نمونه بالا نشان داد که چگونه با چند خط کد در #C می‌توان یک سرور MCP کاربردی ایجاد کرد. این فقط نقطه شروعی است؛ توسعه‌دهندگان می‌توانند با افزودن ابزارهای بیشتر و اتصال به سیستم‌های سازمانی، قابلیت‌های برنامه‌های خود را گسترش دهند.
برای شروع، توصیه می‌شود با مستندات رسمی MCP و SDKهای NET. آشنا شوید و پروژه‌های کوچک را آزمایش کنید. با رشد اکوسیستم MCP، انتظار می‌رود که این پروتکل به استانداردی برای توسعه برنامه‌های مبتنی بر هوش مصنوعی در NET. تبدیل شود.


مشاهده مطلب اصلی