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<stringReadFile([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<stringSaveFile([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

原创作者: chingho 转载于: https://www.cnblogs.com/chingho/p/18913876
<think>好的,我现在需要处理用户关于MCP服务器与stdio配置或使用方法的查询。首先,我需要明确用户的问题到底是什么。用户提到“MCP server stdio configuration or usage in programming context”,可能是在编程环境中如何配置或使用MCP服务器的标准输入输出。但MCP服务器具体指什么呢?这可能是一个特定的框架或工具,比如Minimal Control Protocol,或者是某个专有系统? 接下来,我需要检查内部资料,根据用户提供的引用[1],调用mcp工具搜索编码偏好关于StdioServerTransport。这说明MCP服务器可能使用了StdioServerTransport,这可能是一种通过标准输入输出进行通信的传输方式。通常,这种配置在需要进程间通信的场景中使用,比如父进程和子进程通过stdin和stdout交换数据。 然后,我需要考虑用户可能的实际需求。他们可能想了解如何配置MCP服务器以使用stdio作为通信渠道,或者如何在编程中实现这样的配置。比如,在启动服务器时指定使用stdio传输,或者编写代码处理输入输出流。 另外,用户可能遇到的具体问题可能包括:如何设置服务器以读取命令从stdin,并将结果输出到stdout;如何处理多线程或异步IO;或者如何调试这种配置下的通信问题。需要提供具体的配置示例或代码片段,比如使用Python或其他语言实现基本的stdio通信。 还要注意用户提到的编程上下文,可能需要给出不同语言的示例,或者解释相关的API和配置参数。例如,在某个框架中,可能需要设置transport参数为stdio,或者配置服务器的启动参数来禁用网络接口,强制使用标准流。 最后,根据用户的要求生成相关问题,这些问题应该帮助用户深入理解MCP服务器的stdio配置,比如性能优化、错误处理、多进程通信等。需要确保问题相关且有实际意义,引导用户进一步探索。</think>关于MCP服务器stdio配置的编程实现,以下是关键要点和示例: ### 一、StdioServerTransport基础配置 MCP服务器通过标准输入输出(stdio)实现进程间通信时,核心配置参数包括: $$transport = StdioServerTransport(encoding=\'utf-8\', timeout=300)$$ [^1] 典型应用场景: 1. 容器化部署时通过管道通信 2. IDE插件与语言服务器的交互 3. 自动化测试中的进程控制 ### 二、Python实现示例 ```python from mcp.server import Server from mcp.transport import StdioServerTransport class MyServer: def handle_request(self, request): return {"result": f"Processed: {request}"} if __name__ == "__main__": server = Server( transport=StdioServerTransport(), handler=MyServer() ) server.start() ``` ### 三、调试配置参数 | 参数 | 默认值 | 说明 | |------|--------|------| | buffer_size | 4096 | 输入缓冲区字节数 | | max_retries | 3 | 连接失败重试次数 | | heartbeat | 30s | 连接保持间隔 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值