ARTICLE DETAIL

资讯详情

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

使用MCP C# SDK开发MCP Server + Client:TaoToken统一Key接入与settings.json配置骨架

使用MCP C# SDK开发MCP Server + Client:TaoToken统一Key接入与settings.json配置骨架 1. 从一次“工具调不通”说起MCP C# SDK 到底解决什么问题如果你最近在 .NET 圈子里折腾 AI 应用大概率听过 MCPModel Context Protocol。简单说它是 Anthropic 开源的一套标准协议让大模型能通过统一的消息格式去调用外部工具、读数据、执行操作。你可以把它理解成 AI 世界的 USB-C以前每接一个数据源都要写一套胶水代码现在只要双方都遵守 MCP插上就能用。但真正动手时很多人会卡在同一个地方Server 用 MCP C# SDK 写好了Client 也跑起来了可一到“让模型自己决定调哪个工具”这一步就报错——要么是 Key 没配好要么是 settings.json 结构写错要么是 Client 根本没把 MCP 工具列表传给模型。这篇就聚焦这条完整链路用 MCP C# SDK 搭一个 Server再写一个 ClientClient 侧通过 TaoToken 统一 Key 接入模型服务最后跑一次端到端请求确认通道连通、工具调用返回正常。适合谁看有 .NET 8 基础、想快速把 MCP 跑通的开发者已经在写 Server 但 Client 接模型时卡住的同学以及想用一套 Key 同时管多个模型通道、不想在每个项目里重复配 Key 的人。下面所有配置和代码都可以直接复制改路径使用。2. 前置准备TaoToken 统一 Key 与项目骨架在写代码之前先把“模型通道”这件事解决掉。MCP Client 本身只负责和 Server 通信真正决定用哪个模型、走哪条 API 通道的是 Client 里的 ChatClient 配置。TaoToken 在这里的角色就是统一入口你拿一个 Key就能在 Client 侧接入模型服务不用为每个模型单独维护一套鉴权逻辑。第一步去 TaoToken 控制台创建一个 API Key。地址是 https://taotoken.net/api-keys 登录后新建 Key复制保存。这个 Key 后面会写进 settings.json不要硬编码在 C# 里。第二步确认你要用的模型 ID 和接入端点。TaoToken 的 API 基地址是 https://taotoken.net/api 模型对话相关文档在 https://taotoken.net/doc 。如果你打算长期做编码类 Agent可以顺便了解 Coding Planhttps://taotoken.net/coding-plan 。第三步建两个 .NET 8 控制台项目命名随意我这里用McpServerDemoMCP Server标准 IO 传输McpClientDemoMCP Client负责调 Server 并接模型两个项目都通过 NuGet 安装ModelContextProtocol预览版。Server 端只需要这一个包Client 端除了它还要装Microsoft.Extensions.AI和Microsoft.Extensions.AI.OpenAI用来构建带工具调用能力的 ChatClient。注意MCP C# SDK 目前是预览版包版本会更新安装时以 NuGet 上最新预览版为准。如果 API 有微调优先看官方 Samples 对应版本。3. 可复制配置settings.json 骨架与 Server 工具注册先解决配置。Client 项目根目录新建settings.json把模型通道和 MCP Server 启动信息都放进去。下面这个骨架可以直接用把ApiKey、ModelId换成你自己的{ LLM: { ApiKey: sk-你的TaoTokenKey, EndPoint: https://taotoken.net/api, ModelId: 你的模型ID }, McpServer: { Id: time, Name: Time MCP Server, TransportType: StdIo, Command: ..\\..\\..\\..\\McpServerDemo\\bin\\Debug\\net8.0\\McpServerDemo.exe } }这里EndPoint指向 TaoToken 的 API 地址ApiKey就是刚才创建的 Key。McpServer.Command是 Server 编译后的 exe 路径相对路径根据你实际目录结构调整。把配置抽出来好处是换模型、换 Server 路径都不用改代码。接着写 Server。新建TimeTool.csusing ModelContextProtocol.Server; using System.ComponentModel; namespace McpServerDemo; [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}.; }[McpServerToolType]标记这个类包含工具[McpServerTool]标记具体方法Description会作为工具描述传给模型模型靠它判断什么时候该调这个工具。Server 的Program.csusing Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; 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; }WithToolsFromAssembly()会自动扫描当前程序集里所有带McpServerTool标签的方法并注册不用手动一个个加。编译 Server 项目确认 exe 生成路径和 settings.json 里对上。4. Client 调用示例与端到端验证Client 的Program.cs分三块读配置、建 MCP Client、建带工具调用的 ChatClient。using Microsoft.Extensions.Configuration; using Microsoft.Extensions.AI; using ModelContextProtocol.Client; using OpenAI; var config new ConfigurationBuilder() .AddJsonFile(settings.json) .Build(); // 1. 建立 MCP Client连接 Server await using var mcpClient await McpClientFactory.CreateAsync(new() { Id config[McpServer:Id], Name config[McpServer:Name], TransportType TransportTypes.StdIo, TransportOptions new() { [command] config[McpServer:Command] } }); // 2. 列出 Server 提供的工具 var mcpTools await mcpClient.ListToolsAsync(); foreach (var tool in mcpTools) { Console.WriteLine($Tool: {tool.Name} ({tool.Description})); } // 3. 用 TaoToken 通道构建 ChatClient并注入 MCP 工具 var aiClient new OpenAIClient( new ApiKeyCredential(config[LLM:ApiKey]), new OpenAIClientOptions { Endpoint new Uri(config[LLM:EndPoint]) }) .AsChatClient(config[LLM:ModelId]); var chatClient new ChatClientBuilder(aiClient) .UseFunctionInvocation() .Build(); var chatOptions new ChatOptions { Tools [.. mcpTools] }; var chatHistory new ListChatMessage { new(ChatRole.System, You are a helpful assistant. Use tools when needed.) }; while (true) { Console.Write(User ); var question Console.ReadLine(); if (string.IsNullOrWhiteSpace(question) || question.ToUpper() EXIT) break; chatHistory.Add(new ChatMessage(ChatRole.User, question)); var response await chatClient.GetResponseAsync(chatHistory, chatOptions); Console.WriteLine($Assistant {response}); chatHistory.Add(new ChatMessage(ChatRole.Assistant, response.ToString())); }关键点有三个。第一McpClientFactory.CreateAsync用 StdIo 传输command指向 Server exe。第二ListToolsAsync()拿到的工具列表直接塞进ChatOptions.Tools这样模型才知道有哪些工具可用。第三UseFunctionInvocation()负责在模型返回工具调用请求时自动执行并回传结果少了它模型只会“说”要调工具不会真的调。运行 Client输入一句“What time is it in Chengdu?”正常流程是Client 把问题和工具列表发给模型模型决定调用GetCurrentTimeUseFunctionInvocation拦截这个请求、通过 MCP 调 Server、拿到时间字符串、再回给模型最后输出类似 “It is 14:32 in Chengdu.”。看到这个结果说明 TaoToken 通道连通、MCP 工具调用链路完整。5. 本篇常见错排查报错一McpClientFactory连接失败提示找不到 command。九成是 settings.json 里Command路径不对。先用绝对路径测一次确认 Server exe 存在再换相对路径。注意反斜杠在 JSON 里要转义成\\。报错二模型返回“我没有获取时间的能力”。说明工具列表没传进去。检查chatOptions.Tools是否真的赋了mcpTools以及ListToolsAsync()是否返回了非空集合。如果 Server 没编译或工具类没加[McpServerToolType]这里会是空的。报错三401 或鉴权失败。检查LLM:ApiKey是否是 TaoToken 控制台创建的 KeyEndPoint是否是https://taotoken.net/api。Key 前后不要有空格settings.json 里不要用中文引号。报错四模型一直重复调同一个工具。通常是工具描述太模糊或者 System Prompt 没约束。把Description写具体比如“Get the current time for a city, input is city name”并在 System Prompt 里说明“只在需要当前时间时调用工具”。报错五Client 卡住不返回。检查 Server 是否已经在运行StdIo 模式下 Client 会启动 Server 进程如果 exe 路径错或 Server 启动即崩Client 会一直等。可以先把 Server 单独跑一次确认控制台输出 “Starting MCP Server...” 不报错。6. 把 Key 和工具链固定下来后面就顺了这套结构跑通之后你会发现真正花时间的不是写工具而是配置对齐。我的做法是把 settings.json 纳入项目模板新项目直接复制只改ModelId和 Server 路径。TaoToken 的 Key 放在环境变量或用户机密里settings.json 里留占位符避免提交到仓库。如果你后面要接更多工具Server 侧继续加带[McpServerTool]的方法就行Client 侧完全不用改ListToolsAsync()会自动发现新工具。模型通道要换也只动 settings.json 里的ModelId。需要看模型对话效果可以去 https://taotoken.net/model-chat 接入细节查 https://taotoken.net/doc Key 管理在 https://taotoken.net/api-keys 长期编码 Agent 场景可以看 https://taotoken.net/coding-plan 。把这条链路固定成模板下次再写 MCP 应用基本就是填配置的事了。
返回列表