Skip to main content

Documentation 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.

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 complete 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

ConceptWhat it is
SkillA self-contained folder with SKILL.md that teaches Codex a specialized workflow
PluginAn installable bundle that can contain skills, hooks, MCP config, app connectors, assets, and marketplace metadata
Use a plugin when you want to distribute a collection of capabilities as a single installable package, expose your work in Codex’s plugin marketplace, or combine skills with hooks and MCP server configuration.

When to use plugin-creator

Reach for this skill when you want to:
  • Create a new local plugin with the required plugin.json structure
  • Add optional companion folders (skills/, hooks/, scripts/, assets/, .mcp.json, .app.json)
  • Generate or update marketplace.json entries for plugin ordering and availability metadata
  • Normalize a plugin name and ensure it follows Codex naming conventions

Quick start

1

Run the scaffold script

# Creates plugins/<plugin-name>/ at the repo root by default
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py <plugin-name>
2

Fill in the placeholders

Open .codex-plugin/plugin.json inside the new plugin folder and replace every [TODO: ...] value with real content.
3

Add a marketplace entry (optional)

python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
  --with-marketplace
This creates or updates <repo-root>/.agents/plugins/marketplace.json.
4

Scaffold optional structure

python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
  --path <parent-plugin-directory> \
  --with-skills \
  --with-hooks \
  --with-scripts \
  --with-assets \
  --with-mcp \
  --with-apps \
  --with-marketplace

Script flags

FlagDescription
<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-skillsCreate a skills/ directory
--with-hooksCreate a hooks/ directory
--with-scriptsCreate a scripts/ directory
--with-assetsCreate a assets/ directory
--with-mcpCreate a .mcp.json placeholder
--with-appsCreate a .app.json placeholder
--with-marketplaceGenerate or update marketplace.json
--marketplace-path <path>Override marketplace file location (default: <repo-root>/.agents/plugins/marketplace.json)
--install-policypolicy.installation value: NOT_AVAILABLE, AVAILABLE, INSTALLED_BY_DEFAULT (default: AVAILABLE)
--auth-policypolicy.authentication value: ON_INSTALL, ON_USE (default: ON_INSTALL)
--categoryMarketplace category string (default: Productivity)
--forceOverwrite an existing plugin directory or marketplace entry

Plugin name normalization

Plugin names are always lowercased and hyphen-delimited:
InputNormalized
My Pluginmy-plugin
My--Pluginmy-plugin
analytics_toolanalytics-tool
Data Viz 2data-viz-2
The outer folder name and the 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:
{
  "name": "plugin-name",
  "version": "1.2.0",
  "description": "Brief plugin description",
  "author": {
    "name": "Author Name",
    "email": "author@example.com",
    "url": "https://github.com/author"
  },
  "homepage": "https://docs.example.com/plugin",
  "repository": "https://github.com/author/plugin",
  "license": "MIT",
  "keywords": ["keyword1", "keyword2"],
  "skills": "./skills/",
  "hooks": "./hooks.json",
  "mcpServers": "./.mcp.json",
  "apps": "./.app.json",
  "interface": {
    "displayName": "Plugin Display Name",
    "shortDescription": "Short description for subtitle",
    "longDescription": "Long description for details page",
    "developerName": "OpenAI",
    "category": "Productivity",
    "capabilities": ["Interactive", "Write"],
    "websiteURL": "https://openai.com/",
    "privacyPolicyURL": "https://openai.com/policies/row-privacy-policy/",
    "termsOfServiceURL": "https://openai.com/policies/row-terms-of-use/",
    "defaultPrompt": [
      "Summarize my inbox and draft replies for me.",
      "Find open bugs and turn them into Linear tickets.",
      "Review today's meetings and flag scheduling gaps."
    ],
    "brandColor": "#3B82F6",
    "composerIcon": "./assets/icon.png",
    "logo": "./assets/logo.png",
    "screenshots": [
      "./assets/screenshot1.png",
      "./assets/screenshot2.png",
      "./assets/screenshot3.png"
    ]
  }
}

Top-level field reference

FieldTypeDescription
namestringKebab-case plugin identifier. Required. Must match the folder name.
versionstringSemantic version string
descriptionstringShort purpose summary
authorobjectPublisher identity (name, email, url)
homepagestringDocumentation URL
repositorystringSource code URL
licensestringLicense identifier, e.g. MIT, Apache-2.0
keywordsstring[]Search and discovery tags
skillsstringRelative path to skill directories
hooksstringHook config file path
mcpServersstringMCP config file path
appsstringApp manifest path
interfaceobjectUX and marketplace presentation metadata

interface field reference

FieldTypeNotes
displayNamestringUser-facing title shown in marketplace
shortDescriptionstringBrief subtitle in compact views
longDescriptionstringLonger description on detail screens
developerNamestringHuman-readable publisher name
categorystringPlugin category bucket
capabilitiesstring[]Capability list, e.g. ["Interactive", "Write"]
websiteURLstringPlugin’s public website
privacyPolicyURLstringPrivacy policy URL
termsOfServiceURLstringTerms of service URL
defaultPromptstring[]Up to 3 starter prompts (~50 chars each); extras are ignored
brandColorstringHex theme color for the plugin card
composerIconstringPath to composer icon asset
logostringPath to logo asset
screenshotsstring[]PNG paths under ./assets/; relative to plugin root
Keep defaultPrompt entries around 50 characters so they scan well in the Codex UI. Entries longer than 128 characters are truncated, and only the first 3 entries are ever shown.

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

{
  "name": "plugin-name",
  "source": {
    "source": "local",
    "path": "./plugins/plugin-name"
  },
  "policy": {
    "installation": "AVAILABLE",
    "authentication": "ON_INSTALL"
  },
  "category": "Productivity"
}

Policy values

FieldAllowed valuesDefault
policy.installationNOT_AVAILABLE, AVAILABLE, INSTALLED_BY_DEFAULTAVAILABLE
policy.authenticationON_INSTALL, ON_USEON_INSTALL

Full marketplace file structure

{
  "name": "[TODO: marketplace-name]",
  "interface": {
    "displayName": "[TODO: Marketplace Display Name]"
  },
  "plugins": [
    {
      "name": "my-plugin",
      "source": {
        "source": "local",
        "path": "./plugins/my-plugin"
      },
      "policy": {
        "installation": "AVAILABLE",
        "authentication": "ON_INSTALL"
      },
      "category": "Productivity"
    }
  ]
}
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.

Home-local plugin

For a plugin that lives in your home directory rather than a repo:
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
  --path ~/plugins \
  --marketplace-path ~/.agents/plugins/marketplace.json \
  --with-marketplace

Validation

After scaffolding, validate the embedded skill using the skill-creator validator:
python3 <path-to-skill-creator>/scripts/quick_validate.py .agents/skills/plugin-creator

Build docs developers (and LLMs) love