Claude Skill 介绍

1. 引入Skills

1.1 Skills是什么?

Skill本质就是一个prompt(一个任务模版),在claude code加载skill,最终都是把skill.md、references/、asset/、scripts、合并成一个prompt。

举例:

System: You are Claude, a helpful AI assistant created by Anthropic.
You are knowledgeable, thoughtful, and aim to be helpful.
 
[Claude 的基础指令]
 
<span style="color: #ff0000;"><strong>--- Skills Loaded ---</strong></span>
## PDF Skill
[pdf-skill/SKILL.md 的完整内容]
You are an expert in PDF processing...
When extracting text from PDFs:
- Preserve formatting
- Handle tables correctly
...
 
[pdf-skill/references/best-practices.md 的内容]
 
## Email Extractor Skill
[email-extractor/SKILL.md 的完整内容]
You specialize in extracting structured information from emails...
When processing emails:
- Extract sender, subject, date
- Identify key action items
...
 
[email-extractor/references/email-patterns.md 的内容]
 
--- End of Skills ---
 
User: [用户的实际输入]

1.2 Skills Vs 直接写Prompt区别

特性
直接写 Prompt
使用 Skill
长度
需要每次输入完整指令
一次定义,重复使用
管理
分散在各处
集中在 Skill 文件夹
版本控制
难以追踪变化
Git 管理,有历史记录
分享
复制粘贴 prompt
打包成 .zip 或 Git 仓库
组合使用
手动合并多个 prompt
可以同时加载多个 Skills

1.3 Skills作用

1、定义模板 workflow,提高可重用性:一次编写,到处使用,标准化工作流程。

2、集成和编排工具,突破上下文限制:

  • 将相关工具组合在一起,定义工具的使用时机和顺序。
  • Skills 采用了独特的 “渐进式披露” 架构,像一本组织良好的手册,从目录开始,然后是特定章节,最后是详细附录,Skills 让 Claude 只在需要时加载信息 Claude。
层级 1: Skill 名称 + 描述(总是加载)
层级 2: SKILL.md 完整内容(相关时加载)
层级 3+: 额外的参考文件(按需加载)

3、将特定领域的专业知识编码进 Skill,让通用 AI 具备特定领域的专业能力。

2. Skill目录

2.1 标准结构

Skill本质就是一个prompt(一个任务模版),为了保证skill.md中内容简洁,对于比较复杂的skill.md 可以将数据归类到references/scripts/asset目录下。

一个标准的Skill目录如下:

skill-name/
├── SKILL.md            # 必需:Skill 的入口文件和核心指令
│   ├── YAML frontmatter(元数据)
│   └── Markdown 内容(指令)
├── scripts/            # 可选:存放可执行的辅助脚本
│   ├── script1.py
│   └── script2.sh
├── references/        # 可选:存放供 AI 参考的外部文档、Schema 等
│   ├── api_docs.md
│   └── schema.md
└── assets/            # 可选:存放报告模板、图片等静态资源
    ├── template.html
    └── logo.png

SKILL.md 详解

SKILL.md 是 Skill 的灵魂,它由两部分组成:YAML Frontmatter (元数据) 和 Markdown Body (指令主体)。

  • YAML Frontmatter (元数据区):位于文件最顶端,用---包裹,用于定义 Skill 的基本信息、依赖和配置。
  • Markdown Body (指令区):跟在 YAML 之后,这里是你放置核心提示词的地方,其结构与我们之前介绍的 “通用 Skill 设计模板” 完全一致,包含角色设定、目标、输入输出要求、示例、限制等。
---
name: email-extractor
description: "Extracts email addresses from a block of text."
metadata:
  version: 0.1.0
  author: "Your Name"
  inputs:
    - name: "text_block"
      type: "string"
      description: "The text to search for emails."
      required: true
---
 
你是一位数据处理专家。你的任务是从用户提供的文本中,找出所有格式合法的电子邮件地址。
 
## 输出格式
请将找到的所有电子邮件地址以 JSON 列表的形式输出。如果没找到,则返回一个空列表。
 
## 示例
- ** 输入:** "Contact me at test@example.com or support@domain.org."
- ** 输出:**
```json
["test@example.com", "support@domain.org"]
```
 
## 质量检查
- [ ] 结果是否为 JSON 数组格式?
- [ ] 是否处理了没有邮件地址的情况?

scripts 目录

此目录保存封装的的脚本或者代码。

references 目录

存放供 AI 在执行任务时 “阅读” 的背景材料,尤其适用于涉及专业领域知识的 Skill,可以当成知识库。

  • 存放大量示例数据。
  • 技术规范文档。例如,一个用户 JSON 对象的字段定义(user_id, username, email)、数据类型、是否必填和示例值。

assets 目录

用于存放 Skill 在生成结果时需要用到的静态资源:

  • 模板文件。比如 Skill 的目标是生成一份 HTML 报告,这里可以存放报告的模板文件。模板中可以使用占位符(如 {{ title }} 和 {{ content }}),AI 的任务就是生成填充这些占位符的内容。
  • 配置文件。
  • 多媒体:比如报告或产出物中需要用到的图片、Logo 等。

2.2 Skill 中有 script、references、asset 目录,这些目录是做什么的?正常不是只有一个 skill.md 不就行了?

skill本质就是一个提示词 来构建的任务模版,为了保证skill.md中prompt简洁,对于比较复杂的skill.md 可以将数据归类到references、scripts、asset目录下。

正常情况简单场景 (只需 skill.md),比如:提取邮件地址这种简单任务。

email-extractor/ 
└── skill.md

复杂场景 ,需要完整结构:

email-extractor/
├── skill.md                    # 核心逻辑
├── scripts/
   ├── preprocess.js          # 清洗输入
   └── validate.js            # 验证输出
├── references/ │
   ├── rfc5322.md             # 邮件标准文档
└── assets/
   ├── output-template.json   # 输出模板
   └── icon.svg               # Skill 图标

选择哪种方式?大概80% 的 Skills 只需要 skill.md。

只用 skill.md
需要额外目录
提示词 < 500 行
提示词 > 500 行或需要分模块
无需编程逻辑
需要前/后处理脚本
示例在提示词内就够
大量示例数据
个人使用
团队协作/发布到社区

2.3 Skill 的 script 也是在 prompt 提供的样例,llm 本身不执行 script 吧?

LLM本身不执行script,而是:

  • LLM的角色:根据prompt中的示例和指令,生成符合格式的script代码。
  • Script的执行:由外部的执行引擎/运行时环境来解析和执行这些script。

具体流程是这样的:

用户请求 
    ↓
LLM分析并生成技能调用的script
    ↓
返回script给调用方
    ↓
外部执行引擎解析script
    ↓
调用实际的工具/API
    ↓
返回结果

类比理解:

  • LLM就像一个“代码生成器”,根据文档示例写出符合规范的代码。
  • 但它不是“编译器”或“解释器”,不负责真正运行这些代码。
  • 真正的执行由外部系统(如:function calling 框架、MCP服务器等)完成。

3. 创建 Skill

3.1 直接使用官网库

https://github.com/anthropics/skills,这个项目是 Anthropic 的 Skills 系统的公开仓库。Skills 是一些指令、脚本和资源的文件夹集合,Claude 可以动态加载它们来提升在特定任务上的表现。

第一步:添加市场。这个命令是将 anthropics/skills 这个 GitHub 仓库注册为一个插件市场源,类似于添加一个“商店”,安装在~/.claude/plugins/marketplaces。

# skill没有公开市场平台,只有这个公共代码库,都是在本地添加市场。
/plugin marketplace add anthropics/skills

第二步:安装具体的 Skills。这个命令才是真正安装具体的 Skills 到你的 Claude Code 中。

/plugin install document-skills@anthropic-agent-skills
# 或
/plugin install example-skills@anthropic-agent-skills

第三步 执行 /plugin list

Claude Skill 介绍

第四步:测试一个demo。执行如下会在本地创建一个docx的文档:

请帮我创建一个 Word 文档,内容如下:
 
标题:2024年度工作总结
副标题:技术部门
 
正文包含三个部分:
1. 项目完成情况 - 今年完成了5个重要项目
2. 团队成长 - 团队从10人扩展到15人
3. 明年规划 - 计划启动3个新项目
 
请使用专业的格式,包含适当的标题样式和段落间距。

注意:这里不需要显示指定 @document_skills ,直接在对话框输入上面文本就行。一般在测试某一个skill时,才指定skill。

3.2 创建自定义Skill

方式1:使用官方脚本创建

下载官方项目(https://github.com/anthropics/skills),进入到当前目录的 skill-creator/scripts,然后执行如下命令,在new下创建了一个extract-email目录

Claude Skill 介绍

生成如下:

Claude Skill 介绍

方式2:手动创建

安装目录格式手动创建上面的目录和文件

---
name: email-extractor
description: "Extracts email addresses from a block of text."
metadata:
  version: 0.1.0
  author: "Your Name"
  inputs:
    - name: "text_block"
      type: "string"
      description: "The text to search for emails."
      required: true
---
 
你是一位数据处理专家。你的任务是从用户提供的文本中,找出所有格式合法的电子邮件地址。
 
## 输出格式
请将找到的所有电子邮件地址以 JSON 列表的形式输出。如果没找到,则返回一个空列表。
 
## 示例
- ** 输入:** "Contact me at test@example.com or support@domain.org."
- ** 输出:**
```json
["test@example.com", "support@domain.org"]
```
 
## 质量检查
- [ ] 结果是否为 JSON 数组格式?
- [ ] 是否处理了没有邮件地址的情况?

4. Skill 加载机制

如何读取skill的skill.md、references、assetss的信息?最终还是构建一个prompt:

1. 启动:扫描 skills 目录,索引所有 Skill

2. 调用:用户通过 @skill-name 触发

3. 加载和组装Context

  • 读取 skill.md (必需) + references + assets
  • 构建完整的 System Promp

4. 执行:调用 Claude API

阶段 1:启动时扫描

默认流程

Claude Code 启动
    ↓
扫描 skills/ 目录
    ↓
解析每个 skill.md 的 frontmatter
    ↓
构建 Skill 索引(name, description)
    ↓
准备就绪

Claude Code 会在特定位置查找 Skills:

# macOS/Linux
~/.config/claude-code/skills/

# Windows
%APPDATA%\claude-code\skills\

# 或项目本地
./.claude/skills/

skill.md

---
name: email-extractor
description: "Extracts emails from text"
---

你是邮件提取专家。从用户文本中提取所有邮件地址。

输出格式: JSON 数组

references/patterns.md

# 常见邮件格式

- 标准格式: user@domain.com
- 带加号: user+tag@domain.com
- 子域名: user@mail.company.com

assets/template.json

{
  "emails": [],
  "count": 0,
  "timestamp": ""
}

激活配置config.json

config.json是把skill的所有信息生成prompt,都合并到context。

# .claude/config.json
{
  "active_skills": ["pdf-skill","email-extractor"]
}

当你配置 active_skills 时,Claude Code 做的事情

1. 启动时读取 config.json
   ↓
2. 找到指定的 Skills 目录
   ~/.claude/plugins/.../pdf-skill/
   ~/.claude/plugins/.../email-extractor/
   ↓
3. 读取每个 Skill 的内容
   - SKILL.md 的内容
   - references 下的文档
   - 可能还有其他元数据
   ↓
4. 组合成一个大的 System Prompt
   ↓
5. 每次对话都附加这个 System Prompt

对比下有激活和无激活的system prompt:

1、默认(无激活配置conifig.json)。每次需要动态的加载sklill,即根据用户输入,圈定具体的skill,然后再加载skill。所以默认情况下system prompt原始内容没有load skill的信息。

System: You are Claude, a helpful AI assistant created by Anthropic.
You are knowledgeable, thoughtful, and aim to be helpful.
 
[Claude 的基础指令]

2、 有激活config.json。预加载 Skills 后的 System Prompt,保证每次skill都是生效,行为一致可预测,但是每次会消耗更多的tokens。

System: You are Claude, a helpful AI assistant created by Anthropic.
You are knowledgeable, thoughtful, and aim to be helpful.
 
[Claude 的基础指令]
 
--- Skills Loaded ---
## PDF Skill
[pdf-skill/SKILL.md 的完整内容]
You are an expert in PDF processing...
When extracting text from PDFs:
- Preserve formatting
- Handle tables correctly
...
 
[pdf-skill/references/best-practices.md 的内容]
 
## Email Extractor Skill
[email-extractor/SKILL.md 的完整内容]
You specialize in extracting structured information from emails...
When processing emails:
- Extract sender, subject, date
- Identify key action items
...
 
[email-extractor/references/email-patterns.md 的内容]
 
--- End of Skills ---
 
User: [用户的实际输入]

阶段 2:用户调用 Skill

正常情况下是通过llm自动识别的,不需要显示指定。在测试阶段可以使用 @ 语法显示调用。

@email-extractor "Contact me at test@example.com"

阶段 3:加载和组装Context

1. 读取 skill.md
   ├── 解析 YAML frontmatter (metadata)
   └── 读取 Markdown 正文 (instructions)
 
2. 加载 references 
   ├── 读取所有 .md, .txt, .json 文件
   └── 作为附加上下文
 
3. 加载 assets
   ├── 读取模板、配置文件
   └── 如果需要,编码为 base64
 
4. 组装最终 prompt
   ├── System: skill.md 的指令
   ├── Context: references 的内容
   └── User: 用户的实际输入

组装后的实际prompt:

--
System Message:
---
你是邮件提取专家。从用户文本中提取所有邮件地址。
 
输出格式: JSON 数组
 
## 参考资料
 
### patterns.md
# 常见邮件格式
- 标准格式: user@domain.com
- 带加号: user+tag@domain.com
- 子域名: user@mail.company.com
 
## 输出模板
{
  "emails": [],
  "count": 0,
  "timestamp": ""
}
---
 
User Message:
请从以下文本中提取邮件: "Contact us at info@example.com..."

5. 发布Skill:创建好的skill如何加入到Claude Code

方式1:放置源码-本地使用

1. 包含两个目录

  • 个人的 Skills
~/.claude/skills/
└── my-skill/
    ├── SKILL.md          # 源码
    ├── scripts/
    │   └── helper.py     # 源码
    └── resources/
        └── data.json     # 源码
  • 项目 Skills:如果只是某一project下,建立一个skill目录,然后把原始的skill放在skill目录下就行。
your-project/
├── skills/
│   ├── my-skill/
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── README.md
│   └── another-skill/
│       └── ...
└── 其他目录

2. FAQ

Q:定义一个cluade skill,在当前project的skills目录下放置的是skill的原始目录,还是通过pacakage打包的产物?

A:在项目中,skills 目录下通常放置的是 skill 的原始源代码目录,而不是打包后的产物。

your-project/
├── skills/
│   ├── my-skill/
│   │   ├── src/
│   │   │   └── index.ts
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── README.md
│   └── another-skill/
│       └── ...
└── 其他目录

Q:如果要在 .claude/config.json 配置 { “active_skills”: [“email-extractor”] },那么是否需要先打包发布呢?

A:不需要先打包发布。在 .claude/config.json 中配置本地 skill 时,可以直接引用本地的源代码目录。

{
  "skills": {
    "email-extractor": {
      "path": "/absolute/path/to/skills/email-extractor"
    }
  },
  "active_skills": ["email-extractor"]
}

方式2:通过 /plugin 发布自己的 Skills 的方式

# 1. 创建你自己的 Skills 仓库
# 例如:https://github.com/your-username/my-skills
 
# 2. 添加你的仓库作为 marketplace
/plugin marketplace add your-username/my-skills
 
# 3. 从你的市场安装
/plugin install your-skill@your-marketplace-name

anthropics/skills/代码库 VS Plugin Marketplace区别:

1. GitHub 仓库 (anthropics/skills)

  • 这是一个示例和参考仓库
  • 包含 Anthropic 官方提供的示例 Skills
  • 主要用于:学习如何创建 Skills,参考最佳实践;使用 Anthropic 提供的官方 Skills

2. Claude Code Plugin Marketplace

  • 这是 Claude Code 的插件市场系统
  • 可以从任何 GitHub 仓库添加为 marketplace 源
  • 你可以创建自己的仓库并添加为市场源

公开 Skills

# 从公开 GitHub 仓库
/plugin marketplace add anthropics/skills
/plugin install document-skills@anthropic-agent-skills

私有Skills

# 方案 1: 从公司私有 GitHub 仓库
/plugin marketplace add your-company/internal-skills
 
# 方案 2: 从本地路径
/plugin add /company/shared/skills/custom-skill
 
# 方案 3: 通过 Claude API 上传(完全私有)
# 使用 API 上传 skills,只有你的账号可以访问

方式3:通过 package 发布的场景

使用package (验证 + 依赖分析+ 元数据+ 优化 + 签名 + 压缩)。它不是简单的 zip 命令,而是一个完整的构建和发布流程。

  1. 下载:https://github.com/anthropics/skills/tree/main/skills/docx
  2. 进入脚本目录 cd skills/skill-creator/scripts
  3. 打包并输出到指定目录 ./package_skill.py ~/.claude/skills/company-branding ~/Desktop/

6. Skills 和 MCP

核心区别

Skills

  • 本质: 提示词模板/指令集
  • 作用: 定义 Claude 如何思考和回应
  • 内容: 系统提示、输出格式、示例、质量标准
  • 类比: 给 Claude 的“工作手册”或“SOP”

MCP

  • 本质: 数据和工具连接协议
  • 作用: 让 Claude 访问外部资源
  • 内容: 数据库、API、文件系统、搜索引擎等
  • 类比: 给 Claude 的“工具箱”

两者关系

┌─────────────────────────────────────┐
│         Claude Skill                │
│  (如何处理邮件提取任务)              │
│                                     │
│  ┌───────────────────────────┐     │
│  │ 提示词: 你是数据专家...    │     │
│  │ 输出格式: JSON 列表        │     │
│  │ 质量要求: 验证邮件格式     │     │
│  └───────────────────────────┘     │
│              ↓                      │
│  ┌───────────────────────────┐     │
│  │ allowed-tools:            │     │
│  │  - gmail-mcp (读取邮件)   │ ←─┐ │
│  │  - database-mcp (存储)    │   │ │
│  └───────────────────────────┘   │ │
└─────────────────────────────────│─┘
                                  │
                    ┌─────────────┴──────────────┐
                    │    MCP Servers             │
                    │  (提供实际数据和功能)       │
                    │                            │
                    │  • Gmail API               │
                    │  • PostgreSQL              │
                    │  • File System             │
                    │  • Web Search              │
                    └────────────────────────────┘

协同工作示例

假设你要构建一个“客户邮件分析”系统:

Skill 定义 (skill.md):

---
name: customer-email-analyzer
description: "Analyzes customer emails and extracts key information"
allowed-tools:
  - gmail-mcp
  - crm-database-mcp
---
 
你的任务是分析客户邮件并提取:
1. 客户情绪 (正面/负面/中性)
2. 关键问题
3. 紧急程度
 
输出格式: JSON

MCP 提供能力:

  • gmail-mcp: 连接 Gmail,读取邮件内容
  • crm-database-mcp: 连接 CRM 数据库,查询客户历史

执行流程:

  • Skill 告诉 Claude 如何分析邮件
  • MCP 让 Claude 能够读取 Gmail 中的实际邮件
  • Skill 指导 Claude 按指定格式输出分析结果
  • MCP 让 Claude 能够将结果存入 CRM

加载方式

Skills(技能):是渐进式加载的——Claude 可以按需读取特定的 SKILL.md 文件,只加载当前任务需要的技能,不会一次性全部加载。

MCP(Model Context Protocol):不是渐进式加载的。MCP 服务器在启动时就会连接,所有已配置的 MCP 服务器的工具列表会在会话开始时一次性注入到上下文中。这意味着:

  • 所有 MCP 工具的定义(schema、描述等)都会占用上下文空间
  • 无论你是否用到某个 MCP 工具,它的定义都已经在上下文里了
  • 配置的 MCP 服务器越多,上下文开销越大