完整字段一览
--- name: sec-10k-analyzer description: > 分析 SEC 10-K 年报,输出财务健康度评分与风险摘要。 激活:用户提供 10-K 文件路径或 ticker。 不处理:10-Q 季报(用 sec-10q-analyzer)、非美股。 version: 1.3.0 allowed-tools: - Bash - Read - Write - WebFetch required-env: - SEC_API_KEY tags: [finance, analysis, public-filings] maintainer: finance-team@example.com ---
name(必填)
Skill 的唯一标识,小写字母 + 连字符,与目录名一致。Claude 内部用来引用。反例:驼峰、空格、中文。
description(必填,核心)
Claude 决定是否激活本 Skill 的唯一依据。必须包含:做什么 / 何时激活 / 不处理什么。3 行最佳,超过 500 字会影响命中精度。
version(可选)
语义化版本。团队协作与 Marketplace 分发时必要;个人用可省略。
allowed-tools(可选)
明确限制 Skill 可用的工具。API 场景下是安全边界——即便用户开了 Write 权限,Skill 如果没写 Write,就不能写文件。
required-env(可选)
声明依赖的环境变量。Skill 激活前若缺失,Claude 会提示用户配置,而不是运行到一半报 401。
tags / maintainer(可选)
纯元数据,不参与激活逻辑。Marketplace 搜索、团队归属用。
description 的三段结构
官方建议的 description 模板:
[做什么] 一句话描述核心能力
[何时激活] 关键词 / 输入条件 / 用户意图
[不处理] 相邻但不做的场景,留给兄弟 Skill
对比两个版本:
| 反例 | 正例 |
|---|---|
description: SQL 工具 |
description: 生成符合公司 data-warehouse schema 的 Snowflake SQL。激活:用户描述数据查询需求且提到表名或业务概念。不处理:DDL、权限管理、Postgres。 |
| 5 字,Claude 看到所有 SQL 请求都激活 | 范围明确,Snowflake 专属,Postgres 请求不误触 |
正文结构:三层金字塔
SKILL.md 的正文(frontmatter 之下的 markdown)应该分三层,从必读到参考:
┌─────────────────────────────────────┐
│ 层 1 工作流(Workflow) │
│ Claude 必须遵循的主步骤,按数字排列 │
│ 目标:读完这一节能跑通 80% 场景 │
├─────────────────────────────────────┤
│ 层 2 边界与决策点(Edge Cases) │
│ 遇到 X 时去读 references/Y │
│ 目标:触发懒加载,不把细节塞进来 │
├─────────────────────────────────────┤
│ 层 3 示例对话(Few-shot) │
│ 3-5 个高代表性样例,纠正常见跑偏 │
│ 目标:小参数模型也能学到调用模式 │
└─────────────────────────────────────┘
一份优秀的 SKILL.md 正文模板
# {name} {一句话重申能力,供 Claude 在激活后复读确认。} ## 工作流 1. 第一步,指明具体动作与用到的脚本。 2. 第二步,包含输入校验。 3. 第三步,生成交付物。 ## 决策点 - 如果 {条件 A},读 `references/a.md` 按方案 A 处理。 - 如果 {条件 B},读 `references/b.md`。 - 如果遇到未定义情况,明确向用户提问,不要猜。 ## 常见失败 - 报错 X → 解法 Y - 输入格式 Z → 先运行 `scripts/convert.py` ## 示例 ### 示例 1: 典型用法 用户: "帮我 ..." Claude: 1. [调用 detect_fields.py] 2. [输出] ... ### 示例 2: 边界情况 用户: "..." Claude: 先问清楚 ...,再做 ...。
示例对话比大段说教有效 10 倍
LLM 对 few-shot 极度敏感。与其写 "不要直接填签字域",不如写一段对话演示 Claude 遇到签字域时如何提问、如何降级处理。
LLM 对 few-shot 极度敏感。与其写 "不要直接填签字域",不如写一段对话演示 Claude 遇到签字域时如何提问、如何降级处理。
Claude 读 SKILL.md 的顺序
- 激活期:只注入 frontmatter(name + description)到上下文,正文不读。此时占用约 50-200 tokens。
- 匹配期:用户请求命中 description,Claude 主动 read SKILL.md 全文,约 500-2000 tokens。
- 执行期:Claude 遇到"去读 references/X"、"运行 scripts/Y" 时,才按需加载那些文件。
别在正文里 import 100KB
有人会把 API Spec 的所有 endpoint 列表复制进 SKILL.md,以为"让 Claude 记得住"。这会一次性把 50K tokens 怼进上下文——Skill 的节流优势荡然无存。API Spec 放 references/,用时再 grep。
有人会把 API Spec 的所有 endpoint 列表复制进 SKILL.md,以为"让 Claude 记得住"。这会一次性把 50K tokens 怼进上下文——Skill 的节流优势荡然无存。API Spec 放 references/,用时再 grep。
长度与性能经验
| 区域 | 推荐长度 | 超出后果 |
|---|---|---|
| description | 50-200 字 | 太长影响激活精度,Claude 抓不到关键词 |
| SKILL.md 正文 | 200-500 行 | 超过后考虑拆分到 references |
| references/ 单文件 | < 5000 行 | 超过后按主题拆成多个小文件,便于 grep |
| Skill 总体积 | < 50 MB | 过大影响 Marketplace 分发 |
版本管理与 changelog
Skill 进入团队使用后,强烈建议:
version字段遵循 semver:MAJOR.MINOR.PATCH- 根目录放
CHANGELOG.md,每次更新记录变化 - 行为大改(如工作流步骤顺序变化)升 MAJOR
- 新增决策点、references 升 MINOR
- 文案修正、bug 修复升 PATCH
常见反模式
❌ description 里写 "高级 SQL 工具"
形容词无意义,Claude 匹配不到任何具体请求。改成"生成 Snowflake SELECT 语句"。
❌ SKILL.md 里塞完整 API 文档
违背渐进披露。拆到 references/api/*.md,用 grep 触发。
❌ 没写"不处理什么"
Skill 互相打架——两个 SQL Skill 同时激活,Claude 不知道用哪个。明确职责边界。
❌ 把代码写在 SKILL.md 的代码块里让 Claude 复制执行
让 Claude 现场抄代码容易出错。封装成 scripts/,给一个清晰的 CLI 签名。
本章小结
- SKILL.md frontmatter 的核心是 description——决定激活的唯一字段,写清做什么/何时/不做什么
- allowed-tools、required-env 作为安全与契约边界声明
- 正文三层:工作流(必读) → 边界(懒加载触发点) → 示例(few-shot)
- Claude 激活期只读 frontmatter,匹配后才读正文,不要把重资料塞在正文
- 版本化 + changelog 让团队 Skill 可治理