How to add a custom MCP server to ChatGPT with developer mode
Connect your own remote MCP server to ChatGPT using developer mode: requirements, auth options, step-by-step setup, refreshing tools and fixing common errors.
The Plugin Directory only lists reviewed plugins. To use any other MCP server in ChatGPT (your company's internal server, a server you are building, or a public one that isn't listed), turn on developer mode. It gives ChatGPT full MCP client support, including tools that write data, and lets you add a server by URL.
OpenAI labels developer mode as elevated risk. Read the safety section at the end before connecting anything you didn't build yourself.
Before you start#
You need:
- An eligible account. Developer mode is available to Plus, Pro, Business, Enterprise and Education accounts, on the web. Workspace policy can turn it off.
- A remote server. ChatGPT connects over the network, so the server needs a public HTTPS URL. A server that only runs as a local command (stdio) won't work directly. Put it behind an HTTP endpoint, a development tunnel, or OpenAI's Secure MCP Tunnel.
- A supported transport. Streamable HTTP or SSE. Streamable HTTP is the current standard; SSE is deprecated by the MCP project.
- The full endpoint URL, including its path. Most servers use
/mcp, for examplehttps://mcp.example.com/mcp. - The server's auth method. ChatGPT supports OAuth, No Authentication and Mixed (described below).
Tip: Building a server on your laptop? Expose it with
ngrok http 8787orcloudflared tunnel --url http://localhost:8787and use the HTTPS URL it prints. See Test and debug an MCP server.
1. Turn on developer mode#
- Open ChatGPT on the web.
- Go to Settings > Security and login.
- Turn on Developer mode.
If the toggle is missing, your plan doesn't include it or your workspace admin has disabled it.
2. Create the connection#
- Go to
chatgpt.com/pluginsand select the plus button. With developer mode on, this creates a developer-mode app for an MCP server. - Enter a name and a short description. The model reads these, so make them describe what the server does.
- Under Connection, choose how ChatGPT reaches the server:
- For a public endpoint, enter the server URL, including the
/mcppath. - For a private server behind Secure MCP Tunnel, select Tunnel, then pick a tunnel or enter its
tunnel_id.
- For a public endpoint, enter the server URL, including the
- Choose the authentication mode.
- Select Create.
- Check the tools and metadata ChatGPT discovered. If the list is empty or wrong, fix the server before going further.
New connections appear under Drafts in your plugin settings.
Picking an auth mode#
- No Authentication: for public, read-only servers. Fine for testing.
- OAuth: the usual choice for hosted servers with user accounts. If you enter static client credentials, ChatGPT uses them. Otherwise it can use Client ID Metadata Documents (CIMD) when the authorization server advertises support, or Dynamic Client Registration (DCR) when configured.
- Mixed: initialization and tool listing happen without auth, then each tool uses OAuth or no auth based on the security schemes in its metadata. Use it when some tools are public and others need a login.
3. Test with a server that needs no login#
Before debugging your own server, confirm the flow works with a known public one. DeepWiki answers questions about public GitHub repositories and needs no auth. Use https://mcp.deepwiki.com/mcp with No Authentication.
OpenAI's own quickstart uses a demo server that exposes a single read-only roll_dice tool: https://tinymcp.dev/api/moldy-aloof-zettabyte/mcp.
4. Use the server in a chat#
- Start a new conversation.
- Open the plus menu in the message box, choose Developer mode, and select your server. (OpenAI's guides also show it under + > More, and in a Work chat you can type
@and pick it. The menu layout varies between rollouts.) - Ask for something the server can do.
Be explicit while you're testing. The model has to choose between your tools and ChatGPT's built-in ones:
Use the "Acme CRM" app's "update_record" tool to set the status of
record 4411 to "closed". Do not use browsing or any other tools.Other prompting tips from OpenAI's docs: name the tool and the input shape, tell the model which tool to prefer when two overlap, and spell out the order of calls when a workflow needs several.
5. Review and confirm tool calls#
Every tool call in the chat can be expanded with the caret to show the full JSON input and output. Use it to check that the model sent what you expected.
- Write actions need confirmation by default. ChatGPT treats any tool without the
readOnlyHintannotation as a write. Read the input before approving: a wrong write can destroy, change or share data. - "Remember" applies to one conversation. You can remember an approve or deny choice for a tool for the rest of that chat. New conversations ask again. Only remember approvals for servers you fully trust.
6. Manage and refresh tools#
Each connection has a details page in your plugin settings. From there you can:
- Toggle individual tools on or off.
- Select Refresh to pull new tools, descriptions and server instructions.
After changing the server's tools, descriptions, schemas, annotations, auth or UI resources:
- Deploy or restart the server.
- Open the connection at
chatgpt.com/pluginsand select Refresh. - Confirm the metadata changed.
- Start a new chat. Old chats keep the tool list they started with.
Business, Enterprise and Edu workspaces#
In a company workspace an admin usually has to allow custom MCP connectors before members see the toggle. The Help Center describes this under Workspace settings > Permissions & Roles > Connected Data (look for developer mode or custom MCP connectors). Labels change between releases, so ask your admin if you can't find it. Members can test servers in developer mode; publishing a plugin to the whole workspace is an admin action.
Troubleshooting#
| Symptom | Likely cause and fix |
|---|---|
| "Couldn't connect" on create | URL is missing /mcp, isn't HTTPS, or the tunnel has stopped. Test the same URL with MCP Inspector. |
| 502 or OAuth errors on a server with no auth | Your server answers OAuth discovery routes with an error page. Return 404 for /.well-known/... paths you don't use. |
| OAuth loop or "invalid redirect" | The redirect URI registered with your identity provider doesn't match the one shown on the connection's page. Copy it exactly. |
| Tools list is empty | tools/list failed or returned invalid JSON Schema. Check server logs. |
| New tool doesn't appear | Select Refresh, then start a new chat. |
| Every call asks for approval | The tool lacks readOnlyHint: true. Add it only if the tool really changes nothing. |
| Model ignores your server | Make tool descriptions start with "Use this when…", and name the tool in your prompt. |
| Private server unreachable | Check the tunnel's workspace association and that tunnel-client is running. |
Safety checklist#
Warning: A connected server can read whatever the model sends it, and its tool descriptions and results go straight into the model's context. A malicious or compromised server can try to inject instructions or pull data out of your chat.
- Prefer official servers run by the service itself, such as Linear's at
https://mcp.linear.app/mcpor GitHub's, over third-party proxies. - Keep write confirmations on until you trust the server.
- Don't paste secrets into chats that have untrusted servers attached.
- Turn off tools you don't need on the connection's details page.
- Remove connections you've stopped using.
Next steps#
- Browse remote servers worth connecting in the MCP directory.
- Build your own with Build your first ChatGPT app.
- Call the same servers from code with Use remote MCP servers in the OpenAI API.