资讯动态

MCP C# SDK 的 Echo 服务器教程:用 TaoToken 接入的 Codex 照着搭

发布时间:2026/9/16 8:50:35 来源:尧图企业网站定制
微软与 Anthropic 合作推出的官方 C# SDKNuGet 包名ModelContextProtocol给 MCP 生态补上了一块重要拼图。原文用这个 SDK 演示了一个非常直观的 Echo MCP 服务器从dotnet add package ModelContextProtocol --prerelease开始替换Program.cs再用npx modelcontextprotocol/inspector dotnet run验证。跟着做的时候依赖注入那一段和WithToolsFromAssembly()的用法是最容易写偏的。这篇文章就让 TaoToken 接入的 Codex 照着原文搭一遍。动手前建议先打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建 API Key再把 Base URL 填成 https://taotoken.net/api 配进 Codex。1. 先把 C# SDK 的依赖注入看明白1.1 MCP 里的 Host、Client、Server 各司其职MCP 协议里AI 应用程序叫 Host它通过 MCP Client 与 MCP Server 通信。协议上一开始会交换InitializeRequest做握手然后客户端发出ListToolsRequest拿服务器暴露的工具列表真正调用时发CallToolRequest。Echo 服务器做的事情非常纯粹客户端传一个message参数服务端原样接收并拼上hello前缀返回。官方 C# SDK 把这些协议细节封装在McpServer服务里开发者只需要关心两件事一是怎么把服务器托管起来二是用哪个类、哪个方法对外暴露工具。原文的 Echo 示例就是用Host.CreateApplicationBuilder创建 .NET 宿主再通过依赖注入容器注册 MCP 服务。1.2 AddMcpServer() 三件套的顺序不能乱原文Program.cs的核心是这一串链式调用builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly();这里每一步都有明确含义AddMcpServer()往依赖注入容器里注册 MCP Server 核心服务WithStdioServerTransport()让服务器通过标准输入输出与客户端通信这是本地命令行工具的默认传输方式WithToolsFromAssembly()扫描当前程序集把所有标记了[McpServerToolType]的静态类里的[McpServerTool]方法自动注册成 MCP 工具。写偏的典型情况是只调用了AddMcpServer()却忘了挂载传输层或者把WithToolsFromAssembly()写成了不存在的WithToolsFromTypeT()。理解这一串调用的职责之后后面让 Codex 生成代码时你也能看出它有没有跑题。2. 给 Codex 指一条统一切换的 API 通道2.1 去 TaoToken 拿 Key如果你是被官方额度、多把 Key 切换、模型不一致这些事卡住的人建议先把模型接入收敛到一个统一入口。TaoToken 的作用是提供一套统一 API 兼容通道在你常用的 AI 编程工具里只改一个 Base URL就能在多个模型之间切换不用反复换 Key、改配置。在动手搭 Echo 服务器之前先打开 TaoToken 注册账号进入控制台创建一个 API Key。这个 Key 就是你后续填进 Codex 的身份凭证。官网地址再确认一次https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 。注意区分注册、建 Key、看模型列表都在这上面完成而真正填进 Codex 的接口地址是另一个见下一节。2.2 Codex 的 config.toml 改成 TaoTokenCodex 的配置目录在用户主目录下的.codex文件名为config.toml。我们需要在里面声明一个自定义模型供应商指向 TaoToken 的兼容接口。这里要特别留神接口 Base URL 是https://taotoken.net/api末尾没有/v1也不要加任何跟踪参数。先创建配置文件mkdir -p ~/.codex touch ~/.codex/config.toml然后写入如下内容model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat其中YOUR_MODEL_ID不要拍脑袋写要打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 的模型广场选一个支持函数调用/工具调用的模型 ID 复制进来。不同时期模型广场上架的模型会有变动以当时列表为准。接着把 API Key 放进环境变量export TAOTOKEN_API_KEYYOUR_API_KEYYOUR_API_KEY换成你在 TaoToken 控制台创建的那串字符串。这样配置之后Codex 发出的请求就会统一走https://taotoken.net/api你可以在后续对话里让 Codex 专心写 C# 代码不再纠结额度和 Key 的问题。如果希望配置永久生效把export那一行追加到~/.bashrc或~/.zshrc末尾。3. 让 Codex 照着原文生成 Echo 服务器3.1 新建控制台项目并安装 NuGet 包Echo 服务器本身是一个 .NET 控制台应用。你可以自己先建项目也可以让 Codex 帮你把整个骨架拉起来。建议先本地建好目录再让 Codex 往里面填充内容dotnet new console -o EchoServer cd EchoServer原文章节明确要求添加两个 NuGet 包Microsoft.Extensions.Hosting提供宿主环境ModelContextProtocol是 MCP 的官方 C# SDK。因为 SDK 还处于预览阶段第二个包必须带--prerelease参数dotnet add package Microsoft.Extensions.Hosting dotnet add package ModelContextProtocol --prerelease如果编译时提示版本冲突检查一下.NET SDK 版本建议 .NET 8 或更高。这里的安装工作要在本地终端执行Codex 的角色是帮你生成命令、解释报错而不是替你在生产环境乱动东西。3.2 Program.cs 里被忽略的细节包装好之后把Program.cs替换成 Echo 服务器代码。为了让 Codex 生成时更贴近原文你可以把这段代码作为参考资料发给它让它逐行解释并保持可编译using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using ModelContextProtocol.Server; using System.ComponentModel; var builder Host.CreateApplicationBuilder(args); // MCP over stdio日志全走 stderr避免污染 stdout 协议通道 builder.Logging.AddConsole(consoleLogOptions { consoleLogOptions.LogToStandardErrorThreshold LogLevel.Trace; }); // 依赖注入三件套注册核心服务、挂 stdio 传输、扫描当前程序集 builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly(); await builder.Build().RunAsync(); [McpServerToolType] public static class EchoTool { [McpServerTool, Description(Echoes the message back to the client.)] public static string Echo(string message) $hello {message}; }这里最容易忽略的是builder.Logging.AddConsole()里的LogToStandardErrorThreshold。MCP 走 stdio 协议时stdout 是用来传协议消息的如果日志也打到 stdout客户端解析会直接乱掉。官方把阈值设置成LogLevel.Trace意思是所有日志级别都进 stderr确保 stdout 干干净净。3.3 让 Codex 生成而不是手抄如果你想让 Codex 帮你从零生成这个项目可以用一段明确的任务描述请帮我按 MCP C# SDK 的官方 Echo 示例在 EchoServer 目录里生成一个可编译的 .NET 控制台项目。 要求使用 Host.CreateApplicationBuilder 做宿主日志输出到 stderr 用 AddMcpServer().WithStdioServerTransport().WithToolsFromAssembly() 注册服务 并且提供一个标记了 [McpServerToolType] 的 EchoTool 类Echo 方法接收 message 参数并返回 hello {message}。Codex 拿到这个任务后会基于它训练过的 SDK 知识生成Program.cs和.csproj。因为我们在第 2 节已经把 Codex 接到了 TaoToken 的通道上所以这一步骤里你不需要临时换模型或换 KeyCodex 会持续用同一套配置连续输出。生成完代码后你在本地执行dotnet build把报错贴回对话Codex 会继续修。4. 用 MCP Inspector 把工具跑出来4.1 npx 启动 InspectorMCP Inspector 是官方提供的可视化测试工具它是 Node 应用不需要单独安装用 npx 直接跑。关键点是 Inspector 后面要跟一条启动服务器的命令这里是dotnet runnpx modelcontextprotocol/inspector dotnet run首次执行时 npx 会提示是否安装modelcontextprotocol/inspector输入y回车即可。等待片刻终端会输出类似这样的信息MCP Inspector is up and running at http://localhost:5173这几行输出表示 Inspector 已经启动并且后台正在用dotnet run拉起你的服务器。浏览器打开http://localhost:5173就能看到 Inspector 界面。4.2 Connect 后依次点 List Tools 和 Run Tool在 Inspector 页面点击Connect按钮它会向本地运行的 Echo 服务器发送初始化请求。连接成功后点击List Tools正常情况下只能看到一个工具Echo。再点Echo工具右侧会展示参数输入框参数名是message。在输入框里填上world点击Run Tool返回结果应该是{ content: [ { type: text, text: hello world } ] }这说明从客户端发起ListToolsRequest到CallToolRequest的整条链路是通的。如果点击 Connect 后一直转圈先看终端里dotnet run有没有报错再把报错内容复制给 Codex请它对照Program.cs排查。4.3 本地执行与 AI 生成的分工有一点要分清楚Codex 是帮你生成代码、解释协议、诊断报错的它不会替你直接连生产库或者在你机器上执行业务操作。dotnet run、npx这些命令都在本地终端由你执行编译错误、运行日志也是你在本地收集后贴回给 Codex。Echo 服务器整个运行在 localhost 上不涉及任何外部数据源所以安全边界很清晰。5. 跟着原文最容易写偏的三个地方5.1 WithToolsFromAssembly 扫了个寂寞WithToolsFromAssembly()的设计意图是免去手动注册每个工具的麻烦。它默认扫描的是当前程序集也就是包含Program.cs编译产物的那个程序集。如果你把EchoTool放进了另一个类库项目而Program.cs所在项目没有引用它扫描结果就是零工具。Inspector 里 List Tools 返回空列表时先查工具类有没有打[McpServerToolType]再查它和入口项目是否在同一个程序集。跨程序集场景要用WithToolsFromAssembly(typeof(EchoTool).Assembly)明确告诉 SDK 去哪个程序集找。5.2 日志把 stdout 弄脏如果你把AddConsole那一段注释掉或者把LogToStandardErrorThreshold改成只让 Error 级别进 stderrConsole 默认的信息日志就会写到 stdout。MCP 的 stdio 传输层要求 stdout 只承载协议帧任何额外字符都会让 Inspector 解析错乱现象是 Connect 失败、工具列表加载不出来。对照原文的写法日志全部进 stderr 是关键前提不是锦上添花。5.3 预览期 API 变了ModelContextProtocol目前还是预发布版本原文也明确提醒 API 可能变化。比如某次升级后WithToolsFromAssembly()的命名空间或者McpServerToolType特性名有调整编译失败很正常。遇到这种问题优先去官方 SDK 仓库的 README 找 Getting Started (Server) 章节把最新的示例代码和你的写法对比也可以把错误信息贴给 Codex让它根据当前版本修正调用方式。版本演进导致的报错不等于你的思路错了先看 SDK 变更说明再动手改。6. 跑通之后去控制台对一下这次调用Echo 服务器在 Inspector 里跑通后建议回到 TaoToken 控制台查看一下调用记录。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 进入用量页面看刚才 Codex 生成代码和 Inspector 验证那几步是否按预期记上了账。这一步能帮你确认 Key、Base URL、模型 ID 全链路都没配歪。想先快速验证同一把 Key 的对话效果可以打开 TaoToken 模型对话发一条测试消息再回到 Codex 里继续调 C# 代码。如果你计划长期让 Codex 帮你写这类 MCP 服务器建议看一眼 Coding Plan 的用量包是否够日常折腾。创建新的 Key 在 控制台 API Keys 页面随时可以生成多把分开管理。若你也用 Claude Code 做 C# 代码审查可以参考 Claude Code 接入文档 把环境变量一次性配好。遇到 SDK 本身的问题记得去 GitHub 仓库提 issue把 Inspector 的报错和Program.cs贴全维护者回复会更快。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价