该专栏优先在飞书发布,欢迎收藏关注!
https://www.feishu.cn/community/article?id=7507084665509904403
前面的课程,我们已经实现SSE通信方式的MCP Server。
下面来实现Stdio通信方式的MCP Server。
SSE方式,让我们可以与远程服务器交互。Stdio的方式,让我们可以与本地电脑交互,比如操作文件、操作数据库、与其他应用程序交互。
一、创建项目
创建控制台应用项目。

项目名称

勾选配置如下:

项目创建完成后。
添加依赖库:ModelContextProtocolServer.Stdio,版本为:0.0.1-preview-05。添加的时候记得勾选:包括预发行版。

二、代码实现
===
2.1 Program.cs
启动一个基于标准输入/输出(stdin/stdout)通信的协议服务器
// 标准输入/输出协议服务器相关的类和方法。 using ModelContextProtocolServer.Stdio; // 使用 StdioServer 类的 RunAsync 方法启动一个异步的标准输入/输出服务器。 await StdioServer.RunAsync(args);
2.2 Stadi 实例代码
添加类:FileTool

FileTool的代码如下,这里有几个关键点,通过为类、方法、参数来添加标识,这样才能被识别 MCP tool:
1、[McpServerToolType] 标记此类为 MCP 服务器工具类型
2、[McpServerTool] 标记的方法会被框架识别并注册为可用工具。
3、[Description("获取服务器时间")] 描述方法的工具。
4、[Description("格式")] 描述参数。
5、提供2个工具方法:读取本地文件内容,保存内容至本地文件。
// MCP 协议服务端所需的核心特性与类型。 using ModelContextProtocol.Server; // 用于支持 [Description] 特性,提供描述信息。 using System.ComponentModel; namespace MCPServer.Stdio { /// <summary> /// 标记此类为 MCP 服务器可用的工具类型,客户端可通过协议调用其中的方法。 /// </summary> [McpServerToolType] public static class FileTool { /// <summary> /// 读取指定路径的文件内容。 /// </summary> /// <param name="path">要读取的文件的完整路径</param> /// <returns>文件的内容字符串</returns> [McpServerTool, Description("读取文件")] public static async Task<string> ReadFile([Description("文件路径")] string path) { // 检查文件是否存在,若不存在则抛出异常 if (!File.Exists(path)) throw new FileNotFoundException("文件不存在"); // 异步读取文件内容并返回 return await File.ReadAllTextAsync(path); } /// <summary> /// 将指定内容保存到指定路径的文件中。 /// 如果目标目录不存在,则自动创建。 /// </summary> /// <param name="path">要保存的文件路径</param> /// <param name="content">要写入文件的内容字符串</param> /// <returns>操作结果信息</returns> [McpServerTool, Description("保存文件")] public static async Task<string> SaveFile([Description("文件路径")] string path, [Description("内容")] string content) { try { // 获取文件所在目录路径 var directory = Path.GetDirectoryName(path); // 如果目录不为空且不存在,则创建目录 if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // 使用异步方式将内容写入文件(覆盖模式) await File.WriteAllTextAsync(path, content); // 返回成功提示 return $"文件已成功保存至: {path}"; } catch (Exception ex) { // 捕获所有异常并返回错误信息,防止崩溃并便于调试 return $"保存文件时发生错误: {ex.Message}"; } } } }
2.3 项目发布

三、结合MCP Client 测试效果
===
使用上一个课程:C#实现MCP Client 与 LLM 连接,抓取网页内容功能! 的Client示例。
修改 Program.cs 的代码。

其中Command为项目发布后的程序路径。备注:路径记得修改为自己的!
// 创建一个基于标准输入/输出(stdio)的客户端传输配置对象 var config = new StdioClientTransport(new StdioClientTransportOptions() { // 设置要启动的服务端可执行文件路径 Command = "e:\project\mcpdemo\mcpserver.stdio\bin\release\net8.0\publish\win-x64\MCPServer.Stdio.exe" });
运行MCP Client,成功连接MCP Server,并打印出工具列表。

输入以下命令:
读取 e:本地文件.txt 的内容
大模型会调用本地工具,读取本地文件的内容,并返回结果如下。
备注:本地文件 e:本地文件.txt,需要提前创建。

输入以下命令:
将内容:这是MPC Server实例,保存到文件路径:e:stdio.txt
大模型会调用本地工具,将内容保存至本地文件,并返回结果如下。

也可以直接刚才保存的内容。
好了,今天就分享到这边!
文中示例代码:https://pan.quark.cn/s/a4f479c2eed2
- End -
推荐阅读
C#实现MCP Client 与 LLM 连接,抓取网页内容功能!