使用说明
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#控制台应用程序,该应用程序使用工具、资源和脚本来设置一个部署了gpt-4模型实例的Azure OpenAI实例:
| 文件夹 | 应用程序 |
|---|---|
| ./zh/SportApp | 一个简化的c#控制台应用程序,使用来自的工具、提示和资源 SportKnowHow_McpServer |
| ./src/SportKnowHow_McPServer | 一个简化的c#Mcp服务器 |
| ./setup/setup.azcli | 一个powershell Azure CLI脚本,用于使用部署的gpt-4实例设置必要的Azure OpenAI实例 |
演示应用程序
概述“SportsApp”
-
SportApp使用netsrun和stdio启动提供的MCP服务器
//MCP Server: start parameter string command = "dotnet"; string[] arguments = new string[] { "run", "--project", "./src/SportKnowHow_MCPServer/SportKnowHow_MCPServer.csproj"}; //MCP Server: communication protocol StdioClientTransportOptions stdioClientTransportOptions = new StdioClientTransportOptions() { Name = "Sport Know How (MCP Server)", Command = command, Arguments = arguments, }; StdioClientTransport stdioClientTransport = new StdioClientTransport(stdioClientTransportOptions); //Start MCP Server await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(stdioClientTransport); -
列出了MCP服务器提供的所有可用工具
-
id为的工具
RetrieveWinner带参数eventName' andeventDate已执行//List available tools IList<McpClientTool> mcpClientTools = await mcpClient.ListToolsAsync(); //Manual tool call 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); -
MCP服务器工具通过以下方式提供给LLM/SLM完成调用
Microsoft.Extensions.AI。不需要拦截LLM/SLM功能工具请求,因为chatClient.RetResponse()负责根据LLM的请求调用MCP服务器工具,并将结果提供回LLM。//Use tools in chat completions ... string systemMessage = "You help with information around international sport events."; string userMessage = "Who won the Super Sports Championship 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)请求参数。// List available prompts IList<McpClientPrompt> mcpClientPrompts = await mcpClient.ListPromptsAsync(); // Retrieve specific prompt string promptName = "CreateMatchSummaryPrompt"; Console.WriteLine($"Retrieve prompt: {promptName}"); Dictionary<string, object?> promptParameter = new Dictionary<string, object?> { { "eventName", "Munich Flying Dolphins vs. Berlin Bears" }, { "winner", "Munich Flying Dolphins" }, { "score", "24:31" }, { "enthusiasm", "high" } }; GetPromptResult getPromptResult = await mcpClient.GetPromptAsync(promptName, promptParameter); -
在MCP服务器中,列出并请求了定义的资源模板和资源。
//List available resource templates string resourceTemplateUri = ""; IList<McpClientResourceTemplate> mcpClientResourceTemmplates = await mcpClient.ListResourceTemplatesAsync(); //Retrieve a specific resource template resourceTemplateUri = resourceTemplateUri.Replace("{id}", "NurembergFlyingTigers"); ReadResourceResult readResourceTemplateResult = await mcpClient.ReadResourceAsync(resourceTemplateUri); //List available resources string resourceUri = ""; IList<McpClientResource> mcpClientResources = await mcpClient.ListResourcesAsync(); // Retrieve a specific resource ReadResourceResult readResourceResult = await mcpClient.ReadResourceAsync(resourceUri); -
创建了MCP服务器的订阅。MCP服务器可以在底层资源发生更改时发送更新。
// Subscribe to resources mcpClient.RegisterNotificationHandler("notifications/resource/updated", NotificationHandler); await mcpClient.SubscribeToResourceAsync("sportIntelligence://team/MunichFlyingDolphins");
概述“SportKnowHow_McpServer
- 使用工具、提示和资源支持创建MCP服务器。
//create MCP server 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 Server和Mcp Host应用程序的开发。