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

使用 MCP C# SDK 实现 MCP Tool

yund56 2025-05-21 05:34 24 浏览

使用 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

相关推荐

分享|最美色彩!40张纯迷彩高清原图壁纸送给你

最美的色彩是什么?对于军人来说是迷彩那是青春的本色是理想、使命的颜色40张纯迷彩高清原图壁纸送给你so快来收图!!军报记者微信发布作者:剑客小吉;编辑:王旭;编审:曲延涛;投稿邮箱:jfjbwx@16...

你还在用百度搜图?推荐5个图片素材库,你要的图片都有!

自媒体运营人每天都需要进行内容创作,所以少不了图片、视频、文案素材等,那么这些自媒体素材哪里找呢?今天,就给大家分享5个图片和视频素材库,文案素材下期再给大家详细介绍。图片和视频素材现在已经是做短视频...

《2》图片原创无版权素材

粉樱于雨中轻轻摇曳,花瓣飘呀飘的,落在小径上、湖面上,将世界晕染成柔和的粉色。雨滴似银线,串联起天空与湖水,古亭在一旁静静凝望,连空气都透着甜意。我们一直在寻觅“诗意”的模样,原来就是这般——有落花纷...

太美了!100个令人窒息的绝美风景摄影照

全网最全的图片素材网站分享!任意下载!值得收藏!

自媒体时代,很多内容创作者都需要高清的图片资源。因为图片不清晰会带来不好的用户体验~众所周知,从网上下载的图片一般都是有版权的!如果你直接下载使用,可能会有侵权的风险!今天为了帮助大家解决图片问题,今...

中秋节素材(海报+插画)!绝景良时难再并

部分预览随机选取中秋节素材(海报+插画)(仅供会员下载)...

10张早上好美图,早安祝福语和祝福图片选集

每天准时分享接收:早安问候图片、漂亮的早安图片、问候祝福语、动态聊天表情包等等每日的祝福准时送达,愿你用满满的正能量开启新的一天。美满,是日常的点点汇聚;情谊,是时光的悠悠长卷;一声招呼,穿越五湖四海...

晚安心语正能量经典素材带图片,让你一见倾心

一、没事的,每个人大概都会经历一些情绪崩溃或者极端的时刻,会好的,会熬过来的。二、以后,只对两种人好,一种是对我好的人,一种是懂得我的好的人,一个人的温暖也是有限的啊,一点都不能浪费。三、要钱,就要努...

太厉害了,52种科幻画主题创意素材,极其脑洞大开,科技创新未来

图片来自网络,仅作分享,如有侵权请联系删除哦...

综合绘画素材—29张冬天主题绘画素材,一起来画你心中的冬天呀

图片来自,仅作分享,如有侵权请联系删除哦...

20张彩色线描装饰画素材!一起欣赏线条带来的艺术美呀!

图片来自网络,仅作分享,如有侵权请联系删除哦...

国外的免费素材网站!这3个大神私藏款,你还没用过?

做PPT没素材?去网上找了半天,浪费时间不说,大部分还收费,等于白忙活!不少小伙伴也问我有没有免费好用的素材网站,这不就来了。今天和大家分享3个国外的素材网站,关键是免费又高质量。不管是PPT设计还是...

8个高清无版权的图片资源网站,质量高又免费,够你用一辈子

很多时候我们找素材总是要花费很多时间,今天就给大家分享8个,高清无版权的图片资源网站,质量高又免费,够你用一辈子。01*Logosc链接:https://www.logosc.cn/so/这是一个免版...

100种超萌手帐素材简笔画,小白看一遍也能学会

手帐素材集中营:天气、美食、植物花草、动物、人物、乐器都在这里。一次画个够,转存轻松做手帐~爱画画,爱生活~...

超治愈萌系手帐素材大全 美食旅游花草人物花边都备齐了

现代人每天都生活在一个充满焦灼感的空气中,成年人的世界里,每个人都不容易。不论是生活还是工作,都充满了各种挫折。很少有人能一帆风顺,为学习、为工作、为家庭、为感情、我们总会在坎坎坷坷中成长,难免会觉得...