1. 先搞清楚 skill 到底是什么,为什么 Claude Code 需要它
如果你刚接触 Claude Code,大概率会把它当成一个"命令行里的聊天框":问一句答一句,用完就忘。但真正让它在工程场景里变得好用的,是skill这套机制。简单说,skill 就是一份写给 AI 看的"工作手册",把某类任务的专家经验、操作步骤、脚本工具打包成一个文件夹,Claude Code 在需要的时候自动加载,不用你每次重复贴一大段提示词。
我自己的理解是:prompt 是"这次你帮我做这件事",skill 是"以后这类事你都按这个标准做"。前者是一次性口头交代,后者是沉淀下来的流程规范。比如你团队有一套固定的 Node.js 项目脚手架规范、日志格式、错误码约定,把这些写进 SKILL.md,Claude Code 每次生成代码就会自动对齐,而不是靠你反复纠正。
那 skill 在 Claude Code 里长什么样?核心是一个叫SKILL.md的 Markdown 文件,放在~/.claude/skills/目录下的独立子文件夹里。Claude Code 启动任务时会扫描这个目录,判断当前请求要不要调用某个技能,需要的话就把对应 SKILL.md 的内容加载进上下文。你也可以主动点名,比如"用 node-scaffold 这个 skill 帮我建个项目"。
这篇教程面向的是完全没写过 skill 的新手,我会带你从零做一个Node.js 技能:一个能根据参数生成标准 Node.js 项目骨架的最小可运行 skill。全程你会拿到可直接复制的 SKILL.md 模板、目录结构、本地验证命令,以及怎么通过 TaoToken 的统一 Key 和 API 通道把 Claude Code 跑起来完成一次真实调用。不需要你之前写过任何 skill,跟着敲就行。
先明确一下本文的检索关键词,方便你对号入座:Claude Code skill 使用教程、SKILL.md 编写规范、Node.js 技能最小结构。这三个词基本覆盖了新手最常搜的问题。下面从环境准备开始。
2. 用 TaoToken 打通 Claude Code 的 Key 与 API 通道
在写 skill 之前,得先让 Claude Code 能正常跑起来。Claude Code 依赖 Node.js 环境,所以第一步是确认本机 Node 版本。打开终端输入:
node -v只要输出类似v20.11.0的版本号就说明环境 OK。如果提示command not found,去 Node.js 官网下载对应系统的安装包,装完重开终端再验证一次。这一步是后面所有操作的地基,别跳过。
接下来是接入通道。Claude Code 通过环境变量读取鉴权信息和 API 地址,我们需要配置三个关键变量:ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL。这里用 TaoToken 作为统一入口,它提供兼容的 API 通道,你只需要一个 Key 就能把请求发出去,不用自己折腾多套凭证。
TaoToken 的 API 地址是https://taotoken.net/api,Key 在控制台的 API Keys 页面生成。拿到 Key 之后,在终端里设置环境变量(macOS / Linux):
export ANTHROPIC_AUTH_TOKEN=sk-你的Key export ANTHROPIC_BASE_URL=https://taotoken.net/api export ANTHROPIC_MODEL=你的模型IDWindows PowerShell 用$env:语法:
$env:ANTHROPIC_AUTH_TOKEN="sk-你的Key" $env:ANTHROPIC_BASE_URL="https://taotoken.net/api" $env:ANTHROPIC_MODEL="你的模型ID"每次开新终端都要重设很烦,所以把这几行写进 shell 配置文件。macOS 默认 zsh,写进~/.zshrc;用 bash 就写~/.bash_profile。写完执行source ~/.zshrc让它生效。你可以用echo $SHELL确认自己用的是哪个 shell。
如果你在 VS Code 或 JetBrains 插件里用 Claude Code,环境变量要配到~/.claude/settings.json的env字段里才能全局生效,格式是这样:
{ "env": { "ANTHROPIC_AUTH_TOKEN": "sk-你的Key", "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_MODEL": "你的模型ID" } }配好之后在终端输入claude启动。首次启动会让你同意服务条款、选主题,如果它跳转到官方登录页,说明环境变量没生效,回到上一步检查ANTHROPIC_AUTH_TOKEN和ANTHROPIC_BASE_URL是否写对,然后在同一个终端里重新执行 export 再启动。
这里有个新手常踩的坑:环境变量设了但没source,或者设在了另一个终端窗口。Claude Code 只认当前进程能读到的变量,所以务必在启动claude的同一个终端里确认echo $ANTHROPIC_BASE_URL有输出。通道打通后,我们才有条件去写和验证 skill。
3. 手写第一个 SKILL.md:Node.js 技能的最小可运行结构
现在进入正题。Claude Code 的 skill 统一放在用户目录下的.claude/skills/里,macOS 路径是/Users/你的用户名/.claude/skills/,Windows 是C:\Users\你的用户名\.claude\skills\。注意.claude是隐藏文件夹,Finder 里按Cmd+Shift+.才能看到。
每个 skill 是一个独立文件夹,里面至少有一个SKILL.md。我们这次做的技能叫node-scaffold,作用是"根据项目名生成标准 Node.js 骨架"。目录结构如下:
~/.claude/skills/ └── node-scaffold/ ├── SKILL.md └── scripts/ └── scaffold.jsSKILL.md是核心,用 Markdown 写。它需要包含两部分信息:元数据(告诉 Claude Code 这个技能叫什么、什么时候用)和正文指令(具体怎么做)。元数据用 YAML front matter 写在文件最顶部,格式必须严格,冒号后面要有空格。下面是可以直接复制的模板:
--- name: node-scaffold description: 根据项目名生成标准 Node.js 项目骨架,包含 package.json、入口文件和基础目录结构。当用户要求"新建 Node 项目""生成 Node 骨架"时使用。 --- # Node.js 项目脚手架技能 ## 何时使用 当用户明确要求创建一个新的 Node.js 项目,或需要标准化的项目初始结构时,调用本技能。 ## 执行步骤 1. 向用户确认项目名称,若未提供则询问。 2. 运行 `node scripts/scaffold.js <项目名>` 生成骨架。 3. 检查生成结果,向用户展示目录树。 ## 生成规范 - package.json 的 name 字段使用项目名,version 固定为 1.0.0 - 入口文件为 src/index.js,包含一个可执行的 main 函数 - 必须生成 .gitignore,忽略 node_modules - 不自动执行 npm install,交由用户决定 ## 约束 - 项目名只允许小写字母、数字和连字符 - 若目标目录已存在,停止并提示用户,不要覆盖front matter 里的name是技能标识,description最关键——Claude Code 靠它判断"当前任务要不要用这个技能"。所以 description 要写清楚做什么和什么时候用,别只写一句"Node 工具"。我试过把 description 写得太泛,结果它在该调用的时候没调用,改成带触发场景的描述后就稳定了。
正文部分用自然语言写指令就行,Claude Code 会把它当上下文读。你可以用列表、标题组织,但别写得太啰嗦,重点是步骤清晰、约束明确。scripts/目录放实际执行的脚本,SKILL.md 里用相对路径引用。
配套的scaffold.js最小实现如下,放在scripts/下:
const fs = require('fs'); const path = require('path'); const name = process.argv[2]; if (!name || !/^[a-z0-9-]+$/.test(name)) { console.error('项目名只允许小写字母、数字和连字符'); process.exit(1); } const target = path.resolve(process.cwd(), name); if (fs.existsSync(target)) { console.error(`目录 ${name} 已存在,停止生成`); process.exit(1); } fs.mkdirSync(path.join(target, 'src'), { recursive: true }); fs.writeFileSync( path.join(target, 'package.json'), JSON.stringify({ name, version: '1.0.0', main: 'src/index.js' }, null, 2) ); fs.writeFileSync( path.join(target, 'src', 'index.js'), "function main() {\n console.log('Hello from " + name + "');\n}\n\nmain();\n" ); fs.writeFileSync(path.join(target, '.gitignore'), 'node_modules\n'); console.log(`已生成项目骨架:${name}`);这个脚本不依赖任何第三方包,纯 Node 内置模块,所以不用npm install就能跑。SKILL.md 里引用它时写node scripts/scaffold.js,Claude Code 会在技能目录下执行。到这里,一个最小可运行的 Node.js 技能就成型了。
4. 本地验证:从加载 skill 到跑通一次真实调用
写完文件不代表能用,得先本地验证脚本本身没问题,再验证 Claude Code 能正确加载技能。分两步走。
第一步,单独测脚本。进入 skill 目录,手动执行一次:
cd ~/.claude/skills/node-scaffold node scripts/scaffold.js demo-app如果输出已生成项目骨架:demo-app,并且当前目录下出现了demo-app/文件夹,里面有package.json、src/index.js、.gitignore,说明脚本逻辑正确。再跑一次node scripts/scaffold.js demo-app,应该报"目录已存在,停止生成",这验证了防覆盖约束生效。测完把 demo 目录删掉,别污染技能目录。
第二步,验证 Claude Code 加载技能。启动claude,然后输入一句能触发技能的话,比如:
用 node-scaffold 技能帮我创建一个叫 my-service 的 Node 项目如果技能被正确加载,你会看到类似Skill(node-scaffold) successfully loaded的提示,接着 Claude Code 会按 SKILL.md 的步骤执行脚本,最后把生成的目录树展示给你。这一步能跑通,说明 front matter 格式、description 触发条件、脚本路径引用全都对上了。
如果它没有自动调用,你可以直接点名技能名,Claude Code 支持显式指定。还有一种情况是它调用了但脚本报错,那多半是路径问题——SKILL.md 里的相对路径是相对于技能目录的,不是相对于你当前工作目录,这点容易搞混。
验证通过后,回到你的工作目录,让 Claude Code 在真实项目里用一次这个技能。比如在~/projects/下启动 claude,说"用 node-scaffold 建一个 api-gateway 项目",确认生成物落在你期望的位置。整个链路——环境变量鉴权、API 通道、技能加载、脚本执行——就全部打通了。这套流程跑顺之后,你再去写更复杂的技能(比如带模板文件、带多脚本编排的),心里就有底了。
5. 常见报错排查:401、技能不加载、脚本路径错
新手在这一步最容易卡住,我把几个高频报错和对应解法列出来,对照着查。
报错一:401 Unauthorized 或鉴权失败。这是 Key 或 Base URL 没配对。先确认echo $ANTHROPIC_AUTH_TOKEN有输出,且以sk-开头;再确认echo $ANTHROPIC_BASE_URL是https://taotoken.net/api,末尾不要多加斜杠。如果是在 IDE 插件里报错,检查~/.claude/settings.json的env字段有没有写对,JSON 不能有注释和多余逗号。改完重启 Claude Code。
报错二:技能不加载,没有successfully loaded提示。九成是 front matter 格式问题。YAML 要求---独占一行,name:和description:冒号后必须有空格,description 里如果含冒号要用引号包起来。另外确认文件夹名和name字段一致,路径在~/.claude/skills/下且没有多套一层目录。可以用ls ~/.claude/skills/node-scaffold/确认 SKILL.md 在正确位置。
报错三:脚本执行报Cannot find module或路径错误。SKILL.md 里写的是相对路径scripts/scaffold.js,Claude Code 执行时的基准目录是技能目录。如果你手动测试时在别的目录跑,就会找不到文件。统一在技能目录下测试,或者脚本里用__dirname拼绝对路径更稳妥。
报错四:local proxy failed或连接超时。通常是网络层问题,先确认 Base URL 可达,用curl https://taotoken.net/api看有没有响应。如果公司网络有出口限制,换网络环境再试。别去折腾系统代理设置,先排除变量配错。
报错五:reading choices相关解析错误。这类多半是模型返回格式和客户端预期不一致,检查ANTHROPIC_MODEL填的模型 ID 是否在 TaoToken 支持的列表里。填错模型 ID 会导致返回体结构异常,换一个确认可用的模型再试。
排查顺序建议固定下来:先看环境变量,再看 SKILL.md 格式,最后看脚本路径。大部分问题都出在前两步。如果还搞不定,去 TaoToken 的接入文档对照配置示例,或者直接在模型对话里把报错贴进去问,通常能快速定位。
6. 把技能用起来:从单次调用到可复用工作流
跑通第一个 skill 之后,真正的价值在于复用。你可以把这个node-scaffold扩展成团队规范:在 SKILL.md 里加上 ESLint 配置模板、CI 的 GitHub Actions 文件、统一的日志封装,让每次新建项目都自动带上这些。技能越贴近你团队的实际约定,Claude Code 的产出就越省心。
再往上一层,你可以写多个技能组合使用。比如一个node-scaffold负责建骨架,一个node-test-setup负责加测试框架,一个node-deploy负责生成部署配置。Claude Code 会根据任务描述自动挑选,你也可以在对话里显式串联。这种"技能库"的思路,比每次手写长提示词稳定得多。
如果你打算长期在编码和 Agent 场景里用 Claude Code,可以考虑 TaoToken 的 Coding Plan,它更适合高频、持续的开发调用,Key 和通道统一管理,省去反复配置的麻烦。想先验证模型效果,可以直接在模型对话里试;需要生成和管理 Key,去控制台的 API Keys 页面;配置细节和更多示例看接入文档。这几个入口按你的阶段选就行。
最后给个实用建议:每写完一个 skill,先在本地用脚本单独测一遍,再让 Claude Code 调用一次,两步都过了再提交到你的技能库。这样能避免"技能写了但跑不起来"的尴尬。技能这东西,写十个不如跑通一个,动手才是关键。