资讯详情

使用 MCP C# SDK 实现 MCP Tool:ASP.NET Core + SSE 配置与验证

📅 2026/9/28 7:29:13 | 华诺云谱 👁 阅读
使用 MCP C# SDK 实现 MCP Tool:ASP.NET Core + SSE 配置与验证
1. 为什么要在 ASP.NET Core 里用 MCP C# SDK 暴露 ToolMCPModel Context Protocol是 Anthropic 提出的开放协议用来让大模型以标准化方式调用外部工具和数据源。官方 C# SDK 由早期的 mcpdotnet 演进而来底层基于 Microsoft.Extensions.AI目前已经提供了ModelContextProtocol.AspNetCore这个 NuGet 包把「在 ASP.NET Core 里跑一个 SSE 模式的 MCP Server」这件事从「手动拷贝扩展代码」变成了「加包 三行注册」。这篇要解决的问题很具体你有一个 ASP.NET Core 项目想把自己的业务能力比如翻译、查库、执行计算包装成 MCP Tool让 Claude、Cherry Studio 这类支持 MCP 的客户端能通过 SSE 连上来调用。适合谁适合已经会写 ASP.NET Core、但对 MCP 协议和 SSE 传输还不熟的后端同学。读完你能拿到一份可直接复制的Program.cs与appsettings.json骨架知道怎么用 curl 验证 Tool 列表和调用结果也能把模型请求统一走 TaoToken 的 Key/API 通道避免每个 Tool 里各写一套鉴权。我试过把 Tool 直接写死在 Controller 里结果客户端列不出工具、参数也对不上后来换成 SDK 的 Attribute 扫描方式才顺。下面按「前置准备 → 可复制配置 → 验证 → 排障」的顺序走一遍。2. TaoToken 前置统一 Key 与 API 通道MCP Tool 本身不负责模型调用但很多 Tool比如翻译、总结内部要请求大模型。如果每个 Tool 各自读环境变量、各自拼 endpoint项目一多就乱。我的做法是把模型请求统一收敛到 TaoToken 的 API 通道Tool 里只依赖注入好的IChatClient。TaoToken 在这里的角色是「统一入口」一个 Key 走通模型对话、编码类请求接入文档里给了 OpenAI 兼容的 base URL 和鉴权头格式。你需要在 TaoToken 控制台创建一个 API Key然后把它写进appsettings.json或用户机密不要硬编码进仓库。几个会用到的地址建议先收藏官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址不加 UTMhttps://taotoken.net/api创建 Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole注意Key 只放在服务端配置里MCP 客户端连的是你的 ASP.NET Core 服务不是直连 TaoToken。这样客户端不需要知道你的模型 Key鉴权边界更清晰。如果你后面要做长期编码类 Agent、需要更稳定的额度与并发可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan3. 可复制配置Program.cs 与 appsettings.json 骨架3.1 加包与项目结构先建一个空的 ASP.NET Core Web 项目然后加两个包MCP 的 ASP.NET Core 包以及用于模型调用的客户端包。dotnet new web -n McpAspNetDemo cd McpAspNetDemo dotnet add package ModelContextProtocol.AspNetCore --prerelease dotnet add package Microsoft.Extensions.AI.OpenAI --prereleaseModelContextProtocol.AspNetCore提供AddMcpServer()、WithToolsFromAssembly()、MapMcp()这套 APIMicrosoft.Extensions.AI.OpenAI用来把 TaoToken 的兼容端点包装成IChatClient注入到 Tool 里。3.2 appsettings.json把 TaoToken 的 base URL、Key、模型名放进配置。Key 建议用用户机密或环境变量覆盖这里给的是结构示例。{ TaoToken: { BaseUrl: https://taotoken.net/api, ApiKey: sk-你的Key, Model: gpt-4o-mini }, Logging: { LogLevel: { Default: Information, Microsoft.AspNetCore: Warning } }, AllowedHosts: * }3.3 Program.cs 完整骨架下面这份可以直接跑。注意MapMcp()默认把 SSE 端点挂在/sse客户端连的就是这个路径。using System.ComponentModel; using System.ClientModel; using Microsoft.Extensions.AI; using ModelContextProtocol.Server; using OpenAI; var builder WebApplication.CreateBuilder(args); // 1. 注册 TaoToken 通道的 IChatClient var cfg builder.Configuration.GetSection(TaoToken); builder.Services.AddSingletonIChatClient(_ { var client new OpenAIClient( new ApiKeyCredential(cfg[ApiKey]!), new OpenAIClientOptions { Endpoint new Uri(cfg[BaseUrl]!) }); return client.GetChatClient(cfg[Model]!).AsIChatClient(); }); // 2. 注册 MCP Server并从程序集扫描 Tool builder.Services .AddMcpServer() .WithToolsFromAssembly(); var app builder.Build(); // 3. 注册 MCP SSE 端点默认路径 /sse app.MapMcp(); app.Run();3.4 写一个带依赖注入的 ToolTool 类加[McpServerToolType]方法加[McpServerTool]。方法参数里可以直接注入IChatClientSDK 会帮你解析。using System.ComponentModel; using Microsoft.Extensions.AI; using ModelContextProtocol.Server; [McpServerToolType] public static class DemoTools { [McpServerTool(Name echo), Description(Echoes the input back to the client.)] public static string Echo(string message) hello message; [McpServerTool(Name translation), Description(Translate English to Simplified Chinese)] public static async Taskstring TranslationEnZh( [Description(The source english text)] string sourceText, IChatClient chatClient, CancellationToken cancellationToken) { var response await chatClient.GetResponseAsync( $Translate the following English to Simplified Chinese, output only the translation:\n{sourceText}, cancellationToken: cancellationToken); return response.Text; } }Name决定客户端看到的工具名Description决定模型判断「该不该调这个工具」。参数上的[Description]会出现在客户端的参数说明里写清楚能显著降低模型传错参的概率。4. 验证请求用 curl 跑通 Tool 列表与调用4.1 启动服务dotnet run默认监听http://localhost:5000或控制台打印的端口。SSE 端点是http://localhost:5000/sse。4.2 用 curl 建立 SSE 连接MCP 的 SSE 传输是「先连/sse拿到一个消息端点再往那个端点 POST JSON-RPC」。先开一个终端保持连接curl -N http://localhost:5000/sse你会看到类似输出其中endpoint事件给出了后续 POST 的地址event: endpoint data: /message?sessionIdxxxx4.3 列出 Tool另开一个终端把上一步的sessionId填进去发tools/listcurl -X POST http://localhost:5000/message?sessionIdxxxx \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}返回里应该能看到echo和translation两个工具以及各自的inputSchema。如果这里为空八成是WithToolsFromAssembly()没扫到你的 Tool 类。4.4 调用 Tool调用echocurl -X POST http://localhost:5000/message?sessionIdxxxx \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:2,method:tools/call,params:{name:echo,arguments:{message:MCP}}}预期返回{jsonrpc:2.0,id:2,result:{content:[{type:text,text:hello MCP}]}}调用translation时服务端会通过注入的IChatClient请求 TaoToken 通道返回中文译文。这一步能跑通说明「MCP Tool → TaoToken → 模型」整条链路是通的。4.5 用官方 Inspector 可视化验证不想手写 curl 的话用官方 Inspector 更直观npx modelcontextprotocol/inspectorTransport 选 SSEURL 填http://localhost:5000/sse点 Connect再点 List Tools就能看到工具列表并填参运行。Cherry Studio 里也是同样填法添加 MCP Server 选 SSEURL 填/sse然后在聊天窗口启用即可。5. 本篇常见错排查5.1 客户端连不上 /sse先确认app.MapMcp()在app.Run()之前调用且没有被路由中间件提前短路。如果项目里自定义了UseRouting确保MapMcp()注册在正确位置。端口对不上也会连不上用dotnet run打印的实际地址为准。5.2 tools/list 返回空数组最常见原因是 Tool 类没加[McpServerToolType]或者方法没加[McpServerTool]。另外WithToolsFromAssembly()默认扫描入口程序集如果 Tool 写在别的类库需要传程序集参数。方法必须是public静态或实例都行。5.3 调用 translation 报鉴权或 404检查appsettings.json里的BaseUrl是否写成https://taotoken.net/api不要多加/v1或漏掉/apiApiKey是否有效。如果报模型不存在核对Model字段与控制台里可用的模型名是否一致。接入细节以接入文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc5.4 参数对不上、模型传错值[Description]写得含糊模型就容易猜错。把参数含义、格式、示例都写进描述里。比如sourceText明确写「英文原文纯文本不要带引号」。工具名也别用tool1这种用translation、query_order这类语义化的名字。5.5 SSE 连接频繁断开SSE 是长连接反向代理或本地防火墙可能超时切断。本地联调一般没事部署到网关后面要确认代理没有缓冲 SSE 流、超时时间够长。调试阶段先用curl -N直连排除代理因素。6. 下一步把 Tool 接到真实客户端最小链路跑通后你可以按需扩展给 Tool 加更多业务能力、用IChatClient统一走 TaoToken 通道、在 Cherry Studio 或 Claude 里做端到端对话验证。想直接体验模型对话效果可以从模型对话入口进https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat如果你在做长期编码类 Agent、需要把 MCP Tool 和编码工作流串起来Coding Plan 那条线更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan最后提醒一句Tool 里如果要做文件、数据库、命令执行这类操作务必加白名单和参数校验别把「能执行任意代码」的能力直接暴露给客户端。MCP 的便利性来自标准化风险也来自标准化——客户端一旦连上就能列出并调用你注册的所有工具。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑