上周同事问我为什么准备客户拜访材料那么快我说不是我手快是把重复工作交给了几个开源的Skills。他当时一脸疑惑等我把笔记整理、客户会议准备、查数据、做演示、配图这五个场景挨个演示了一遍他也开始往自己的工具链里装。这篇就把这5个实用开源Skills的选型思路、实际用法和踩过的坑整理出来给正在用Claude Code、Codex或OpenCode这类Agent工具又被重复劳动困住的朋友一个参考。1. 先弄清楚Skills是什么不是插件不是提示词也不是脚本先把这个概念理清楚不然后面安装和排查问题时会绕弯子。市面上讨论Agent时经常把Skills和Plugin、MCP工具、提示词模板混在一起说实际它们的定位完全不一样。1.1 Skills的构成SKILL.md、脚本和资源文件一个Skill本质上是一个目录里面包含一份SKILL.md说明文件和若干辅助资源核心是告诉Agent“在什么情况下、按什么步骤、调用什么工具完成一类特定任务”。我本地的Skills目录会长这样meeting-prep-skill/ ├── SKILL.md ├── scripts/ │ ├── fetch_company_news.py │ └── build_agenda.py └── assets/ └── agenda_template.mdSKILL.md是灵魂用Markdown编写通常带一段YAML格式的元信息。Agent读到这里就知道这个技能是干什么用的以及应该什么时候触发它。下面是典型的元信息--- name: meeting-prep description: 输入客户公司名称或官网生成客户会议准备包 when_to_use: 当用户需要准备客户拜访、客户会议或商务洽谈时 ---这里的关键在于Agent不是所有时候都会调用这个Skill它靠描述里的关键词来匹配。描述写得太宽Agent会频繁误触写得太窄该用的时候又不会触发。我一般会在描述里写清“输入是什么、输出是什么、什么场景用”让匹配准确率尽量高。1.2 为什么Skills现在这么火一次封装处处复用我个人的理解Skills火起来是因为它解决了提示词工程的复用问题。以前我把一套会议准备流程写在提示词里每次用都要复制粘贴还经常因为上下文太长被截断。写成Skill之后Agent自动在合适的时候加载与任务相关的那一份说明既不占上下文又能保证每次按固定步骤执行。它跟MCP工具也不是替代关系。MCP解决的是“Agent能不能做到某件事”比如能不能访问数据库、能不能搜索网页Skills解决的是“Agent知不知道该怎么做好这件事”。好的组合方式是Skill脚本里调用MCP工具把外部能力串进固定流程里。后面我会专门讲这两者怎么配。2. 整理笔记的Skill把碎片信息自动归位先说笔记整理这个场景。我的笔记来源很杂临时记的Markdown文件、网页剪藏、会议记录、随手截图里的文字。以前每周手动整理一次每次都得花一个多小时而且越积越不想动。2.1 一个笔记整理任务的前后对比装上笔记整理Skill之后我现在只需要在Agent对话里说一句“整理一下我的notes目录先dry-run”它就会扫描目录下所有Markdown文件测出主题、生成标签建议、找出重复内容然后输出一份整理计划。计划里会写明准备把哪个文件移动到哪里、给哪些文件补frontmatter、建议新建什么索引全部确认后我再让它执行。整理前我的目录是一堆无规则文件比如新建文档 12.md、想法.txt、关于那个啥的笔记.md。整理后文件会按主题分到notes/ai-agents/、notes/customer-visits/这样的目录下每个文件头部带上时间、标签和摘要根目录生成一份index.md汇总索引。2.2 调用方式与内部流程这个Skill的内部逻辑其实不复杂但顺序很要紧。它会先跑一个Python脚本扫描目录提取每个文件的基础信息然后把文件名列表交给Agent让它结合文件内容推断主题最后脚本根据Agent给出的分类建议执行移动和重命名操作。关键是扫描和分析两步之间一定要让Agent看到文件内容而不是只根据文件名猜。我常用的调用方式有两种。一种是在对话里用自然语言触发“整理notes目录重点关注本周新增的文件”另一种是直接跑脚本python scripts/scan_notes.py --input ./notes --dry-run--dry-run参数非常重要。第一次跑的时候它会先生成一份重命名和移动方案而不是直接改文件。我建议所有整理类Skill都保留这个参数让人工确认一步避免AI把文件名改得莫名其妙。2.3 中文笔记环境里的三个坑笔记整理实际用下来有三个坑最典型第一个坑是文件名编码和超长问题。系统里经常有包含空格、中文标点、特殊符号的文件名脚本处理不当会出现乱码或者路径解析错误。我的方案是统一走Python的pathlib文件操作全部用Path对象避免直接拼接字符串。第二个坑是自动改正文内容。有些笔记Skill会顺手把正文里的结构也改了这在个人笔记上问题不大但如果是团队共享的文档目录改坏了很难恢复。我要求Skill默认只动frontmatter和文件位置不修改正文内容需要改正文时单独询问。第三个坑是关联关系幻觉。AI在整理索引时经常会把“看起来内容相似”的笔记强行关联成“相关笔记”实际上只是用了相近的关键词。生成的双向链接里有不少是错配。现在我的习惯是让Skill先生成链接建议我确认过再写入不直接自动建立大量link。3. 客户会议准备Skill从空白页面到完整会议包见客户最烦的不是聊天而是准备阶段。以前我见一个陌生客户至少要花半天去查公司背景、最近的新闻、组织架构、可能的决策链再自己拼一份议程。客户会议准备Skill就是来解决这件事的。3.1 会议包应该包含哪几块一个完整的客户会议准备包我按这四块来组织客户背景摘要公司主营方向、规模、近年动态、所在行业的挑战决策链与关键人从公开资料里能推断出的组织架构信息列出可能参与会议的角色会议议程草案按时间块划分的议程包含每个环节的目标和时长常见异议与应答要点站在客户角度可能会提的疑问以及我方回应时可以参考的话术这个Skill输入很简单只需要给一个公司名称或者官网地址最多再加一个希望会议覆盖的主题方向。它会把公开信息收集、整理、成稿这套流程全部接过去。3.2 执行顺序是防幻觉的关键我踩过最大的坑是顺序问题。第一版这个Skill拿到客户名字后直接让AI“生成”一份会议包结果里面提到的客户新闻、口号、甚至联系人职位都是编的样子很好看但根本不能用。后来我把执行顺序硬性固定了先做事实收集再做分析输出。具体分成三步通过搜索相关工具抓取客户官网、新闻页面、招聘信息把原始链接收集下来从原始材料里摘取事实每条事实都记录来源最后基于事实清单生成背景摘要和议程遵守这个顺序之后编造内容的情况少了非常多。同时我还在SKILL.md里加了一条很强的规则对于找不到明确来源的信息必须返回“未知”而不是推测。宁可让报告里出现“未知”也不要让AI编出一个听起来顺理成章的答案。3.3 结合CRM历史的进阶用法只靠公开信息还不够因为老客户的情况主要存在CRM里。我现在会把CRM导出的表格作为附件一起提供让Skill把上一轮的会议纪要、未完成事项、客户提出的问题并进来这样生成的议程会更有针对性。比如上一轮客户提到“对当前方案的权限管理不满意”Skill在生成议程时会自动把“权限方案演示与确认”排进去还会在异议应答里准备对应的解释材料。这一步带来的提升比公开信息搜索更明显毕竟存量客户的信息才是最有价值的。一个小提醒客户公司的人事变动比AI训练数据新很多尤其是职位和决策链信息。我习惯在会议前一天重新跑一次这个Skill确保用的不是几个月前的旧信息。4. 查数据Skill用自然语言替代每次手写SQL数据分析这个场景几乎每个团队都有。以前要么找数据同学帮忙跑数要么自己打开数据库写SQL光搞清楚表结构就要花不少时间。查数据Skill解决的正是这个链条里的“理解库结构”和“生成正确查询”两个环节。4.1 查数Skill与聊天窗口里的“直接问”有什么不同如果你只是把数据库建连信息贴给Agent然后问“本周新增用户多少”它有可能会成功。但问题在于没有任何约束Agent可能去猜字段名、可能全表扫描、可能把敏感字段带出来。查数据Skill做的事情是加了一层护栏一本数据结构说明。它会先请求数据库返回schema列出主要表和字段再根据用户问题生成SQL最后以受限的方式执行。如果遇到字段名不一致它不会瞎猜而是会查看表注释或者返回可能匹配的字段列表让用户确认。比如我问“本月各区域销售额占比”Skill的流程是列出与订单、区域相关的表检查这些表的字段注释生成一条带区域维度的聚合SQL执行并输出Markdown表格结果把“这个结果说明了什么”的分析附在后面4.2 一个安全的连接与执行配置我把配置都放在环境变量里不写进Skill文件export DB_HOSTlocalhost export DB_PORT5432 export DB_NAMEanalytics export DB_USERreadonly_user export DB_PASSWORD****** export QUERY_TIMEOUT15注意这里用的是readonly_user这是最重要的一条。查数据Skill连接数据库一定要用只读账号从机制上杜绝Agent执行UPDATE或DELETE语句的可能。数据库端还要设置statement_timeout或查询超时时间避免复杂查询把线上库拖垮。如果建账号不方便至少要在Skill的脚本里做两层检查先解析SQL发现非SELECT开头就拒绝执行再统一给查询加上LIMIT并且不允许通过子查询绕过。4.3 大表和敏感字段的处理经验实际用下来有几个经验值得分享。第一Schema很大的时候不要让Agent一次看所有表。很多数据库有几百张表上下文塞不下也容易分析混乱。我在Skill里加了一步先只列出与问题可能相关的表名再针对这些表读取字段信息。第二大表一定要自动加限制。比如查“用户表里有多少人”如果不加LIMITAgent可能会尝试把整个表拉下来再计数。正确做法是让Skill识别聚合类查询允许全表聚合但拒绝不带聚合条件的明细查询。第三敏感字段要脱敏。Skill在返回结果前会检查列名碰到手机号、邮箱、身份证这类字段时自动做打码处理。这一点在团队里多人共用同一套查数入口时特别重要不然一个数据分析入口很容易变成数据泄露通道。5. 演示文稿Skill先大纲、后页面输出可编辑PPTX做演示是很多人高频需求但我看到的大部分AI直接生成PPT的方案都不太靠谱。要么生成的是网页版幻灯片要么是纯图片不能编辑改一个错别字都得重来。我用的演示文稿Skill走的是“先大纲、后渲染”的路线。5.1 为什么不用“一句话生成整份PPT”第一版我也试图让AI直接一口气生成完整PPT效果很差。原因很简单PPT的结构决策和内容填充是两件事混在一起做AI既没想清楚逻辑又会写出大段文字填满页面。现在这个Skill分两步走。第一步先根据用户给出的主题生成大纲包含页码、每页标题、每页要点和备注提示。大纲输出后用户先审阅修改确认不需要大调后才进入第二步。这样看似多了一个环节实际上总耗时反而更短因为后期返工少了。5.2 渲染阶段的技术选型渲染阶段我见过几种方案评估下来最省事的是通过python-pptx直接生成可编辑的.pptx文件。它虽然不能做出花哨的视觉效果但能保证每一页都是原生文本框和形状客户拿过去能直接改。另一种方案是用Marp把Markdown转成HTML格式的slide适合个人演示和纯技术分享如果公司内部要求统一PPT模板就得用python-pptx套模板把模板页复制出来再往指定位置填文字。下面是一段用python-pptx生成基础页面的核心代码from pptx import Presentation from pptx.util import Inches prs Presentation() slide_layout prs.slide_layouts[1] # 标题和内容版式 slide prs.slides.add_slide(slide_layout) slide.shapes.title.text 示例标题 slide.placeholders[1].text 第一段要点\n第二段要点 prs.save(output.pptx)这只是一个简单示例实际Skill里会把大纲里的每个page标题和要点逐一映射到对应的版式和占位符中。关键是输出结果一定记得用Python重新打开检查一遍因为偶尔会遇到“文字超出了文本框边界”或“第二页占位符缺失”这类渲染问题。5.3 让演示文稿像“人做的”的细节AI生成的PPT最容易被看出AI痕迹的问题有三个文字太多、字体不统一、配色混乱。文字太多是最典型的。Skill里我会限制每一页的正文要点不超过4条每条不超过20个字详细的解释放到演示者备注里。这样页面干净演示者也有讲稿可用。字体方面中文环境建议在模板中统一设置为思源黑体或系统自带的微软雅黑。python-pptx生成的中文文本如果不显式设置字体容易落到默认字体上不同电脑打开效果差别很大。配色方面最简单的方式是把公司或团队的主题色写进Skill的配置文件所有页面都从这套颜色里取色。这样即使页面结构很朴素整体观感也会比五颜六色的方案好很多。6. 配图Skill搜图、生成、压缩和版权检查一体化配图看起来不是硬核工作但真正做内容的人知道它有多琐碎。找图、改尺寸、压缩、写Alt文本、确认版权每一步都耗时间。配图Skill把这些步骤串成了一条流水线。6.1 配图这件琐碎活到底琐碎在哪以前给一篇技术文章配图我至少要经历根据段落内容想关键词、到图库网站搜索、筛选风格匹配的图、下载后裁剪大小、压缩体积、写一句合适的Alt文本、记录图片来源和许可协议。这一套流程下来一篇长文配5张图半小时就没了。配图Skill的用法是直接告诉它“给这篇文章配图内容是关于Agent工作流的输出图片文件和说明”它会自动做下面这些事阅读文章或给出的提纲提取每一段的关键主题为每个主题生成图片检索词或文生图提示词调用图库接口搜索CC0或可商用许可的图片或者调用本地文生图模型生成批量裁剪到统一宽度、压缩体积、重命名生成一份图片清单包含文件名、建议插入位置、Alt文本、来源链接、许可类型6.2 一次实际出图过程我在一次社区分享的幻灯片里用过这个流程。文章标题是“让Agent按流程干活”我给Skill的指令只有一句话“为这篇分享配5张配图主题包括工作流、自动化、人机协作。”它返回的结果是[ { filename: workflow-map.png, alt_text: 带有分支节点的流程示意图表示Agent按步骤执行任务, source: https://example.com/photos/flow.png, license: CC0, insert_after: 第2页Skills工作原理 }, { filename: automation-levers.png, alt_text: 多块控制开关的抽象图表示自动化控制, source: https://example.com/photos/levers.png, license: CC BY 4.0需署名, insert_after: 第5页一次封装处处复用 } ]输出格式统一之后我插入图片时只需要照着清单操作Alt文本和许可信息直接复制就能用省了很多事。6.3 版权与风格统一的红线配图这块有两条红线碰一次就会很麻烦。第一条是版权。图库网站上标注“免费”不代表可以商用更不代表可以二次修改。Skill里检索图片时会过滤许可类型只保留CC0、CC BY或明确允许商用的素材。CC BY系列记得保留署名信息这是许多人容易忽略的。第二条是风格统一。一篇文章里如果出现照片、插画、扁平图标三种风格观感会很碎。我会在Skill配置里写死风格偏好比如“扁平插画风、低饱和色、无文字水印”这样生成或筛选出的图片才能保持一致。另外文生图模型生成图片时要注意别让模型生成与真实品牌、真实人物相关的形象容易踩到肖像权和商标权的坑。配图Skill在提示词里加了负向过滤词同时生成后由人工过一眼再使用。7. 安装与调用中的高频坑环境、权限、路径和MCP就算Skill本身写得再好安装和调用环节出了岔子也会让人劝退。这部分把我自己踩过的或者帮朋友排查过的问题集中列一下基本都是常见场景。7.1 依赖与权限问题多数Skill依赖Python或Node环境还牵扯到一些系统命令。如果脚本是用Python写的建议新建独立虚拟环境不要直接装到系统环境里避免版本冲突。更隐蔽的是执行权限问题。在Linux或macOS上如果脚本没有可执行权限Agent调用时会直接报“Permission denied”。装完Skill后第一件事就是执行chmod x scripts/*.shWindows环境下的处理方式不同通常是用git bash或wsl跑这些脚本。如果你用的框架只支持Windows原生环境那配置起来会多花一些时间。7.2 中文路径和编码问题这恐怕是国内用户最常踩的坑。很多开源Skill是在英文环境下开发的对中文文件名、中文路径、UTF-8 BOM这些情况没做处理。我的经验是安装Skill时尽量把路径改简单比如C:\Users\你的名字\skills这类包含中文用户名的路径容易在脚本解析时出问题。虽然现在大部分脚本已经能处理Unicode路径但没必要给自己增加不确定性。如果你的笔记文件是中文名记得在Skill脚本里强制指定文件读写编码为utf-8。有个细节Windows下部分编辑器保存的Markdown文件带BOM头脚本读取时第一行会多出\ufeff字符解析frontmatter时容易报错。可以在读文件时用encodingutf-8-sig来兼容。7.3 Skills与MCP工具的配合再说Skills和MCP工具的关系。两者可以在一个任务里协同工作但前提是配置准确。Skill脚本里如果要调用MCP工具需要声明清楚需要哪个工具并且保证MCP服务已经在后台启动。我遇到过一种情况Skill的脚本依赖数据库MCP服务但MCP服务没启动Agent试了两次之后干脆绕开数据库开始编数据。这个问题很危险。后来我在SKILL.md里加了一条规则“依赖的MCP工具不可用时必须明确告知用户工具未就绪并停止任务而不是猜测或编造结果。”下面用一个表整理常见问题和处理方式方便排查问题现象处理办法Skill不触发用户按场景描述需求Agent没有加载该Skill检查SKILL.md的description关键词尽量覆盖更多同义表达脚本报权限错误终端提示Permission denied设置脚本可执行权限Windows用git bash运行中文文件名乱码输出文件名为乱码或路径解析失败统一UTF-8编码使用pathlib处理路径MCP工具未启用脚本需要调数据却拿不到结果检查MCP服务状态SKILL.md中注明依赖Agent绕过脚本结果格式和脚本输出不一致在SKILL.md中强调必须调用脚本不允许自行生成结果8. 从“用别人的”到“写自己的”一个最小Skill的诞生用了几个开源Skills以后你就很难忍住不写自己的。实际上写一个最小Skill并不难也不需要会写多复杂的代码关键是理解SKILL.md的编写逻辑。8.1 最小可用的SKILL.md长什么样我拿一个最简单的场景举例给单篇Markdown笔记生成标题建议和标签。目录结构如下title-tagger/ ├── SKILL.md └── scripts/ └── tag_note.pySKILL.md内容可以写成这样--- name: title-tagger description: 为Markdown笔记生成3个标题候选和5个标签当用户说“帮我起个标题”或“给这篇笔记加标签”时使用 when_to_use: 用户整理笔记、写文章需要标题或标签建议时 --- ## 执行步骤 1. 读取用户指定的Markdown文件内容 2. 运行 python scripts/tag_note.py 文件路径 3. 根据脚本输出的关键词给出3个标题候选和5个标签 4. 如果用户要求直接写入文件询问是否替换原有frontmatter这里最核心的写法是把步骤写清楚让Agent照着走。不要让它自由发挥而是把每一步都固定下来。8.2 测试思路写完Skill之后测试比编码更需要耐心。我的做法是准备三组样例输入一组是典型输入验证正常流程一组是边界输入比如空文件、纯图片文件一组是诱导输入试图让Skill删文件或者绕过步骤验证规则是否牢靠。测试时加--debug参数观察Agent的思考轨迹能看到它读SKILL.md之后是否理解了步骤还是跳过了某些操作。如果发现Agent经常不按SKILL.md执行多半是描述写得不够明确需要把步骤写得更细甚至明确禁止某些做法。8.3 发布与分享的建议如果你觉得自己的Skill确实好用可以把它发布到开源社区。发布时不要只丢一个代码包至少要配一个简短的README写清楚适用场景、输入输出格式、依赖环境和几个示例。我自己挑选开源Skills时最关注的就是README里有没有给出真实调用示例没有示例的项目一律不装因为看不懂它到底能干什么。版本管理上也建议从一开始就纳入Git管理每次改动记录清楚。Skills这类的“经验沉淀”最怕就是改着改着忘了当初为什么这么设计有提交历史会好很多。一个实践方法是每当你在实际工作中发现某个重复性任务已经有固定步骤就试着把它写成一个新Skill或者改进现有的Skill。我现在的习惯是每周五下午花三十分钟复盘这一周里哪些事情是反复做的然后沉淀到Skill里。别追求一次性自动化率100%哪怕每次只省十分钟十个Skills累积下来就是很可观的时间。真正有价值的不是那些花哨的功能而是你把“知道怎么做”这件事固定了下来之后每次执行都不会再把同样的错误。