/
Guides
How to publish your MCP app on ChatGPT
A ChatGPT submission is easier to get right than to fix. OpenAI allows one active review per plugin, so anything missing or wrong costs you a full review cycle. This guide walks the whole process in order, so you submit once, with everything in place.
A ChatGPT app now ships as a plugin, and the plugin goes through OpenAI’s submission portal at platform.openai.com/plugins. We have taken many apps through it. The steps work for any MCP server, and we flag where Alpic tools can save you time.
Why list your app at all?
ChatGPT is where your users already work. A listing puts your app in front of them inside the conversation, and a reviewed plugin gives them a vetted option instead of a connector they have to paste in themselves.

Before you start the submission process
You need:
A verified individual or business identity on the OpenAI platform, for the exact name you will publish under, and permission to submit (organization owners can, teammates need Apps Management Write).
A project with global data residency. Projects with EU data residency can’t submit.
A remote MCP server on a public HTTPS endpoint, on a domain you will keep, because the URL can’t change through the update flow. No server yet? Deploying from a Git repository on Alpic gives you one with no configuration.
A privacy policy, terms of service, a company website, a support page, and a test account with sample data and no MFA.
Test it in ChatGPT like a reviewer
Go to chatgpt.com/plugins, select the plus button, choose Add custom MCP server, enter your public URL (the one ending in /mcp) and select Create as a plugin. Then start a conversation, type @, pick the plugin and try direct, indirect, follow-up and unsupported requests. After any server change, open the connection and select Refresh. To call tools directly, run npx @modelcontextprotocol/inspector@latest.
Refreshing and prompting gets slow with several views, so check layouts in the Alpic Playground at /try instead of in ChatGPT: it renders every view inline, in picture-in-picture and fullscreen without prompting, and you can see how it renders on multiple AI surfaces.
Check your server against the requirements
Reviewers check three things:
Annotations match behavior:
readOnlyHintonly for tools that strictly read,destructiveHintfor anything irreversible,openWorldHintfor tools that reach the open internet.The CSP lists the exact domains your UI fetches from.
Responses return only what the request needs, with no internal IDs, logs or debug fields.
Checking this by hand across every tool is where things slip, so we suggest to run Beacon first. It audits a remote MCP server from its URL against the requirements the stores apply, and the Alpic dashboard adds live view checks in ChatGPT. After alpic login (unauthenticated servers only), run: alpic audit --url https://your-server.com/mcp
Submit your MCP server
Everything happens in Plugins at platform.openai.com/plugins, and the portal saves a draft as you go.
Build the package
OpenAI takes a ZIP with a plugin.json manifest and an mcp.json file that declares exactly one remote MCP server, and no credentials. The manifest carries the listing: a name and short description of up to 30 characters each, a long description, HTTPS links for your website, support page, privacy policy and terms, and a square icon. Test cases and the demo video URL go with it, and release notes can too.
Writing the listing and test cases from scratch is the slow part. On Alpic, the submission helper (Submissions tab, then Submit my plugin) does the first pass for a deployed server: it pre-fills the listing, drafts the description, subtitle and test cases, and generates the file to hand to OpenAI. We read every drafted field, because generated copy is where inaccuracies hide.

Upload and check the package
Select Upload new or existing plugin, choose your verified identity and upload the ZIP. Read any Issues under Metadata & Skills, fix the package and upload it again. Required skill scans must pass before you can submit.
Verify your domain and connect the server
Host the token OpenAI gives you at https://your-domain/.well-known/openai-apps-challenge, as plain text and nothing else. Then open MCPs, select your server, select Connect and authorize the account OpenAI uses to scan it. Authentication (none, OAuth or mixed) is set in mcp.json, since API keys and bearer tokens are not supported. An OAuth client secret goes in the portal, never in the file.
Run the tool scan
Let the scan finish, open Issues and fix what it flags, then select Reconnect or Rescan.
Complete the review details
Open Review information, then Review details, and add a dedicated test account: login URL, workspace details and sign-in instructions, with sample data and no MFA, codes or magic links.
Run every test case with that account first. The five positive cases each need a description, a prompt, the tools triggered and the expected behavior. The three negative cases each need a description and a prompt, and should say why the plugin must not act. Imported items are read-only here, so to change one, edit the package and upload it again. Select Save details.
Submit
Select the draft, choose Submit for review, accept the policy attestations and confirm. Feedback arrives by email, and you can follow progress under Review status on the Plugins page.
Publish, then update with care
Approval does not put your app in ChatGPT. It goes live only when you open the approved version and select Publish plugin, so you choose the moment. To replace a package while a review is open, wait for the decision or cancel the review first.
After publishing, OpenAI scans your server daily, and new tools stay unavailable until approved. Package changes need a new ZIP with a new version number. On Alpic, we keep one environment per version (v1, v2), so the version under review stays untouched while you work on the next.
Get it right the first time
Submitting well is mostly preparation. Test in ChatGPT, check the three requirements, and keep one version stable during review. On Alpic, Beacon and the submission helper cover most of it, and our docs walk the full path from code to a live listing.





