当前位置: 首页 > news >正文

C#实现Stdio通信方式的MCP Server

该专栏优先在飞书发布,欢迎收藏关注!

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#实现SSE通信方式的MCP Server

C#实现MCP Client 与 LLM 连接,抓取网页内容功能!

VS Code + Cline + 魔搭MCP Server 实现抓取网页内容。

C#实现自己的MCP Client

http://www.lqws.cn/news/178183.html

相关文章:

  • 数据通信 PoE 交换机解决方案
  • 高效Excel合并拆分软件
  • 【人工智能】一些基本概念
  • 惠普HP Deskjet 9600 打印机信息
  • 【递归、搜索与回溯】综合练习(四)
  • JVM虚拟机:内存结构、垃圾回收、性能优化
  • 使用 Mechanical 脚本获取联合反作用力和力矩
  • Linux 服务管理与自启动配置全解析:rc.d、systemctl与service对比
  • 物联网嵌入式开发实训室建设方案探讨(高职物联网应用技术专业实训室建设)
  • 【使用conda】安装pytorch
  • 力扣刷题(第四十九天)
  • 【redis实战篇】第八天
  • 越狱蒸馏-可再生安全基准测试
  • Science Robotics:UCLA 贺曦敏团队综述自主软体机器人
  • 绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
  • AI大模型学习三十三、HeyGem.ai 服务端(ubuntu)docker 安装 /客户端(win)分离部署
  • 【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
  • 智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
  • vscode使用系列之快速生成html模板
  • LlamaFactory × 多模态RAG × Chat-BI:万字长文探寻RAG进化轨迹,打造卓越专业AI助手
  • 安卓基础(ProGuard vs R8)
  • FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
  • 【Linux】Linux 进程间通讯-管道
  • gitlab CI/CD本地部署配置
  • WebRTC 与 WebSocket 的关联关系
  • 【JVM】Java虚拟机(一)——内存结构
  • Qt生成日志与以及报错文件(mingw64位,winDbg)————附带详细解说
  • 在Windows下利用LoongArch-toolchain交叉编译Qt
  • 【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析
  • 数据库SQLite基础