首页/新闻资讯/正文详情

用 dnx + nuget 分发 MCP 服务:TaoToken 统一 Key 接入 .NET 10 工具链

发布时间:2026/9/23 10:17:11 来源:云帆数科 栏目:资讯中心
用 dnx + nuget 分发 MCP 服务:TaoToken 统一 Key 接入 .NET 10 工具链
1. 为什么 .NET 10 的 dnx nuget 值得你重新看一遍 MCP 分发如果你最近在折腾 MCPModel Context Protocol服务大概率遇到过这种尴尬本地写好的 C# MCP 工具想分享给同事用对方得先 clone 仓库、装 SDK、dotnet run环境变量还得手动配一遍。Python 那边一句uvx就搞定的事.NET 这边过去确实没有对等体验。.NET 10 把这块补上了。核心变化有两个一是 NuGet.org 开始支持McpServer包类型MCP 服务可以像普通类库一样被搜索、托管、版本化二是dnx这个工具执行器登场它相当于 .NET 世界的npx/uvx能直接从 NuGet 拉包并运行不需要你预先全局安装。两者一组合MCP 服务的分发链路就变成了dotnet pack→ 推 NuGet → 用户dnx 包名版本直接跑。但分发只是前半段。真正让 AI 工具VS Code Copilot、Cherry Studio、Claude Code 这类客户端稳定调用你的 MCP 服务还需要一个统一的模型接入通道——否则每个工具都要单独配 Key、单独管额度维护成本会迅速失控。这篇就按「打包分发 → dnx 运行 → TaoToken 统一 Key 接入」这条完整链路走一遍给你可直接复制的config.toml、settings.json骨架和验证命令。适合已经会写 C#、但还没把 MCP 服务真正分发出去的 .NET 开发者。2. 前置准备TaoToken 统一 Key 与 .NET 10 环境先说清楚 TaoToken 在这条链路里的位置。它不替代你的 MCP 服务也不碰你的编辑器它解决的是「AI 客户端怎么统一拿到模型能力」这件事。你的 MCP 服务负责暴露工具比如查天气、算随机数TaoToken 负责让调用这些工具的 AI 客户端有一个统一的 API 通道和 Key 管理入口。两者是上下游关系。你需要准备的东西不多.NET 10 SDK预览版即可dotnet --version能看到 10.x一个 NuGet.org 账号用于发布包一个 TaoToken 的 API Key拿 Key 的路径很直接打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 进控制台创建 API Key。如果你后面要长期跑编码类 Agent可以顺带看下 Coding Plan 页面按量或包月自己权衡。API 端点统一是 https://taotoken.net/api 配置时填这个就行不要自己拼路径。注意TaoToken 的 Key 只用于模型调用通道不要把它写进你要发布的 NuGet 包里。MCP 服务包应该是「无状态、无密钥」的密钥由客户端侧注入。环境变量建议这样设后面server.json和客户端配置都会引用到# Linux / macOS export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api # Windows PowerShell $env:TAOTOKEN_API_KEYsk-你的key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api3. 可复制配置从 mcpserver 模板到 server.json 骨架3.1 安装模板并创建项目.NET 10 SDK 自带 AI 模板包一条命令装好dotnet new install Microsoft.Extensions.AI.Templates装完你会看到mcpserver这个短名称。创建项目dotnet new mcpserver -n SampleMcpServer cd SampleMcpServer生成的结构里有三个关键文件Program.cs入口配置传输和工具注册、Tools/RandomNumberTools.cs示例工具、.mcp/server.json服务元数据声明。Program.cs里的注册链长这样builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsRandomNumberTools(); await builder.Build().RunAsync();WithStdioServerTransport()表示用标准输入输出通信这是本地 MCP 工具最省事的传输方式不需要开端口。3.2 写一个带环境变量的自定义工具在Tools/下新建WeatherTools.cs演示怎么读环境变量using System.ComponentModel; using ModelContextProtocol.Server; namespace SampleMcpServer.Tools; [McpServerToolType] public class WeatherTools { [McpServerTool] [Description(Describes random weather in the provided city.)] public string GetCityWeather( [Description(Name of the city to return weather for)] string city) { var weather Environment.GetEnvironmentVariable(WEATHER_CHOICES); if (string.IsNullOrWhiteSpace(weather)) weather balmy,rainy,stormy; var choices weather.Split(,); var idx Random.Shared.Next(0, choices.Length); return $The weather in {city} is {choices[idx]}.; } }然后在Program.cs里补上.WithToolsWeatherTools()。[Description]不是装饰它是给 LLM 看的调用说明写清楚能显著降低模型乱调参数的概率。3.3 配置 .csproj 与 server.json打开.csproj确保包含这几项PropertyGroup PackAsTooltrue/PackAsTool PackageTypeMcpServer/PackageType PackageIdyourname.SampleMcpServer/PackageId PackageVersion0.2.0/PackageVersion /PropertyGroupPackageType设为McpServer后NuGet.org 会把它归到 MCP 服务分类包页面还会自动生成配置说明。接着改.mcp/server.json让name和version跟包信息对齐{ description: 一个带天气和随机数工具的示例 MCP 服务, name: io.github.yourname/SampleMcpServer, packages: [ { registry_name: nuget, name: yourname.SampleMcpServer, version: 0.2.0, package_arguments: [], environment_variables: [ { name: WEATHER_CHOICES, description: 以逗号分隔的天气描述列表, is_required: true, is_secret: false } ] } ], repository: { url: https://github.com/yourname/SampleMcpServer, source: github }, version_detail: { version: 0.2.0 } }这个文件的作用是让客户端在首次使用时知道要配哪些环境变量减少手动沟通。3.4 打包与发布dotnet pack -c Release产物在bin/Release/下的.nupkg。推到 NuGet.org 用官方 CLIdotnet nuget push bin/Release/yourname.SampleMcpServer.0.2.0.nupkg \ --api-key 你的NuGetKey \ --source https://api.nuget.org/v3/index.json推完等几分钟索引刷新就能用 dnx 直接跑了。4. 验证请求dnx 运行 TaoToken 通道接入4.1 用 dnx 本地验证包发布后最直接的验证方式dnx yourname.SampleMcpServer0.2.0 --yes--yes表示跳过交互确认。如果服务正常进程会挂起等待 stdio 输入——这说明 MCP 服务已经能被 dnx 拉起。这一步跑通分发链路就成立了。4.2 客户端 settings.json 骨架以 VS Code 为例在项目下建.vscode/mcp.json{ servers: { SampleMcpServer: { type: stdio, command: dnx, args: [yourname.SampleMcpServer0.2.0, --yes], env: { WEATHER_CHOICES: sunny,humid,freezing,perfect } } } }如果你用的是支持 TOML 配置的客户端比如某些 CLI Agent对应的config.toml骨架[mcp_servers.SampleMcpServer] command dnx args [yourname.SampleMcpServer0.2.0, --yes] [mcp_servers.SampleMcpServer.env] WEATHER_CHOICES sunny,humid,freezing,perfect TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY sk-你的key注意TAOTOKEN_API_KEY放在客户端侧不放进 NuGet 包。这样你的 MCP 服务保持纯净密钥由使用方自己管。4.3 一次完整调用验证在 VS Code 里打开 Copilot Chat输入「北京今天天气如何」。正常流程是客户端通过 stdio 调用GetCityWeather工具返回随机天气模型把结果组织成自然语言。如果返回类似The weather in 北京 is sunny.说明 dnx 分发 MCP 调用 TaoToken 通道三层都通了。想单独验证 TaoToken 通道可以直接打模型对话接口curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: ping}] }返回正常 JSON 就说明 Key 和端点没问题。模型列表和可用型号可以在模型对话页面确认。5. 本篇常见错排查dnx 找不到包多半是 NuGet 索引还没刷新或者包名大小写写错。等 5 分钟重试或者用dotnet tool install -g yourname.SampleMcpServer先验证包本身能装。server.json 的 name 和包名不一致客户端会按server.json里的name去匹配如果和 NuGet 上的PackageId对不上自动配置会失败。改完记得重新dotnet pack并升版本号。环境变量没生效WEATHER_CHOICES在server.json里标了is_required: true客户端首次使用会提示配置。如果你在mcp.json里写了但工具还是走默认值检查是不是 JSON 层级写错了——env要在 server 对象内部。TaoToken 返回 401Key 没带对或者Authorization头格式错了。确认是Bearer sk-xxx中间一个空格。端点用https://taotoken.net/api不要自己加/v1之外的路径。stdio 传输下日志污染MCP 走 stdio 时任何Console.WriteLine都会干扰协议帧。调试信息请写Console.Error或者用ILogger输出到 stderr。包体积过大PackAsTool会把依赖打进去如果引了重型库包会膨胀。MCP 服务尽量保持轻量重逻辑放服务端。6. 把 Key 和分发链路固定下来走到这里你手上应该有一条能跑通的链路dotnet pack出包 → 推 NuGet → 用户dnx 包名版本直接运行 → 客户端通过 stdio 调用工具 → 模型能力走 TaoToken 统一通道。这套组合的价值在于它把 .NET 的包管理生态和 MCP 的服务分发接上了你不用再为每个 MCP 服务单独写安装脚本。下一步建议做两件事一是把 API Key 的创建和轮换固定成流程进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 管理二是如果你要接多个客户端把接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 过一遍确认各客户端的配置字段差异。长期跑编码 Agent 的话Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 有额度方案按自己的调用量选就行。API Key 管理入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 需要新建或吊销 Key 时从那里进。

相关推荐

健身器材出口欧盟CE认证全解析:EN 20957标准与合规要点
健身器材出口欧盟CE认证全解析:EN 20957标准与合规要点

1. 健身器材出口欧盟的合规门槛去年帮一家国内健身器材厂搞定CE认证时,老板拿着厚达两百多页的EN 20957标准文档问我:"这些条款到底在说什么?我们生产的跑步机到底要改哪些地方?"这场景让我意识到,太多厂商困… · 2026/9/23 10:17:11

调拨单模板优化避坑指南:3个技巧提升10倍效率
调拨单模板优化避坑指南:3个技巧提升10倍效率

调拨单模板优化避坑指南:3个技巧提升10倍效率 官方文档太长抓不住重点,导致很多开发在实现“调拨单模板”功能时,往往陷入重复造轮子的困境。别急,这份 避坑指南 直接给你可落地的代码方案,省掉你翻文档两小时的时间。… · 2026/9/23 10:17:11

Agent Harness 架构真相:Prompt Cache 如何决定 Skill、MCP 与 SubAgent 设计——TaoToken 统一 Key 下的配置骨架与验证
Agent Harness 架构真相:Prompt Cache 如何决定 Skill、MCP 与 SubAgent 设计——TaoToken 统一 Key 下的配置骨架与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 10:17:04

OpenStock 开源库存管理系统实战:从零搭建到生产级优化
OpenStock 开源库存管理系统实战:从零搭建到生产级优化

1. OpenStock 到底是什么,为什么值得你花时间折腾第一次听到 OpenStock 这个名字,很多人会下意识以为它又是一个“开源版某某股票软件”。这个理解只对了一半。OpenStock 本质上是一套面向个人和小团队的开源库存与物资管理系统,核心解决的是… · 2026/9/23 11:04:12

状态模式解析:优化对象行为随状态变化的代码设计
状态模式解析:优化对象行为随状态变化的代码设计

1. 状态模式的核心价值在软件开发中,我们经常会遇到这样的场景:一个对象的行为会随着其内部状态的改变而改变。比如订单系统里的订单状态(待支付、已支付、已发货、已完成等),游戏角色的状态(站立、奔跑、跳… · 2026/9/23 11:04:12

Numba 安装完全指南:conda / pip / 源码构建、CUDA 支持与版本兼容性详解
Numba 安装完全指南:conda / pip / 源码构建、CUDA 支持与版本兼容性详解

Numba 安装完全指南:conda / pip / 源码构建、CUDA 支持与版本兼容性详解 【免费下载链接】numba NumPy aware dynamic Python compiler using LLVM 项目地址: https://gitcode.com/gh_mirrors/nu/numba 本指南以 Numba 官方安装文档(docs/source… · 2026/9/23 11:04:12

Haar级联车牌检测实战:从XML加载到视频流与OCR流水线
Haar级联车牌检测实战:从XML加载到视频流与OCR流水线

简介:这份资源是OpenCV 4.x配套的Haar级联分类器模型包,面向从事车辆监控、交通管理与智能安防方向的开发者与研究人员,用于实现俄罗斯车牌的自动检测与识别。包内共2个文件,包含1个xml格式的预训练分类器文件与1份txt使用说明&am… · 2026/9/23 11:04:12

PaddleSpeech 工业级 ASR 部署实战:基于 SpeechX 的 U2/U2++/Deepspeech2 C++ 推理指南
PaddleSpeech 工业级 ASR 部署实战:基于 SpeechX 的 U2/U2++/Deepspeech2 C++ 推理指南

PaddleSpeech 工业级 ASR 部署实战:基于 SpeechX 的 U2/U2/Deepspeech2 C 推理指南 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend… · 2026/9/23 11:04:12

Claude Code 100个真实案例 - 用AI搭建向量搜索引擎(语义匹配+相似检索)
Claude Code 100个真实案例 - 用AI搭建向量搜索引擎(语义匹配+相似检索)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 11:04:05

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码