技能创建器(Skill Creator)

Verified 中级 Intermediate 流程型 Process ⚡ Claude Code 专属 ⚡ Claude Code Optimized
4 min read · 200 lines

Anthropic 官方技能创建指南:渐进式披露设计 + 六步创建法

技能创建器(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 技能激活时使用的模型(如 sonnethaiku
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%,保持描述精简

相关技能 Related Skills