ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Skill / MCP / Hook 区别与联系:用 TaoToken 统一 Key 跑通 Claude Code 三类扩展

Skill / MCP / Hook 区别与联系:用 TaoToken 统一 Key 跑通 Claude Code 三类扩展 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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 这条不带 UTM 参数配置时直接用它。Claude Code 读取配置的方式和环境变量有关最直接的做法是在 shell 里导出两个变量。你可以这样操作export ANTHROPIC_BASE_URLhttps://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可以在文件修改后自动跑 lintStop可以在会话结束时记录日志。这一步不依赖模型决策是强制的流程控制。三者叠加起来才是一个完整的 AI 编程扩展体系Skill 管认知、MCP 管能力、Hook 管控制。缺任何一层要么流程不规范要么能力不够要么安全没保障。如果你打算长期用这套组合做编码和 Agent 任务可以考虑 TaoToken 的 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 适合需要稳定调用和统一管理的场景。想先验证模型对话效果可以用模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置细节都能查到。最后留一个实用技巧每次改完 Skill、MCP 或 Hook 配置先只验证改动的那一层别一次性全改。三类扩展的报错信号不一样分开验证能让你快速定位问题出在哪条轴上。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进