1. 先把三个名词放回同一条请求里看
Claude Code 里的 Skills、MCP、Rules,被讲成三套并列的体系,越看越像三门要分别学的课。我一开始也这么理解,直到把一次真实的 API 请求拆开看:system、tools、messages三个字段,Rules 落在 messages 最前面,MCP 同时落在 tools 和 system 里,Skills 的正文也是落进 messages。三个概念在文档里各说各话,在请求体里却是同一批位置的不同占位方式。
这篇就按这个视角写。适合已经在用 Claude Code、被 Rules/MCP/Skills 绕晕、想搞清楚"到底该在什么时候用哪个"的人;也适合想把这套东西接到统一 Key 通道上、不想每个工具单独配一遍的人。核心检索词先摆出来:Claude Code 的 Skills 是可复用的 Markdown 工作指令,MCP 是外部工具协议,Rules 是项目级行为规范,三者最终都变成发给模型的上下文,区别主要在"塞进哪个字段、什么时候塞、谁来触发"。
我会用 TaoToken 作为统一 Key 通道,把 Claude Code 的接入配置写完整,然后在settings.json和config.toml里给出可复制的骨架,最后发一次请求,把三者的调用链差异打出来看。全程不需要你改 Claude Code 的源码,只需要改配置。
2. 接入前把 TaoToken 的 Key 和通道准备好
TaoToken 在这里的角色是统一入口:Claude Code、其他编码 Agent、以及你后面可能加的模型对话,都走同一个 Key,不用为每个客户端单独申请和轮换。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,注意 API 这个地址不带 UTM 参数,配置里填的就是它。
第一步,登录后在控制台创建 API Key。控制台地址带 deep link:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。创建时给 Key 起个能认出来的名字,比如claude-code-local,方便后面在多个客户端之间区分。Key 只在创建时完整显示一次,复制后先放到本地环境变量里,别直接写进会提交到 Git 的配置文件。
第二步,确认你要用的模型名。Claude Code 默认走 Anthropic 的模型标识,TaoToken 的模型对话页可以对照可用模型:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。如果你只是本地跑 Claude Code 做编码,选一个稳定的编码向模型即可,不用一上来就追最新。
第三步,把 Key 写进环境变量。macOS/Linux 用:
export TAOTOKEN_API_KEY="sk-你的key"Windows PowerShell 用:
$env:TAOTOKEN_API_KEY="sk-你的key"这一步的意义是:后面settings.json和config.toml里都引用这个变量,而不是硬编码 Key。这样你换 Key 只改一处,配置文件可以放心进版本库。
注意:不要把 Key 直接写进
.claude/settings.json再提交。Claude Code 的配置经常被团队共享,Key 一旦进仓库就等于泄露。用环境变量引用是成本最低的防护。
3. settings.json 与 config.toml 的可复制配置骨架
Claude Code 的配置分两层:项目级的.claude/settings.json管权限、环境变量、MCP Server 注册;用户级的~/.claude/settings.json管全局默认。而config.toml通常出现在你用的其他编码客户端或网关侧,用来声明 provider 和 base_url。两者配合的方式是:config.toml定义"请求发到哪",settings.json定义"Claude Code 在这个项目里怎么行为"。
先写config.toml的骨架。放在你的客户端配置目录下,核心是 provider 段:
# config.toml —— 统一走 TaoToken 通道 [provider.taotoken] type = "anthropic" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" [model] default = "claude-sonnet-4-5" provider = "taotoken" [request] timeout_seconds = 120 max_retries = 2这里base_url填的是不带 UTM 的 API 地址,api_key_env指向刚才设的环境变量。type = "anthropic"表示按 Anthropic 的消息协议发请求,Claude Code 的system/tools/messages结构能原样透传。
再写.claude/settings.json的骨架。这个文件管的是 Claude Code 自身的行为,包括 MCP Server 注册和权限:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "${TAOTOKEN_API_KEY}" }, "permissions": { "allow": [ "Read", "Edit", "Bash(gh *)", "Bash(git *)" ], "deny": [ "Bash(rm -rf *)" ] }, "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" } } } }env段把 Claude Code 的请求指向 TaoToken 通道,permissions段控制哪些工具能自动执行,mcpServers段注册外部 MCP Server。注意mcpServers里的github只是示例,你不需要它也能跑通后面的验证;如果暂时不接 MCP,把这一段删掉即可。
Rules 的配置不在settings.json里,而是靠文件发现。在项目根建CLAUDE.md,或者建.claude/rules/目录放规则文件。条件规则用 frontmatter 的paths字段限定生效范围:
--- paths: - "src/components/**/*.tsx" - "src/hooks/**/*.ts" --- 在 React 组件中始终使用函数式组件和 hooks,不要用 class 组件。Skills 的配置是文件系统层面的。在.claude/skills/下建目录,每个目录放一个SKILL.md:
--- name: commit description: 按团队规范生成提交信息并提交代码 whenToUse: 用户要求提交代码、生成 commit message 时 --- Step 1: 运行 git diff --staged 查看暂存区改动。 Step 2: 按 Conventional Commits 规范生成提交信息。 Step 3: 执行 git commit,不要加 --no-verify。到这里,三者的配置位置就清楚了:Rules 是CLAUDE.md和.claude/rules/*.md,MCP 是settings.json的mcpServers,Skills 是.claude/skills/*/SKILL.md。它们物理上分散,但最终都会汇进同一次 API 请求。
4. 发一次请求,把三者的调用链差异打出来
配置写完,最直接的验证方式是发一次请求,看请求体里三者分别出现在哪。Claude Code 本身不打印完整请求体,但你可以用一个最小的 Anthropic 协议请求来模拟,观察字段结构。
先验证通道本身通不通。用 curl 发一个最小请求:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 256, "system": "你是一个只回答 JSON 的助手。", "messages": [ {"role": "user", "content": "返回 {\"ok\": true}"} ] }'如果返回里带content数组和stop_reason,说明 Key 和通道都正常。这一步失败的话,先查 Key 有没有带sk-前缀、环境变量有没有在当前 shell 生效。
通道通了之后,在 Claude Code 里发一条会同时触发三者的指令。比如在项目里输入:
帮我给 src/components/Button.tsx 加一个 loading 状态,然后提交这条指令会依次触发:Rules 里的 React 规范(因为路径匹配src/components/**/*.tsx)被注入到 messages 最前面;模型读到 Skill 列表后判断commitskill 匹配,输出一个tool_use调用 Skill 工具;如果 MCP 的 github server 已连接,模型在需要查 issue 时会输出mcp__github__*的 tool_use。
要观察调用链差异,最省事的办法是开 Claude Code 的调试日志。在settings.json里加:
{ "env": { "ANTHROPIC_LOG": "debug" } }重启 Claude Code 后,日志里会打印每次请求的字段摘要。你会看到:
Rules 的内容出现在messages[0],role 是user,带isMeta标记,被<system-reminder>包裹。它不走tool_use,是每次请求自动注入的。
MCP 的工具定义出现在tools[]数组里,名字形如mcp__github__create_issue,和内置的Read、Edit并列,格式完全一致。模型分不出哪个是内置、哪个是 MCP,区别只在 Claude Code 侧的执行路由:内置工具本地执行,MCP 工具转发到外部进程。
Skills 的触发是一个tool_use,name是Skill,input里带skill: "commit"。但它的tool_result很短,只有一句Launching skill: commit,真正的指令文本是作为一条isMeta: true的 user 消息注入到对话历史里的。也就是说,Skill 的"能力"来自那段被注入的 Markdown,tool_use只是个触发器。
把这三条放在一起看,结论就出来了:Rules 是自动注入的上下文,MCP 是注册进 tools 的外部函数,Skills 是"用 tool_use 触发一次 Markdown 注入"。三者在请求体里的位置不同,但都不是什么独立的运行时。
5. 本篇常见错排查
配置过程中最容易踩的坑,基本集中在这几类。
第一类,Key 没生效。表现是请求返回 401 或authentication_error。先确认环境变量在当前 shell 里能echo $TAOTOKEN_API_KEY出来;如果settings.json里写的是${TAOTOKEN_API_KEY},确认 Claude Code 启动时这个变量已经存在。Windows 下环境变量名大小写不敏感但容易拼错,建议统一用大写。
第二类,base_url 写错。常见的是把https://taotoken.net/api写成带/v1或带 UTM 参数的版本。API 入口就是https://taotoken.net/api,不要加 UTM,也不要手动拼/v1/messages到配置里——客户端会自己拼。如果返回 404,先检查这一项。
第三类,MCP Server 起不来。表现是 Claude Code 启动时报mcp server failed to connect。先单独在终端跑一遍mcpServers里的command和args,看进程能不能起来。npx拉包慢的话,先手动npx -y @modelcontextprotocol/server-github预热一次。另外 MCP Server 的env里引用的变量(比如GITHUB_TOKEN)也要真实存在,否则握手会失败。
第四类,Skill 不自动触发。这是最高频的困惑。原因通常是description和whenToUse写得太模糊,模型判断不出来。Skill 列表有 token 预算,每个描述最多 250 字符,写太长会被截断。解决办法是把触发场景写具体,比如"用户要求提交代码、生成 commit message 时",而不是"用于代码相关操作"。如果还是不触发,直接用/commit手动调用,别跟模型较劲。
第五类,Rules 没生效。先确认文件位置对不对:项目根CLAUDE.md、.claude/CLAUDE.md、.claude/rules/*.md都会被扫描。条件规则的paths字段如果写错,规则只在匹配路径时才注入,你在别的文件上测试自然看不到效果。另外单个CLAUDE.md超过 40000 字符会触发警告,超长内容建议拆到.claude/rules/下。
第六类,改了配置没重启。Claude Code 的settings.json和 MCP 注册在启动时读取,改完要重启进程。Skills 和 Rules 是运行时扫描的,改完通常下一轮就生效,但 Skill 列表的刷新时机取决于客户端实现,稳妥起见也重启一次。
排障时如果怀疑是通道问题而不是配置问题,可以直接用第 4 节的 curl 命令测一次。curl 通、Claude Code 不通,问题在客户端配置;curl 也不通,问题在 Key 或通道。接入相关的文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
6. 按场景选通道,把 Key 收在一处
回到最开始那个问题:Skills、MCP、Rules 的区别到底有多大。从请求体看,它们的区别是"注入位置 + 触发方式"的组合,不是三套独立体系。Rules 自动注入 messages,MCP 注册进 tools 并可能带 system instructions,Skills 用 tool_use 触发一次 Markdown 注入。理解了这个,你就不会再被"该学哪个"困住——它们解决的是不同层面的问题,不是替代关系。
实际选型上,我的建议是:项目级编码规范、技术栈约定放 Rules,短文本、每次注入不心疼;长流程、需要执行隔离的工作流放 Skills,用 Fork 模式跑;需要持久连接、原子封装、权限隔离的外部系统才上 MCP,简单的gh、curl、psql直接让模型用 Bash。
如果你后面要长期跑编码任务或 Agent 工作流,可以看一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合把 Claude Code 这类客户端固定在一个通道上,Key 和额度集中管理,不用每个项目单独配。想先验证模型效果的话,模型对话入口在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,可以先在网页上试一轮再落到本地配置。
最后留一个我自己的习惯:把TAOTOKEN_API_KEY只放在 shell 的启动文件里,settings.json和config.toml全部用变量引用,这两个文件可以放心进 Git。团队里谁要接入,复制配置骨架、自己设一次环境变量就行,Key 不落地到任何仓库。这样换 Key、加客户端、排查通道问题,都只动一个地方。