ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C#实现SSE通信方式的MCP Server:把endpoint改到TaoToken的完整配置与验证

C#实现SSE通信方式的MCP Server:把endpoint改到TaoToken的完整配置与验证 1. 为什么 C# 开发者需要自己搭一个 SSE 版 MCP Server如果你最近在折腾 AI Agent 或者智能助手大概率听过 MCPModel Context Protocol这个词。简单说它是一套让大模型能调用外部工具的协议标准——模型不再只是聊天而是能真正去查数据库、读文件、调接口。MCP Server 就是那个工具箱把你能提供的能力暴露给模型。MCP Server 的通信方式主要有两种SSEServer-Sent Events服务端推送事件和 Stdio标准输入输出。SSE 走的是 HTTP 长连接适合部署成独立服务、被多个客户端远程调用Stdio 则是本地进程间通信适合嵌在编辑器里跑。这篇聚焦 SSE 方式因为它是把 MCP Server 做成可远程访问服务的主流选择。那为什么标题里要提把 endpoint 改到 TaoToken因为很多 C# 开发者在本地把 MCP Server 跑起来之后卡在了下一步客户端连哪个模型通道、Key 怎么统一管理、Base URL 填什么。TaoToken 提供了一套统一的 API 通道和 Key 管理你只要把 MCP Client 侧的 endpoint 指过去就能让整条链路跑通。这篇就带你从零用 C# 写一个 SSE 版 MCP Server再把 endpoint 配置到 TaoToken 通道最后做一次真实的工具调用验证。适合谁看有 C#/.NET 基础、想给自己的 AI 应用接上自定义工具的开发者已经会用现成 MCP Server 但想自己写一个的以及被 endpoint 配置和 Key 管理绕晕的人。全程可跟做代码能直接复制。2. TaoToken 通道准备Key、Base URL 与模型 ID 三件套在写代码之前先把通道侧的东西准备好。MCP Server 本身只负责暴露工具真正跟模型对话的是 MCP Client而 Client 需要知道往哪个 API 地址发请求、用哪个 Key、调哪个模型。这三样就是所谓的三件套。先注册并登录 TaoToken 控制台地址是 https://taotoken.net/console 。进去之后在 API Keys 页面创建一个新的 Key复制下来保存好——这个 Key 只会完整显示一次丢了就得重建。Key 的格式通常是一串以特定前缀开头的字符串别把它硬编码进代码提交到 Git用环境变量或者配置文件管理。接着确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api 注意这里不带任何查询参数就是干净的根路径。很多客户端要求填到/v1这一级具体看你用的 SDK但根地址就是上面这个。最后是 Model ID。在控制台的模型列表里能看到当前可用的模型标识比如常见的对话模型、代码模型各有各的 ID。你要把这个 ID 填到 MCP Client 的配置里模型才知道自己该用哪个大脑。把这三样整理成一张表后面配置时直接对照配置项值说明Base URLhttps://taotoken.net/apiAPI 根地址不带 UTMAPI Key控制台创建只显示一次妥善保存Model ID控制台模型列表按需选择对话/代码模型注意Base URL 和官网地址不是一回事。官网是 https://taotoken.net/ 带推广参数API 调用只认 https://taotoken.net/api 。填错会导致 404 或连接失败。如果你打算长期跑编码类 Agent可以了解下 Coding Plan它针对高频编码场景做了额度优化只是临时验证模型连通性的话用模型对话页面手动测一下也行。但不管哪种Key 和 Base URL 都是同一套。3. 可复制配置appsettings.json 与 SSE 事件流代码现在进入正题。先创建一个 ASP.NET Core Web API 项目目标框架选 .NET 8 或更高。项目建好后通过 NuGet 添加依赖库ModelContextProtocol.AspNetCore注意勾选包括预发行版因为目前它还是 preview 版本。3.1 appsettings.json 配置片段把通道三件套写进配置文件方便后续切换环境。在项目根目录的appsettings.json里加上这一段{ TaoToken: { BaseUrl: https://taotoken.net/api, ApiKey: sk-你的Key粘贴在这里, ModelId: 你的模型ID }, McpServer: { SseEndpoint: /sse, ServerName: CSharpSseMcpServer }, Logging: { LogLevel: { Default: Information, Microsoft.AspNetCore: Warning } } }实际生产环境别把 Key 明文放这里用dotnet user-secrets或者环境变量覆盖。本地开发图方便可以先这么写但记得.gitignore里排除掉含真实 Key 的文件。3.2 Program.cs 注册 MCP 服务Program.cs里注册 MCP Server 相关服务并开启 HTTP 传输和自动扫描工具var builder WebApplication.CreateBuilder(args); // 注册 MCP Server 相关服务 builder.Services .AddMcpServer() .WithHttpTransport() // 使用 HTTP 传输的 MCP 请求和会话 .WithToolsFromAssembly(); // 从程序集中扫描添加 tool 工具列表 var app builder.Build(); app.UseHttpsRedirection(); // 注册 MCP 协议终结点默认路径 /sse app.MapMcp(); app.Run();WithHttpTransport()就是开启 SSE 长连接的关键WithToolsFromAssembly()会自动扫描当前程序集里所有带[McpServerToolType]标记的类。3.3 SSE 工具类 DemoTool新建一个DemoTool.cs写一个返回服务器时间的工具。这里几个特性标记是重点缺一个模型就识别不到using ModelContextProtocol.Server; using System.ComponentModel; namespace MCPServer.SSE { // 标记此类为 MCP 服务器工具类型 [McpServerToolType] public static class DemoTool { /// summary /// 服务器工具方法用于获取当前服务器时间。 /// /summary /// param nameformat时间格式字符串默认 yyyy-MM-dd HH:mm:ss/param [McpServerTool, Description(获取服务器时间)] public static string ServerTime( [Description(格式)] string format yyyy-MM-dd HH:mm:ss) { return DateTime.Now.ToString(format); } } }[McpServerToolType]告诉框架这个类是工具容器[McpServerTool]标记具体方法[Description]则是给模型看的说明——模型靠这些描述决定什么时候调用哪个工具。描述写得越清楚模型调用越准。3.4 启动并确认 SSE 地址dotnet run启动项目控制台会打印监听地址比如https://localhost:7130。SSE 的默认终结点就是在这个地址后面加/sse也就是https://localhost:7130/sse。这个地址就是待会儿要填到 MCP Client 里的 endpoint。4. 验证请求一次工具调用的连通性实测Server 跑起来了现在验证它能不能被真正调用。用上一节的 MCP Client 示例把 Client 侧的 endpoint 改成我们自己的地址同时把模型通道指向 TaoToken。4.1 Client 侧配置Client 的配置文件里通常有这几项对照填{ McpServer: { Endpoint: https://localhost:7130/sse }, Llm: { BaseUrl: https://taotoken.net/api, ApiKey: sk-你的Key, ModelId: 你的模型ID } }Endpoint 指向本地 SSE 服务BaseUrl 指向 TaoToken 通道。这样模型请求走 TaoToken工具调用走本地 MCP Server两条链路各司其职。4.2 发起一次调用运行 Client它会先连接 SSE 端点拉取工具列表。控制台应该打印出类似ServerTime的工具名和描述。然后给模型发一句用 yyyy年MM月dd日 的格式告诉我服务器时间。模型会判断需要调用ServerTime工具把format参数填成yyyy年MM月dd日通过 SSE 通道把请求发给 MCP Server。Server 执行后返回格式化时间模型再把结果组织成自然语言回复。4.3 成功结果长什么样一次成功的链路你会看到三段日志Client 连上 SSE 并收到工具列表模型返回一个 tool_call参数是{format:yyyy年MM月dd日}Server 返回2025年XX月XX日这样的字符串模型最终输出当前服务器时间是 2025年XX月XX日。如果工具列表为空说明WithToolsFromAssembly()没扫到类检查DemoTool的命名空间是否和Program.cs在同一程序集、特性标记是否写全。如果模型不调用工具多半是[Description]写得太模糊模型不知道这工具干嘛用的。5. 常见报错排查401、local proxy failed 与 OAuth配置过程中最容易踩的坑集中在几个报错上逐个说清楚。401 Unauthorized这个几乎都是 Key 的问题。要么 Key 没填、填错要么 Key 前后带了空格或换行。检查appsettings.json里ApiKey的值确认没有多余字符。还有一种情况是 Key 被禁用或额度耗尽去控制台 API Keys 页面看状态。local proxy failed / connection refused这个报错通常出现在 Client 连不上 MCP Server 的时候。先确认 Server 是不是真的在跑dotnet run的窗口有没有报异常。再确认 endpoint 地址的端口和协议http 还是 https跟实际监听一致。本地自签证书还会导致 SSL 校验失败开发阶段可以在 Client 侧临时跳过证书校验但生产环境必须配好证书。reading choices 相关报错这类错误一般出在模型响应解析阶段说明请求发出去了但返回格式不对。常见原因是 BaseUrl 填成了官网地址而不是 API 地址或者 ModelId 填了一个不存在的模型。回到第 2 节的三件套对照表逐项核对。OAuth 相关报错如果你用的客户端要求 OAuth 流程而 TaoToken 通道用的是 API Key 鉴权两者会冲突。解决办法是在客户端配置里明确选择 API Key 模式别走 OAuth。具体选项名各客户端不同一般在认证方式那一栏切换。工具调用返回空模型调了工具但没拿到结果检查 SSE 连接是否在调用过程中断开。SSE 是长连接网络抖动或超时都会断Client 侧最好加自动重连逻辑。排查顺序建议先看 Key 和 BaseUrl鉴权层再看 endpoint 和端口连接层最后看工具描述和参数语义层。大部分问题在前两层就能定位。6. 把通道固定下来长期编码场景的配置建议验证跑通之后如果你打算把这个 MCP Server 长期用于编码或 Agent 场景有几个实践建议。第一把 Key 从配置文件挪到环境变量。appsettings.json里只留占位符真实 Key 通过TAOTOKEN_API_KEY这类环境变量注入避免误提交。第二SSE 端点加上健康检查。在Program.cs里加一个/health路由返回 200 就行方便容器编排或监控探活。第三工具描述当成给模型的文档来写。[Description]不是注释是模型决策的依据。参数含义、取值范围、返回格式都写清楚模型调用准确率会明显提升。第四如果编码任务量大、调用频繁可以看看 Coding Plan 的额度方案比按次计费更划算。只是偶尔验证模型连通性的话模型对话页面手动测一下就够了。第五接入文档里对 SSE 事件格式、鉴权头、错误码有更细的说明遇到协议层问题去那里查最快。API Keys 页面则用来管理多个 Key、查看用量。整套流程走下来核心就三件事Server 侧用WithHttpTransport()开 SSE、用特性标记暴露工具Client 侧把 endpoint 指向本地 SSE、把 BaseUrl 指向 TaoToken 通道验证时盯住工具列表和一次完整调用。把这三步做扎实后面加更多工具、换更多模型都是顺水推舟的事。
返回列表