1. 先搞清楚 Skill、MCP、Hook 到底各管什么
如果你刚开始折腾 Claude Code 的扩展体系,大概率会被这三个词绕晕:Skill、MCP、Hook。它们经常出现在同一份配置文件里,文档又各说各话,很容易让人以为它们是同一层的东西,只是叫法不同。实际上它们压根不在一个维度上,硬要类比的话,更像是「大脑的工作手册」「外接的工具箱」「流水线上的自动闸机」这三样东西。
先把结论摆出来:Skill 决定 Claude 怎么思考、按什么套路做事;MCP 决定 Claude 能调用哪些外部工具;Hook 决定在什么时间点强制触发某段脚本。三者一个管认知、一个管能力、一个管流程控制,互相不替代,但可以叠加使用。
我试过把这三类扩展混在一起配,结果排查问题时完全分不清是 Skill 没加载、MCP 没连上,还是 Hook 把命令拦了。后来把它们的边界理清楚,再统一用 TaoToken 的 Base URL 和 Key 接管模型请求,整个链路才变得可观测、可复现。
这篇就按「先分清边界,再逐个跑通」的思路来写。你会看到三类扩展各自的最小可复制配置,以及把 Claude Code 的请求统一指向 TaoToken 之后,怎么逐一验证 Skill 加载、MCP 工具调用、Hook 触发这三件事是否真的生效。适合已经在用 Claude Code、想给它加扩展但被配置绕晕的开发者,也适合想搞清楚这三者协作关系的技术负责人。
核心检索词先记住:Claude Code 的 Skill、MCP、Hook 是三条不同的扩展轴,不是同一层的三个选项。
2. 用 TaoToken 统一 Claude Code 的 Base URL 与 Key
在动 Skill、MCP、Hook 之前,得先把模型请求这条链路固定下来。原因很简单:这三类扩展最终都要经过 Claude Code 发起模型调用,如果 Base URL 和 Key 一会儿指向这、一会儿指向那,排查问题时你根本不知道是扩展没生效,还是请求压根没发出去。
TaoToken 在这里的作用是提供一个统一的接入地址和 Key,让 Claude Code 的模型请求走同一个入口。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,注意 API 这条不带 UTM 参数,配置时直接用它。
Claude Code 读取配置的方式和环境变量有关,最直接的做法是在 shell 里导出两个变量。你可以这样操作:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="你的TaoToken Key"如果你用的是 Claude Code 的 settings 文件方式,也可以写进配置文件。路径通常在~/.claude/settings.json,内容大致如下:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的TaoToken Key" } }这里有个容易踩的坑:Base URL 末尾不要多加/v1之类的路径,Claude Code 会自己拼接。多写了反而会 404。Key 的获取在控制台的 API Keys 页面,地址是 https://taotoken.net/console/api-keys ,生成后复制完整字符串,别漏字符。
配好之后先别急着上扩展,跑一次最基础的对话验证链路通不通。如果这一步就报 401,说明 Key 或 Base URL 有问题,先解决它,再往下走。链路通了,后面 Skill、MCP、Hook 的验证才有意义——否则你分不清是扩展的问题还是接入的问题。
统一 Key 的另一个好处是:Skill、MCP、Hook 三类扩展在触发模型调用时,走的都是同一个入口,日志和用量都能在一个地方看,排查效率高很多。
3. 三类扩展的最小可复制配置
这一节是重点,三类扩展各给一份最小配置,路径和字段尽量贴近 Claude Code 的实际约定。你照着放进去就能跑,不用先理解全部细节。
3.1 Skill 的最小配置
Skill 本质是一份 Markdown 说明,放在 Claude Code 能识别的目录里。常见位置是项目根目录下的.claude/skills/,每个 Skill 一个子目录,里面放SKILL.md。
目录结构长这样:
项目根/ └── .claude/ └── skills/ └── commit-helper/ └── SKILL.mdSKILL.md内容示例:
--- name: commit-helper description: 生成符合团队规范的 commit message --- 当用户要求提交代码时,按以下流程执行: 1. 先运行测试,确认通过 2. 查看 git diff,归纳改动类型 3. 按 Conventional Commits 规范生成 message 4. 格式为 type(scope): subjectSkill 不执行外部操作,它只是告诉 Claude「这类任务该怎么做」。加载时机通常是任务匹配到 description 时被引入。
3.2 MCP 的最小配置
MCP 是外部工具通道,配置一般写在.claude/settings.json或项目级的 MCP 配置文件里。下面是一个本地 MCP server 的最小示例:
{ "mcpServers": { "filesystem": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/your/project"] } } }这段配置的意思是:启动一个文件系统 MCP server,允许 Claude 通过工具调用读写指定目录。command是启动命令,args是参数,路径换成你自己的项目目录。
MCP 配置里如果涉及远程服务,通常还需要 Base URL 和 Key。这里同样可以复用 TaoToken 的接入方式,把模型请求和工具请求的入口统一起来,减少变量。
3.3 Hook 的最小配置
Hook 是生命周期事件监听器,配置同样在 settings 文件里。下面是一个在工具执行前拦截危险命令的示例:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "echo '即将执行 Bash 命令,请确认'" } ] } ] } }PreToolUse表示工具调用前触发,matcher匹配工具类型,command是要执行的脚本。Hook 的关键特点是它不依赖模型决策,到点就执行,属于强制层。
三份配置放好后,目录和文件大致是这样:
项目根/ ├── .claude/ │ ├── settings.json # MCP + Hook 配置 │ └── skills/ │ └── commit-helper/ │ └── SKILL.md # Skill 配置注意 settings.json 里 MCP 和 Hook 可以写在同一个文件,字段名分别是mcpServers和hooks,别写混。
4. 逐一验证 Skill 加载、MCP 调用、Hook 触发
配置放好不代表生效,得逐个验证。下面按 Skill、MCP、Hook 的顺序来,每步都有可观察的成功信号。
4.1 验证 Skill 是否加载
启动 Claude Code 后,输入一个能匹配到 Skill description 的任务,比如「帮我提交代码」。如果 Skill 加载成功,Claude 的输出会体现出 SKILL.md 里定义的流程,比如先跑测试、再归纳改动、最后按规范生成 message。
如果没生效,先检查目录名和文件名是否严格匹配:.claude/skills/commit-helper/SKILL.md,大小写敏感。再检查 frontmatter 里的description是否和你的任务描述有语义重叠,匹配不上就不会加载。
4.2 验证 MCP 工具调用
让 Claude 执行一个需要文件系统操作的任务,比如「列出项目根目录下的所有文件」。如果 MCP 配置正确,Claude 会发起一次 tool call,调用 filesystem server 的能力,然后返回文件列表。
成功信号是你能在输出里看到工具调用的痕迹,或者结果明显来自外部目录读取。失败的话,常见报错是 server 启动失败,通常是npx找不到包或路径写错。可以先在终端手动跑一遍command和args,确认 server 能独立启动。
4.3 验证 Hook 是否触发
Hook 的验证最直接:触发一次匹配matcher的操作,看command有没有执行。上面配的是 Bash 工具调用前打印提示,那你就让 Claude 执行一条 Bash 命令,观察终端有没有输出「即将执行 Bash 命令,请确认」。
Hook 不依赖模型,所以只要事件触发,脚本就一定跑。如果没反应,检查matcher是否写对,Bash是工具名,大小写要对。另外 Hook 的command是在 shell 里执行的,路径和权限也要确认。
三类都验证通过后,你就有了一个可观测的基线:Skill 管流程、MCP 管工具、Hook 管拦截,各自独立又能叠加。后面加更复杂的扩展时,出问题也能快速定位是哪一层。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
扩展跑起来之后,报错基本集中在接入层和配置层。下面几个是我实际遇到过的,对照着排查能省不少时间。
401 Unauthorized:最常见,Key 不对或没生效。先确认ANTHROPIC_API_KEY导出的是 TaoToken 控制台生成的完整 Key,没有多余空格。再确认 Base URL 是https://taotoken.net/api,没多写路径。如果用的是 settings.json,检查 JSON 格式有没有语法错误,导致 env 没被读取。
local proxy failed:这个通常出现在本地有代理层或端口冲突时。检查是否有其他进程占用了 Claude Code 需要的端口,或者环境变量里残留了旧的代理配置。把无关的代理变量清掉,重启终端再试。
reading choices 相关报错:这类多半是响应格式不符合预期,常见于 Base URL 指向了不兼容的端点。确认你用的是 TaoToken 的 API 地址,而不是其他路径。如果之前配过别的地址,记得清掉旧的环境变量,环境变量优先级高于配置文件。
OAuth 相关报错:Claude Code 某些版本会走 OAuth 流程,如果和 API Key 方式混用会冲突。确认你的接入方式是纯 Key 模式,没有残留的 OAuth token 文件。必要时清理~/.claude/下的缓存文件再重新登录。
排查顺序建议固定:先看 Key 和 Base URL,再看配置文件格式,最后看环境变量冲突。这三步能覆盖大部分接入层问题。扩展层的报错则回到第 4 节,逐个验证 Skill、MCP、Hook 的加载和触发。
6. 把三类扩展串起来:一个完整任务链路
单点验证通过后,最有价值的是看它们怎么协作。假设你让 Claude 完成「检查代码并提交 PR」这个任务,三类扩展会依次登场。
Skill 先起作用。它让 Claude 按团队规范来:先跑测试、再写规范 commit message、最后按 review 流程走。这一步决定的是「做事方式」,不涉及外部调用。
接着 MCP 登场。Claude 需要提交代码、创建 PR,就会调用 Git MCP 和 GitHub MCP 提供的工具。这一步决定的是「能用什么工具」,把 Claude 的行动边界从本地扩展到外部系统。
Hook 全程在关键节点插入。PreToolUse可以拦住直接 push 到主分支的操作,PostToolUse可以在文件修改后自动跑 lint,Stop可以在会话结束时记录日志。这一步不依赖模型决策,是强制的流程控制。
三者叠加起来,才是一个完整的 AI 编程扩展体系:Skill 管认知、MCP 管能力、Hook 管控制。缺任何一层,要么流程不规范,要么能力不够,要么安全没保障。
如果你打算长期用这套组合做编码和 Agent 任务,可以考虑 TaoToken 的 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,适合需要稳定调用和统一管理的场景。想先验证模型对话效果,可以用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,配置细节都能查到。
最后留一个实用技巧:每次改完 Skill、MCP 或 Hook 配置,先只验证改动的那一层,别一次性全改。三类扩展的报错信号不一样,分开验证能让你快速定位问题出在哪条轴上。