微信扫码
添加专属顾问
一键打包 Codex 能力,从个人技能到团队共享的完整解决方案。 核心内容: 1. Codex plugin 的核心模型与打包组件 2. 从 skill 到 plugin 的适用场景判断 3. 完整的插件开发流程与实战案例
如果你已经写过 Codex skill,很快就会遇到一个问题:这个 workflow 只在自己机器上好用,怎么稳定地给团队复用?
一开始,把 SKILL.md 放在本机 skill 目录就够了。但当你的能力开始包含更多东西时,单独一个 skill 就不够清晰了:
/plugins 里看到、安装、启用、更新。这时就该把它做成 Codex plugin。
本文整理 Codex plugin 的核心模型、目录结构、开发流程和一个完整实战案例。重点不是罗列字段,而是把插件到底解决什么问题、每个文件负责什么、什么时候该用 skill / MCP / hook / app 讲清楚。
Codex plugin 不是一个新的执行引擎。它更像一个可安装的能力包。
它可以把这些东西打在一起:
skills/:可复用工作流和领域操作规约。.mcp.json:MCP server 配置,让 Codex 多一组工具。hooks.json 或 hooks/hooks.json:生命周期脚本,比如拦截危险命令、记录审计、停止时做检查。.app.json:App integrations 的声明入口。assets/:图标、截图、品牌展示素材。.codex-plugin/plugin.json:插件 manifest,声明这个包叫什么、版本是多少、包含哪些组件。再通过 marketplace.json 把插件放进一个可浏览、可安装、可更新的 catalog。
可以这样记:
skill 解决“怎么做”
MCP 解决“能调用什么工具”
hook 解决“什么时候插入规则或自动动作”
app 解决“连接哪个外部应用”
plugin 解决“怎么把这些能力打包、安装、分发”
marketplace 解决“Codex 从哪里发现这些插件”
官方文档里的判断很实用:如果还在一个 repo 或个人 workflow 里迭代,先写 local skill;当你要跨团队共享、打包 MCP config、打包 app integration、打包 lifecycle hooks,或者发布一个稳定能力包时,再做 plugin。
换成工程判断:
/plugins 里可见、可安装、可更新 | |
不要过早做 plugin。plugin 的价值在于分发和组合,不在于让一个还没稳定的 prompt 看起来更正式。
一个完整插件可以长这样:
repo-pr-guardian/
├── .codex-plugin/
│ └── plugin.json
├── skills/
│ └── pr-guardian/
│ └── SKILL.md
├── hooks/
│ ├── hooks.json
│ └── scripts/
│ └── block-dangerous-git.py
├── assets/
│ ├── icon.png
│ └── screenshot1.png
├── .mcp.json
└── .app.json
最小插件只需要:
my-first-plugin/
├── .codex-plugin/
│ └── plugin.json
└── skills/
└── hello/
└── SKILL.md
对应的 plugin.json:
{
"name": "my-first-plugin",
"version": "1.0.0",
"description": "Reusable greeting workflow",
"skills": "./skills/"
}
这个最小结构已经是一个插件。后面的 MCP、hook、app 都是增强能力,不是必须项。
plugin.json 负责什么.codex-plugin/plugin.json 是插件 manifest。它回答四个问题:
name、version、description、author。skills、hooks、mcpServers、apps。interface.displayName、shortDescription、brandColor、logo、screenshots。homepage、repository、license、privacyPolicyURL、termsOfServiceURL。一个较完整的形态:
{
"name": "repo-pr-guardian",
"version": "1.0.0",
"description": "Review pull requests with repo policy, safe git hooks, and optional MCP tools.",
"author": {
"name": "Your Team",
"email": "team@example.com",
"url": "example-dot-com"
},
"homepage": "example-dot-com/repo-pr-guardian",
"repository": "github-dot-com/example/repo-pr-guardian",
"license": "MIT",
"keywords": ["codex", "review", "pull-request"],
"skills": "./skills/",
"hooks": "./hooks/hooks.json",
"mcpServers": "./.mcp.json",
"apps": "./.app.json",
"interface": {
"displayName": "Repo PR Guardian",
"shortDescription": "Review PRs with repo policy and safety checks.",
"longDescription": "A Codex plugin that packages PR review workflow guidance, optional MCP tools, and lifecycle hooks for safer repository work.",
"developerName": "Your Team",
"category": "Productivity",
"capabilities": ["Review", "MCP", "Hooks"],
"defaultPrompt": [
"Review this PR against repo policy.",
"Check risky git commands before running.",
"Summarize review findings for maintainers."
],
"brandColor": "#2563EB",
"composerIcon": "./assets/icon.png",
"logo": "./assets/icon.png",
"screenshots": ["./assets/screenshot1.png"]
}
}
几个细节要记住:
name 用稳定的 kebab-case,Codex 会把它当插件标识和组件 namespace。./ 开头,并保持在 plugin root 内。skills、hooks、mcpServers、apps 是组件入口,不是展示字段。interface 是给插件目录和安装页面看的,不参与 workflow 本身。skills/:插件的操作大脑Skill 是插件里最重要也最容易复用的部分。
一个 SKILL.md 通常长这样:
---
name: pr-guardian
description: Review pull requests against repository policy, test expectations, and risk boundaries.
---
Use this skill when the user asks for PR review, merge readiness, or risk assessment.
Start by reading the diff and relevant tests. Report findings first, ordered by severity.
Prefer concrete file and line references. Do not rewrite unrelated code.
If the PR touches authentication, secrets, deployment, or data deletion paths,
include an explicit risk section.
Skill 的价值不是“多一段 prompt”,而是把一个稳定流程固定下来:
如果你的 plugin 只能保留一个部分,优先保留 skill。
.mcp.json:把工具能力打进插件MCP server 让 Codex 能调用外部工具。.mcp.json 是插件内 MCP 配置的入口。
示例:
{
"mcpServers": {
"repo-policy": {
"command": "node",
"args": ["./server/index.js"],
"env": {
"REPO_POLICY_MODE": "strict"
}
}
}
}
这类配置适合:
但 MCP 有一个现实边界:它经常涉及认证、网络、二进制依赖或本地服务。插件可以打包配置,不等于用户安装后立刻能用。你需要在 README 或 skill 里写清楚:
hooks:把生命周期规则打进插件Hooks 是插入 Codex Agent loop 的脚本。它能做很多治理类工作:
PreToolUse 拦截危险命令。PostToolUse 检查命令输出。UserPromptSubmit 做 prompt 审计。Stop 做收尾检查或生成摘要。SessionStart 加载项目上下文。插件可以自带 hooks,但这里有两个关键限制:
[features].plugin_hooks = true。插件内默认 hook 路径是:
hooks/hooks.json
你也可以在 plugin.json 里覆盖:
{
"name": "repo-pr-guardian",
"hooks": "./hooks/hooks.json"
}
一个 hooks/hooks.json 示例:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 \"$PLUGIN_ROOT/hooks/scripts/block-dangerous-git.py\"",
"timeout": 10,
"statusMessage": "Checking git command"
}
]
}
]
}
}
插件 hook 命令会拿到几个非常有用的环境变量:
PLUGIN_ROOT:当前已安装插件根目录。PLUGIN_DATA:插件可写数据目录。CLAUDE_PLUGIN_ROOT、CLAUDE_PLUGIN_DATA:兼容已有插件 hooks。这意味着 hook 脚本不要假设自己运行在固定路径里。用 PLUGIN_ROOT 找随插件分发的脚本和配置,用 PLUGIN_DATA 放运行时产生的数据。
.app.json:声明 App Integration.app.json 是插件内 app integrations 的 manifest 入口。它不是 skill,也不是 MCP server。
可以把它理解成:
.app.json 负责“这个插件带哪些外部应用连接”
.mcp.json 负责“这个插件带哪些工具服务”
SKILL.md 负责“Codex 应该怎么使用这些能力”
本地 scaffold 里的最小占位通常是:
{
"apps": {}
}
什么时候需要 .app.json?
如果你的插件只是 skill + MCP + hooks,通常可以先不写 .app.json。
marketplace.json:让 Codex 发现插件插件本身只是一个目录。Codex 要发现它,需要 marketplace。
Repo 级 marketplace:
$REPO_ROOT/.agents/plugins/marketplace.json
个人级 marketplace:
~/.agents/plugins/marketplace.json
示例:
{
"name": "team-codex-plugins",
"interface": {
"displayName": "Team Codex Plugins"
},
"plugins": [
{
"name": "repo-pr-guardian",
"source": {
"source": "local",
"path": "./plugins/repo-pr-guardian"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}
注意两个路径规则:
source.path 指向插件目录。source.path 是相对 marketplace root 解析的,不是相对 .agents/plugins/ 目录。维护 marketplace 时,一个 catalog 可以先只有一个插件,后面再逐步扩成团队插件集合。
CLI 也可以添加 marketplace:
codex plugin marketplace add owner/repo
codex plugin marketplace add owner/repo --ref main
codex plugin marketplace add git@example-host:example/plugins.git --sparse .agents/plugins
codex plugin marketplace add ./local-marketplace-root
刷新和移除:
codex plugin marketplace upgrade
codex plugin marketplace upgrade marketplace-name
codex plugin marketplace remove marketplace-name
一个稳妥的开发流程是:
skills/<name>/SKILL.md。.codex-plugin/plugin.json,先只声明 skills。.mcp.json。hooks/hooks.json 和 hook scripts。.app.json。marketplace.json。/plugins 安装并启用。如果使用本机的 $plugin-creator scaffold,命令形态大概是:
python3 ~/.codex/skills/.system/plugin-creator/scripts/create_basic_plugin.py repo-pr-guardian \
--path ./plugins \
--with-skills \
--with-hooks \
--with-mcp \
--with-apps \
--with-marketplace
这个 scaffold 会创建 .codex-plugin/plugin.json,并可选生成 skills/、hooks/、.mcp.json、.app.json、assets/ 和 marketplace entry。生成后要把 [TODO: ...] 全部替换掉。
下面做一个实战插件:repo-pr-guardian。
目标是把团队的 PR review 工作流打成插件。它包含:
pr-guardian skill:规范 PR review 输出。PreToolUse hook:拦截明显危险的 git 命令。/plugins 里安装。plugins/repo-pr-guardian/
├── .codex-plugin/
│ └── plugin.json
├── skills/
│ └── pr-guardian/
│ └── SKILL.md
├── hooks/
│ ├── hooks.json
│ └── scripts/
│ └── block-dangerous-git.py
└── .mcp.json
.agents/plugins/
└── marketplace.json
plugin.json{
"name": "repo-pr-guardian",
"version": "1.0.0",
"description": "Review pull requests with repo policy and safe git command checks.",
"author": {
"name": "Example Engineering",
"email": "eng@example.com",
"url": "example-dot-com"
},
"homepage": "example-dot-com/repo-pr-guardian",
"repository": "github-dot-com/example/repo-pr-guardian",
"license": "MIT",
"keywords": ["codex", "review", "pull-request", "hooks"],
"skills": "./skills/",
"hooks": "./hooks/hooks.json",
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "Repo PR Guardian",
"shortDescription": "Review PRs with repo policy and safe git checks.",
"longDescription": "Packages a PR review workflow, optional repository policy MCP tools, and a lifecycle hook that blocks risky git commands.",
"developerName": "Example Engineering",
"category": "Productivity",
"capabilities": ["Review", "Hooks", "MCP"],
"defaultPrompt": [
"Review this PR against repo policy.",
"Check this change for merge risk.",
"Summarize blocker findings for maintainers."
],
"brandColor": "#2563EB"
}
}
skills/pr-guardian/SKILL.md:
---
name: pr-guardian
description: Review pull requests against repository policy, test expectations, and risk boundaries.
---
Use this skill when the user asks for PR review, merge readiness, or risk assessment.
Review behavior:
- Read the diff before drawing conclusions.
- Prioritize bugs, regressions, missing tests, and operational risks.
- Report findings first, ordered by severity.
- Use concrete file and line references when available.
- Keep summaries short and secondary.
- Do not rewrite unrelated code during review.
Escalate risk when changes touch authentication, secrets, deletion, deployment,
billing, permissions, or data migration paths.
.mcp.json:
{
"mcpServers": {
"repo-policy": {
"command": "node",
"args": ["./tools/repo-policy-mcp/index.js"],
"env": {
"REPO_POLICY_MODE": "strict"
}
}
}
}
这里的 MCP server 是示例占位。真实项目里,command 可以换成你的本地二进制、Node server、Python server 或远程 MCP 配置。发布前要确认依赖是否随插件打包,还是要求用户单独安装。
hooks/hooks.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 \"$PLUGIN_ROOT/hooks/scripts/block-dangerous-git.py\"",
"timeout": 10,
"statusMessage": "Checking git command"
}
]
}
]
}
}
hooks/scripts/block-dangerous-git.py:
#!/usr/bin/env python3
import json
import re
import sys
payload = json.load(sys.stdin)
tool_input = payload.get("tool_input") or {}
command = tool_input.get("command") or""
blocked = [
r"\bgit\s+reset\s+--hard\b",
r"\bgit\s+clean\s+-fdx\b",
r"\bgit\s+push\s+--force\b",
]
if any(re.search(pattern, command) for pattern in blocked):
print(json.dumps({
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Dangerous git command blocked by repo-pr-guardian."
}
}))
这个 hook 只做一件事:在 Bash 工具调用前检查命令文本,发现明显高风险 git 命令就拒绝。
要让插件 hooks 生效,用户的 Codex 配置里还需要:
[features]
plugin_hooks = true
安装后第一次运行时,还需要在 /hooks 里 review / trust。
.agents/plugins/marketplace.json:
{
"name": "team-codex-plugins",
"interface": {
"displayName": "Team Codex Plugins"
},
"plugins": [
{
"name": "repo-pr-guardian",
"source": {
"source": "local",
"path": "./plugins/repo-pr-guardian"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}
然后重启 Codex,打开:
/plugins
选择 Team Codex Plugins,安装 Repo PR Guardian。
安装后做三类验证:
Use pr-guardian to review the current diff.
或者:
@repo-pr-guardian review this PR against repo policy.
观察 Codex 是否按 review-first 格式输出 findings。
开启 plugin_hooks 并 trust hook 后,尝试让 Codex 运行:
git reset --hard HEAD
期望行为是 hook 返回 deny,Codex 不执行该命令。
如果 MCP server 已经实现,确认 Codex 能看到对应工具,并在 skill 触发时合理使用。
如果 MCP 只是占位,发布前不要把它伪装成可用能力。要么删掉 .mcp.json,要么在插件说明里明确“需要单独安装 repo-policy MCP server”。
发布或给团队安装前,至少检查这些点:
plugin.jsonname 与 marketplace entry 一致 | |
version | |
./ 开头并留在 plugin root 内 | |
.env、token、cookie | |
.env.example | |
PLUGIN_ROOT / PLUGIN_DATA | |
plugin_hooks = true 和 /hooks trust | |
policy.installation 和 policy.authentication 合理 | |
/plugins 里验证 |
Skill 是工作流,plugin 是分发包。一个 plugin 可以只有 skill,但 plugin 不等于 skill。
.mcp.json 只是配置入口。真实可用还取决于命令、依赖、网络、认证和环境变量。
当前 release 里,plugin hooks 默认关闭。需要 [features].plugin_hooks = true,还要 trust。
.app.json 和 .mcp.json 混在一起MCP 是工具服务配置,app 是应用集成声明。只做 MCP 工具接入时,不一定需要 .app.json。
不需要。marketplace 是 catalog,一个 marketplace 可以只有一个插件,也可以是团队插件集合。
做 Codex plugin 时,按这个顺序想:
我要复用一个 workflow
-> 写 skill
workflow 需要工具
-> 加 .mcp.json
workflow 需要生命周期治理
-> 加 hooks/hooks.json 和脚本
workflow 需要外部 app integration
-> 加 .app.json
我要让别人安装
-> 写 .codex-plugin/plugin.json
我要让 Codex 发现它
-> 写 marketplace.json
如果你只想记一句话:
Codex plugin 的核心价值,不是把 prompt 包起来,而是把一套可复用的工作方法、工具接入、生命周期规则和安装入口,变成一个可以被团队稳定安装和更新的能力包
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-01
AI Agent 的 Skill 系统设计
2026-07-01
我们做了一款招投标Skill,数据按需调用
2026-07-01
Harness 工程之道:Skill 原理与最佳实践
2026-07-01
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
2026-07-01
重新思考研发基础设施:当 Agent 成为第一公民
2026-06-30
一个测试人必备的需求分析Skill,搞定需求分析8大维度,生成用例采纳率直接拉满
2026-06-30
开源「仓颉.Skill」2.0,你现在可以蒸馏任何视频!
2026-06-30
手写 Skill vs skill-creator:差距在哪
2026-05-15
2026-04-05
2026-05-24
2026-04-16
2026-04-09
2026-04-14
2026-05-06
2026-05-19
2026-05-20
2026-05-03
2026-06-28
2026-06-23
2026-06-11
2026-06-11
2026-06-09
2026-06-08
2026-05-28
2026-05-19
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。