In the ChatGPT app
Connectors are added under Settings → Connectors → Create, and on the plans where custom connectors are available you paste the URL there:1
Add the connector
Name it, paste the MCP server URL, and choose OAuth as the authentication
method. The server advertises everything ChatGPT needs to discover the flow
on its own — RFC 9728 protected-resource metadata at
/.well-known/oauth-protected-resource, and RFC 8414 authorization-server
metadata at /.well-known/oauth-authorization-server.2
Sign in and consent
You are sent to the dashboard to sign in, then shown a consent screen naming
ChatGPT and the exact scopes it is asking for. Read them — this is the point
at which you decide what a model may do with your workspace.
3
Use it
The connector appears in the composer. Ask for something a tool answers.
ChatGPT’s research and connector surfaces expect a server to expose two tools
with fixed schemas:
search(query) returning {results: [{id, title, url}]}, and fetch(id) returning {id, title, text, url, metadata}. The
server provides both, mapped onto knowledge search and document fetch, and
returns them as structuredContent and JSON-encoded text because clients
differ on which they read. They are the same two tools every other client sees
— nothing about them is ChatGPT-only except the shape.From the Responses API
Themcp tool takes the server URL and a bearer credential directly. No OAuth,
no connector — this is the path for backend code.
Two credentials, and they are not interchangeable
The Responses API forwards your
headers to our server verbatim. OpenAI never
sees a scope decision; the key does.
If it does not connect
The connector will not save
The connector will not save
ChatGPT fetches
/.well-known/oauth-protected-resource before it will
accept a URL. Confirm it answers, and that you pasted the endpoint
(/mcp) and not the dashboard.Tools are listed but every call fails
Tools are listed but every call fails
The grant carries
mcp:connect and nothing else. Scopes are per tool; see
Authentication.A call returns an error the model reads out loud
A call returns an error the model reads out loud
That is the design. Out of credit, not found and validation failures come
back as tool errors with readable text, not as HTTP faults, so the model can
tell you what went wrong instead of stalling. See
Credits.

