技能创建器(Skill Creator)
概述
Anthropic 官方的技能创建指南。系统化地引导你从零构建高质量的 Claude 技能,覆盖从需求定义到打包发布的完整流程。
技能是什么
技能为 Claude 提供:
- 专业工作流:特定领域的步骤化指导
- 工具集成:通过 MCP 或脚本连接外部服务
- 领域专长:将专家知识编码为可复用的指令
- 捆绑资源:脚本、参考文档、模板等附件
核心设计原则
简洁性
上下文窗口是公共资源。技能应尽可能精简,只包含完成任务所需的最少信息。
适度的自由度
过于死板的技能无法适应真实场景。给 Claude 留出合理的判断空间。
渐进式披露(Progressive Disclosure)
三层加载机制,最大化 token 效率:
| 层级 | 内容 | 加载时机 |
|---|---|---|
| 第一层 | YAML 前置元数据(frontmatter) | 始终加载到系统提示 |
| 第二层 | SKILL.md 正文 | Claude 判断技能相关时加载 |
| 第三层 | references/ 等外部文件 | 按需读取 |
技能文件结构
your-skill-name/
├── SKILL.md # 必须 — 主技能文件
├── scripts/ # 可选 — 可执行脚本
│ ├── process_data.py
│ └── validate.sh
├── references/ # 可选 — 参考文档
│ ├── api-guide.md
│ └── examples/
└── assets/ # 可选 — 模板、图标等
└── report-template.md
技能创建六步法
步骤 1:理解技能
用具体例子定义技能的使用场景。写出 2-3 个用户会说的真实请求。
步骤 2:规划可复用内容
确定哪些指导是通用的(放入 SKILL.md),哪些是专业参考(放入 references/)。
步骤 3:初始化技能
创建文件夹结构,编写 YAML 前置元数据:
---
name: your-skill-name # kebab-case,必须
description: > # 必须:做什么 + 何时用
描述技能功能和触发条件。
包含用户可能说的具体短语。
---
步骤 4:编写 SKILL.md
- 顶部放最关键的指令
- 使用编号步骤和清晰结构
- 用
## Important/## Critical标记关键信息 - 引用捆绑资源时写清路径
步骤 5:打包技能
- 文件夹命名用 kebab-case
- SKILL.md 大小写必须精确
- 不要在技能文件夹内放 README.md
- 保持 SKILL.md 在 5000 词以内
步骤 6:迭代优化
基于实际使用反馈持续改进:
| 信号 | 含义 | 对策 |
|---|---|---|
| 技能该触发时未触发 | 描述不够具体 | 补充触发短语和关键词 |
| 不相关时触发 | 描述过于宽泛 | 添加负面触发条件 |
| 执行结果不一致 | 指令不够明确 | 改进步骤描述,增加错误处理 |
YAML 前置元数据字段
| 字段 | 必须 | 说明 |
|---|---|---|
name |
❌ | kebab-case,显示名称,最长 64 字符 |
description |
推荐 | 做什么 + 何时用,< 1024 字符。Claude 据此决定何时加载 |
argument-hint |
❌ | 自动补全时显示的参数提示 |
disable-model-invocation |
❌ | 设为 true 阻止 Claude 自动加载,默认 false |
user-invocable |
❌ | 设为 false 从 / 菜单隐藏,默认 true |
allowed-tools |
❌ | 技能激活时允许的工具列表(无需用户确认) |
model |
❌ | 技能激活时使用的模型(如 sonnet、haiku) |
context |
❌ | 设为 fork 在独立子代理上下文中运行 |
agent |
❌ | 当 context: fork 时指定子代理类型(如 Explore) |
hooks |
❌ | 作用域限定在此技能生命周期内的 Hooks |
license |
❌ | 如 MIT、Apache-2.0 |
metadata |
❌ | 自定义键值对(author、version 等) |
调用控制矩阵
| Frontmatter 配置 | 用户可调用 | Claude 可调用 | 上下文加载方式 |
|---|---|---|---|
| (默认) | ✅ | ✅ | 描述始终在上下文中,调用时加载完整内容 |
disable-model-invocation: true |
✅ | ❌ | 描述不在上下文中 |
user-invocable: false |
❌ | ✅ | 描述始终在上下文中 |
技能存放位置与优先级
| 位置 | 路径 | 作用范围 |
|---|---|---|
| 企业级 | 托管设置 | 组织内所有用户 |
| 个人级 | ~/.claude/skills/<name>/SKILL.md |
你的所有项目 |
| 项目级 | .claude/skills/<name>/SKILL.md |
仅当前项目 |
| 插件级 | <plugin>/skills/<name>/SKILL.md |
启用插件的地方 |
优先级:企业级 > 个人级 > 项目级。插件技能使用 plugin-name:skill-name 命名空间。
描述预算:上下文窗口的 2%,回退值 16,000 字符。可通过 SLASH_COMMAND_TOOL_CHAR_BUDGET 环境变量覆盖。
字符串替换变量
技能正文中可使用以下动态变量:
| 变量 | 说明 |
|---|---|
$ARGUMENTS |
调用时传入的所有参数 |
$ARGUMENTS[N] / $N |
按索引(从 0 开始)获取特定参数 |
${CLAUDE_SESSION_ID} |
当前会话 ID |
${CLAUDE_SKILL_DIR} |
技能 SKILL.md 所在目录 |
动态上下文注入
使用 !`command` 语法在技能内容发送给 Claude 之前执行 Shell 命令,将实时数据注入上下文:
---
name: pr-summary
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---
## Pull Request 上下文
- PR 差异: !`gh pr diff`
- PR 评论: !`gh pr view --comments`
这是一种强大的模式 —— 让技能能够访问实时数据(Git 状态、API 响应、环境信息等),而不只是静态文本。
子代理执行模式
设置 context: fork 可让技能在隔离的子代理中运行,技能正文成为子代理的提示词:
---
name: code-review
context: fork
agent: general-purpose
model: sonnet
allowed-tools: Read, Grep, Glob
---
你是一名资深代码审查员。审查最近的代码变更...
适用场景:
- 需要独立上下文避免污染主对话
- 需要限制工具访问权限
- 需要指定不同模型运行
最佳实践
- 代码比语言更可靠:关键验证用脚本而非纯语言描述
- 先迭代一个任务:在对话中把一个困难任务做对,然后提取成技能
- 描述字段是最重要的部分:它决定 Claude 何时加载你的技能
- 技能是活文档:计划持续迭代,不是一次写完
- 善用动态上下文:
!`command`让技能能够注入实时数据 - 利用子代理隔离:
context: fork防止复杂技能污染主对话上下文 - 控制描述预算:所有技能描述共享上下文窗口的 2%,保持描述精简