Technical Deep Dives
How to submit your MCP server to Claude and ChatGPT
A step-by-step guide to listing a remote MCP server in Claude's Connectors Directory and the ChatGPT plugin directory, and how an Opus 5.5 agent loop did most of the work.
DevOps Team
10 min read
Product capabilities, plans and interfaces may have changed since publication.

If you've built a remote MCP server, the two directories that matter most are Claude's Connectors Directory and the ChatGPT plugin directory (what OpenAI first called the App Directory). Between them they put you in front of most people who use an AI assistant at work.
We just took the FileSpin MCP server through both. This post is the tutorial we wish we'd had. It covers what each directory asks for, what their automated checks flag, and the fixes we made along the way.
It's also about how we did it. Almost all of the work, including code changes, tests, pull requests, CI, merges and releases, ran as a self-directed loop with Claude Opus 5.5 in Claude Code. A human approved deploys, sign-ins and the final submit.
Before you start: what both directories expect
Both directories want roughly the same server:
A public, remote MCP endpoint over Streamable HTTP. Ours is
https://mcp.filespin.io/mcp.OAuth sign-in that follows the MCP Authorization spec, so the assistant never sees a password or API key. Both directories handle dynamic client registration (DCR).
Tool annotations on every tool. Claude requires a
titleand areadOnlyHintordestructiveHint. ChatGPT requires all three ofreadOnlyHint,destructiveHintandopenWorldHint, and checks them against what each tool actually does.A privacy policy, terms, a support contact and public docs.
A reviewer test account that signs in without MFA, email codes or magic links, with realistic sample data.
Get these right first. Everything else is paperwork.
Part 1: Submitting to ChatGPT
OpenAI's flow lives at platform.openai.com → Plugins. It's built around a package (a ZIP) plus a connected MCP server, and it tells you exactly what's wrong at each step.
1. Verify your organization
Under Settings → General → Verifications, verify as a Business so the listing shows your company as the developer. Only org Owners (or members whose role includes Apps Management Write) can submit. We found that out when the plugin page told our ops account "You don't have permission to submit plugins".
2. Build the plugin ZIP
The package uses the portable Agent Plugins layout:
The listing lives in plugin.json under extensions["com.openai"].interface: displayName (30 characters), shortDescription (30 characters, a one-line subtitle), longDescription, category, capabilities, websiteURL, supportURL, privacyPolicyURL, termsOfServiceURL, up to three defaultPrompts, brand colours and the logo.
In mcp.json, declare OAuth explicitly:
Two things caught us out:
Test cases come from the ZIP, not the form. The review form asks for exactly 5 positive and 3 negative test cases, but the form fields are read-only. They have to be in
extensions["com.openai"].review.test_cases. We keep ours in a private file and merge them in at build time, so they never land in our public plugin repo.Keep the ZIP minimal. Leave out other clients' manifests (
.claude-plugin/,.mcp.json) so the validator only reads what it should.
We added a small build-chatgpt-zip.sh that checks every field limit, icon path and skill front-matter rule before upload. Then the upload's automated checks are just confirmation.
3. Upload and read the findings
Upload the ZIP and OpenAI runs metadata, skill and MCP checks. Findings are labelled blocking or non-blocking, with a filter for each. That one design decision saves a lot of anxiety.
4. Connect the server and verify your domain
On the MCPs tab, OpenAI shows a token to serve as plain text at https://<your-mcp-host>/.well-known/openai-apps-challenge. We added a route that returns an OPENAI_APPS_CHALLENGE env var (and 404 when it isn't set).
Then Connect signs in an account (use your test account) and scans every tool.
5. Fix what the tool scan finds
This is where ChatGPT earns its keep. The scan judged our annotations against what the tools do, and it was right:
Five tools were marked
openWorldHint: falsebut fetched arbitrary URLs (asource_url, amask_url, a watermark URL) or created public links by default. We flipped them totrue.
After deploying, one Rescan came back with "No findings in the latest MCP scan."
6. Fill in the review form
The form walks you through:
Countries.
Reviewer credentials: login URL, username, password and sign-in steps. Use a dedicated sample-data account that OpenAI can keep using for ongoing safety testing.
Test cases, from the ZIP.
Negative test cases, from the ZIP.
A video walkthrough of your five test cases, plus release notes (also from the ZIP).
Then accept the policy attestations and Submit for review. After approval, publishing is a separate, manual step.
Part 2: Submitting to Claude
Anthropic's flow lives at claude.ai/directory/manage. Any paid plan can submit, and it's a form rather than a package.
Submit new → MCP connector. Enter your server URL. The wizard probes the server and captures its tool list.
Listing details: one-liner (200 characters), description (2,000), categories, icon, documentation, support and privacy policy.
Directory presentation: where it works (Claude web and mobile, Desktop, Code, API), author, a permissions summary and sensitive data types.
Tools and prompts: the names advertised on your listing. Sync from server refreshes them from your live server. Check the result: ours came back from a cache that still listed a tool we'd already removed.
Use cases and prerequisites: three use cases with example prompts, plus what a user needs before connecting. These are shown to reviewers only.
User data: API ownership, health data, sponsored content.
Policy acknowledgements. Read these carefully against what your server actually does. One reads "My MCP server does not use AI models to generate images, video, or audio." We have AI image tools (generate, fill, expand), so we unticked it and explained the tools in Additional notes: user-initiated, the customer's own assets only, saved as a new version by default, charged as credits. Don't tick a box that isn't true to get past a form.
Saving updates a submission that's already in review ("Reviewers see what's on this page"), so you can keep improving it while you wait.
ChatGPT vs Claude: Submission process comparison
We like both companies' assistants, and we use Claude every day. But as submission processes, OpenAI's is clearly better thought out today:
ChatGPT plugin directory | Claude Connectors Directory | |
|---|---|---|
Format | Versioned ZIP package plus connected server | Web form |
Automated checks | Metadata, skill safety scans and a full MCP tool scan, each finding marked blocking or non-blocking | Mostly self-attested checkboxes |
Tool annotations | Checked against behaviour (it caught 5 wrong | Required, but not visibly checked |
Fix loop | Change the server → Rescan in minutes. Change metadata → upload a new ZIP | Edit the form. "Tool list refresh is not available for this organization yet", so reviewers keep the capture from submission day |
Domain ownership | Required ( | Not asked |
Reviewer testing | Structured: credentials, 5+3 test cases, demo video | Free-text use cases and notes |
Visibility | You always know what's blocking you | "In review. Nothing to do until a reviewer decides." |
The ChatGPT flow is stricter, and it surfaced real problems in our server: problems a user or a reviewer would eventually have hit. The Claude flow was quicker to fill in, but then gave us no signal. Your mileage may vary. Other teams report faster Claude reviews, and Anthropic is clearly still building out the portal.
How we ran it: a self-directed loop with a manual deploy gate
We didn't do this by hand. We ran the whole effort as one long Claude Code session on Claude Opus 5.5, working in our repo with the GitHub CLI, a browser and our design docs. The loop looked like this:
What the agent did on its own:
Research: searched the web for every MCP registry and directory worth listing in, then read OpenAI's submission docs and the MCP registry spec.
Change: wrote the code and docs. That meant the annotation fixes, the domain-verification route, removing
search_by_faceand the legacy "Teleport" product naming, the ZIP build script and the reviewer test cases.Test: ran
go vet,go test ./..., both builds and our plugin public-safety check before every commit.PR → CI → merge: opened a pull request for each change, waited for CI and merged only when it was green.
Release: opened the
dev → mainrelease PR, merged it, published the GitHub release and watched the image build until it succeeded.Verify: after each deploy, signed in to staging and then prod through a read-only OAuth flow and checked the live
tools/list. That covered tool count, annotations and which tools were open-world.Track: kept a GitHub issue up to date at every step, so anyone on the team could see where things stood.
What a human did (the gates):
Deploying each release to staging and production.
Signing in and consenting: passwords, OAuth "Authorize" clicks and switching accounts.
Decisions that are ours to make: Untick an attestation or remove the AI tools? Which account submits?
The final Submit in each portal.
Where the loop paid for itself, beyond speed:
Before releasing, the agent ran the plugin publish as a dry run.
It caught policy statements on the Claude form that didn't match our server and raised them instead of re-confirming them.
Checklist
Remote MCP over Streamable HTTP, OAuth with DCR, no API keys in the client
title,readOnlyHint,destructiveHintandopenWorldHinton every tool, true to what it doesNothing a reviewer will read as biometric, financial or deceptive unless you can defend it
Privacy policy, terms, support contact and public docs
A dedicated test account with sample data and no MFA
ChatGPT: business verification, ZIP with listing plus 5+3 test cases,
/.well-known/openai-apps-challenge, connect, Rescan until clean, demo videoClaude: the portal form, three use cases, and attestations that are actually true
A loop you trust for test → PR → CI → merge → release, with a human on the deploy button
FileSpin is a digital asset management platform for images, videos and documents. Try the FileSpin MCP server in Claude, ChatGPT or any MCP client.
