ChatGPT plugins are back.
Here's how to build one.
On July 9, OpenAI renamed ChatGPT apps to plugins and opened the Plugin Directory. At DevDay on September 29, it added plugin extensions and plugin picks inside the conversation. One package now runs in ChatGPT and Codex.
This guide covers what goes in a plugin, how to build one, what review asks for, and how ChatGPT decides to use it. Rather have it built? That's what we do.
Apps are plugins now.
One directory for ChatGPT and Codex. DevDay 2026 added plugin extensions and in-chat recommendations.
Skills, tools, UI.
A plugin.json ties SKILL.md files, an MCP server and optional interface into one install.
Review is real.
Test cases, a demo video, a test account and domain proof. Skills-only plugins skip most of it.
What changed,
and when.
Plugins died in 2024. They came back in 2026 with a new engine. Here is the short history.
| DATE | WHAT HAPPENED |
|---|---|
| MAR 2023 | The first ChatGPT plugins launch in beta. A manifest file and an OpenAPI spec the model could call. |
| APR 2024 | Those plugins shut down for good. GPTs take their place. |
| OCT 2025 | OpenAI launches the Apps SDK at DevDay 2025. Apps run inside the chat, built on MCP. |
| JUL 9, 2026 | Codex merges into the ChatGPT desktop app. Apps are renamed plugins. The App Directory becomes the Plugin Directory. |
| SEP 29, 2026 | DevDay 2026: plugin extensions, plugin recommendations in conversation, Plugin Creator, and a redesigned submission flow. |
Same name as 2023. Nothing else in common. The old plugins were an API spec the model called. The new ones bundle tools, instructions and interface, and they install in two products at once.
Publish once and the plugin is listed in one directory that serves both ChatGPT and Codex. Users can browse it, call a plugin with @, or have ChatGPT suggest it mid-conversation.
Six parts.
Most plugins use two.
A plugin can be skills only, an MCP server only, or both. Everything else is optional and earns its place.
Instructions the model follows
A folder with a SKILL.md. Its description decides when it fires. Scripts, references and templates sit beside it.
Tools that do real work
Your API, exposed over Streamable HTTP. Search, create, update. This is how the plugin touches your product.
Cards inside the chat
Built on the open MCP Apps standard. Inline card, carousel, fullscreen or picture-in-picture.
Your app, inside ChatGPT
New at DevDay 2026. Sidebar apps, side panels, file viewers, composer mentions. Canva, Figma and Adobe are the launch examples.
Scripts on lifecycle events
Run a command at session start and similar moments. A Codex feature, and users must trust a hook before it runs.
Physical goods only
External checkout or saved payment methods. Digital goods, subscriptions and upsells are off limits.
acme-orders/
├── plugin.json # name, version, description
├── mcp.json # your MCP server (optional)
├── skills/
│ └── find-orders/
│ └── SKILL.md # when and how to use your tools
├── assets/ # logo, composer icon, screenshots
└── hooks/
└── hooks.json # lifecycle hooks (optional){
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "acme-orders",
"version": "1.0.0",
"description": "Find, track and update Acme orders.",
"extensions": {
"com.openai": {
"interface": {
"displayName": "Acme Orders",
"category": "Productivity",
"privacyPolicyURL": "https://acme.com/privacy",
"logo": "./assets/logo.png"
}
}
}
}The manifest follows the open Agent Plugins schema. Only name, version and description are required. OpenAI-specific listing fields live under extensions.com.openai. Skills are found automatically from the skills/ folder, so you don't register them anywhere.
Codex still reads the older .codex-plugin/plugin.json overlay, and even a .claude-plugin/marketplace.json. If you built a Claude plugin already, you are closer than you think.
How to build a
ChatGPT plugin.
Seven steps, from idea to directory. Step one is where most plugins go wrong, so don't skip it.
- STEP 01
Pick one job
Not your whole product. One job people already bring to ChatGPT. "Where's my order?" "Draft a quote." "Book the room." Write 20 real prompts for it before you write any code. They become your test set.
- STEP 02
Build the MCP server
Expose that job as a few tools over Streamable HTTP. Name them domain first, like
orders.search. Start every description with "Use this when". SetreadOnlyHint,destructiveHintandopenWorldHinthonestly, because review checks them.MCP.JSONJSON { "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json", "mcpServers": { "acme": { "type": "streamable-http", "url": "https://mcp.acme.com/mcp" } } } - STEP 03
Write the skills
A skill tells the model how to run the job with your tools: what to ask for, the steps, the output format, and when to stop. The
descriptionin the frontmatter decides when it triggers, so write it like a search query.SKILLS/FIND-ORDERS/SKILL.MDMARKDOWN --- name: find-orders description: Use when the user asks where an Acme order is, or wants to change one. --- 1. Ask for the order number, or the email on the order. 2. Call orders.search. Never guess an order number. 3. Show status, carrier and delivery date. 4. Offer an address change only if the order has not shipped. - STEP 04
Add UI only where it earns it
Text is fine for most answers. Add a card when the user has to compare, pick or edit. Build on MCP Apps first, then layer ChatGPT extras from
window.openai, likecallToolandsetWidgetState. Keep every tool working without the UI. - STEP 05
Package it
plugin.jsonat the root,mcp.jsonbeside it, skills underskills/, art underassets/. Every path is relative and starts with./. No secrets in the folder, ever. - STEP 06
Test it in Developer Mode
Turn on Developer Mode in ChatGPT under Settings, Security and login. Register your MCP server, ask
@plugin-creatorto scaffold a local marketplace entry, restart the desktop app, and install the plugin from your personal plugins. Run your 20 prompts. Fix. Run them again. - STEP 07
Submit it
Upload a ZIP on the plugins dashboard. Fill in the listing, fix every automated finding, verify your domain, and send it to review. Once approved, you pick the publish date.
We build it. You own it.
MCP server, skills, UI, listing and review packet. Built in your repo, tested in your ChatGPT, submitted under your name.
What review
asks for.
Every plugin gets automated checks. Plugins with an MCP server also get tested by a person. Here is the packet.
| ITEM | WHAT OPENAI WANTS |
|---|---|
| DISPLAY NAME | 30 characters max. Specific and tied to your brand, not a dictionary word. |
| SHORT DESCRIPTION | 30 characters max. Plain facts, no pricing, no hype. |
| LONG DESCRIPTION | Up to 4,000 characters. |
| LINKS | Privacy policy, terms, support and website URLs. |
| ART | A logo and a composer icon. |
| TEST CASES | 5 positive and 3 negative, each with a prompt, the expected tool and the expected result. MCP plugins only. |
| DEMO | A video walkthrough URL. MCP plugins only. |
| TEST ACCOUNT | Working credentials with no MFA, no email codes and no private network. Entered in the dashboard, never in the ZIP. |
| DOMAIN PROOF | A challenge token served as plain text at /.well-known/openai-apps-challenge on your MCP host. |
| IDENTITY | Individual or business verification on your OpenAI organization. |
Six easy ways to fail review.
How long does it take? OpenAI doesn't publish a timeline and doesn't expedite. Only one review can be open per plugin. After launch, changes to your hosted MCP tools are picked up by daily scans. New skills or listing changes need a new ZIP and another review.
How ChatGPT
picks a plugin.
ChatGPT now suggests plugins mid-conversation, and it decides from your metadata. Treat it like SEO, with a model as the reader.
- Name tools domain first
calendar.create_eventbeatscreate. The model reads the name before anything else.- Say when, and when not
- Open each description with "Use this when". Then say what it's not for: "Do not use for reminders."
- Describe every argument
- Add examples. Use allowed values for anything with a fixed set of options.
- Test three kinds of prompt
- Direct ("use Acme to find my order"), indirect ("where's my package?"), and negative: prompts that should not trigger you.
- Measure precision and recall
- Did the right tool run? Did it run when it should have? Fix precision on the negatives first.
- Change one field at a time
- Otherwise you won't know what helped. Then check tool-call analytics weekly for drift.
Should you
build one?
Not every product needs a plugin. Here is the test we run before we quote one.
People already paste your stuff into ChatGPT
Order numbers, CRM records, docs, tickets. That's demand. A plugin meets it where it already is.
You have an API
The MCP server wraps what you already expose. No API means building one first, and that is the bigger job.
One job is worth doing in chat
Lookups, drafts, bookings, quotes. Quick in, quick out, and the answer is useful on its own.
You already have a Claude plugin
OpenAI publishes a guide to port it. Commands become skills, Claude-only features come out, most of the work carries over.
When to skip it.
Where this
comes from.
OpenAI's own docs, plus DevDay 2026 coverage. Checked on 29 September 2026.
- Plugins quickstartOPENAI DEVELOPERS
- Build a pluginOPENAI DEVELOPERS
- Build skillsOPENAI DEVELOPERS
- Build a ChatGPT UIOPENAI DEVELOPERS
- Plugin extensionsOPENAI DEVELOPERS
- Submit your pluginOPENAI DEVELOPERS
- Plugin guidelinesOPENAI DEVELOPERS
- Optimize metadataOPENAI DEVELOPERS
- Submit a Claude pluginOPENAI DEVELOPERS
- OpenAI DevDay 2026 live updatesENGADGET
- Vibe Check: OpenAI DevDay 2026EVERY