使用C#构建MCP服务器并在VS Code中运行AI代理

本文详细介绍了如何使用C#构建自定义MCP服务器,通过MCP协议将工具暴露给AI代理,并在VS Code中实现实时通信。包含完整的代码示例和配置说明,帮助开发者创建能够访问特定领域数据的智能AI代理。

构建MCP服务器

相对较新的基于大语言模型(LLM)的AI代理(如GPT-4o、Claude或Gemini)在通用推理和回答广泛问题方面非常熟练。然而,它们通常难以处理特定领域的查询——比如"只给我戴尔设备信息"——因为它们无法访问专有的、内部的或组织级别的数据。

要正确回答这类问题,LLM需要的不仅仅是一个提示:它需要通过可信内部源提供的上下文信息。本文展示了如何借助模型上下文协议(MCP)构建能够访问和使用特定领域上下文的AI代理。它包括自定义MCP服务器创建的代码示例,并演示了MCP主机(本例中为VS Code)如何与服务器通信并使用工具。

以下是使用MCP创建AI代理所需的关键构建模块:

  • MCP主机:通常是受MCP支持的IDE(如下例中的VS Code),由任何MCP客户端使用。
  • MCP服务器:这是工具所在的地方。它通过MCP协议暴露这些工具,为AI提供上下文数据,以便客户端使用它们。
  • MCP客户端:作为MCP主机和MCP服务器之间的链接。它连接到MCP服务器并发现可用的工具。

要更深入理解MCP,请参阅MCP介绍。

1. 创建MCP服务器项目

自定义MCP服务器使用工具提供外部信息。以下是使用C# SDK构建自定义服务器的代码片段。

首先,将ModelContextProtocol包添加到您的C# Web API项目中。然后,将以下代码片段添加到项目的启动文件中。这就是使用模型上下文协议C# SDK创建MCP服务器所需的全部内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
var builder = WebApplication.CreateBuilder(args);

try
{
    // 添加MCP服务器
    builder.Services
        .AddMcpServer()
        .WithStdioServerTransport()
        .WithToolsFromAssembly();
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

var app = builder.Build();

AddMcpServer()方法使此项目能够作为MCP服务器运行。

2. 在MCP服务器上创建MCP工具

每个MCP工具都有元数据——标题和描述。这些元数据帮助LLM通过语义匹配用户提示与工具描述来确定要调用哪个工具。

在上面的代码中,WithToolsFromAssembly()扫描您的项目,找到任何标记为McpServerTool的内容,并将这些工具注册到MCP服务器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Net.Http;
using System.Net.Http.Headers;
using AIWebAPIs.Tools;

namespace AIWebAPIs.Tools
{
    [McpServerToolType]
    public class BYODTool
    {
        [McpServerTool(Description = "Gets the peripheral device information")]
        public string GetPeripherals(string message)
        {
            using (var client = new HttpClient())
            {
                // 添加带有Bearer令牌的授权头
                client.DefaultRequestHeaders.Authorization = 
                    new AuthenticationHeaderValue("Bearer", "<your-token>");

                var response = client.GetAsync(Constants.GetPeripheralGroupsUrl).Result;

                if (response.IsSuccessStatusCode)
                {
                    return response.Content.ReadAsStringAsync().Result;
                }
                else
                {
                    return $"Error: {response.StatusCode}";
                }
            }
        }
    }
}

基本上,上面的代码充当LLM的数据提供者,允许它动态从外围设备获取数据——比如ping一个安全API(内部或外部)。MCP服务器将此功能作为MCP工具暴露给LLM。

3. 在VS Code工作区中添加MCP服务器

接下来是什么?在VS Code中打开您的项目,并在.vscode文件夹中添加一个mcp.json文件。该文件基本上是MCP客户端和MCP服务器之间的通信器——它告诉客户端在哪里找到您的服务器以及允许使用哪些工具。以下是mcp.json文件的示例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "servers": {
      "my-mcp-server": {
        "type": "stdio",
        "command": "dotnet",
        "args": [
          "run",
          "--project",
          "C:/Users/mcpserver/source/repos/AIWebAPIs/AIWebAPIs/AIWebAPIs.csproj"
        ]
      }
    }
}

4. 在VS Code中运行MCP服务器

下面的VS Code片段显示了我启动MCP服务器并在GitHub Copilot聊天窗口中输入提示以请求仅获取戴尔设备的位置。MCP服务器随后返回了适当的响应。

好的,我的MCP服务器已经准备就绪并运行。现在,您的MCP客户端——托管在VS Code中的那个——实际上可以与MCP服务器通信。它将GetPeripherals MCP工具暴露给客户端,LLM使用该工具获取相关数据。

下图显示了端到端的流程:

  • MCP服务器已经通过托管在VS Code(MCP主机)中的MCP客户端连接。
  • 用户通过在GitHub Copilot聊天窗口中输入提示进行交互。
  • 用户的提示以及服务器上可用的MCP工具作为上下文信息提供给LLM。
  • LLM决定执行哪些工具以获取相关的外部信息。
  • 基于检索到的数据,LLM生成信息丰富的响应。

结论

通过使用MCP C# SDK构建自定义MCP服务器并在Visual Studio Code中使用GitHub Copilot运行它,开发人员可以开始创建强大的AI代理。MCP服务器与IDE共享工具,得益于Copilot的智能,AI代理可以自动将用户的提示与正确的工具匹配。一旦触发该工具,它会获取相关数据以帮助LLM准确响应。这种基于MCP架构和模型上下文协议的设置使得将真实世界上下文引入AI交互变得更加容易。它还保持了模块化、可重用和可扩展的特性,简化了任何构建AI驱动应用程序的开发过程。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计