1. 从/plugin marketplace add dotnet/skills说起的技能加载链路
在 .NET 项目里让 Claude Code 解释一段IHostedService里DbContext生命周期为什么会炸,它给的答案十有八九绕不开「作用域不匹配」那几句通用话术,但要它顺着AddDbContext的注册顺序、ServiceLifetime和宿主BuildServiceProvider的真实调用栈给出可执行建议,就卡壳了。微软官方把 dotnet/skills 这个项目推出来,本质上是给这类 Agent 补 .NET 领域知识:80 多条 SKILL.md 覆盖 ASP.NET Core、EF Core、C# 语言特性、MSBuild、测试、打包等场景,每一条都是可被 Claude Code 这类工具按需加载的技能文件。
但技能文件本身不产生任何模型能力——真正读 SKILL.md、把里面的上下文拼进推理请求的,还是 Claude Code 背后的模型 API。也就是说:想用 80+ 条技能,得先让 Claude Code 的模型通道能跑起来;如果你打算用统一入口接住这些 Token 消耗,先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 API Key,再把 Claude Code 的模型配置里的 Base URL 改成https://taotoken.net/api,然后按原文的两条/plugin命令把技能装好。顺序错了,会出现「插件装了但模型根本调不动」的假成功。
这篇按 Skill/MCP 的视角,把「先建通道、再装技能、最后验证 SKILL.md 真的被模型读到」这条链路拆开讲一遍。
1.1 为什么这篇不先讲配置、先讲插件
原文章第五部分流程是:在 Claude Code 里执行/plugin marketplace add dotnet/skills,再执行/plugin install,然后就能用 dotnet 领域的技能。这个流程本身没问题,但它默认你 Claude Code 已经能正常对话。实际踩过的顺序是反的:插件注册很快,/plugin命令也返回成功,但紧接着一条.NET相关的提问发出去,模型侧报authentication_error或model not found,你以为是技能没生效,回头查才发现是模型通道压根没接通。
所以本文把顺序倒过来:先把 Claude Code 的模型通道切到 TaoToken,再把 dotnet/skills 挂上去。这样技能一安装,第一次加载 SKILL.md 就走的是你配好的通道,省去两轮排错。
1.2 本文覆盖的四件事
- dotnet/skills 的 80+ 条 SKILL.md 是怎么被 Claude Code 加载的;
- Claude Code 的
~/.claude/settings.json怎么把ANTHROPIC_BASE_URL指到https://taotoken.net/api; - 装完插件后怎么确认技能真的注册上、模型真的被调起;
- 技能列表空、SKILL.md 读不到、401 和
model not found分别怎么排查。
2. dotnet/skills 的 80+ 条技能补的是哪一层
2.1 通用大模型在 .NET 场景的三类典型失手
通用模型不是不会写 C#,而是不知道 .NET 生态里的「默认约定」。第一类失手是生命周期和 DI:你问它AddScoped在BackgroundService里能不能注入,它给的答案经常漏掉「BackgroundService本身是 singleton,构造注入 scoped 服务会抛Cannot consume scoped service from singleton」这条硬规则。第二类失手是 API 版本差异:.NET 6/7/8 在Minimal API、IHostApplicationLifetime、源生成器上的写法差异很大,模型容易混着写。第三类失手是工具链:dotnet publish的--self-contained、PublishTrimmed、AOT 和runtimeconfig.json的关系,通用模型经常一笔带过。
dotnet/skills 把这些领域知识拆成一条条 SKILL.md,每条只负责一个具体任务,模型加载时按需取用,不必把全部内容塞进上下文。这也是 80+ 条技能的价值——不是让模型「背」完 .NET,而是在遇到具体任务时,按需把对应的领域约定喂进去。
2.2 技能粒度决定 Token 消耗
按需加载意味着每装一条技能,未来某个提问就会多触发一次模型请求把 SKILL.md 内容带进上下文,Token 消耗量也因此和「装了多少技能、命中多少次」直接相关。这就是为什么本文强调模型通道:Skill 本身不挑供应商,但调用 Skill 的模型 API 走哪条通道,决定了你能不能统一看到这些消耗、能不能一把 Key 跑多个模型。TaoToken 在这里的定位就是统一 API 入口——模型广场里有哪几个模型、当前可用 ID 是什么,都以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的列表为准,别自己拼gpt-5那种不存在的 ID。
2.3 Skill/MCP 两条路的边界
dotnet/skills 走的是 Skill 路线:给 Claude Code 注入静态知识片段,模型读完之后生成代码或解释。如果你接的是 MCP 服务器(比如某些数据库 MCP),它走的是另一条路——工具调用。无论哪条,最终执行的动作都发生在模型 API 侧,Claude Code 只是承载方。涉及生产库、生产机器的操作,Skill 和 MCP 都只能生成、解释或对照代码/SQL,真正的执行必须由你在本地客户端(比如 SQL*Plus、dotnet run)完成,再把输出贴回对话。这条边界在 .NET 的数据库场景里尤其重要,别让 Agent 直接连生产环境。
3. Claude Code 加载 SKILL.md 的链路,和模型 API 在哪一步被消耗
3.1/plugin marketplace add dotnet/skills做了什么
/plugin是 Claude Code 的插件管理入口。marketplace add这一步只做一件事:把一个远程仓库注册为插件源,让 Claude Code 知道去哪里拉取插件清单。它不下载 SKILL.md,也不调用模型。你可以在插件目录里看到新增加的市场源记录,但此刻对话请求还没碰到任何技能。
这一步本身不需要 TaoToken 参与,但有个前置条件:Claude Code 本身能启动、能连上模型通道,否则/plugin子命令之间的会话可能直接断掉。
3.2/plugin install之后 SKILL.md 何时进上下文
/plugin install才是真正把 dotnet/skills 里的技能文件拉到本地缓存的一步。安装完成后,Claude Code 会维护一份技能索引——你不需要手动把 SKILL.md 全塞进 system prompt,而是由 Claude Code 在会话过程中根据用户提问匹配技能名,把命中的 SKILL.md 内容拼进下一次请求。
这意味着两件事:
- 技能命中是动态的,不是每次都加载全部 80+ 条;命中越多,模型请求越大。
- 每次命中都会经过
ANTHROPIC_BASE_URL指明的那条通道发出。通道没配好,技能匹配得再准,请求也发不出去。
3.3 通道配置在哪一步生效
Claude Code 读模型通道有两个来源:环境变量和~/.claude/settings.json的env字段。环境变量优先级通常更高,但也有版本差异,所以推荐两处保持一致:环境变量临时切换,settings.json做持久化。两个来源里都涉及三个关键字段:ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL。下一节把它们具体写清楚。
4. settings.json 里把 Claude Code 的模型通道指到 TaoToken
4.1 准备一把能用的 Key
打开 TaoToken 控制台 注册账号,在 API Keys 页面创建一把 Key,复制出来。Key 一律写成占位符YOUR_API_KEY,不要贴到公开仓库里。模型 ID 不要自己编,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场当前列表为准,把你真正要用的那个模型 ID 记下来。
准备阶段还有一件事:确认你的网络环境能直接访问https://taotoken.net/api。这一步和 Skill 无关,先把通道探通,后面加载 SKILL.md 才不会因为连接问题误判成「技能没生效」。
4.2~/.claude/settings.json的完整写法
Claude Code 的持久配置放在~/.claude/settings.json,env字段里写环境变量。示例如下,字段名严格按 Claude Code 的约定,不要自己改名。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }三个字段需要留意:
ANTHROPIC_BASE_URL填https://taotoken.net/api,末尾不要加/v1,也不要加任何 UTM 参数。TaoToken 的兼容通道已经按 Anthropic 的路径规范做了适配,多一层/v1会直接 404。ANTHROPIC_AUTH_TOKEN填你在控制台创建的那把 Key;与官网落地页不同,这里绝不放https://taotoken.net,只放 Key。ANTHROPIC_MODEL填模型广场里真实存在的 ID,不要用带日期的臆想后缀。
4.3 用环境变量做临时切换
如果你不想改settings.json,也可以在当前 shell 里临时导出。macOS / Linux 下:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="YOUR_MODEL_ID"Windows PowerShell 下:
$env:ANTHROPIC_BASE_URL = "https://taotoken.net/api" $env:ANTHROPIC_AUTH_TOKEN = "YOUR_API_KEY" $env:ANTHROPIC_MODEL = "YOUR_MODEL_ID"临时变量只对当前终端有效,重启后失效。适合做一次性排查。
另外 TaoToken 提供了 CLI 方式启动 Claude Code,如果原文里你已经在用命令行流程,可以直接:
npm install -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID-u同样填https://taotoken.net/api,不带/v1、不带 UTM。
4.4 先探活,再装插件
配置保存后,不要急着装 dotnet/skills。先在终端里开一个 Claude Code 会话,发一条最简单的.NET问题,比如「解释一下AddDbContext的默认生命周期」。如果它能正常回答,说明通道通了;如果报认证错或模型找不到,先按第 6 节排错。探活这一步很关键,它把「通道问题」和「技能问题」隔离开了。
5. 回 Claude Code 执行/plugin install并验证技能注册
5.1 按原文顺序执行两条/plugin命令
通道探通之后,回到 Claude Code 会话,按原文章第五部分的顺序执行:
/plugin marketplace add dotnet/skills /plugin install第一条把 dotnet/skills 注册为插件市场源,第二条按市场清单把技能装到本地。安装过程如果出现网络失败或清单解析失败,先确认你的 Claude Code 版本是否支持当前插件协议;不要用「通道异常」来解释插件层的报错。
5.2 怎么确认 80+ 条技能已加载
装完之后,Claude Code 的技能索引里会出现 dotnet/skills 提供的条目。你可以通过插件的列表命令或者向 Claude Code 提问「列出当前可用的 .NET 相关技能」来间接验证。核对的要点是:条目数量、命名前缀、SKILL.md 是否被识别。
如果列表里只有一两条,通常是插件源注册了但安装没走完;重跑一次/plugin install即可。如果列表看起来正常,但提问时模型没有任何加载技能的迹象,常见原因是模型通道配置被覆盖。检查~/.claude/settings.json里ANTHROPIC_BASE_URL是不是https://taotoken.net/api——有些版本会同时读系统环境变量,如果旧变量还指着别处,就会静默覆盖。
5.3 拿一条具体技能试一下
挑一条和你项目强相关的技能,比如 EF Core 的迁移、或 ASP.NET Core 的中间件顺序,向 Claude Code 提一个该技能命中范围内的具体问题。观察两件事:
- 回答里是否开始引用 dotnet/skills 约定的命名和规则;
- 这次请求是否在你的 TaoToken 控制台产生对应的调用记录(这一步放到第 7 节)。
只要回答里出现了「按 .NET 官方推荐做法……」「在Program.cs里通常是」这类贴合版本的具体表述,就说明 SKILL.md 被读进去并影响了推理。
6. 排错:技能列表空、SKILL.md 读不到、401 与 model not found
6.1 技能列表为空
三种常见原因:市场源没注册成功;网络拉取中断;Claude Code 版本不支持当前插件清单格式。排查顺序是:先看/plugin返回的信息,再确认 dotnet/skills 的仓库地址没写错,最后升级 Claude Code。
6.2 报 401:认证失败
401 属于通道层错误。检查ANTHROPIC_AUTH_TOKEN有没有填成YOUR_API_KEY占位符而不是真 Key;Key 有没有被截断;Key 是否在 TaoToken 控制台 里被删过或过期。改完 Key 之后,重启 Claude Code 会话让settings.json重新加载。
6.3 报 404 或 Not Found
多半是 Base URL 多写了/v1。TaoToken 的兼容通道填https://taotoken.net/api,末尾不带/v1。另一种可能是加了查询参数,比如把落地页的 UTM 链粘进来了——注意区分:https://taotoken.net/?utm_source=taotoken_aicg_blog_end是给人点的官网地址,https://taotoken.net/api才是填进工具里的接口 Base URL,两者不能混。
6.4 model not found
模型 ID 不存在,或者你的账号下没有该模型的访问权限。解决方式只有一条:去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场看当前可用 ID,复制过来替换ANTHROPIC_MODEL。不要凭记忆写 ID,不要自己拼-date后缀。
6.5 通道通了但技能触发很低
如果探活正常、插件列表正常,但提问时很少命中技能,多半是提问太泛。dotnet/skills 的技能匹配偏向具体任务词,比如「EF Core 迁移」「中间件顺序」「Minimal API 的参数绑定」。把问题拆细,命中率会明显上升。
7. 跑通之后去控制台对一下这次调用
配置保存、插件装完、技能也触发了之后,最后一步是核账。打开 TaoToken 模型对话 用同一把 Key 发一条测试消息,确认模型 ID 和 Base URL 没填错;再回 控制台 API Keys 看这次 Claude Code 加载 dotnet/skills 时的请求是否记上了账。如果你打算长期在 .NET 项目里用这些技能写代码,可以顺便看一下 Coding Plan 的额度是否够用。Claude Code 的环境变量对照说明,官方文档在 Claude Code 接入文档。
个人体会是,Skill 这类东西容易让人产生「装上就完事」的错觉,实际上技能能不能生效,取决于模型通道、插件加载、提问命中这三件事同时成立。dotnet/skills 给的是 .NET 领域知识,Claude Code 负责把知识带进上下文,TaoToken 负责把每一次上下文请求稳稳发出去。三段都对齐,80+ 条技能才算真正在 .NET 项目里跑起来。