عنوان:

‫تبدیل ابزارهای خط فرمان دات‌نت به سرور محلی MCP برای استفاده با GitHub Copilot در VS Code


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۱۸ ۰۷:۵۵
آدرس: www.dntips.ir
ابزارهای خط فرمان (Command Line Interface - CLI) نقش مهمی در خودکارسازی وظایف و تسهیل فرآیندهای توسعه ایفا می‌کنند. همگام با پیشرفت هوش مصنوعی در حوزه توسعه، ابزارهایی مانند GitHub Copilot در محیط توسعه ویژوال استودیو کد (Visual Studio Code) به کمک توسعه‌دهندگان آمده‌اند. این ابزارها با ارائه پیشنهادات هوشمندانه کد و تسهیل تعاملات، بهره‌وری را به طور چشمگیری افزایش می‌دهند. مقاله حاضر به بررسی روشی نوین برای تعامل ابزارهای خط فرمان دات‌نت با GitHub Copilot از طریق پروتکل ModelContextProtocol (MCP) می‌پردازد. این پروتکل امکان تبدیل ابزارهای CLI موجود به سرورهای محلی MCP را فراهم می‌سازد، که به نوبه خود، تعاملات غنی‌تری را با ابزارهای مبتنی بر مدل‌های زبانی بزرگ (Large Language Model - LLM) مانند GitHub Copilot ممکن می‌سازد.

مفهوم ModelContextProtocol (MCP)
ModelContextProtocol (MCP) یک بسته NuGet در حال پیش‌نمایش است که به توسعه‌دهندگان کمک می‌کند تا یک سرور MCP ایجاد کنند. این سرور به ابزارهای مختلف مبتنی بر LLM، از جمله GitHub Copilot در حالت Agent در ویژوال استودیو کد، اجازه می‌دهد تا با ابزارهای توسعه تعامل داشته باشند. مستندات تکمیلی در مورد پروتکل MCP در فایل Readme بسته NuGet موجود است. هدف اصلی MCP، ایجاد یک پل ارتباطی استاندارد بین ابزارهای توسعه و ابزارهای هوشمند مبتنی بر زبان طبیعی است، به طوری که این ابزارها بتوانند قابلیت‌های یکدیگر را به طور موثرتری به کار گیرند.

ارتقاء ابزار خط فرمان دات‌نت به سرور MCP
با استفاده از بسته پیش‌نمایش ModelContextProtocol، افزودن قابلیت سرور MCP به یک ابزار خط فرمان دات‌نت موجود نسبتاً ساده است. در ادامه، مراحل انجام این کار بر اساس ابزار T-SQL Analyzer به عنوان مثال شرح داده می‌شود. T-SQL Analyzer یک ابزار خط فرمان است که به منظور شناسایی مشکلات طراحی و الگوهای نامناسب در اسکریپت‌های CREATE زبان SQL Server توسعه داده شده است.

1. افزودن بسته‌های NuGet:
برای شروع، لازم است دو بسته NuGet به پروژه CLI خود اضافه کنید:
dotnet add package ModelContextProtocol --version 0.1.0-preview.12
dotnet add package Microsoft.Extensions.Hosting
بسته ModelContextProtocol شامل مؤلفه‌های لازم برای ساخت سرور MCP است و بسته Microsoft.Extensions.Hosting برای مدیریت چرخه عمر برنامه و ارائه سرویس‌های مورد نیاز به کار می‌رود.

2. ایجاد کلاس ابزار MCP:
در مرحله بعد، یک کلاس ایجاد کنید که قابلیت‌های ابزار خط فرمان شما را برای کلاینت‌هایی مانند GitHub Copilot در دسترس قرار دهد. دقت کنید که توضیحات متدها و پارامترها باید خلاصه دقیقی از عملکرد ابزار شما برای کاربر ارائه دهند. همچنین، در صورت بروز خطا، پیام‌های واضح و قابل اقدامی را برگردانید. کلاس و متدهای آن باید با ویژگی(Attribute)های ارائه شده توسط بسته ModelContextProtocol تزئین شوند.
using System.ComponentModel;
using System.Text;
using ModelContextProtocol.Server;

namespace SqlAnalyzerCli.Services;

[McpServerToolType]
public sealed class AnalyzerTools
{
    [McpServerTool]
    [Description("یافتن مشکلات طراحی و الگوهای نامناسب در یک اسکریپت CREATE زبان SQL Server")]
    public static async Task<string> FindSqlScriptProblems(
        [Description("اسکریپت CREATE زبان SQL Server برای یافتن مشکلات طراحی و الگوهای نامناسب در آن.")] string sqlScript)
    {
        var factory = new ErikEJ.DacFX.TSQLAnalyzer.AnalyzerFactory(new() { Script = sqlScript });
        var result = factory.Analyze();
        var output = new StringBuilder();

        // TODO: بررسی اعتبار اسکریپت CREATE
        if (result.Result == null || result.Result.Problems.Count == 0)
        {
            return "هیچ مشکلی یافت نشد.";
        }

        foreach (var problem in result.Result.Problems)
        {
            output.AppendLine(problem.Description);
        }

        return output.ToString();
    }
}
در این کد، کلاس AnalyzerTools با ویژگی [McpServerToolType] مشخص شده است که نشان می‌دهد این کلاس شامل ابزارهای قابل استفاده توسط سرور MCP است. متد FindSqlScriptProblems با ویژگی [McpServerTool] علامت‌گذاری شده و توضیحی برای آن با استفاده از ویژگی [Description] ارائه شده است. این توضیحات توسط GitHub Copilot برای درک عملکرد این ابزار استفاده می‌شود. پارامتر sqlScript نیز دارای یک ویژگی [Description] است که هدف آن را برای Copilot روشن می‌سازد.

3. پیکربندی و راه‌اندازی سرور MCP:
در نهایت، کدی را به فایل Program.cs خود اضافه کنید تا سرور MCP را راه‌اندازی کرده و آن را به کلاس ابزار ایجاد شده متصل کنید. توجه داشته باشید که ثبت رویدادهای خطا (Error Logging) به گونه‌ای پیکربندی شده است که با تعامل Copilot تداخل پیدا نکند. هنگامی که ابزار خط فرمان با سوییچ -mcp اجرا شود، سرور MCP شروع به کار کرده و منتظر دستورات از طرف کلاینت MCP می‌ماند.
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SqlAnalyzerCli.Services;
using ModelContextProtocol.Server;

if (args.Length == 1 && args[0] == "-mcp")
{
    var builder = Host.CreateApplicationBuilder(args);

    builder.Services.AddMcpServer()
        .WithStdioServerTransport()
        .WithTools<AnalyzerTools>();

    builder.Logging.AddConsole(options =>
    {
        options.LogToStandardErrorThreshold = LogLevel.Trace;
    });

    await builder.Build().RunAsync();

    return 0;
}
در این بخش از کد، ابتدا بررسی می‌شود که آیا آرگومان -mcp هنگام اجرای برنامه ارائه شده است یا خیر. در صورت وجود این آرگومان، یک HostBuilder ایجاد می‌شود. سپس، سرویس MCP با استفاده از متد AddMcpServer() اضافه شده و نحوه انتقال داده‌ها از طریق ورودی/خروجی استاندارد (Standard Input/Output - Stdio) با استفاده از WithStdioServerTransport() پیکربندی می‌شود.
در نهایت، کلاس AnalyzerTools به عنوان منبع ابزارهای MCP با استفاده از WithTools<AnalyzerTools>() ثبت می‌شود. پیکربندی لاگینگ نیز به گونه‌ای انجام شده است که فقط لاگ‌های با سطح Trace و بالاتر به خروجی کنسول هدایت شوند، تا از تداخل با ارتباطات MCP جلوگیری شود.

نصب و استفاده از سرور MCP
کاربران ابزار خط فرمان شما می‌توانند آن را به صورت سراسری نصب کنند:
dotnet tool install --global ErikEJ.DacFX.TSQLAnalyzer.Cli
برای "نصب" سرور MCP در ویژوال استودیو کد، می‌توانید یک لینک با محتوایی مشابه زیر به اشتراک بگذارید:
vscode:mcp/install?%7B%22name%22%3A%22tsqlanalyzer%22%2C%22command%22%3A%22tsqlanalyze%22%2C%22args%22%3A%5B%22-mcp%22%5D%7D
یا اینکه کاربران می‌توانند به صورت دستی تنظیمات مربوط به سرور MCP را در فایل mcp.json پیکربندی کنند:
{
    "servers": {
        "tsqlanalyzer": {
            "type": "stdio",
            "command": "tsqlanalyze",
            "args": [
                "-mcp"
            ]
        }
    }
}
هنگامی که کاربر یک فایل .sql در ویرایشگر باز دارد و از GitHub Copilot در حالت Agent استفاده می‌کند، می‌تواند از Copilot بخواهد تا به او در یافتن الگوهای نامناسب T-SQL در آن فایل کمک کند. Copilot با سرور MCP محلی که توسط ابزار tsqlanalyze اجرا می‌شود، ارتباط برقرار کرده و نتایج تحلیل را دریافت و به کاربر ارائه می‌دهد.

نتیجه‌گیری
بسته ModelContextProtocol در حال حاضر در مرحله پیش‌نمایش اولیه قرار دارد، اما قابلیت سرور MCP بسیار مفید بوده و افزودن آن به ابزارهای خط فرمان موجود به میزان کمی کد نیاز دارد. افزودن این قابلیت به ابزار شما، آن را کاربردی‌تر کرده و می‌تواند به افزایش تعداد کاربران آن منجر شود. با استفاده از MCP، توسعه‌دهندگان می‌توانند تعاملات هوشمندانه‌تری را بین ابزارهای توسعه و دستیارهای هوش مصنوعی تجربه کنند و فرآیند توسعه نرم‌افزار را کارآمدتر سازند.


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