返回市场
AzureAI.MCP

AzureAI.MCP

作者:RobertEichenseer2 星标更新:2025-06-03

项目介绍

MCP 服务器

概述

MCP 是一个开放协议,标准化了应用程序如何向大型语言模型(LLM)提供上下文,并且经常被称为“AI应用的USB-C端口”。MCP 提供了一种标准化的方法来连接AI模型到不同的数据源、提示和工具。

MCP(模型上下文协议)服务器向应用程序提供资源、工具和提示,使其能够增强与大型语言模型(LLM)或小型语言模型(SLM)的通信。应用程序启动MCP服务器——通常在其自身的安全上下文中——并通过标准I/O(stdio)与其通信。

概述

应用程序不限于单一的MCP服务器;它可以同时启动并交互多个MCP服务器,每个服务器提供不同的资源、工具和提示。虽然每个MCP客户端(由应用程序启动)与其对应的MCP服务器之间存在一对一的关系,但应用程序可以管理多个这样的配对。在给定的例子中,启动了三个MCP服务器,每个服务器贡献自己的上下文资产以增强模型交互。

工具:通常用于向应用程序提供功能(例如检索私有信息、执行特定任务等)。应用程序可以向LLM/SLM实例(具有函数调用能力)提供可用的MCP服务器工具列表,大多数SDK会自动封装必要的函数或工具调用到MCP服务器。

资源:应用程序可以从MCP服务器请求的数据,例如为LLM/SLM调用提供基础。应用程序还可以订阅MCP资源以获取连续更新(如果有新信息可用)。MCP服务器实现必要的更新逻辑。

提示:MCP服务器可以提供提示模板供应用程序发送给LLM/SLM。

存储库内容

存储库包含一个简化的C# MCP服务器和一个消费工具、资源和脚本的C#控制台应用程序,以及一个设置Azure OpenAI实例的脚本,该实例部署了gpt-4模型实例:

文件夹应用程序
./src/SportApp使用来自SportKnowHow_McpServer的工具、提示和资源的简化C#控制台应用程序
./src/SportKnowHow_McPServer简化的C# Mcp服务器
./setup/setup.azcli一个PowerShell Azure CLI脚本,用于设置必要的Azure OpenAI实例和已部署的gpt-4实例

示例应用程序

“SportsApp”概览

存储库内容

  • SportsApp 使用dotnet run和stdio启动提供的MCP服务器。

        //MCP服务器:启动参数
        string command = "dotnet";
        string[] arguments = new string[] {
            "run",
            "--project",
            "./src/SportKnowHow_MCPServer/SportKnowHow_MCPServer.csproj"};
    
        //MCP服务器:通信协议
        StdioClientTransportOptions stdioClientTransportOptions = new StdioClientTransportOptions()
        {
            Name = "Sport Know How (MCP Server)",
            Command = command,
            Arguments = arguments,
        };
        StdioClientTransport stdioClientTransport = new StdioClientTransport(stdioClientTransportOptions);
    
        //启动MCP服务器
        await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(stdioClientTransport);
    
  • 列出MCP服务器提供的所有可用工具。

  • 执行具有ID RetrieveWinner 和参数 eventNameeventDate 的工具。

        //列出可用工具
        IList<McpClientTool> mcpClientTools = await mcpClient.ListToolsAsync();
     
        //手动工具调用
        string toolName = "RetrieveWinner";
        Dictionary<string, object?> callParameter = new Dictionary<string, object?>
        {
            { "eventName", "Super Sports Champtionship" },
            { "eventDate", "2025-01-01"}
        };
        CallToolResponse callToolResponse = await mcpClient.CallToolAsync(toolName, callParameter);
    
  • 使用 Microsoft.Extensions.AI 将MCP服务器工具提供给LLM/SLM完成调用。无需拦截LLM/SLM函数工具请求,因为 chatClient.RetResponse() 负责根据LLM的要求调用MCP服务器工具,并将结果返回给LLM。

        //在聊天完成中使用工具
        ...
        string systemMessage = "您帮助提供有关国际体育赛事的信息。";
        string userMessage = "谁赢得了2025年超级体育锦标赛?";
        var chatMessages = new List<ChatMessage>
        {
            new ChatMessage (Microsoft.Extensions.AI.ChatRole.System, systemMessage),
            new ChatMessage (Microsoft.Extensions.AI.ChatRole.User, userMessage)
        };
        ChatResponse chatResponse = await chatClient.GetResponseAsync(
            chatMessages,
            new ChatOptions
            {
                Tools = mcpClientTools.ToArray()
            }
        );
        ...
    
  • 在MCP服务器定义的提示中列出,并请求具有参数的具体提示(CreateMatchSummaryPrompt)。

        //列出可用提示
        IList<McpClientPrompt> mcpClientPrompts = await mcpClient.ListPromptsAsync();
        
        //检索具体提示
        string promptName = "CreateMatchSummaryPrompt";
        Console.WriteLine($"检索提示:{promptName}");
        Dictionary<string, object?> promptParameter = new Dictionary<string, object?>
        {
            { "eventName", "慕尼黑飞鱼队对阵柏林熊队" },
            { "winner", "慕尼黑飞鱼队" },
            { "score", "24:31" },
            { "enthusiasm", "高" }
        };
        GetPromptResult getPromptResult = await mcpClient.GetPromptAsync(promptName, promptParameter);
    
  • 在MCP服务器定义的资源模板和资源中列出并请求。

        //列出可用资源模板
        string resourceTemplateUri = "";
        IList<McpClientResourceTemplate> mcpClientResourceTemmplates = await mcpClient.ListResourceTemplatesAsync();
        
        //检索具体资源模板
        resourceTemplateUri = resourceTemplateUri.Replace("{id}", "纽伦堡飞虎队"); 
        ReadResourceResult readResourceTemplateResult = await mcpClient.ReadResourceAsync(resourceTemplateUri);
        
        //列出可用资源
        string resourceUri = "";
        IList<McpClientResource> mcpClientResources = await mcpClient.ListResourcesAsync();
        
        //检索具体资源
        ReadResourceResult readResourceResult = await m[...]
    
  • 创建与MCP服务器的订阅。当底层资源发生变化时,MCP服务器可以发送更新。

        //订阅资源
        mcpClient.RegisterNotificationHandler("notifications/resource/updated", NotificationHandler);
        await mcpClient.SubscribeToResourceAsync("sportIntelligence://team/MunichFlyingDolphins");
    

“SportKnowHow_McpServer”概览

  • 创建支持工具、提示和资源的MCP服务器。
    //创建MCP服务器
    HostApplicationBuilder hostApplicationBuilder = Host.CreateApplicationBuilder(args);
    hostApplicationBuilder.Logging.AddConsole(consoleLogOptions =>
    {
        consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
    });
    
    hostApplicationBuilder.Services
        .AddMcpServer()
        .WithStdioServerTransport()
        .WithTools<SportEventTools>()
        .WithPrompts<SportEventPrompts>()
        .WithResources<SportEventResources>()
        .WithSubscribeToResourcesHandler(SubscribeToResourcesHandler)
        .WithUnsubscribeFromResourcesHandler(UnsubscribeFromResourcesHandler)
        .WithReadResourceHandler(ReadResourceHandler);
    
    hostApplicationBuilder.Services.AddSingleton(resourceSubscriptions);
    hostApplicationBuilder.Services.AddHostedService<SubscriptionMessageSender>();
    

总结

通常在调用应用程序的安全上下文中执行的MCP服务器使得向调用应用程序提供工具、资源和提示变得容易。正如示例中的SportApp应用程序所示,ModelContextProtocol NuGet包简化了MCP服务器和MCP主机应用程序的开发。