How to submit a plugin to ChatGPT
To submit a plugin to ChatGPT, you upload a ZIP bundle to OpenAI’s plugin portal, connect a remote MCP server that anyone on the internet can reach, and wait for review. A first review takes months, so every problem you catch before the upload saves you a round. This guide covers each step, from the tests you run in MCP Tower before submitting to finding out who uses your plugin once it is in the ChatGPT plugin directory, which OpenAI does not tell you.
This article is the long version of lesson 3, How to get listed in an MCP directory, of Growing Your MCP Server: A Crash Course, a free course on getting an MCP server listed, measured and used.
ChatGPT and Grok call these integrations plugins, while Claude and Muse call them connectors. Each one is a remote MCP server (Model Context Protocol). For Claude, read How to get listed in the Claude Marketplace.
The whole process, in order:
- Run your MCP server remotely, on a public HTTPS endpoint.
- Pick the hostname you will keep for good, and put MCP Tower in front of it.
- Test the OAuth sign-in in MCP Tower.
- Test the server privately in ChatGPT by adding its URL.
- Validate your tools and their descriptions in MCP Tower’s Inspect.
- Build the plugin bundle with the Plugin Creator.
- Upload the ZIP at platform.openai.com/plugins and clear the findings.
- Add the review material: test cases, a video and a demo account.
- Submit for review and wait.
- Keep the plugin up to date, and measure who uses it.
1. Run a remote MCP server on a public HTTPS endpoint
ChatGPT only lists remote MCP servers. OpenAI’s review requirements ask for a server “hosted on a publicly accessible domain”. A stdio server on a laptop does not qualify, and neither does a development tunnel, which is fine for testing only.
The submission page adds a few limits: one MCP server per plugin, and OAuth if users must sign in (no API keys, Basic auth or custom headers). Reviewers also need a demo account that works without extra setup; MFA can get the plugin rejected.
2. Pick the hostname you will keep, behind MCP Tower
The review requirements state that the server’s origin (scheme, hostname and port) cannot change
between versions. A new hostname means a new plugin, and a new plugin starts the review queue again.
So before the first upload, choose a hostname you control, such as mcp.example.com, rather than
one tied to a hosting vendor.
Put MCP Tower in front of the server now. You use it twice: before you submit, to test the sign-in
and the tools the way ChatGPT will see them, and after you are listed, to see who uses the plugin.
MCP Tower answers on your own hostname through a CNAME record, so the URL in your plugin stays
yours. If the server already runs on the hostname you want to publish,
move it to an origin hostname first.
3. Test the OAuth sign-in in MCP Tower
If users must sign in, the sign-in has to work for the reviewer on the first try. When it fails, the reviewer cannot reach your tools, the submission comes back, and you wait for another turn in the queue.
MCP Tower signs in to your server the way ChatGPT and Claude do: same discovery documents, same
registration, same scopes. Each of the 18 OAuth checks is one step of that flow. The
scan reports the first place where the flow breaks, what to change, and a curl command to confirm
the fix.
Tip
Run the OAuth checks in MCP Tower before you upload anything to OpenAI, and again after every change to your authorization server. Broken authentication can cost you weeks in review, and it is easy to catch beforehand.
4. Test it privately before you publish the MCP server to ChatGPT
You do not need a listing to use your server in ChatGPT. Any user can add it by URL, and then only
that user has it, which makes it the place to test. Follow OpenAI’s
quickstart: in
ChatGPT Plugins, choose Add custom MCP server, enter the full URL
(for example https://mcp.example.com/mcp) and create it as a plugin.
Try real requests, invalid values and questions that should not call any tool. If ChatGPT picks the wrong tool or fills arguments badly, the descriptions need work: “The model uses this metadata to decide whether and how to call the tool,” says OpenAI’s MCP server guide.
5. Validate your tools and their descriptions in MCP Tower
Tool names and descriptions are text the model reads and acts on. That makes them a channel for prompt injection: a description can carry instructions that steer the model, such as calling another tool, ignoring the user or sending data somewhere. In my view, that risk is the main reason OpenAI reviews plugins so rigorously and takes months to do it.
MCP Tower’s Inspect module validates your tools and their descriptions and recommends what to change, so the text a reviewer reads describes what each tool does and nothing more. Inspect also lets you make quick changes yourself: edit tool titles and descriptions through overrides without waiting for your developers. Scan again until the list is clean, and what you submit is what you have already checked.
6. Build the bundle with the Plugin Creator
The submission is a ZIP of a plugin package: a manifest, optional skills, the MCP configuration, and
icons and screenshots. OpenAI’s plugin build guide
calls the built-in Plugin Creator “the fastest setup”: ask @plugin-creator in ChatGPT, or
$plugin-creator in Codex, and it scaffolds the plugin.
my-plugin/├── .codex-plugin/│ └── plugin.json├── .mcp.json├── skills/└── assets/In my use, the Plugin Creator also prepares the ZIP for the portal, and its update-plugin skill
refreshes the bundle when something changes (step 10). Keep secrets out of the ZIP, including any
OAuth client secret.
7. Upload the ZIP to the ChatGPT plugin directory portal
At platform.openai.com/plugins, choose Upload new or existing plugin. Complete individual or business verification in your organization settings first. The portal opens a draft, and you resolve its findings: metadata and skills, then the MCP server connection, domain verification, OAuth and the tool scan.
Tool annotations come from your server, and your justifications “don’t override the annotations”, per the review page. If a tool is really read-only, fix the annotation on the server and rescan. If you validated in step 5, few scan findings should be left.
8. Add test cases, a video and a demo account
Reviewers rerun what you give them, so each test case has to work every time. The portal asks for five positive and three negative test cases, a video walkthrough, release notes and reviewer credentials. Reuse the prompts from your private testing in step 4, and if the demo account signs in with OAuth, run the MCP Tower checks from step 3 with that account.
9. Submit for review
Choose Submit for review, complete the policy attestations and follow Review status. Feedback comes by email; after approval you choose when to publish. If the plugin is rejected, fix what the email says and upload a corrected ZIP. Read the plugin guidelines before you submit.
How long does ChatGPT plugin approval take?
OpenAI publishes no timeline and says requests for faster review “cannot be accommodated”. From my own submissions, and what other developers report:
| Submission | Approval time |
|---|---|
| First version of a new plugin | 3 months or longer |
| Changes to an existing plugin | 2–4 weeks |
A new origin or a failed review means another wait, which is why steps 2, 3 and 5 come before the upload. Claude’s first review takes about as long, but its updates go through much faster; see How to get listed in the Claude Marketplace.
10. Keep the plugin up to date and measure its usage
OpenAI treats two kinds of change differently (submission page). Changes on the MCP server, such as a better tool description, need no new ZIP: OpenAI rescans hosted servers daily, and a changed tool keeps its old definition live until the new one passes automated checks. Changes to the plugin’s metadata, assets or skills need a new ZIP and a new review, which is where the 2–4 weeks come from.
MCP Tower and the Plugin Creator cover both. In Inspect, Admins and Editors
override tool and argument descriptions and add prompts, and the
middleware serves the new text to every agent; ChatGPT picks up description changes on its next
scan. OpenAI’s docs do not say that ChatGPT reads MCP prompts, so I carry the same guidance into a
skill in the bundle: ask the Plugin Creator to run update-plugin, and it prepares a new ZIP.
Inspect marks every overridden field and warns that a catalog listing may need to be resubmitted. MCP Tower also rescans your server daily and emails Admins and Editors when a tool or description changes, so a change from your developers does not reach ChatGPT unnoticed.
Measure who uses your plugin after you publish
Once you are listed, ChatGPT reports no users, sessions or calls back to you. For a marketing or product team that treats the directory as a growth channel (see Why the ChatGPT plugin directory can be a new growth channel; for Claude, see Why the Claude Marketplace can be a new growth channel), that leaves the next decision without data.
The MCP Tower setup you used for testing now records every request. For ChatGPT traffic, its Measure page shows:
- Users and sessions: ChatGPT sends a stable user identifier with each call, so MCP Tower counts people directly and groups calls into sessions by ChatGPT’s conversation.
- Where users are: a world map of tool calls by country, using the location ChatGPT reports.
- Which tools they call, how often, with what latency and errors, per tool and per AI agent.
- What users do next: widget interactions and the links they open from tool results.
- Uptime of your server, checked on a schedule whether or not there is traffic.
Every report filters by tool, AI agent, country and date range, so you can compare ChatGPT with Claude or one market with another.
Where else to submit your MCP server
ChatGPT is not the only directory worth your time. Once your server passes OpenAI’s review, the same server, the same OAuth setup and the same MCP Tower checks carry over to the other assistants. Claude is covered in How to submit a connector to Claude. These guides cover the rest:
- How to publish an MCP to Muse
- How to publish an MCP in Perplexity
- How to submit an MCP to Gemini
- How to submit a plugin to Grok, which lists it in Grok Bot and Cursor
To reach the developer catalogs as well, publish the same server to the official MCP Registry: How to publish an MCP server to the MCP Registry.
Summary
- ChatGPT lists only remote MCP servers on a public HTTPS endpoint, with OAuth if users sign in.
- The origin cannot change between versions: choose your own hostname, behind MCP Tower, before the first upload.
- Test the OAuth sign-in with MCP Tower’s checks. Broken authentication delays review.
- Test privately by adding the server URL in ChatGPT. Only you see it.
- Validate tools and descriptions in Inspect and apply its recommendations. In my view, prompt injection is why the review is so strict.
- Build the ZIP with the Plugin Creator and upload it at platform.openai.com/plugins.
- In my experience, the first approval takes 3 months or more and updates 2–4 weeks.
- OpenAI reports no usage. MCP Tower counts users, sessions and countries.
If you are about to submit, put MCP Tower in front of your server first: test the sign-in and the tools before the upload, and measure the traffic once you are listed. Open MCP Tower
