一文搞懂 Agent Skills:SKILL.md 如何让 Claude Code 从“会聊天”到“会干活”?
1. 为什么你的 Claude Code 还停留在“会聊天”很多人装完 Claude Code用了几次就放弃了原因出奇一致它只会跟你聊天不会替你干活。你问它“帮我看看这个项目的接口有没有问题”它给你一段分析你让它“把 src 下所有 console.log 清掉”它给你一段 sed 命令让你自己跑。整个过程你还是那个执行者它只是个更聪明的搜索引擎。问题不在模型能力而在你只给了它一张嘴没给它一双手。Agent Skills 就是这双手。它把“完成某类任务需要知道什么、按什么顺序做、调用哪些工具、产出什么格式”整体封装成一个可被 Agent 自动发现和调用的能力单元。你不再需要每次写一大段提示词去引导Agent 会在合适的时机自己判断“这个任务该用哪个 Skill”然后按 Skill 里写好的流程执行。这篇文章面向的是已经用过 Claude Code、但还停留在对话式使用的开发者。我会从 SKILL.md 的目录结构讲起给出可直接复制的配置模板跑一次端到端验证再把常见的报错逐个拆开。中间会说明如何通过 TaoToken 统一 Key 和 API 通道接入避免你在多个平台之间来回切换配置。读完你应该能让 Claude Code 从“会聊天”变成“会干活”。核心检索词先摆出来Agent Skills 是 Claude Code 里让 Agent 自动调用工具完成多步任务的标准化机制SKILL.md 是它的核心说明文件MCP 是更底层的上下文协议两者配合使用。适合谁适合已经能跑通 Claude Code、想让 Agent 真正执行文件操作、脚本调用、多步工作流的开发者。2. SKILL.md 目录结构与触发条件Agent Skills 渐进式披露机制详解先搞清楚一个 Skill 在磁盘上长什么样。官方协议里一个 Skill 就是一个文件夹核心是 SKILL.md其余都是可选的补充材料。目录结构大致如下my-skill/ ├── SKILL.md # 必需元数据 说明文档 ├── assets/ # 可选产出模板、配置文件、素材 ├── examples/ # 可选背景知识、规范、示例 └── scripts/ # 可选执行时调用的脚本如 pythonSKILL.md 本身分两段。顶部是 YAML frontmatter用---包起来写元数据下面是 Markdown 正文写执行说明。元数据里几个关键字段你得记住字段是否必需作用name必需Skill 名称Agent 检索时看到的就是它description必需功能说明和适用场景决定何时被触发allowed-tools可选执行过程中允许自动调用的工具白名单model可选默认使用的模型context可选是否在独立子 Agent 上下文中运行这里有个很多人踩过的坑description 写得越模糊Skill 越难被正确触发。你写“处理文档”Agent 不知道什么时候该用你写“当用户要求提取 PDF 中的表格并转成 Excel 时使用”触发准确率立刻上来。description 本质上是给 Agent 看的“检索索引”不是给人看的简介。接下来说触发条件这是 Agent Skills 最核心的设计——渐进式披露Progressive Disclosure。系统不会把整个 Skill 文件夹一次性塞进上下文而是分三层曝光第一层Agent 启动或任务初始化时只加载每个 Skill 的 name 和 description。这一层信息量极小但足够让 Agent 判断“当前任务可能和哪个 Skill 相关”。第二层当任务需求和某个 Skill 的 description 高度匹配时Agent 才把完整的 SKILL.md 读进上下文这时它才了解输入参数、使用约束、执行方式。第三层正式执行阶段Agent 严格按 SKILL.md 里定义的流程操作并按需加载 assets/ 里的模板、examples/ 里的参考文档或运行 scripts/ 里的脚本。这个机制直接解决了上下文消耗问题。假设你有 20 个 Skill每个 SKILL.md 平均 2000 token一次性全加载就是 4 万 token 打底还没开始干活上下文就满了。渐进式披露让初始只加载 20 条 description可能就几百 token真正用到的那个才展开。触发链路可以这样理解用户输入 → Agent 匹配 description → 命中则加载完整 SKILL.md → 按流程执行 → 按需调用 scripts 或读取 assets。整个过程中Agent 是主动判断者不是被动执行者。这也是它和单纯 Prompt 的本质区别——Prompt 是你每次手动喂Skill 是 Agent 自己找。再补一个容易混淆的点Skill 和 MCP 不是替代关系。MCP 是更底层的协议规范模型如何发现和使用能力Skill 是上层的能力封装把任务流程、资源、脚本打包。一个 Skill 内部可以调用 MCP 提供的工具。你可以把 MCP 理解成“插座标准”Skill 理解成“插上去就能用的电器”。3. 可复制配置SKILL.md 模板与 TaoToken 接入 settings.json这一节给你能直接抄的东西。先看一个完整的 SKILL.md 模板我以一个“清理项目日志并生成报告”的 Skill 为例你可以照着改。--- name: clean-logs-and-report description: 当用户要求清理项目中的 console.log 或调试日志并生成清理报告时使用。适用于 JavaScript/TypeScript 项目。 allowed-tools: - Read - Write - Bash model: claude-sonnet-4-20250514 context: subagent --- # 清理日志并生成报告 ## 触发场景 用户明确要求清理 console.log、debugger 语句或调试日志并希望得到一份清理报告。 ## 执行步骤 1. 使用 Bash 执行 grep -rn console.log src/ --include*.ts --include*.js 定位所有日志语句。 2. 逐文件读取确认哪些是调试日志、哪些是必要的业务日志如错误上报。 3. 仅删除调试日志保留业务日志删除前在报告中记录文件路径和行号。 4. 使用 Write 生成 clean-report.md包含清理文件数、删除行数、保留的日志清单。 ## 注意事项 - 不要删除 console.error 和 console.warn除非用户明确要求。 - 如果项目有 ESLint 配置清理后运行 npx eslint src/ --fix 验证。 - 报告使用中文表格形式呈现。这个模板里description 写得足够具体Agent 在用户说“帮我清一下项目里的调试日志”时就能命中。allowed-tools 限制了它能用的工具避免它乱调。context 设为 subagent 表示在独立上下文运行不污染主对话。接下来是接入配置。Claude Code 通过环境变量或 settings.json 读取 API 通道。用 TaoToken 统一 Key 的好处是你不用在多个模型平台之间切换一个 Key 走通。配置文件路径是~/.claude/settings.json内容如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }三件套对齐Base URL 填https://taotoken.net/apiKey 填你在控制台生成的密钥Model ID 填你要用的模型。如果你用的是 Codex 或 Cline配置位置不同但字段逻辑一致。Codex 的 auth.json 里对应base_url和api_keyCline 的 MCP 配置里对应baseUrl和apiKey。不管哪个客户端Base URL Key Model ID 这三样必须齐全缺一个就会报认证或模型找不到的错。Key 的获取路径登录 TaoToken 控制台进入 API Keys 页面生成。生成后复制粘贴到上面的ANTHROPIC_API_KEY字段。注意不要有多余空格我见过有人复制时带了个换行结果一直报 401。Skill 文件夹放哪里Claude Code 默认读取~/.claude/skills/目录。你把上面那个clean-logs-and-report/文件夹整个放进去重启 Claude Code 即可加载。验证是否加载成功可以在对话里输入/skills查看已注册的 Skill 列表。如果你想让 Skill 跨项目共享放在用户级目录如果只想在某个项目生效放在项目根目录的.claude/skills/下。两种方式都支持优先级是项目级高于用户级。4. 端到端验证一次请求看 Agent 如何自动调用 Skill配置完了得跑一次真实请求验证。我拿一个实际项目来演示你跟着做一遍就能确认链路通了。准备一个测试项目里面故意放几个 console.logmkdir -p /tmp/skill-test/src cat /tmp/skill-test/src/app.ts EOF export function greet(name: string) { console.log(debug: greet called with, name); const msg Hello, ${name}; console.log(debug: msg , msg); return msg; } export function add(a: number, b: number) { console.log(debug: add, a, b); return a b; } EOF进入项目目录启动 Claude Codecd /tmp/skill-test claude然后在对话里输入帮我清理 src 下的调试日志并生成清理报告接下来观察 Agent 的行为。正常情况下你会看到它先判断当前任务匹配clean-logs-and-report这个 Skill弹出提示询问是否启用。确认后它按 SKILL.md 里的步骤执行先跑 grep 定位再逐文件读取然后删除调试日志最后生成clean-report.md。执行完成后检查结果cat /tmp/skill-test/clean-report.md你应该看到一份中文报告包含清理的文件数、删除的行数、保留的日志清单。同时src/app.ts里的 console.log 应该被清掉了但如果有 console.error 会被保留。再验证一下 Skill 是否真的被加载了。在 Claude Code 里输入/skills列表里应该能看到clean-logs-and-report。如果没看到说明文件夹放错位置或 SKILL.md 的 frontmatter 格式有问题。这一步的关键观察点是Agent 没有让你手动写 grep 命令也没有让你确认每一步它是按 Skill 里定义的流程自主执行的。这就是“会干活”和“会聊天”的分界线。你可以在报告生成后追问“把保留的日志也列出来”它会基于已有上下文继续不需要重新走一遍流程。如果这一步你跑通了说明 TaoToken 的 API 通道、Claude Code 的 Skill 加载机制、SKILL.md 的触发逻辑三者都正常。接下来可以把这个模式复制到其他任务上比如“抓取资讯并总结”“批量重命名文件”“生成接口文档”。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节把你会遇到的报错逐个拆开。我按出现频率排序每个都给出真实报错文本和解决路径。401 Unauthorized / invalid api key报错长这样API Error: 401 {error:{message:invalid api key,type:authentication_error}}原因通常是三种Key 复制时带了空格或换行、Key 已过期或被撤销、Base URL 和 Key 不匹配比如 Key 是 TaoToken 的Base URL 却填了别的平台。排查顺序先检查~/.claude/settings.json里ANTHROPIC_API_KEY的值用echo $ANTHROPIC_API_KEY | wc -c看长度是否异常再去 TaoToken 控制台确认 Key 状态最后确认ANTHROPIC_BASE_URL是https://taotoken.net/api结尾没有多余斜杠。local proxy failed / connection refused报错文本Error: local proxy failed: dial tcp 127.0.0.1:xxxx: connect: connection refused这个通常是你本地配了某个代理端口但代理服务没启动。检查环境变量HTTP_PROXY、HTTPS_PROXY是否指向了一个没运行的端口。如果你不需要代理直接 unset 掉unset HTTP_PROXY HTTPS_PROXY ALL_PROXY然后重启 Claude Code。注意这里说的是本地网络配置问题和 API 通道本身无关。reading choices / unexpected response format报错文本Error: reading choices: unexpected end of JSON input这个多半是 Base URL 填错了请求打到了一个不兼容 OpenAI 格式的端点返回的 JSON 结构里没有choices字段。确认你的ANTHROPIC_BASE_URL是https://taotoken.net/api不要手动加/v1或/chat/completions后缀客户端会自己拼接。如果你用的是 Cline 的 MCP 配置检查baseUrl字段是否完整。OAuth token expired / authentication failed报错文本OAuth error: token expired, please re-authenticate如果你之前用 OAuth 方式登录过 Claude Code后来又切到 API Key 模式可能会残留 OAuth 凭证导致冲突。解决方式是清掉旧的凭证文件rm -rf ~/.claude/credentials.json然后重新用 API Key 模式启动。确认settings.json里没有oauth相关字段。Skill 不触发 / 提示 no matching skill这个不是报错但很常见。Agent 没匹配到你的 Skill通常是 description 写得太泛。把 description 改成“当用户要求 X 时使用”这种明确句式重新加载。另外确认 SKILL.md 的 frontmatter 用---正确包裹YAML 缩进用空格不用 Tab。排查完这些你的链路应该就稳了。如果还有问题去 TaoToken 的接入文档页对照配置项逐个核对或者直接在模型对话页里测一下 Key 是否可用。6. 从对话到执行把 Skill 用起来的下一步跑通第一个 Skill 之后你会发现真正的价值不在单个 Skill而在组合。一个“抓取资讯”的 Skill 加一个“总结成报告”的 Skill串起来就是一个自动化的信息处理流水线。Agent 会在任务开始时判断需要哪些 Skill按顺序调用中间产物自动传递。我自己的做法是先把重复性最高的三类任务抽成 Skill文件批量处理、数据抓取与清洗、结构化报告生成。这三类占了我日常操作的大头封装之后每次省下的提示词编写时间很可观。Skill 写好后放在用户级目录所有项目共享改一处全局生效。如果你要长期跑编码类任务或 Agent 工作流Coding Plan 比按量计费更划算适合高频调用场景。只是偶尔验证模型效果用模型对话页就够了。Key 的管理统一在控制台接入细节看文档。最后留一个实用技巧SKILL.md 里的执行步骤写得越像“给新人的操作手册”Agent 执行越稳。别写“分析代码质量”这种模糊指令写“用 eslint 跑一遍把 error 级别的输出整理成表格按文件路径排序”。Agent 不需要你聪明它需要你具体。