عنوان:

‫پروتکل متن مدل (MCP): رویکردی نوین در تعامل هوش مصنوعی با دنیای خارج در NET.


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۲۶ ۰۹:۲۶
آدرس: www.dntips.ir
در عصر حاضر، شاهد پیشرفت‌های چشمگیری در حوزه هوش مصنوعی (AI) و به‌ویژه مدل‌های زبانی بزرگ (LLMs) و عامل‌های هوشمند هستیم. این فناوری‌ها قادر به انجام وظایف متنوعی از جمله تولید کد، خلاصه سازی داده‌ها، پاسخگویی به سوالات و تهیه گزارش‌ها هستند. با این حال، برای انجام امور کاربردی واقعی، این مدل‌ها نیازمند تعامل با سیستم‌ها و منابع خارجی مانند رابط‌های برنامه‌نویسی کاربردی (APIs)، فایل‌های داده و پایگاه‌های داده هستند. روش‌های سنتی برای این یکپارچه‌سازی اغلب پیچیده، زمان‌بر و نیازمند رویکردهای متفاوتی برای هر منبع هستند. برای رفع این چالش، شرکت Anthropic، توسعه‌دهنده مدل Claude، یک استاندارد باز و عمومی به نام پروتکل متن مدل (Model Context Protocol - MCP) را معرفی کرده است. MCP به عامل‌های هوشمند و مدل‌های زبانی این امکان را می‌دهد تا به‌طور یکپارچه با هر API، سرویس، ابزار یا منبع داده خارجی ارتباط برقرار کنند.

آشنایی با معماری پروتکل متن مدل (MCP)

معماری MCP از سه جزء اصلی تشکیل شده است:
  • مشتری MCP (MCP Client): می‌تواند هر برنامه، ربات یا عامل هوشمند مبتنی بر هوش مصنوعی مانند GitHub Copilot، Cursor IDE یا Claude Desktop باشد. این بخش از طریق اتصال به سرورهای MCP، از قابلیت‌های منابع خارجی بهره می‌برد.
  • سرورهای MCP (MCP Servers): این سرورها به منابع یا ابزارهای خارجی متصل شده و متن (Context) دریافتی از عامل هوشمند را به متن مناسب برای ابزار یا API مورد نظر ترجمه می‌کنند.
  • منابع/ابزارهای خارجی (External Tools/Resources): شامل هر نوع منبع داده یا ابزاری مانند پایگاه‌های داده، سیستم‌های فایل، APIها یا سایر برنامه‌های کاربردی است که اطلاعات از طریق سرور MCP از آن‌ها استخراج شده و به مشتری MCP بازگردانده می‌شود.

تصور کنید از طریق یک مشتری MCP مانند GitHub Copilot سوال می‌کنید: "لیست تمام درخواست‌های Pull باز را به من بده." در این سناریو، سرور MCP این پیام را دریافت کرده، آن را به یک درخواست API مناسب برای GitHub API ترجمه می‌کند، پاسخ را دریافت کرده و به مشتری MCP/GitHub Copilot ارسال می‌کند.
پروتکل متن مدل (MCP) در واقع دستورالعملی است که اطمینان می‌دهد تمام اجزا به‌طور هماهنگ با یکدیگر ارتباط برقرار کرده و یک روش استاندارد برای این تعامل تعریف می‌شود که برای همه قابل فهم است. این پروتکل انعطاف‌پذیر بوده و می‌تواند به‌صورت محلی یا از طریق اینترنت اجرا شود و آداپتورهایی برای بسیاری از زبان‌های برنامه‌نویسی دارد. همچنین، از قالب JSON برای تبادل داده استفاده می‌کند که باعث پذیرش گسترده آن شده است.

پیاده‌سازی MCP در .NET
برای درک عملی نحوه کارکرد MCP، به پیاده‌سازی یک اکوسیستم MCP ساده در محیط .NET می‌پردازیم. در این مثال، یک مشتری و یک سرور MCP ایجاد خواهیم کرد که با یک API خارجی برای دریافت اطلاعات مربوط به یک آدرس IP تعامل می‌کنند.

سناریو: کاربر بر اساس یک آدرس IP سوال می‌کند: "اطلاعات مرتبط مانند منطقه، عرض جغرافیایی، طول جغرافیایی و غیره را برای این آدرس IP به من بده." برای به دست آوردن این اطلاعات، از API سرویس IP Info استفاده خواهیم کرد. سرور MCP ما با این API ارتباط برقرار کرده و اطلاعات مورد نیاز را بازمی‌گرداند.

پیش‌نیازها: برای این پیاده‌سازی، به دو بسته NuGet زیر نیاز داریم:
  • ModelContextProtocol
  • Microsoft.Extensions.Hosting
مشتری و سرور MCP به عنوان دو برنامه کنسولی جداگانه پیاده‌سازی خواهند شد.

پیاده‌سازی سرور MCP
کد زیر برای ایجاد سرور MCP در .NET استفاده می‌شود:
var builder = Host.CreateEmptyApplicationBuilder(null);

builder.Services.AddMcpServer()
    .WithStdioServerTransport()
    .WithToolsFromAssembly();

builder.Services.AddSingleton(_ => new HttpClient());

var app = builder.Build();
app.Run();
در این کد، ابتدا یک میزبان (Host) ایجاد می‌کنیم و سپس با استفاده از متد AddMcpServer()، سرویس‌های مربوط به سرور MCP را ثبت می‌کنیم. متد WithStdioServerTransport() برای استفاده از ورودی و خروجی استاندارد در کنسول تنظیم شده است. ابزارهای مورد نیاز ما در یک اسمبلی (Assembly) تعریف شده و با استفاده از متد WithToolsFromAssembly() ثبت می‌شوند. همچنین، یک نمونه از HttpClient به عنوان یک سرویس Singleton برای انجام درخواست‌های HTTP به API خارجی ثبت می‌شود. در نهایت، برنامه ساخته و اجرا می‌شود.

پیاده‌سازی ابزار MCP
در زیر کد مربوط به ایجاد ابزار IpInfoTool آمده است:
[McpServerToolType]
public class IpInfoTool
{
    [McpServerTool, Description("Get IP related information for a given IP address")]
    public static async Task<IpInfo> GetIpInfo(HttpClient httpClient,
        [Description("The IP address to get the related information")] string ip)
    {
        var ipInfo = await httpClient.GetFromJsonAsync<IpInfo>($"https://ipinfo.io/{ip}?token=your_api_token");
        return ipInfo;
    }
}
پیاده‌سازی این ابزار بسیار ساده است. کلاس ابزار با attribute [McpServerToolType] و متد ابزار با attribute [McpServerTool] به همراه یک توضیح (Description) تزئین شده‌اند. متد GetIpInfo یک نمونه از HttpClient و یک آدرس IP را به عنوان ورودی دریافت کرده و با استفاده از آن، یک درخواست GET به API ipinfo.io ارسال می‌کند. توجه داشته باشید که برای استفاده واقعی از این API، باید یک توکن (token) معتبر جایگزین your_api_token شود. در نهایت، پاسخ API که شامل اطلاعات مربوط به IP است، به صورت یک شیء از نوع IpInfo بازگردانده می‌شود. (برای سادگی، فرض شده است که یک کلاس IpInfo برای نگهداری ساختار پاسخ API وجود دارد.)

پیاده‌سازی مشتری MCP
ابتدا یک متن انتقال استاندارد ورودی/خروجی (Standard IO transport context) ایجاد می‌کنیم:
StdioClientTransport ct = new(
    new()
    {
        Name = "IpInfoServer",
        Command = "Your_path_to_the_server_exe"
    }
);
در اینجا، Your_path_to_the_server_exe باید با مسیر فایل اجرایی سرور MCP که قبلاً ساخته‌اید، جایگزین شود. سپس، یک مشتری MCP از طریق McpClientFactory با ارائه متن انتقال ایجاد شده و اطلاعات مربوط به مشتری (نام و نسخه) ایجاد می‌کنیم:
await using var mcpClient = await McpClientFactory.CreateAsync(ct,
        new()
        {
            ClientInfo = new() { Name = "IpInfoServer", Version = "1.0.0.0" }
        })
    .ConfigureAwait(false);
اکنون، مشتری MCP آماده شنیدن درخواست‌ها است. می‌توانید لیست ابزارهای پیکربندی شده در سرور را با استفاده از کد زیر دریافت کنید (در این مثال، فقط ابزار IpInfoTool وجود دارد):
var tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);

foreach (var tool in tools)
{
    Console.WriteLine($"{tool.Name} => {tool.Description}");
}
خروجی این کد در کنسول به صورت زیر خواهد بود:
GetIpInfo => Get IP related information for a given IP address
در نهایت، برای ارسال یک درخواست به ابزار MCP و دریافت اطلاعات مربوط به یک آدرس IP، از کد زیر استفاده می‌کنیم:
Dictionary<string, object> parameters = new()
{
    ["ip"] = "Your_IP_Address"
};

var response = await mcpClient.CallToolAsync("GetIpInfo", parameters).ConfigureAwait(false);
if (response.IsError)
{
    Console.WriteLine($"Error");
}
else
{
    foreach (var content in response.Content)
    {
        Console.WriteLine(content.Text);
    }
}
در اینجا، Your_IP_Address باید با آدرس IP مورد نظر جایگزین شود. پاسخ دریافتی از سرور MCP در متغیر response ذخیره می‌شود. اگر خطایی رخ داده باشد، پیام خطا نمایش داده می‌شود؛ در غیر این صورت، محتوای پاسخ که شامل اطلاعات IP در قالب JSON است، در کنسول چاپ می‌شود. خروجی نمونه می‌تواند به شکل زیر باشد:
{
  "ip":"Your_IP_Address",
  "city":"Your_City",
  "region":"Your_Region",
  "country":"Your_Country",
  "loc":"Your_Lat_Lng",
  "postal":"Your_Postal_Code"
}
به این ترتیب، ما اولین اکوسیستم مشتری-سرور MCP خود را با استفاده از یک API خارجی برای دریافت اطلاعات آدرس IP ایجاد کردیم. به همین روش، می‌توان آن را به سیستم‌های فایل، پایگاه‌های داده، سایر APIها و ابزارها متصل کرده و قابلیت‌های این منابع را در اختیار مشتری‌های مدل هوش مصنوعی خود قرار داد.

نتیجه‌گیری
پروتکل متن مدل (MCP) یک تغییر پارادایم مهم در نحوه تعامل مدل‌های هوش مصنوعی با داده‌های دنیای واقعی است. با حذف نیاز به فرآیندهای میانی مانند embedding و پایگاه‌های داده برداری (vector databases)، MCP یک راه حل کارآمدتر، امن‌تر و مقیاس‌پذیرتر ارائه می‌دهد. این پروتکل با فراهم کردن یک زبان مشترک و استاندارد برای ارتباط بین عامل‌های هوشمند و منابع خارجی، امکان ساخت برنامه‌های کاربردی هوشمند قدرتمند و منعطفی را فراهم می‌کند. در آینده‌ای که هوش مصنوعی نقش فزاینده‌ای در زندگی ما ایفا خواهد کرد، MCP بدون شک نقش مهمی در تسهیل این تحول خواهد داشت و به توسعه‌دهندگان .NET امکان می‌دهد تا به سادگی قابلیت‌های هوش مصنوعی را با سیستم‌های موجود خود یکپارچه کنند.


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