这段时间不少读者私信问我同一个问题:Skills 安装到底怎么搞?我翻了翻聊天记录,发现问的人里有刚接触 AI 编程助手的,也有已经用了一两个月 Claude Code、Codex 但始终没搞明白 Skills 和 MCP、插件有什么区别的。所以这篇文章我打算直接从 0 开始,把 Skills 的概念、安装步骤、自定义写法、触发调试和典型坑位一次性讲清楚。不管你是只装别人写好的现成 Skills,还是想自己动手写一个,读完都应该能把链路跑通。
1. 为什么 Skills 突然成了热词:它解决的其实是一个"执行一致性"问题
1.1 从"会聊天"到"会干活":Agent 时代的新刚需
AI 编程助手这两年最大的变化,不是模型参数又涨了多少,而是产品形态从"对话框里给代码建议"变成了"Agent 自主执行任务"。你让它写一个功能,它会自己去读工程结构、改文件、跑测试、修 bug,甚至提 PR。这个转变带来了一个全新的问题:模型本身很聪明,但它不知道你的团队规范、你的项目约定、你处理某一类任务的固定流程。
以前靠什么解决?靠提示词。每次要做代码审查,你就在对话框里贴一大段"请按照以下几点审查……";每次要整理会议纪要,你又贴另一段"请输出结构化纪要,包含结论、待办、风险……"。问题是提示词越长,越占上下文窗口,而且每次重贴还可能漏掉某个细节,Agent 执行出来的结果时好时坏。
Skills 的价值就在这儿。它把某一类任务背后的操作手册、执行脚本、约束条件打包成一个独立的文件夹。Agent 一旦判断用户需求匹配某个 Skill,就自动加载这份手册并按步骤执行。装一个 Skill,相当于给 Agent 装了一个"职业领域的方法论包"。
1.2 Skills、MCP、插件、普通提示词到底有什么区别
这几个概念经常被混着聊,我先把边界划清楚:
- **MCP(Model Context Protocol)**是数据通道。它解决的是"Agent 怎么拿到外部数据"的问题。比如你想让 Agent 查数据库、获取 GitHub Issue、读某个内部系统的 API,通常需要一个 MCP Server 把资源暴露给模型。你可以把它类比成"网线"。
- 插件是应用层面的扩展组件。比如 IDE 插件、浏览器插件,它们往往是一整套 UI + 功能逻辑,不完全依赖模型。
- Skills 是"操作手册 + 工具箱"。核心不是连接外部系统,而是沉淀"这类活应该怎么干"的方法。它可以是纯 Markdown 说明,也可以带上脚本和静态资源。
- 普通提示词是一次性的;Skills 是可复用、可分发、可版本管理的。
这里最容易绕晕的点是:MCP 和 Skills 是不是二选一?并不是。一个 Skill 的执行步骤里完全可能调用 MCP Server 拿数据。举个实际例子:一个"代码审计" Skill,既包含审计规则文档(这是 Skill 本身),又通过 MCP 连接 SonarQube API 拉取扫描结果(这是 MCP 的能力)。所以更准确的理解是:MCP 把外部世界接进来,Skills 把内部方法论沉淀下来。
1.3 主流工具支持情况一览
截至写这篇文章的时间点,Claude Code、OpenAI Codex CLI、Cursor 以及一批开源 Agent 框架都已经加入了类似 Skills 的机制。虽然各家命名和目录位置不太一样,但核心思路基本统一:一个 Skill 就是一个文件夹,里面必备一个 SKILL.md 说明文件,再配上脚本和资源。
| 工具 | Skills 目录 | 查看方式 | 主要差异 |
|---|---|---|---|
| Claude Code | 全局 ~/.claude/skills,项目级 .claude/skills |
交互界面输入 /skills |
生态最成熟,官方文档完善 |
| Codex CLI | ~/.codex/skills |
配置或 /skills |
与 AGENTS.md 体系配合使用 |
| Cursor | .cursor/skills |
Rules 面板 | 更偏向规则注入,自动匹配为主 |
| 开源框架 | 各不相同 | 按框架文档 | 目录结构更灵活,但标准不统一 |
后面我会以 Claude Code 的目录约定为主线来演示安装和编写,因为它的生态最丰富、社区 Skills 数量最多。第四节末尾再单独讲一下 Codex 的差异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前必须确认的事:环境版本、目录位置和命名规则
2.1 先检查版本,别装完了才发现不支持
不管是装现成 Skills 还是自己写,第一步都应该是确认你的 CLI 工具版本够新。以 Claude Code 为例,安装后先跑一下:
bash复制claude --version
如果版本比较老,建议先升级到最新稳定版。原因是 Skills 功能在早期版本里只支持项目级目录,全局目录支持是后来才加的;还有一些版本对 SKILL.md 的 frontmatter 字段解析比较严格,写错一个字段就直接不加载,且不报明显错误。这个坑我踩过不止一次,所以建议养成"先升级再折腾"的习惯。
接着可以进交互界面确认 Skills 入口是否存在:
bash复制claude
# 进入后输入
/skills
如果命令不存在,大概率是版本太旧,或者安装路径有问题。先处理环境,再继续下面的步骤。
2.2 目录位置是最大的坑:全局和项目级别放反
Skills 的目录约定在 Claude Code 里分两层:
- 全局 Skills:放在
~/.claude/skills/下,对所有项目生效。 - 项目级 Skills:放在
<项目根目录>/.claude/skills/下,只对当前项目生效。
我见过大量"我明明装了为什么不生效"的提问,排查到最后基本都是目录放反了。比如把某个团队内部规范类的 Skill 放进了全局目录,结果所有项目都会被它的 description 干扰;把通用型的 Skill 放进了某个项目目录,换个项目就找不到。
实际使用我建议这样规划:
- 通用能力(比如 Git 提交信息规范化、会议纪要整理)放全局。
- 跟当前项目强相关的(比如这个项目的架构审查规范、特定框架的迁移步骤)放项目级。
- 如果同一个 Skill 既要全局又要项目级,就做一份拷贝放到项目级,让项目级覆盖全局,避免两边不一致。
2.3 命名规范:小写、连字符、无空格
每个 Skill 文件夹的名字就是它的唯一标识,会被 Agent 用于识别和触发。命名不规范会导致两个问题:一是自动匹配时模型难以把它和用户意图对应起来;二是在 /skills 列表中显示混乱。
规范很朴素:
- 全部小写。
- 单词之间用连字符
-或下划线_连接,社区常用连字符。 - 不要用空格、中文、特殊符号。
举例:pdf-summarizer、commit-message-checker 都是好名字;PDF Summarizer、汇总工具 这种就不行。
注意:如果你从社区仓库下载的 Skills 文件夹名字和
SKILL.md里 frontmatter 的name字段不一致,以name字段为准,但文件夹名最好也改成一致。不一致会导致某些工具在加载时出现混乱。
3. 第一次实操:从社区仓库装一个现成 Skills 并验证生效
3.1 去哪找靠谱的 Skills 仓库
现在社区里 Skills 的数量已经很多,但质量参差不齐。我常用这几个渠道:
- GitHub 上的聚合仓库,比如
awesome-claude-skills、awesome-ai-skills这类列表项目,star 多、维护频繁,里面有按场景分类的链接。 - 官方示例仓库,比如 Anthropic 官方放出的 skills 示例,质量最稳,适合当模板学习。
- Skills Hub 类的浏览站点,有些做了可视化页面,能直接看到每个 Skill 的说明和目录结构。
选 Skills 时我的判断标准有三个:更新时间(超过一年没更新的基本不要碰,模型和工具变化太快)、SKILL.md 是否规范(直接点进去看 frontmatter 和正文结构)、脚本是否透明(凡是带可执行脚本的,先看一遍内容再决定装不装)。
3.2 最稳妥的安装方式:git clone 而不是复制粘贴
虽然市面上已经出现了一些一键安装工具,但我更推荐手动 git clone。原因有三:
- 后续升级方便,
git pull拉到最新版即可。 - 你可以 fork 一份自己维护,针对项目需求做微调,改动不会丢失。
- 手动 clone 能让你看清楚这个 Skill 的真实目录结构,避免"盲装"带来的安全隐患。
具体步骤:
bash复制mkdir -p ~/.claude/skills
cd ~/.claude/skills
git clone https://github.com/your-name/some-skill.git
clone 完之后一定要检查一下目录层级。很多仓库会把 SKILL.md 放在子目录里,比如 some-skill/src/SKILL.md,而约定要求是 some-skill/SKILL.md。遇到这种情况,要么把文件挪到正确位置,要么 clone 时只取子目录内容。
标准目录结构是:
text复制~/.claude/skills/
└── some-skill/
├── SKILL.md
├── scripts/
│ └── run.sh
└── assets/
└── template.md
3.3 验证是否生效:从 /skills 列表到一次真实任务
装完之后,进入 Claude Code 交互界面,输入:
text复制/skills
列表里应该能看到刚装的 Skill 名字。这一步只说明"目录被识别了",还不能说明"触发没问题"。
更有效的验证方式是拿一个真实小任务去试。比如装了一个 commit-message-checker,就随便找个仓库,对 Agent 说:"帮我生成最近几条提交的规范提交信息。"观察它是否自动读取了该 Skill 的说明并按步骤执行。
如果 /skills 列表里没出现,最可能的原因就是层级多套了一层,或者 SKILL.md 的 frontmatter 格式有问题。打开文件检查 YAML 部分,确认 name 和 description 字段都在,且没有排版错误。
4. 手写第一个自定义 Skill:从需求拆解到文件落盘
4.1 Skill 最小文件结构:SKILL.md 是灵魂
社区里大部分 Skill 都可以精简成这个文件结构:
text复制my-skill/
├── SKILL.md
└── scripts/
└── main.sh
其中 SKILL.md 是灵魂,它由两部分组成:
- YAML frontmatter:用
---包裹的元信息,至少包含name和description。 - 正文 Markdown:告诉 Agent 这个 Skill 到底怎么用、有哪些步骤、有什么注意事项。
frontmatter 示例:
yaml复制---
name: meeting-summarizer
description: 将会议转写文本整理为结构化会议纪要,提取结论、待办、风险、负责人和截止时间。当用户提供会议记录或要求整理会议纪要时使用。
---
description 是最关键的信息位。它不只是给人看的说明,更是 Agent 做意图匹配的主要依据。写法上要满足三个条件:
- 说明适用场景和触发条件。
- 包含用户可能说的动词和名词,比如"整理""生成""会议纪要""meeting notes"。
- 保持客观,不要堆形容词。
4.2 一个完整示例:会议纪要与行动项提取 Skill
我拿一个工作中很常用的场景来讲——会议纪要整理。
先建目录:
bash复制mkdir -p ~/.claude/skills/meeting-summarizer
然后创建 SKILL.md:
markdown复制---
name: meeting-summarizer
description: 将会议转写文本整理为结构化会议纪要,提取结论、待办事项、风险项、负责人和截止时间。当用户提供会议记录、转写文本,或要求"整理会议纪要""生成会议总结"时使用。
---
# 会议纪要与行动项提取
## 适用场景
- 用户贴了会议转写文本,要求整理成纪要。
- 用户要求从聊天记录中提取行动项。
## 执行步骤
1. 读取用户提供的会议转写文本,识别议题和讨论主线。
2. 将内容分类:背景、结论、待办、风险、遗留问题。
3. 输出 Markdown 格式会议纪要,包含以下小节:会议主题、背景、讨论摘要、结论、待办事项、风险项。
4. 待办事项按负责人分组,每条标注截止时间;没有截止时间的写 TBD。
5. 如果原文存在决策,补充决策人和决策理由。
## 注意事项
- 只输出整理后的纪要,不要添加原文没有的信息。
- 如果原文信息不足,在对应小节标注"信息缺失"。
- 使用中文输出,保留原文中的专有名词。
接着可以建一个 scripts/ 目录,放一个简单的脚本用于提取关键词(按需扩展),但纯说明类 Skill 不强求脚本。如果任务只涉及文本整理,不建议写脚本,反而增加维护成本。
创建完后,进入 Claude Code 测试。给 Agent 一段模拟会议记录,说"帮我整理成会议纪要"。如果 Skill 生效,输出应该严格匹配 SKILL.md 里的步骤和格式。
4.3 加入可执行脚本:让 Skill 从"会读"变成"会做"
有一部分任务光靠文字说明不够,需要确定性执行。比如"统计当前仓库最近 30 天的代码行数变化"这种任务,如果让模型自己发挥,它可能会用不同命令,得到不稳定结果。这种情况下,把执行逻辑写进脚本,再在 SKILL.md 里引导 Agent 去调用脚本,结果就可复现了。
以一个"生成 Git 周报" Skill 为例:
bash复制#!/usr/bin/env bash
# scripts/generate_weekly_report.sh
# 统计当前用户最近 7 天的提交,按仓库分组输出
cd "$(git rev-parse --show-toplevel)" || exit 1
REPO_NAME=$(basename "$PWD")
echo "## 仓库: $REPO_NAME"
git log --since="7 days ago" --pretty=format:"%h|%an|%ad|%s" --date=short --author="$(git config user.name)"
然后在 SKILL.md 的执行步骤里写明:
markdown复制## 执行步骤
1. 运行 `bash scripts/generate_weekly_report.sh` 获取最近 7 天提交记录。
2. 将输出整理成 Markdown 周报。
到这里,这个 Skill 既有文档说明,又有固定脚本,质量已经超过大部分社区仓库里的半成品了。写完之后不要忘记做一次回归测试——换一个仓库、换一个场景再试,确保脚本里的路径逻辑不是写死的。
5. 让 Agent 真正"用起来":触发机制、上下文窗口与调试方法
5.1 description 是触发命中的头号因素
很多用户反馈"明明装了 Skill,但 Agent 好像根本不知道它存在"。这个问题的根源绝大多数在 description 写得不够好。
Agent 在对话中的行为是:每轮都可能根据当前上下文决定要不要加载某个 Skill。它读取的是 Skill 的 name 和 description,而不是正文全文。所以在模型眼里,description 就相当于这个 Skill 的"简历",简历写得模糊,它就不会被邀请来干活。
写 description 我总结了一个公式:
功能定义 + 适用场景 + 用户可能的表达 + 使用条件
举个例子,不要写"这个技能用于处理 PDF",而要写"提取 PDF 文件中的文字、表格和图片位置信息,输出为 Markdown。当用户要求'读取 PDF'、'解析 PDF'、'把 PDF 转成 Markdown'时使用。"
这样写的好处是,模型在做语义匹配时,容易把用户的自然语言和 description 里出现的动作词对应上。
5.2 调试 Skill 的三种手段
我自己调试 Skill 时,按顺序尝试这三种方法:
- 检查加载状态。在 Claude Code 里输入
/skills,确认列表显示正常。 - 点名强制触发。直接说"使用 meeting-summarizer 来处理这段会议记录",跳过自动匹配。如果点名后仍不生效,问题基本出在文件结构、frontmatter 或版本支持上;如果点名后生效但自动触发不生效,问题出在 description。
- 观察执行过程。让 Agent 逐步输出它读取了什么文件、执行了什么命令。看它是不是真的走了 SKILL.md 里写的步骤。
一次典型的排查经历:我写了一个 code-review Skill,第一次测试时点名触发有效,但自动触发始终不命中。我对照了一下 description,发现里面写的全是"该技能可进行代码审查",缺少用户表达中常见的动词。改成"当用户要求审查代码、检查代码质量、Review PR 或分析代码问题时使用"后,自动触发立刻正常了。
5.3 控制 Skill 的体积:别把整个知识库塞进一个文件
有个容易忽视的问题:**Agent 触发 Skill 时,通常会把 SKILL.md 全文读入上下文窗口。**这意味着你写的内容越多,留给实际代码和对话的上下文就越少。
我把 SKILL.md 的篇幅经验值定为 100 到 300 行。一旦超过这个量级,就应该拆分:把详细模板放 assets/ 目录,把可执行逻辑放 scripts/ 目录,在 SKILL.md 中只保留"何时用、怎么用、调什么脚本"。
比如前文那个 Git 周报 Skill,如果把周报模板写在 SKILL.md 里,大约 50 行;优化后正文只有 15 行,模板放 assets/weekly_report_template.md,正文里引导 Agent "按模板输出" 就行。这样既不影响功能,又节省了上下文。
6. 绕开这些坑:权限、路径与版本兼容性排查清单
6.1 脚本执行权限:Windows 和 Linux/macOS 的处理不一样
Skill 里的脚本,在 Linux/macOS 下要执行通常需要加执行权限:
bash复制chmod +x scripts/*.sh
不加权限会导致 exec format error 或 permission denied。在 Windows 上用 Git Bash 或 WSL 时,更推荐用 bash scripts/xx.sh 这种方式调用,而不是直接执行脚本文件,这样能绕开权限模型差异。
另外注意:claude 在 Windows 上跑的 shell 环境可能是基于 PowerShell 的,bash 命令未必存在于 PATH 中。如果 SKILL.md 里写了 bash 调用,建议在说明里加一句"若在 Windows 环境,请使用 Git Bash 执行"。
6.2 相对路径和绝对路径的取舍
一个我反复遇到的问题:SKILL.md 里写了脚本路径 scripts/generate.sh,但 Agent 执行时的当前工作目录可能不是 Skill 目录——在项目里运行 Claude Code 时,当前目录通常是项目根目录。此时直接执行相对路径会找不到脚本。
两种解决方案:
- 在 SKILL.md 里写清楚"先进入 Skill 目录再执行"。
- 在脚本内部自行定位目录,比如用 Bash 里这句经典写法:
bash复制SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
然后在脚本里所有引用都基于 $SCRIPT_DIR。这样无论 Agent 在哪个目录调用,都不会路径错乱。
6.3 工具版本升级后 Skills 失效怎么办
Claude Code、Codex 这类工具迭代速度很快,模型也会不定期更换。升级后 Skills 失效,常见原因有三个:
- frontmatter 字段要求变了。比如某些早期版本支持
description为空,新版要求必须非空。 - 目录约定变了。比如从
.claude/skills改成其他位置。 - 模型行为变化。新版模型对长文档的遵循能力可能更强或更弱,导致原来能自动触发的 Skill 突然不触发了。
应对办法是建立定期检查机制。我每两周会跑一遍 /skills 列表,挑几个核心 Skill 做一次快速冒烟测试。工具升级日志里只要看到 "skills" 相关变更,就立刻重测。
6.4 安全提醒:第三方 Skill 会执行本机代码
最后说一个必须重视的点:**装第三方 Skill 不只是装一份说明书,它可能带着脚本在你的机器上执行。**尤其是从陌生仓库下载的 Skill,先用编辑器把 SKILL.md 和所有脚本浏览一遍,确认没有可疑命令再使用。
我给自己的安全底线是:
- 只看源码,不用压缩包盲装。
- 带 curl/pip install 之类网络下载命令的脚本,先逐行看懂。
- 涉及密钥、token、环境变量的 Skill 一律不装,除非核心逻辑完全自己可控。
写在后面:我的一点实战体会
Skills 这套机制上手其实不难,真正拉开差距的是"会不会把方法论沉淀成 Skill"以及"会不会维护自己的 Skills 库"。我个人的习惯是:每遇到一次"让 Agent 折腾了半小时才做对"的任务,就抽时间把它固化成一个 Skill,下次再遇到直接触发。几周下来,你的 Skills 库就是一套专属于你和团队的 AI 工作手册。
先别急着一次装几十个 Skill,从两三个高频场景开始,跑通了再慢慢扩展。装得多不如装得准——这个道理,在 Skills 上面体现得尤其明显。
