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

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

C#实现Stdio通信方式的MCP Server的更多相关文章

  1. Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议

    Nacos是阿里巴巴开源的服务发现与配置管理项目,本次发布的1.1.4版本,主要带来的是与Istio的对接功能,使用的是Istio最新的MCP协议.本文将介绍包括这个功能在内的新版本发布的功能. 升级 ...

  2. web服务器tomcat入门实战

    一.tomcat介绍1.1 引入tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Su ...

  3. SpringCloud入门系列0-Nacos的安装与配置

    背景 工作有一些年头了,自从19年初彻底转了java(这又是另一篇心酸的故事),突然感觉自己荒废了好几年(不是说.net不好,而是回顾自己这几年做的很多东西都浮于表面,有时候弄成很忙的样子,回头看看自 ...

  4. CentOS 7 Nacos 集群搭建

    环境 CentOS 7.4 MySQL 5.7 nacos-server-1.1.2 本次安装的软件全部在 /home/javateam 目录下. MySQL 安装 首先下载 rpm 安装包,地址:h ...

  5. 我在组内的Nacos分享

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. Nacos简介 Nacos : Naming and Configuration Servic ...

  6. 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

    在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...

  7. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  8. 利用HAProxy代理SQL Server的AlwaysOn辅助副本

    利用HAProxy代理SQL Server的AlwaysOn辅助副本 公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群 机房内有三套程序需要读取数据库 第一套:主 ...

  9. [计算机网络]简易http server程序

    好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...

  10. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

随机推荐

  1. Delphi MEMO 循环往上往下滚动

    // 循环往上滚动 if Memo1.Perform(EM_SCROLL,SB_LINEDOWN,0)=0 then begin Memo1.Perform(WM_VSCROLL,SB_TOP,0); ...

  2. BUUCTF---这是Base??

    题目 dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11 ...

  3. 【SpringMVC】RESTful CRUD

    RESTful CRUD REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方 ...

  4. Sql Server执行情况

    --- 1.查找目前SQL Server所执行的SQL语法,并展示资源情况: SELECT s2.dbid , DB_NAME(s2.dbid) AS [数据库名] , --s1.sql_handle ...

  5. pycharm-pip安装scrapy、pywifi等模块报错解决方法

    之前学Python时,使用pycharm安装一些不常用的模块时,报错,安装不成功.找了很多方法,总算好了,总结一下: 一.大部分安装不成功的原因,都是原因pip安装源地址问题. 1.在项目pip.ex ...

  6. 航天信息诺税通SAAS接口封装DLL

    项目中需要对接航天信息的诺税通接口开具电子发票,为此将功能封装到了DLL中,其他项目也可以方便的引用. Delphi调用示例: 有需要可以和我联系:yzqnet(微信)

  7. python环境配置命令

    在Python中,创建新的环境通常指的是创建一个隔离的Python环境,以便在该环境中安装和管理不同版本的库,而不会影响到系统中其他Python环境的库.这通常用于解决不同项目之间的依赖冲突.下面是一 ...

  8. 基于MySQL分析线上充值留存率

    1.数据清洗 步骤: 1.查询charge_record表业务类型为充值且订单状态为成功的数据 2.将上述数据转移到本地数据库 使用如下脚本: # coding=utf-8import pymysql ...

  9. mybatis-plus之配置安全

    1. 环境 SpringBoot 2.6.x 2. 介绍 MyBatis-Plus 从3.3.2版本开始提供了数据安全保护功能,MyBatis-Plus 支持通过加密配置来增强数据库的安全性. 3. ...

  10. Sentinel源码—2.Context和处理链的初始化

    大纲 1.Sentinel底层的核心概念 2.Sentinel中Context的设计思想与源码实现 3.Java SPI机制的引入 4.Java SPI机制在Sentinel处理链中的应用 5.Sen ...