Codex 插件开发教程:从 Skill 到 Plugin 的完整实践
Codex 插件不是“多写一个提示词文件”这么简单。
它更像一个可安装的能力包:
1 | 把可复用工作流、技能、MCP 工具、应用集成和展示信息打包起来 |
如果只是给当前项目加几条长期规则,写 AGENTS.md 就够了。
如果只是给自己沉淀一个小工作流,写一个 Skill 也够了。
但如果你希望这个能力能被安装、分发、展示在 Codex 插件目录里,或者想把多个 Skill、MCP 配置、应用集成打包在一起,就应该考虑做成 Plugin。
本文基于 2026-06-16 的 Codex 官方 manual 和本地 @plugin-creator 规范整理,讲一个从零开发 Codex 插件的完整流程。
一、先分清 AGENTS.md、Skill 和 Plugin
这三个东西经常被混在一起。
但它们的定位不同。
1. AGENTS.md
AGENTS.md 适合写当前仓库的长期约定。
比如:
1 | 使用 pnpm |
它解决的是:
1 | 这个仓库里,Codex 应该一直遵守什么规则。 |
2. Skill
Skill 适合写一个可复用任务流程。
比如:
1 | 写 SEO 文章 |
Skill 本质上是一个目录,里面有 SKILL.md,也可以带脚本、模板和参考资料。
最小结构:
1 | my-skill/ |
SKILL.md:
1 | --- |
Skill 解决的是:
1 | 让 Codex 在某类任务上按固定流程工作。 |
3. Plugin
Plugin 是可安装的分发单元。
它可以包含:
- 一个或多个 Skill
- MCP server 配置
- app integration 配置
- assets 展示资源
- 插件名称、版本、描述、展示信息
- marketplace 条目
Plugin 解决的是:
1 | 把一组能力打包起来,方便安装、共享和管理。 |
我的建议是:
1 | 先写 Skill |
不要一上来就为了“看起来完整”写插件。
插件适合稳定能力,不适合频繁变动的草稿。
二、什么时候应该开发插件
适合做成插件的场景:
- 你写了多个相关 Skill,想统一安装
- 团队里多人都要用同一套工作流
- 需要绑定 MCP server,比如文档搜索、Figma、浏览器、内部系统
- 需要连接外部 app,比如 GitHub、Slack、Google Drive
- 希望在 Codex app 插件目录里展示和分享
- 希望通过 marketplace 管理安装来源
不适合做成插件的场景:
- 只是当前仓库的一条规范
- 只是一次性提示词
- 工作流还没稳定
- 没有复用价值
- 不需要安装和分发
一个简单判断:
1 | 如果只有你在一个项目里用,先写 AGENTS.md 或 Skill。 |
三、插件的最小目录结构
一个最小 Codex 插件可以长这样:
1 | my-first-plugin/ |
其中最重要的是:
1 | .codex-plugin/plugin.json |
这是插件 manifest。
一个最小示例:
1 | { |
name 建议使用 kebab-case:
1 | my-first-plugin |
不要用空格,不要随便改名。
Codex 会把插件 name 当作插件标识和组件命名空间。
四、添加第一个 Skill
创建 Skill 目录:
1 | mkdir -p my-first-plugin/skills/hello |
创建:
1 | my-first-plugin/skills/hello/SKILL.md |
内容:
1 | --- |
这里最关键的是 description。
Codex 会根据 Skill 的描述判断什么时候加载它。
写 description 时不要太虚:
1 | 帮助用户提高效率 |
这种描述太泛。
更好的写法是:
1 | 当用户需要把一段接口说明转换成 OpenAPI 草稿时使用。 |
触发场景越清楚,Codex 越容易选对 Skill。
五、用 @plugin-creator 快速脚手架
手写插件当然可以。
但更推荐用 Codex 内置的 @plugin-creator。
它会生成合法的 .codex-plugin/plugin.json,也可以顺手创建 skills、scripts、assets、MCP、apps 和 marketplace 配置。
基础命令:
1 | python3 scripts/create_basic_plugin.py my-plugin |
如果要创建带 marketplace 的本地插件:
1 | python3 scripts/create_basic_plugin.py my-plugin --with-marketplace |
如果想一起生成常用目录:
1 | python3 scripts/create_basic_plugin.py my-plugin \ |
注意:上面的脚本路径是 @plugin-creator 技能目录里的相对路径。
真实使用时,要么让 Codex 调用 @plugin-creator,要么进入对应 skill 目录执行脚本。
六、plugin.json 常用字段
一个更完整的 manifest 可以这样写:
1 | { |
几个注意点:
version使用语义化版本,例如0.1.0skills指向插件内的 Skill 目录mcpServers只有真的存在.mcp.json时再写apps只有真的存在.app.json时再写websiteURL、privacyPolicyURL、termsOfServiceURL如果写,应该是https://绝对地址defaultPrompt最多放 3 条短提示- 图标、logo、截图等资源要真实存在于插件目录里
不要为了“完整”乱填字段。
插件 manifest 的第一目标是:
1 | 真实、可验证、能被 Codex 正确加载。 |
七、Marketplace 是插件目录,不是插件本身
很多人会把 plugin 和 marketplace 搞混。
插件是能力包。
marketplace 是插件目录。
一个本地 marketplace 文件大概长这样:
1 | { |
常见位置:
1 | 个人 marketplace:~/.agents/plugins/marketplace.json |
source.path 是相对 marketplace root 的路径。
比如个人 marketplace 在:
1 | ~/.agents/plugins/marketplace.json |
那么:
1 | ./plugins/my-plugin |
通常会解析到类似:
1 | ~/plugins/my-plugin |
这点很容易弄错。
不要以为它是相对 .agents/plugins/ 目录。
八、安装本地 marketplace
如果你使用默认个人 marketplace:
1 | ~/.agents/plugins/marketplace.json |
通常不需要额外执行 codex plugin marketplace add。
如果是非默认位置,比如某个团队仓库里的 marketplace,可以用:
1 | codex plugin marketplace add ./local-marketplace-root |
也可以添加 GitHub 或 Git 地址:
1 | codex plugin marketplace add owner/repo |
查看 marketplace:
1 | codex plugin marketplace list |
更新 marketplace:
1 | codex plugin marketplace upgrade |
删除 marketplace:
1 | codex plugin marketplace remove marketplace-name |
安装插件后,通常要开启新线程,让 Codex 重新加载可用插件、技能和工具。
九、给插件添加 MCP 能力
插件可以绑定 MCP server。
MCP 的作用是让 Codex 访问外部工具或上下文,比如:
- 文档搜索
- 浏览器控制
- Figma
- GitHub
- Sentry
- 内部系统
插件里可以放:
1 | my-plugin/ |
然后在 plugin.json 里声明:
1 | { |
.mcp.json 里放 MCP server 配置。
实际配置要看你的 MCP server 是 stdio 还是 HTTP。
比如 stdio 形式常见是:
1 | { |
如果 MCP 需要 token,不要把密钥写死进插件。
应该通过环境变量、OAuth 或用户配置处理。
插件可以打包能力,但不应该硬编码用户秘密。
十、开发时一定要验证插件
开发插件时,最容易出问题的是:
plugin.json字段不合法version不是合法 semvername和目录名不一致skills路径写错mcpServers指向了不存在的.mcp.json- icon、logo、screenshots 文件不存在
- marketplace 的
source.path相对路径写错
如果使用 @plugin-creator,可以跑:
1 | python3 scripts/validate_plugin.py <plugin-path> |
这个验证很重要。
不要靠“看起来差不多”。
插件一旦进入 marketplace,错误路径和错误 manifest 会让安装体验很差。
十一、本地迭代时更新 cachebuster
本地开发插件时,经常会遇到:
1 | 我改了插件,但 Codex 好像没加载最新版本。 |
这时不要手改 marketplace。
更推荐使用 @plugin-creator 的更新脚本:
1 | python3 scripts/update_plugin_cachebuster.py <plugin-path> |
它会把版本改成类似:
1 | 0.1.0+codex.local-20260616-175820 |
然后读取 marketplace 名称:
1 | python3 scripts/read_marketplace_name.py |
再重新安装:
1 | codex plugin add <plugin-name>@<marketplace-name> |
如果插件不在默认个人 marketplace,就要先确认它来自哪个 marketplace。
这种情况下可以看:
1 | codex plugin list |
迭代完成后,开启新线程测试插件。
这是比较稳的边界。
十二、插件的常见开发流程
我建议按这个顺序做:
1 | 1. 先写一个单独 Skill |
不要一开始就追求大而全。
一个好插件,通常是从一个稳定 Skill 长出来的。
十三、一个完整示例
假设我们要做一个“代码审查助手”插件。
目录:
1 | code-review-helper/ |
plugin.json:
1 | { |
skills/code-review/SKILL.md:
1 | --- |
这个例子不复杂。
但它已经是一个可分发插件的雏形。
后续可以继续加:
- 安全审查 Skill
- 性能审查 Skill
- GitHub MCP
- 漏洞扫描脚本
- 插件 logo 和截图
十四、常见坑
1. 直接把插件写成一堆提示词
插件不是提示词集合。
真正有用的是稳定工作流。
Skill 里应该写:
1 | 触发条件 |
不要只写“你是一个专业专家”。
2. description 写得太泛
错误示例:
1 | 帮助用户完成开发任务。 |
这会让 Codex 很难判断什么时候用。
更好:
1 | 当用户需要把接口文档转换成 OpenAPI 3.1 YAML 草稿时使用。 |
触发条件越具体,效果越稳定。
3. 把密钥写进插件
不要这样:
1 | { |
密钥应该通过环境变量、OAuth、1Password 或用户本地配置处理。
插件可能会分享给别人。
把密钥写进去就是事故。
4. 忘记新线程测试
安装或更新插件后,最好开启新线程测试。
这样 Codex 能重新加载插件、Skill 和 MCP 工具。
如果你在旧线程里测试,有时会以为插件没生效。
其实是当前上下文还没拿到最新能力。
5. marketplace 路径写错
记住这句话:
1 | source.path 相对 marketplace root,不是相对 .agents/plugins 目录。 |
路径错了,插件目录就找不到。
这是本地插件最常见的问题之一。
十五、我的建议
如果你要认真开发 Codex 插件,可以按这个原则走:
1 | 小工作流先做 Skill |
插件开发的关键不是把 manifest 写得多复杂。
而是把一个真实可复用的工作流打磨稳定,再用插件把它包装成可安装、可分享、可管理的能力。
这才是 Codex 插件真正有价值的地方。