A plugin is the packaging format that bundles one or more skills together with optional hooks, MCP server configs, app connectors, and interface metadata into a single installable unit. Where a skill extends Codex with a workflow, a plugin makes that workflow — and everything it needs — distributable, discoverable in Codex’s marketplace UI, and installable by others with a single action. The Plugin Creator skill scaffolds the required directory structure, fills in a completeDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/openai/skills/llms.txt
Use this file to discover all available pages before exploring further.
plugin.json manifest with placeholder values, and optionally generates or updates a marketplace.json entry for install ordering and availability control.
The Plugin Creator is a system skill — it is pre-installed in every Codex environment and cannot be removed by users.
Plugins vs. skills
| Concept | What it is |
|---|---|
| Skill | A self-contained folder with SKILL.md that teaches Codex a specialized workflow |
| Plugin | An installable bundle that can contain skills, hooks, MCP config, app connectors, assets, and marketplace metadata |
When to use plugin-creator
Reach for this skill when you want to:- Create a new local plugin with the required
plugin.jsonstructure - Add optional companion folders (
skills/,hooks/,scripts/,assets/,.mcp.json,.app.json) - Generate or update
marketplace.jsonentries for plugin ordering and availability metadata - Normalize a plugin name and ensure it follows Codex naming conventions
Quick start
Fill in the placeholders
Open
.codex-plugin/plugin.json inside the new plugin folder and replace every [TODO: ...] value with real content.Add a marketplace entry (optional)
<repo-root>/.agents/plugins/marketplace.json.Script flags
| Flag | Description |
|---|---|
<plugin-name> | Plugin name (normalized to lowercase hyphen-case, max 64 chars) |
--path <dir> | Parent directory where the plugin folder is created (default: <repo-root>/plugins) |
--with-skills | Create a skills/ directory |
--with-hooks | Create a hooks/ directory |
--with-scripts | Create a scripts/ directory |
--with-assets | Create a assets/ directory |
--with-mcp | Create a .mcp.json placeholder |
--with-apps | Create a .app.json placeholder |
--with-marketplace | Generate or update marketplace.json |
--marketplace-path <path> | Override marketplace file location (default: <repo-root>/.agents/plugins/marketplace.json) |
--install-policy | policy.installation value: NOT_AVAILABLE, AVAILABLE, INSTALLED_BY_DEFAULT (default: AVAILABLE) |
--auth-policy | policy.authentication value: ON_INSTALL, ON_USE (default: ON_INSTALL) |
--category | Marketplace category string (default: Productivity) |
--force | Overwrite an existing plugin directory or marketplace entry |
Plugin name normalization
Plugin names are always lowercased and hyphen-delimited:| Input | Normalized |
|---|---|
My Plugin | my-plugin |
My--Plugin | my-plugin |
analytics_tool | analytics-tool |
Data Viz 2 | data-viz-2 |
name field in plugin.json are always identical.
The plugin.json manifest
Every plugin must contain .codex-plugin/plugin.json. Here is the complete canonical structure:
Top-level field reference
| Field | Type | Description |
|---|---|---|
name | string | Kebab-case plugin identifier. Required. Must match the folder name. |
version | string | Semantic version string |
description | string | Short purpose summary |
author | object | Publisher identity (name, email, url) |
homepage | string | Documentation URL |
repository | string | Source code URL |
license | string | License identifier, e.g. MIT, Apache-2.0 |
keywords | string[] | Search and discovery tags |
skills | string | Relative path to skill directories |
hooks | string | Hook config file path |
mcpServers | string | MCP config file path |
apps | string | App manifest path |
interface | object | UX and marketplace presentation metadata |
interface field reference
| Field | Type | Notes |
|---|---|---|
displayName | string | User-facing title shown in marketplace |
shortDescription | string | Brief subtitle in compact views |
longDescription | string | Longer description on detail screens |
developerName | string | Human-readable publisher name |
category | string | Plugin category bucket |
capabilities | string[] | Capability list, e.g. ["Interactive", "Write"] |
websiteURL | string | Plugin’s public website |
privacyPolicyURL | string | Privacy policy URL |
termsOfServiceURL | string | Terms of service URL |
defaultPrompt | string[] | Up to 3 starter prompts (~50 chars each); extras are ignored |
brandColor | string | Hex theme color for the plugin card |
composerIcon | string | Path to composer icon asset |
logo | string | Path to logo asset |
screenshots | string[] | PNG paths under ./assets/; relative to plugin root |
Marketplace entries
When--with-marketplace is set, the script creates or updates marketplace.json:
- Repo plugin:
<repo-root>/.agents/plugins/marketplace.json - Home-local plugin:
~/.agents/plugins/marketplace.json
Marketplace entry shape
Policy values
| Field | Allowed values | Default |
|---|---|---|
policy.installation | NOT_AVAILABLE, AVAILABLE, INSTALLED_BY_DEFAULT | AVAILABLE |
policy.authentication | ON_INSTALL, ON_USE | ON_INSTALL |
Full marketplace file structure
Plugin order in
plugins[] determines render order in the Codex UI. New entries are appended unless you explicitly ask to reorder. Use --force only when intentionally replacing an existing entry.