Skip to main content
ChatGPT Preview. ChatGPT reaches the server two ways, and they authenticate differently: the chat UI drives a full OAuth 2.1 flow, while the Responses API takes a bearer key you supply.

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.
A connector URL is pasted into somebody else’s product and lives in your settings indefinitely. Every OAuth token the server issues is bound to this exact resource URI (RFC 8707), so a token minted for https://api.impellabs.tech/mcp is refused anywhere else — including by us, if the audience is not us. Use the URL exactly as written.

From the Responses API

The mcp tool takes the server URL and a bearer credential directly. No OAuth, no connector — this is the path for backend code.
"require_approval": "never" lets the model call any tool the key’s scopes allow, unattended. Combine it with allowed_tools and a narrowly scoped key — a key holding only agents:read cannot be talked into spending credits, and that is a stronger guarantee than an approval prompt nobody reads.

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

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.
The grant carries mcp:connect and nothing else. Scopes are per tool; see Authentication.
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.