百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用 MCP C# SDK 实现 MCP Tool(c# memcached)

bigegpt 2025-05-02 09:11 15 浏览

使用 MCP C# SDK 实现 MCP

Intro

MCP是由Anthropic创建的一个开放协议 现在有官方 C# SDK 了,官方 C# SDK 由原来的 mcpdotnet 发展而来,基于 Microsoft.Extensions.AI 实现,截止写文章的时候(2025-4-1)目前最新版本时 0.1.0-preview 4 了,这一版本中增加了
ModelContextProtocol.AspNetCore
NuGet 包,使得实现基于 ASP.NET Core SSE 的 Mcp Server 更加简单了,之前的版本中需要将示例中的扩展拷贝到自己项目中去,有了这个 NuGet 包之后就不需要了,McpServer 目前主要的两种实现方式是 Stdio(标准输入输出) 和 SSE(Server Sent Event),新的规范里提出了基于 Http 的支持,目前暂时还未支持

What

SSE Sample

首先我们需要在项目里添加 NuGet 包引用,这里我们直接引用
ModelContextProtocol.AspNetCore

dotnet add package ModelContextProtocol.AspNetCore --prerelease

然后注册我们的 McpServer 示例如下:

builder.Services
.AddMcpServer() // 注册 McpServer 相关服务
.WithToolsFromAssembly() // 从程序集中扫描添加 tools
;

之后需要注册 Mcp Sse 的 Endpoint

var app = builder.Build();

app.MapMcp(); // 注册 mcp sse endpoint

await app.RunAsync();

最后我们要实现我们 Mcp tool 了,来看一个最简单的示例

[McpServerToolType]
public static class EchoTool
{
[McpServerTool, Description("Echoes the input back to the client.")]
public static string Echo(string message)
{
return "hello " + message;
}
}

McpTool 类型需要添加 McpServerToolType 的 attribute,同时 tool 对应的方法也需要添加 McpServerTool 的 attribute,默认 tool 的名字是方法名,也可以通过 Name 来执行,同时可以通过 DescriptionAttribute 来描述这个 tool 的功能,客户端可以根据 tool 的介绍来选择合适的 tool 来实现功能

最简单的功能差不多就是这样了,最早的版本里也需要是静态方法才能注册,使得想要使用依赖注入的话可能得自己实现一个 service locator 得模式,在第二个版本中支持了简单得依赖注入,我们可以直接在方法参数中添加对应得服务,示例如下:

[McpServerToolType]
public class TranslationTool
{
[McpServerTool(Name = "translation"), Description("Translate English to Simplified Chinese")]
public static async Task<string> TranslationEnZh(
[Description("The source english text needs to be translated to Simplified Chinese"
)]
string sourceText,
IChatClient chatClient,
CancellationToken cancellationToken
)

{
var response = await chatClient.GetResponseAsync(
// ...
);
// ...
}
}

这里我们就可以跑起来我们的 McpServer 了,跑起来之后可以通过官方的 mcp inspector 来调试

可以使用 npx @
modelcontextprotocol/inspector
来运行 mcp inspector,运行起来之后效果如下:


我们可以选择 Transport Type 为 SSE,URL 为我们 web server 的地址 /sse,默认 path 是 sse 然后点击 Connect 按钮即可

Connect 成功之后,下面会显示 Connected,然后我们可以点击中间的 List Tools 去向 server 请求支持的 tools,之后会列出来 server 支持的 tool,我们可以点击任意一个 tool 在右侧会出现对应的参数信息,我们填写之后点击 Run Tool 就可以调用 server 端的这个 tool

tools
echo-tool
translation-tool
csharp-exec

除了 mcp inspector 和 Claude 目前也有一些 chat 工具支持了 mcp tool,我目前有用 Cherry Studio,已经支持了 Mcp Tool,我们也可以在 Cheery Studio 中试一下(如果之前已经安装但是没有 Mcp Server 支持,推荐更新到最新版本)

CherryStudio McpServer Configure

类似地,我们添加 Mcp Server 的时候可以选择 SSE 并填写刚才的 URL,最早支持 MCP 的版本没有列出来可以调用的工具,在新版本里列出来了可用的工具,更加直观和方便了

接着我们在聊天窗口中也需要启用一下 Mcp Server,默认没有启用

chat with Mcp Server

然后就可以测试我们的 Mcp Server 了

chery translation

可以看到这里调用了我们 translation tool 并根据返回的结果生成了回答

cherry exec-csharp-code

它背后是怎么实现的呢?我们可以抓个包看一看,在生成返回结果时有两个请求

requests

第一个请求会将当前上下文的信息和启用的 mcp server tools 放在 request 中,请求服务器

request1

服务器端返回是否需要调用某一个 tool,发现有一个 ExecCSharpCode 的 tool 可以调用

response1

接着客户端会去调用我们的 tool 之后再将 tool 返回的结果作为上下文的一部分再次请求服务器

request2
response2

这次服务器返回了给用户的回复,客户端也返回了回答

Stdio Sample

除了 SSE 之外 Stdio 标准输入输出也是一种常见的方式,不过个人不是太推荐,尤其是使用第三方的一些 mcp server 时,感觉有安全风险,你可能并不知道别人的程序会做一些什么样的操作,在本地执行时会不会出现问题,还有就是在调试的时候有遇到文件被占用需要手动去进程管理器里杀死进程

首先添加对 ModelContextProtocol 的 NuGet package 引用

Stdio 模式是直接运行一个可执行的应用程序

var builder = Host.CreateApplicationBuilder(args);
builder.Services
.AddMcpServer() // 注册 McpServer 相关服务
.WithStdioServerTransport() // 添加标准输入输出传输支持
.WithToolsFromAssembly() // 从程序集中扫描添加 tools
;
// ...

这样基于标准输入输出的 Mcp Server 骨架就搭好了,之后就和前面一样实现我们的 tools 就可以了,针对调试和使用也是类似的只是换成 stdio 方式即可,配置示例:

cherry-stdio-mcp-server-sample

Mcp Client

我们也可以基于 SDK 实现 MCP 客户端,示例代码如下:


var client = await McpClientFactory.CreateAsync(new()
{
Id = "aspnet-sample",
Name = "ASP.NET McpServerSample",
TransportType = TransportTypes.Sse,
Location = "http://localhost:5000/sse",
});

// Print the list of tools available from the server.
foreach (var tool inawait client.ListToolsAsync())
{
Console.WriteLine($"{tool.Name} ({tool.Description})");
}

// Execute a tool (this would normally be driven by LLM tool invocations).
var result = await client.CallToolAsync(
"Echo",
new Dictionary<string, object?> { ["message"] = "MCP!" },
CancellationToken.None);

// echo always returns one and only one text content object
Console.WriteLine(result.Content.First(c => c.Type == "text").Text);


McpClient output
这里像 inspector 一样调用 Mcp Server 的工具,如果要做到 Cherry Studio 中在聊天上下文中调用还需要借助大语言模型的能力来实现

References

  • https://github.com/modelcontextprotocol/csharp-sdk
  • https://github.com/WeihanLi/SamplesInPractice/tree/main/McpSample
  • https://github.com/PederHP/mcpdotnet
  • https://github.com/modelcontextprotocol/inspector
  • https://github.com/CherryHQ/cherry-studio/releases

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...