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

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

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

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

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...