使用MCP C# SDK开发MCP Server + Client
墨韵书香 /
04-02 /
30点赞 /
0评论 /
840阅读
# **MCP是什么鬼?**
MCP,全称是“模型上下文协议”(Model Context Protocol),是Anthropic开源的一个标准协议。打个比方,它就像是AI世界的“USB-C”接口。你知道USB-C吧?一根线就能连接手机、电脑、充电器,超级方便。MCP的作用也差不多,它让AI模型(比如Anthropic的Claude)可以轻松地跟外部的数据源和工具连接起来,比如数据库、文件系统、API等等。以前,如果想让AI访问你的数据库或者调用某个工具,得专门写一堆代码,特别麻烦。现在有了MCP,就像是插上USB-C线那么简单,AI模型通过这个标准协议就能直接获取数据或执行操作,不用每次都重新开发连接方式。这样,开发AI应用就变得更快、更省事了。

# **MCP是如何工作的?**
MCP是一个典型的C/S架构模式,即客户端 和 服务端,它们之间采用一种标准的消息格式(JSON-RPC)进行通信,大模型可以通过这些消息进行:
(1)获取数据:例如通过SQL从DB中查询订单数据;
(2)执行操作:例如通过API调用发个消息通知;
(3)理解指令:例如通过一些提示词模板,LLM可以知道如何使用数据和工具;

简单来说,MCP就是AI的“万能接口”。有了它,AI模型就能像插上USB-C线一样,轻松连接到各种外部数据源和工具,变得更聪明、更实用。不管是开发者还是普通用户,都能通过MCP让AI干更多事,而且过程简单又安全。未来随着MCP的普及,我们可能会看到更多能干实事儿的AI应用冒出来!
# **创建一个MCP Server**
这里我们使用MCP C# SDK来实现,使用标准的IO传输方式。
(1)创建一个.NET 8.0控制台应用,假设命名为:EDT.McpServer.ConsoleHost
(2)安装MCP SDK
```csharp
ModelContextProtocol 0.1.0-preview.4
```
(3)创建一个Tools目录,然后添加一个TimeTool.cs
```csharp
using ModelContextProtocol.Server;
using System.ComponentModel;
namespace EDT.McpServer.Tools.ConsoleHost;
[McpServerToolType]
public static class TimeTool
{
[McpServerTool, Description("Get the current time for a city")]
public static string GetCurrentTime(string city) =>
$"It is {DateTime.Now.Hour}:{DateTime.Now.Minute} in {city}.";
}
```
这个TimeTool就是我们定义的基于MCP的Tool,可以看到基于SDK提供的Attribute,可以方便地将其指定为MCP Server Tools。
(3)修改Program.cs设置为启动MCP Server
```csharp
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using EDT.McpServer.Tools.ConsoleHost;
try
{
Console.WriteLine("Starting MCP Server...");
var builder = Host.CreateEmptyApplicationBuilder(settings: null);
builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithToolsFromAssembly();
await builder.Build().RunAsync();
return 0;
}
catch (Exception ex)
{
Console.WriteLine($"Host terminated unexpectedly : {ex.Message}");
return 1;
}
```
同样,也是很方便地就完成了MCP Server的创建,重点关注WithToolsFromAssembly这个扩展方法,它会扫描程序集中添加了McpServerTool标签的类进行注册。
这时我们已经完成了MCP Server的创建,可以把它启动起来了。
但是,要完成今天的目标,连接起来测试,我们还得实现一个Client来调用Server。
# 创建一个MCP Client
(1)创建一个.NET 8.0控制台应用,假设命名为:EDT.McpServer.Client
(2)安装MCP SDK
```csharp
ModelContextProtocol 0.1.0-preview.4
```
(3)修改Program.cs,实现以下步骤:
**创建MCP Client:**
```csharp
await using var mcpClient = await McpClientFactory.CreateAsync(new()
{
Id = "time",
Name = "Time MCP Server",
TransportType = TransportTypes.StdIo,
TransportOptions = new()
{
["command"] = @"..\..\..\..\EDT.McpServer\bin\Debug\net8.0\EDT.McpServer.exe"
}
});
```
需要注意的是:这里我们MCP Server使用的是标准IO传输方式,因此指定TransportType为StdIo,同时指定command为MCP Server应用程序所在的exe的目录位置。当然,这里的这种方式有点不是很规范,但你只需要了解它是需要访问MCP Server的程序地址就行了。
**列出可用的Tools:**
```csharp
var tools = await mcpClient.ListToolsAsync();
foreach (var tool in tools)
{
Console.WriteLine($"{tool.Name} ({tool.Description})");
}
```
**直接执行Tool:**(一般情况下不会这样用,而是在LLM中来调用)
```csharp
var result = await mcpClient.CallToolAsync(
"GetCurrentTime",
new Dictionary() { ["city"] = "Chengdu" },
CancellationToken.None);
Console.WriteLine(result.Content.First(c => c.Type == "text").Text);
```
**通过LLM来调用Tool:**这里基于Microsoft.Extensions.AI核心库来实现的,你也可以用Semantic Kernel库来做这个事,都行!
```csharp
var apiKeyCredential = new ApiKeyCredential(config["LLM:ApiKey"]);
var aiClientOptions = new OpenAIClientOptions();
aiClientOptions.Endpoint = new Uri(config["LLM:EndPoint"]);
var aiClient = new OpenAIClient(apiKeyCredential, aiClientOptions)
.AsChatClient(config["LLM:ModelId"]);
var chatClient = new ChatClientBuilder(aiClient)
.UseFunctionInvocation()
.Build();
IList chatHistory =
[
new(ChatRole.System, """
You are a helpful assistant delivering time in one sentence
in a short format, like 'It is 10:08 in Paris, France.'
"""),
];
// Core Part: Get AI Tools from MCP Server
var mcpTools = await mcpClient.ListToolsAsync();
var chatOptions = new ChatOptions()
{
Tools = [..mcpTools]
};
// Prompt the user for a question.
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"Assistant> How can I assist you today?");
while (true)
{
// Read the user question.
Console.ForegroundColor = ConsoleColor.White;
Console.Write("User> ");
var question = Console.ReadLine();
// Exit the application if the user didn't type anything.
if (!string.IsNullOrWhiteSpace(question) && question.ToUpper() == "EXIT")
break;
chatHistory.Add(new ChatMessage(ChatRole.User, question));
Console.ForegroundColor = ConsoleColor.Green;
var response = await chatClient.GetResponseAsync(chatHistory, chatOptions);
var content = response.ToString();
Console.WriteLine($"Assistant> {content}");
chatHistory.Add(new ChatMessage(ChatRole.Assistant, content));
Console.WriteLine();
}
```
最后的效果如下图所示:

# 创建一个基于ASP.NET的MCP Server
除了使用标准的IO协议,我们还可以实现一个基于ASP.NET Core的MCP SSE Server,顾名思义它就是使用SSE传输方式。
(1)创建一个.NET 8.0 ASP.NET WebAPI应用,假设命名为:EDT.McpServer.WebHost
(2)安装MCP SDK
```csharp
ModelContextProtocol 0.1.0-preview.4
ModelContextProtocol.AspNetCore 0.1.0-preview.4
```
(3)创建一个Tools目录,然后添加一个TimeTool.cs
这里和上面的一样,不再赘述。
(4)修改Program.cs完成MCP Server配置:
```csharp
using EDT.McpServer.WebHost.Tools;
using ModelContextProtocol.AspNetCore;
try
{
Console.WriteLine("Starting MCP Server...");
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMcpServer().WithToolsFromAssembly();
var app = builder.Build();
app.UseHttpsRedirection();
app.MapGet("/", () => "Hello MCP Server!");
app.MapMcp();
app.Run();
return 0;
}
catch (Exception ex)
{
Console.WriteLine($"Host terminated unexpectedly : {ex.Message}");
return 1;
}
```
可以看到,就是这么简单,通过MapMcp实现了/sse端点的映射。后续MCP Client要连接的就是这个/sse的端点。
(5)这时,你就可以把这个ASP.NET WebAPI应用启动起来,假设我们这里是 https://localhost:8443,你就可以通过下面的一点点修改,让之前的这个MCP Client连接上这个MCP Server:
```csharp
await using var mcpClient = await McpClientFactory.CreateAsync(new()
{
Id = "time",
Name = "Time MCP Server",
TransportType = TransportTypes.Sse,
Location = "https://localhost:8443/sse"
});
```
可以看到,仅仅修改TransportType为SSE,然后指定Server的BaseUrl即可。
OK,让我们再来运行一下Client看看能否再次成功调用Tool:

看来这次使用SSE传输方式也能调用成功了!Perfect!
# 小结
本文介绍了MCP的基本概念和工作模式,然后演示了如何通过MCP C# SDK创建MCP Server和Client,以及基于ASP.NET WebAPI创建SSE Server,相信会对你有所帮助。
如果你也是.NET程序员希望参与AI应用的开发,那就快快了解和使用基于Microsoft.Extensioins.AI + MCP C# SDK 的生态组件库吧。
# 示例源码
GitHub:[点此查看](https://github.com/edisontalk/EdisonTalk.AI.Agents?wt.mc_id=MVP_397012)
# **参考内容**
MCP C# SDK Samples 《[MCP C# Sample Demos](https://github.com/modelcontextprotocol/csharp-sdk/tree/main/samples?wt.mc_id=MVP_397012)》
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/1948
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- .NET Core中的配置Configuration实战
- 在 .NET 中使用 Sqids 快速的为数字 ID 披上神秘短串,轻松隐藏敏感数字!
- 常用的 Visual Studio 2022 扩展插件推荐:生产力必备工具
- 解锁.NET 9性能优化:内存、异步、代码与Web全方位指南
- 一款 .NET 开源、免费、轻量级且非侵入性的防火墙软件
- .NET 10 进展之 CoreCLR Interpreter
- 一款基于 .NET 开源、可以拦截并修改 WinSock 封包的 Windows 软件
- 使用MCP C# SDK开发MCP Server + Client
- Gradio.Net:加速 .NET 的 Web 应用开发
- Magick.NET 支持100多种格式的强大 .NET 图片处理库
- 2025年C#/.NET/.NET Core优秀项目和框架推荐
- EF Core 10 中 LeftJoin 和 RightJoin 运算符在 LINQ 查询中的应用
- [开源][.Net Framework 4.0] SimpleLiveDataFeed v1.0更新:增加NuGet包
- .NET 10 Preview 4中ASP.NET Core 改进
- 通过 Nuke 为 Dotnet Core 应用构建自动化流程
- ASP.NET Core 实现的领域驱动设计框架推荐
- 如何在 .NET 中 使用 ANTLR4
- 如何把ASP.NET Core WebApi打造成Mcp Server
- C#/.NET/.NET Core技术前沿周刊 | 第 39 期(2025年5.19-5.25)
- .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
- C# LINQ 快速入门实战指南,建议收藏学习!
- 解决.NET AOT交叉编译到Linux - arm64的坑
- 10年+.NET Coder 心语 ── 单一职责原则的思维:为什么你的代码总在"牵一发而动全身"
- 深入理解.NET Core中的配置Configuration和应用
- 3款基于.NET开源且免费的远程桌面工具分享
- ASP.NET Core EFCore 属性配置与DbContext 详解
- .NET 的全新低延时高吞吐自适应 GC - Satori GC