ChatGPT MCP Setup
Use this guide to connect ChatGPT/OpenAI either through one handle-specific hosted MCP endpoint or through the shared MCP app URL. The public setup is OAuth-first and the runtime now treats connector bootstrap as automatic: handle resolution, OAuth recovery, scope checks, and bridge refresh happen through the shared bootstrap workflow before the requested handle workflow runs.
If you are still deciding whether ChatGPT/OpenAI MCP is the right invocation surface for the job, start with Hosted Tools & Skills Invocation.
What this setup uses
- One connector per handle.
- Hosted MCP on
https://{handle}.mcp.10x.in/mcp. - Optional shared app URL on
https://ai.10x.in/mcp. - OAuth authorization code flow with protected-resource metadata.
- Short-lived OAuth-issued bridge credentials in
mcpv1_...format behind the MCP runtime.
Prerequisites
- A handle such as
acme. - Access to that handle in 10x.
- A connector configuration surface in ChatGPT/OpenAI that supports OAuth or bearer challenge discovery.
- Optional but recommended: access to
https://app.10x.inso you can confirm the endpoint shown underIntegrations -> MCP & Toolsbefore registering the connector.
Recommended scopes by use case
| Use case | Required OAuth scopes |
|---|---|
| MCP session + tool discovery | mcp.connect, skills.read |
| Links | links.read, links.write |
| Analytics export | analytics.read |
| Site/page launch | pages.read, site.deployments.read, site.deployments.write |
| Campaign detail structure pages | pages.read, pages.write |
| Webhooks | webhooks.read, webhooks.write |
| Knowledge query | knowledge.query |
| Context Store connector reads | context_store.search |
| Context Store refresh | context_store.manage |
MCP URL to register
Use one of these URLs:
- Shared app URL:
https://ai.10x.in/mcp - Canonical hosted URL:
https://{handle}.mcp.10x.in/mcp - Compatibility fallback:
https://ai.10x.in/mcp/{handle}/mcp
Use the shared app URL when you want one public ChatGPT/OpenAI app for every user. Users with more than one handle will pick the handle during OAuth, and the connection stays bound to that one handle after approval.
Use the canonical hosted URL when you want one connector per handle with the handle encoded directly in the URL. The compatibility path is fallback-only for rollout windows such as DNS/TLS propagation.
The same endpoint should be visible in the control plane under Integrations -> MCP & Tools. If the admin surface and your connector configuration disagree, fix the handle selection first.
Why custom-domain MCP is not supported
Mapped custom domains only cover public site and redirect traffic. MCP stays on the platform hostname because the runtime currently depends on platform-managed infrastructure for:
- Stable wildcard DNS and TLS for per-handle MCP hosts.
- OAuth protected-resource metadata and authorization-server discovery on known environment domains.
- Deterministic host-to-handle routing and session isolation without per-customer wildcard delegation.
If MCP were moved onto your custom domain, 10x would need to provision and maintain additional wildcard DNS, certificates, OAuth discovery metadata, and routing rules for every customer domain. That is not part of the supported product path today.
How auth works
When ChatGPT/OpenAI calls the MCP endpoint without a bearer token:
POST /mcpreturns401.- The response includes
WWW-Authenticate: Bearer ... resource_metadata="https://{handle}.mcp.10x.in/.well-known/oauth-protected-resource/mcp". - ChatGPT/OpenAI fetches protected-resource metadata and the OAuth authorization server metadata.
- The user signs in on the first-party 10x auth page and approves scopes for that handle.
- The OAuth token exchange returns a short-lived bridge bearer in
mcpv1_...format. - MCP sessions and tool calls use that bridge bearer. It is not shown in PAT management.
- The bootstrap workflow smoke-checks tool discovery and resumes the original request once the connector is ready.
Register in ChatGPT / OpenAI
Confirm the endpoint in 10x
Open
https://app.10x.in, navigate to your handle, and reviewIntegrations -> MCP & Tools. Confirm the hosted MCP endpoint shown there before you register the connector.Open connector setup
Create a new MCP connector/app in ChatGPT or OpenAI Apps.
Copy the exact ChatGPT callback URL
In the ChatGPT app/connector management page, copy the exact OAuth callback URL shown for that connector. It will look like
https://chatgpt.com/connector/oauth/{callback_id}and must be registered exactly as shown.Set server URL
Use
https://ai.10x.in/mcpfor the shared app experience, orhttps://{handle}.mcp.10x.in/mcpfor one connector per handle. Use the compatibility fallback only when hosted DNS/TLS or rollout state is not ready yet.Use OAuth
Choose OAuth/challenge-based auth if the UI offers it. Do not use custom username/password forms.
Authorize one handle
Complete the redirect to 10x, pick the handle, and approve the requested scopes.
Save and test tools/list
Confirm the connector loads tools for that handle. After the first successful auth, later workflow runs reuse the resumable bootstrap state automatically.
Bootstrap script
Use the helper script to fetch protected-resource metadata, perform dynamic client registration, and print the connector values you need:
Handle-specific connector:
node scripts/setup-chatgpt-mcp-oauth.mjs \
--handle <handle> \
--redirect-uri https://chatgpt.com/connector/oauth/<callback_id>
Shared app URL:
node scripts/setup-chatgpt-mcp-oauth.mjs \
--gateway \
--redirect-uri https://chatgpt.com/connector/oauth/<callback_id>
The script prints either the canonical hosted MCP URL or the shared gateway MCP URL, depending on whether you pass --handle or --gateway.
In production, the script should discover https://ai.10x.in as the OAuth authorization server for https://{handle}.mcp.10x.in/mcp. If discovery returns a legacy shared API host for prod, the edge/runtime rollout is still serving stale auth metadata and ChatGPT will not auto-populate OAuth fields correctly.
The script prints:
- MCP server URL
- OAuth authorization server
- dynamically registered
client_id - registered redirect URIs
- default scopes
Use one --redirect-uri flag per callback you want allowlisted. There is no default ChatGPT callback in 10x anymore. Copy the exact value from ChatGPT for every new connector you create.
Example prompts
- "Launch a webpage on my handle."
- "List recent deployments for
acme." - "Create a redirect from
/saleto my checkout." - "Export my attribution report."
- "Query handle knowledge for refund policy."
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
401 missing_bearer_token | OAuth was not completed | Re-open the connector and finish OAuth |
401 invalid_token_format | Connector cached a non-MCP bearer | Re-authorize the connector |
401 session_handle_mismatch | Existing MCP session was opened for a different handle | Create one connector per handle |
OAuth callback fails with invalid_target on https://ai.10x.in/mcp | The shared gateway MCP resource is not registered on the deployed auth server yet | Deploy the shared gateway OAuth support, then retry the OAuth flow |
403 insufficient_scope | Approved scopes do not cover the requested tool | Re-authorize with the missing scopes |
| OAuth reaches token exchange, then fails on callback allowlisting | The connector's exact ChatGPT callback URL was not registered in the OAuth client's redirect_uris | Copy the exact callback URL from ChatGPT, re-run scripts/setup-chatgpt-mcp-oauth.mjs --handle <handle> --redirect-uri <exact-callback> or repair the existing client_id, then re-authorize |
| OAuth fields stay empty in ChatGPT | The advertised authorization_servers host is wrong for the environment | Re-check discovery. Production should advertise https://ai.10x.in, not a legacy shared API host. |
| hosted URL fails but compatibility path works | DNS/TLS or edge rollout is incomplete | Use https://ai.10x.in/mcp/{handle}/mcp temporarily |
Migration Note
PAT-based ChatGPT/OpenAI MCP setup is deprecated and no longer part of public setup guidance. For non-MCP automation tokens, use API Tokens and Automations.
Related
Updated Jun 19, 2026
