找回密码
 立即注册
首页 业界区 业界 使用C#创建一个MCP客户端

使用C#创建一个MCP客户端

筒霓暄 5 天前
前言

网上使用Python创建一个MCP客户端的教程已经有很多了,而使用C#创建一个MCP客户端的教程还很少。
为什么要创建一个MCP客户端呢?
创建了一个MCP客户端之后,你就可以使用别人写好的一些MCP服务了。
效果展示

为了方便大家复现,我没有使用WPF/Avalonia之类的做界面。只是一个简单的控制台程序,可以很容易看懂。
1.png

接入了fetch_mcp可以实现获取网页内容了,使用的模型只要具有tool use能力的应该都可以。
我使用的是Qwen/Qwen2.5-72B-Instruct。
开始实践

主要使用的包如下所示:
2.png

首先获取MCP服务器:
  1. private static async Task<IMcpClient> GetMcpClientAsync()
  2. {
  3.      DotEnv.Load();
  4.      var envVars = DotEnv.Read();
  5.      McpClientOptions options = new()
  6.      {
  7.          ClientInfo = new() { Name = "SimpleToolsConsole", Version = "1.0.0" }
  8.      };
  9.      var config = new McpServerConfig
  10.      {
  11.          Id = "test",
  12.          Name = "Test",
  13.          TransportType = TransportTypes.StdIo,
  14.          TransportOptions = new Dictionary<string, string>
  15.          {
  16.              ["command"] = envVars["MCPCommand"],
  17.              ["arguments"] = envVars["MCPArguments"],
  18.          }
  19.      };
  20.      var factory = new McpClientFactory(
  21.          new[] { config },
  22.          options,
  23.          NullLoggerFactory.Instance
  24.      );
  25.      return await factory.GetClientAsync("test");
  26. }
复制代码
写死的话就是这样写:
  1. private static async Task<IMcpClient> GetMcpClientAsync()
  2. {
  3.      DotEnv.Load();
  4.      var envVars = DotEnv.Read();
  5.      McpClientOptions options = new()
  6.      {
  7.          ClientInfo = new() { Name = "SimpleToolsConsole", Version = "1.0.0" }
  8.      };
  9.      var config = new McpServerConfig
  10.      {
  11.          Id = "test",
  12.          Name = "Test",
  13.          TransportType = TransportTypes.StdIo,
  14.          TransportOptions = new Dictionary<string, string>
  15.          {
  16.              ["command"] = node,
  17.              ["arguments"] = D:/Learning/AI-related/fetch-mcp/dist/index.js,
  18.          }
  19.      };
  20.      var factory = new McpClientFactory(
  21.          new[] { config },
  22.          options,
  23.          NullLoggerFactory.Instance
  24.      );
  25.      return await factory.GetClientAsync("test");
  26. }
复制代码
重点在:
  1. TransportOptions = new Dictionary<string, string>
  2.          {
  3.              ["command"] = node,
  4.              ["arguments"] = D:/Learning/AI-related/fetch-mcp/dist/index.js,
  5.          }
复制代码
用于连接你想连接的MCP服务器。
如果能正确显示你连接mcp服务器提供的工具,说明连接成功。
  1.   var listToolsResult = await client.ListToolsAsync();
  2.   var mappedTools = listToolsResult.Tools.Select(t => t.ToAITool(client)).ToList();
  3.   Console.WriteLine("Tools available:");
  4.   foreach (var tool in mappedTools)
  5.   {
  6.       Console.WriteLine("  " + tool);
  7.   }
复制代码
3.png

开启一个聊天循环:
  1.     Console.WriteLine("\nMCP Client Started!");
  2.     Console.WriteLine("Type your queries or 'quit' to exit.");
  3.     ChatDemo chatDemo = new ChatDemo();
  4.     while (true)
  5.     {
  6.         try
  7.         {
  8.             Console.ForegroundColor = ConsoleColor.DarkYellow;
  9.             Console.Write("\nQuery: ");
  10.             string query = Console.ReadLine()?.Trim() ?? string.Empty;
  11.             if (query.ToLower() == "quit")
  12.                 break;
  13.             if (query.ToLower() == "clear")
  14.             {
  15.                 Console.Clear();
  16.                 chatDemo.Messages.Clear();                    
  17.             }
  18.             else
  19.             {
  20.                 string response = await chatDemo.ProcessQueryAsync(query, mappedTools);
  21.                 Console.ForegroundColor = ConsoleColor.DarkYellow;
  22.                 Console.WriteLine($"AI回答:{response}");
  23.                 Console.ForegroundColor = ConsoleColor.White;
  24.             }                     
  25.         }
  26.         catch (Exception ex)
  27.         {
  28.             Console.WriteLine($"\nError: {ex.Message}");
  29.         }
  30.     }
  31. }
复制代码
处理每次询问:
  1. public async Task<string> ProcessQueryAsync(string query, List tools)
  2. {
  3.      if(Messages.Count == 0)
  4.      {
  5.          Messages =
  6.          [
  7.           // Add a system message
  8.          new(ChatRole.System, "You are a helpful assistant, helping us test MCP server functionality."),
  9.          ];
  10.      }
  11.      
  12.      // Add a user message
  13.      Messages.Add(new(ChatRole.User, query));
  14.      var response = await ChatClient.GetResponseAsync(
  15.             Messages,
  16.             new() { Tools = tools });
  17.      Messages.AddMessages(response);
  18.      var toolUseMessage = response.Messages.Where(m => m.Role == ChatRole.Tool);
  19.      if (toolUseMessage.Count() > 0)
  20.      {
  21.          var functionMessage = response.Messages.Where(m => m.Text == "").First();            
  22.          var functionCall = (FunctionCallContent)functionMessage.Contents[1];
  23.          Console.ForegroundColor = ConsoleColor.Green;
  24.          string arguments = "";
  25.          foreach (var arg in functionCall.Arguments)
  26.          {
  27.              arguments += $"{arg.Key}:{arg.Value};";
  28.          }
  29.          Console.WriteLine($"调用函数名:{functionCall.Name};参数信息:{arguments}");
  30.          foreach (var message in toolUseMessage)
  31.          {
  32.              var functionResultContent = (FunctionResultContent)message.Contents[0];
  33.              Console.WriteLine($"调用工具结果:{functionResultContent.Result}");
  34.          }
  35.          Console.ForegroundColor = ConsoleColor.White;
  36.      }
  37.      else
  38.      {
  39.          Console.ForegroundColor = ConsoleColor.Green;
  40.          Console.WriteLine("本次没有调用工具");
  41.          Console.ForegroundColor = ConsoleColor.White;
  42.      }
  43.      return response.Text;
  44. }
复制代码
代码已经放到GitHub,地址:https://github.com/Ming-jiayou/mcp_demo。
将.env-example修改为.env应该就可以运行,如果报错,设置成嵌入的资源即可。
.env配置示例:
  1. API_KEY=sk-xxx
  2. BaseURL=https://api.siliconflow.cn/v1
  3. ModelID=Qwen/Qwen2.5-72B-Instruct
  4. MCPCommand=node
  5. MCPArguments=D:/Learning/AI-related/fetch-mcp/dist/index.js
复制代码
最后

对C#使用MCP感兴趣的朋友可以关注这个项目:https://github.com/PederHP/mcpdotnet。
有问题欢迎一起交流学习。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册