ChatGPT connects to remote MCP servers through its connector settings. The same Streamable HTTP server that serves Claude serves ChatGPT; nothing in the examples is client-specific. What differs is mostly operational: ChatGPT runs in OpenAI's infrastructure, so the server must be reachable from there, over HTTPS, with authorization.
Connector availability, the exact settings path, and whether an administrator must approve a connector depend on the ChatGPT plan and workspace. Check OpenAI's current documentation for your plan before promising customers a connection flow.
Three things the server needs before ChatGPT can use it
- A public HTTPS URL.
127.0.0.1is not reachable from ChatGPT. For a test, a tunnel to your local server works; for anything customers use, deploy it (see production). - Authorization on the MCP endpoint. The examples deliberately have none; they rely on being local. A public endpoint must identify who is calling. The TypeScript SDK ships bearer-token verification and OAuth protected-resource metadata helpers; the other SDKs have equivalents. OAuth is the route that lets each ChatGPT user act on their own account.
- A stable URL. ChatGPT stores the connector URL. Changing it means every user reconnects.
Adding the connector
In ChatGPT, open the settings area for connectors (the location and naming vary by plan), choose to add a remote MCP server, enter the server URL, and complete the authorization flow your server exposes. Once added, the tools appear to the model with the descriptions you wrote, and a user can ask for outcomes in plain language.
Test with the Inspector first
npx @modelcontextprotocol/inspector
Connect to your public URL with the Streamable HTTP transport and walk through the tools. Authorization problems show up here as connection failures, which are far easier to diagnose than a connector that silently lists nothing.
What to verify through ChatGPT
- Tool choice. "Find desk lamps" should call
search_products, notget_product. If it does not, the descriptions need work. - Incomplete lists. "Show me every kitchen product" should produce a mention that more results exist, or a follow-up page, because the description says a non-null
nextCursormeans the list is incomplete. - Orders. "Order two cast iron skillets" should produce a confirmation question before
create_orderruns; a retry after a timeout must not create a second order (the idempotency key does that). - Cancellation. "Cancel order o-5001" must show the order and ask before the tool is called with
confirm: true.
These are the same four behaviours the conformance test checks mechanically. If ChatGPT behaves differently from Claude on one of them, the cause is almost always a description that reads two ways; tighten it rather than adding client-specific logic.
One server, every client
Because MCP is client-neutral, there is no ChatGPT version and Claude version of your server. The examples are tested with a generic MCP client precisely so that they are not tuned to any one assistant.