openai/plugins-plugin-creator
Create and scaffold plugin directories for Codex with a required `.codex-plugin/plugin.json`, optional plugin folders/files, and baseline placeholders you can edit before publishing or testing. Use when Codex needs to create a new personal plugin, add optional plugin structure, or generate or update personal or repo-root `.agents/plugins/marketplace.json` entries for plugin ordering and availability metadata.
npx skills add https://github.com/openai/plugins --skill plugin-creator
# Plugin names are normalized to lower-case hyphen-case and must be <= 64 chars.
# The generated folder and plugin.json name are always the same.
# Run from repo root (or replace .agents/... with the absolute path to this SKILL).
# By default creates in ~/plugins/<plugin-name>.
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py <plugin-name>
<plugin-path>/.codex-plugin/plugin.json and replace [TODO: ...] placeholders.# Personal marketplace entries default to ~/.agents/plugins/marketplace.json.
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin --with-marketplace
If the current Git repo already has .agents/plugins/marketplace.json and the user has not said
whether the plugin is personal or shared with their team, ask before generating a marketplace entry.
When they choose the repo marketplace, use:
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
--path ./plugins \
--marketplace-path ./.agents/plugins/marketplace.json \
--with-marketplace
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
--path <parent-plugin-directory> \
--marketplace-path <marketplace-json-path> \
--with-skills --with-hooks --with-scripts --with-assets --with-mcp --with-apps --with-marketplace
<parent-plugin-directory> is the directory where the plugin folder <plugin-name> will be created (for example ~/code/plugins).
~/plugins/<plugin-name>/ plus~/.agents/plugins/marketplace.json.
.agents/plugins/marketplace.json and the user has not saidpersonal vs team, ask which marketplace to update before generating a marketplace entry.
/<parent-plugin-directory>/<plugin-name>/./<parent-plugin-directory>/<plugin-name>/.codex-plugin/plugin.json.interface section.--with-marketplace is set.name plus interface.displayName placeholders before adding the first plugin entry.<plugin-name> is normalized using skill-creator naming rules:My Plugin → my-pluginMy--Plugin → my-plugin-skills/hooks/scripts/assets/.mcp.json.app.json~/.agents/plugins/marketplace.json.<repo-root>/.agents/plugins/marketplace.json.name plus optional interface.displayName.plugins[] as render order in Codex. Append new entries unless a user explicitly asks to reorder the list.displayName belongs inside the marketplace interface object, not individual plugins[] entries.policy.installationpolicy.authenticationcategorypolicy.installation: "AVAILABLE"policy.authentication: "ON_INSTALL"policy.installation values:NOT_AVAILABLEAVAILABLEINSTALLED_BY_DEFAULTpolicy.authentication values:ON_INSTALLON_USEpolicy.products as an override. Omit it unless the user explicitly requests product gating.{
"name": "plugin-name",
"source": {
"source": "local",
"path": "./plugins/plugin-name"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
--force only when intentionally replacing an existing marketplace entry for the same plugin name."name", an "interface" object containing "displayName", and a plugins array, then add the new entry.{
"name": "[TODO: marketplace-name]",
"interface": {
"displayName": "[TODO: Marketplace Display Name]"
},
"plugins": [
{
"name": "plugin-name",
"source": {
"source": "local",
"path": "./plugins/plugin-name"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}
plugin.json "name" are always the same normalized plugin name..codex-plugin/plugin.json present.--force only when overwrite is intentional.interface.displayName.policy.installation, policy.authentication, and category even if their values are defaults.policy.products only when the user explicitly asks for that override.source.path relative to the selected marketplace root as ./plugins/<plugin-name>.response with a short Codex app handoff. Say To view this in the Codex app: and write
View <normalized plugin name> and Share <normalized plugin name> as Markdown links, not raw
URLs or code spans.
codex://plugins/<normalized plugin name>?marketplacePath=<absolute marketplace.json path>.The Share deeplink uses the same URL with &mode=share.
marketplace.jsonpath from the scaffolded plugin. URL-encode the path segment and query value when needed.
pluginName or hostId query parameters to these deeplinks. Codex derives both afterthe user clicks the link.
View <normalized plugin name> or Share <normalized plugin name> links when no marketplace entry wascreated or updated.
For the exact canonical sample JSON for both plugin manifests and marketplace entries, use:
references/plugin-json-spec.mdAfter editing SKILL.md, run:
python3 <path-to-skill-creator>/scripts/quick_validate.py .agents/skills/plugin-creator
Take openai/plugins-plugin-creator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.