Which clients support remote MCP servers
Which MCP clients connect to remote servers, over which transports, with which OAuth registration and static credentials, and what each one cannot do, with a verification date on every row.
On this page
Every client below can connect to a remote MCP server over Streamable HTTP. Where they differ is how they register with your OAuth server, whether you can send a fixed token or API key instead, whether they reach private hosts, and which limits apply once connected. This page is generated from the same data that drives mcptest's compatibility checks, so the table, the per-client notes and the report agree.
The full matrix
Each row carries the date its cells were last checked against the vendor's documentation. "Bridge required" means the client needs a tunnel or a stdio bridge to reach that kind of server.
| Client | Version | Streamable HTTP | Legacy SSE | stdio | Protocol versions | OAuth registration | Other credentials | Private hosts | Configuration | Verified |
|---|---|---|---|---|---|---|---|---|---|---|
| Claude.ai custom connectors (opens in a new tab) (guide) | unknown | Yes | Yes | No | unknown | DCR, CIMD, pre-registered client | no auth; custom headers, bearer token, API key header limited | No | UI: Customize > Connectors > Add custom connector; UI: Team/Enterprise: Organization settings > Connectors > Add > Custom > Web | 2026-10-20 |
| Claude Desktop (opens in a new tab) (guide) | unknown | Yes | Yes | Yes | unknown | DCR, CIMD, pre-registered client | no auth; custom headers, bearer token, API key header limited | No | UI: Remote: Customize > Connectors (same as claude.ai); UI: Local: Settings > Developer > Edit Config, or Settings > Extensions for .mcpb files; File: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows), local servers only | 2026-10-20 |
| Claude Code (opens in a new tab) (guide) | 2.1.304 | Yes | Yes | Yes | unknown | DCR, CIMD, pre-registered client | custom headers, bearer token, API key header, no auth | unknown | CLI: claude mcp add --transport http <name> <url>; File: .mcp.json (project) or ~/.claude.json (local and user scopes) | 2026-10-20 |
| ChatGPT custom MCP servers (developer mode, deep research) (opens in a new tab) (guide) | unknown | Yes | Yes | Bridge required | unknown | DCR, CIMD, pre-registered client | no auth; custom headers unknown | Bridge required | UI: ChatGPT web: Plugins > Add custom MCP server, then configure authentication and accept the risk warning | 2026-10-20 |
| Codex CLI (opens in a new tab) (guide) | rust-v0.163.0 | Yes | Bridge required | Yes | unknown | DCR, CIMD, pre-registered client | custom headers, bearer token, API key header; no auth unknown | unknown | CLI: codex mcp add <name> --url <url>, then codex mcp login <name>; File: ~/.codex/config.toml, [mcp_servers.<name>] | 2026-10-20 |
| Cursor (opens in a new tab) (guide) | 3.24 | Yes | Yes | Yes | unknown | DCR, pre-registered client; CIMD unknown | custom headers, bearer token, API key header, no auth | unknown | File: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global), mcpServers; UI: Customize > MCPs | 2026-10-20 |
| VS Code with GitHub Copilot (opens in a new tab) (guide) | 1.142 | Yes | Yes | Yes | unknown | DCR, CIMD, pre-registered client | custom headers, bearer token, API key header, no auth | Yes | UI: MCP: Add Server command; File: .vscode/mcp.json or user mcp.json (servers), or .mcp.json and ~/.copilot/mcp-config.json (mcpServers); CLI: code --add-mcp '<json>' | 2026-10-20 |
| Windsurf (Devin Desktop, Cascade) (opens in a new tab) (guide) | unknown | Yes | Yes | Yes | unknown | DCR, CIMD, pre-registered client unknown | custom headers, bearer token, API key header; no auth unknown | unknown | File: ~/.config/devin/mcp_config.json (%APPDATA%\devin\mcp_config.json on Windows), serverUrl or url; UI: Cascade panel > ... > MCPs > Open MCP config file | 2026-10-20 |
| Gemini CLI (opens in a new tab) (guide) | unknown | Yes | Yes | Yes | unknown | DCR, pre-registered client; CIMD unknown | custom headers, bearer token, API key header, no auth | Yes | CLI: gemini mcp add --transport http <name> <url>; File: ~/.gemini/settings.json (user) or .gemini/settings.json (project), mcpServers | 2026-10-20 |
| MCP TypeScript SDK client (opens in a new tab) | 2.3.1 | Yes | Yes | Yes | 2024-10-07, 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25, 2026-07-28 | DCR, CIMD, pre-registered client | custom headers, bearer token, API key header, no auth | Yes | CLI: Programmatic: new Client(...).connect(new StreamableHTTPClientTransport(url)) | 2026-10-20 |
Known limitations:
- Claude.ai custom connectors: Free plans can add one custom connector. (Claude Help Center: Get started with custom connectors using remote MCP (opens in a new tab))
- Claude.ai custom connectors: On Team and Enterprise only Owners add custom connectors, and each member connects separately. (Claude docs: Add a connector that isn't in the directory (opens in a new tab))
- Claude.ai custom connectors: The server must be reachable from Anthropic's outbound range 160.79.104.0/21 over IPv4; hostnames with only AAAA records fail. (Anthropic API: IP addresses (opens in a new tab))
- Claude.ai custom connectors: Private, loopback and CGNAT addresses are rejected, including mixed public/private DNS answers. (Claude docs: Troubleshoot your connector (opens in a new tab))
- Claude.ai custom connectors: OAuth discovery, registration and token endpoints must answer within 10 seconds (refresh: 30 seconds). (Claude docs: Authentication for connectors (opens in a new tab))
- Claude.ai custom connectors: Sign-in starts only from a 401; PKCE S256 is required; only the first authorization_servers entry is used. (Claude docs: Authentication for connectors (opens in a new tab))
- Claude.ai custom connectors: A cross-host redirect of the server URL drops the Authorization header. (Claude docs: Troubleshoot your connector (opens in a new tab))
- Claude.ai custom connectors: Authentication settings cannot be edited after the connector is saved. (Claude docs: Add a connector that isn't in the directory (opens in a new tab))
- Claude.ai custom connectors: Tool calls time out after 240 seconds; results are capped at about 150,000 characters. (Claude docs: Building connectors (opens in a new tab))
- Claude.ai custom connectors: Private networks are reachable only through MCP tunnels, an Enterprise research preview. (Claude docs: MCP tunnels (opens in a new tab))
- Claude Desktop: Remote connectors have the same public-internet, IPv4 and egress-range requirements as claude.ai. (Claude Help Center: Get started with custom connectors using remote MCP (opens in a new tab))
- Claude Desktop: Local servers from claude_desktop_config.json are not available in claude.ai or Cowork. (Claude Help Center: Get started with custom connectors using remote MCP (opens in a new tab))
- Claude Desktop: No official page says whether a remote URL in claude_desktop_config.json works; add remote servers as connectors. (Claude Help Center: When to use desktop and web connectors (opens in a new tab))
- Claude Desktop: Organizations can disable or restrict desktop extensions. (Claude docs: Add a connector that isn't in the directory (opens in a new tab))
- Claude Code: Non-interactive runs (claude -p, Agent SDK) cannot complete OAuth; sign in interactively first. (Claude Code: Connect Claude Code to tools via MCP (opens in a new tab))
- Claude Code: Project-scoped .mcp.json servers need approval in interactive sessions. (Claude Code: Connect Claude Code to tools via MCP (opens in a new tab))
- Claude Code: v2.1.229 sent 127.0.0.1 callbacks and broke exact redirect matches; v2.1.231 restored localhost. (Claude Code: Connect Claude Code to tools via MCP (opens in a new tab))
- Claude Code: HTTP and SSE responses over 16 MiB fail; tool output is limited to 25,000 tokens by default. (Claude Code: Connect Claude Code to tools via MCP (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): Deep research and company knowledge use read and fetch actions only; servers for them should implement search and fetch tools. (OpenAI: Building MCP servers for plugins and API integrations (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): Generic custom MCP servers no longer require search and fetch tools. (OpenAI: Add custom MCP server (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): Tools without readOnlyHint are treated as write actions and ask for confirmation by default. (OpenAI: Add custom MCP server (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): The authorization server must advertise PKCE S256 in code_challenge_methods_supported. (OpenAI Apps SDK: Authentication (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): Workspace permissions and security restrictions, including Lockdown, apply to custom servers. (OpenAI: Add custom MCP server (opens in a new tab))
- ChatGPT custom MCP servers (developer mode, deep research): Secure MCP Tunnel and local endpoints do not meet public submission requirements. (OpenAI plugins: Build an MCP server (opens in a new tab))
- Codex CLI: startup_timeout_sec defaults to 10 seconds and tool_timeout_sec to 60 seconds. (ChatGPT Learn: Model Context Protocol in Codex (opens in a new tab))
- Codex CLI: Project .codex/config.toml files apply only in trusted projects. (ChatGPT Learn: Model Context Protocol in Codex (opens in a new tab))
- Codex CLI: ChatGPT web does not read local Codex configuration. (ChatGPT Learn: Model Context Protocol in Codex (opens in a new tab))
- Cursor: envFile works only for stdio servers. (Cursor docs: Model Context Protocol (MCP) (opens in a new tab))
- Cursor: An admin allowlist restricts remote URLs to the configured pattern. (Cursor docs: Model Context Protocol (MCP) (opens in a new tab))
- Cursor: Restart Cursor after editing mcp.json or the shell environment. (Cursor help: MCP (opens in a new tab))
- Cursor: A Cursor-hosted callback page exists for OAuth apps that reject local redirect URIs. (Cursor release notes (opens in a new tab))
- VS Code with GitHub Copilot: At most 128 tools can be enabled in one chat request. (VS Code: Tools in chat (opens in a new tab))
- VS Code with GitHub Copilot: Servers that need input prompts are not forwarded to Copilot harness sessions. (VS Code: Add MCP servers in VS Code (opens in a new tab))
- VS Code with GitHub Copilot: Workspace servers do not start in Restricted Mode, and organization policy can block servers. (VS Code: Manage MCP servers (opens in a new tab))
- VS Code with GitHub Copilot: Open issue: Agent Host (Copilot SDK) chats never start OAuth sign-in for remote HTTP servers; the local agent works. (microsoft/vscode#341574: Agent Host chats never start OAuth sign-in for remote HTTP MCP servers (opens in a new tab))
- Windsurf (Devin Desktop, Cascade): Cascade can use at most 100 tools at a time. (Devin Desktop docs: Cascade MCP configuration (opens in a new tab))
- Windsurf (Devin Desktop, Cascade): Once a team allowlists one server, every other server is blocked; IDs must match the config key exactly. (Devin Desktop docs: Cascade MCP configuration (opens in a new tab))
- Windsurf (Devin Desktop, Cascade): OAuth is supported for every transport, but the docs do not say how the client registers. (Devin Desktop docs: Cascade MCP configuration (opens in a new tab))
- Windsurf (Devin Desktop, Cascade): Enterprise users must turn MCP on in settings. (Devin Desktop docs: Cascade MCP configuration (opens in a new tab))
- Gemini CLI: OAuth needs a local browser; it fails over SSH without X11 forwarding and in containers without a browser. (Gemini CLI: MCP servers with Gemini CLI (opens in a new tab))
- Gemini CLI: Unpaid-tier and Google One users were moved to Antigravity CLI on 18 June 2026. (Gemini CLI: MCP servers with Gemini CLI (opens in a new tab))
- Gemini CLI: When several of httpUrl, url and command are set, httpUrl wins, then url. (Gemini CLI: configuration reference (opens in a new tab))
- Gemini CLI: "trust": true skips every tool confirmation for that server. (Gemini CLI: MCP servers with Gemini CLI (opens in a new tab))
- MCP TypeScript SDK client: The application wires transports, auth and handlers; what a given SDK-based client supports depends on that code. (TypeScript SDK v2: Connect a client (opens in a new tab))
- MCP TypeScript SDK client: The SDK does not validate the OAuth state parameter; the application must. (TypeScript SDK v2: OAuth (opens in a new tab))
"Limited" means beta, plan-gated or restricted to some accounts. "unknown" means the vendor's current documentation does not state it. Every cell, with its source page and verification date, is in clientCompatibility.json (opens in a new tab).
Claude.ai custom connectors
Verified 2026-10-20. Claude.ai connects over Streamable HTTP and the deprecated SSE transport, signs in with OAuth through CIMD, Dynamic Client Registration or your own client ID, and accepts authless servers. It cannot run stdio servers or reach addresses that are not globally routable (MCP tunnels, an Enterprise research preview, are the exception), and fixed request headers are a beta for a limited set of organizations.
Configure it under Customize > Connectors > Add custom connector; on Team and Enterprise, an Owner adds it under Organization settings > Connectors > Add > Custom > Web. Guide: Add a remote MCP server to Claude.
Claude Desktop
Verified 2026-10-20. Remote servers are added to the Claude account as connectors and get the same transports, OAuth options and public-internet requirements as claude.ai, while local stdio servers run from claude_desktop_config.json or desktop extensions. No official page says whether a remote URL in claude_desktop_config.json works, and local servers configured there are not available in claude.ai or Cowork.
Remote servers go in Customize > Connectors; local servers in Settings > Developer > Edit Config or Settings > Extensions for .mcpb files. Guide: Add a remote MCP server to Claude.
Claude Code
Verified 2026-10-20 against version 2.1.304. Claude Code supports Streamable HTTP, SSE and stdio, all three OAuth registration modes, and static Authorization or other headers, including a headersHelper command. Non-interactive runs (claude -p, the Agent SDK) cannot complete OAuth, and the docs do not state whether private or localhost HTTP servers are reachable.
Add a server with claude mcp add --transport http <name> <url>, or edit .mcp.json (project) or ~/.claude.json. Guide: Add a remote MCP server to Claude.
ChatGPT
Verified 2026-10-20. ChatGPT connects over Streamable HTTP (recommended, usually at /mcp) or SSE, and signs in with OAuth through CIMD (preferred), Dynamic Client Registration or static client credentials, or with no authentication. It cannot present custom API keys or bearer tokens other than the OAuth-issued one, and stdio or private servers need Secure MCP Tunnel.
Add a server in ChatGPT web under Plugins > Add custom MCP server, then configure authentication and accept the risk warning. Guide: Connect an MCP server to ChatGPT.
Codex CLI
Verified 2026-10-20 against rust-v0.163.0. Codex supports Streamable HTTP and stdio, OAuth through Dynamic Client Registration, CIMD or a client ID, a bearer token read from an environment variable, and static or environment-sourced headers. Legacy SSE servers need a stdio bridge, and an explicit no-auth mode for HTTP servers is not documented.
Run codex mcp add <name> --url <url>, then codex mcp login <name>, or edit [mcp_servers.<name>] in ~/.codex/config.toml. Guide: Connect an MCP server to Windsurf, Gemini CLI and Codex.
Cursor
Verified 2026-10-20 against version 3.24. Cursor supports Streamable HTTP, SSE and stdio, OAuth through Dynamic Client Registration or a static client ID in an auth block, arbitrary headers with ${env:NAME} interpolation, and url-only servers without sign-in. CIMD is not mentioned in its documentation, and an admin allowlist can restrict which remote URLs are allowed.
Edit mcpServers in .cursor/mcp.json (project) or ~/.cursor/mcp.json (global), or use Customize > MCPs. Guide: Connect an MCP server to Cursor.
VS Code with GitHub Copilot
Verified 2026-10-20 against version 1.142. VS Code supports Streamable HTTP with SSE fallback, stdio, every OAuth registration mode, headers with ${input:...} variables, and localhost servers, Unix sockets and Windows named pipes. At most 128 tools can be enabled in one chat request, and an open issue means Agent Host (Copilot SDK) chats never start OAuth sign-in for remote HTTP servers.
Use the MCP: Add Server command, edit servers in .vscode/mcp.json or the user mcp.json, or run code --add-mcp '<json>'. Guide: Connect an MCP server to VS Code.
Windsurf
Verified 2026-10-20. Windsurf (Devin Desktop, Cascade) supports Streamable HTTP, SSE and stdio, and headers with ${env:VAR} or ${file:path} values. OAuth is supported for every transport but the docs do not say how the client registers, and Cascade can use at most 100 tools at a time.
Edit serverUrl or url in ~/.config/devin/mcp_config.json (%APPDATA%\devin\mcp_config.json on Windows), or open it from the Cascade panel under MCPs > Open MCP config file. Guide: Connect an MCP server to Windsurf, Gemini CLI and Codex.
Gemini CLI
Verified 2026-10-20. Gemini CLI supports Streamable HTTP (httpUrl), SSE (url) and stdio, OAuth through Dynamic Client Registration or a client ID in an oauth block, bearer and API-key headers, and localhost servers. OAuth needs a local browser, so it fails over SSH without X11 forwarding and in containers without one, and CIMD is not mentioned.
Run gemini mcp add --transport http <name> <url>, or edit mcpServers in ~/.gemini/settings.json (user) or .gemini/settings.json (project). Guide: Connect an MCP server to Windsurf, Gemini CLI and Codex.
MCP TypeScript SDK client
Verified 2026-10-20 against version 2.3.1. The SDK is the only client here that documents its protocol versions, and it supports every transport and authentication mode in the matrix. What a client built on it supports depends on how the application wires transports, auth and handlers, and the SDK does not validate the OAuth state parameter, so the application must.
Connect programmatically with new Client(...).connect(new StreamableHTTPClientTransport(url)). There is no mcptest guide; see the SDK client documentation (opens in a new tab).
How we verify
Each cell in the matrix is read from the vendor's current official documentation and stored with the exact source page and the day it was read. Where a vendor does not document something, the cell says "unknown"; support is never inferred from forum posts or third-party blogs. A client's verification date is the oldest date among its cells.
The freshness rule is 90 days: the compatibility check fails when any cell was verified more than 90 days ago, and the fix is to re-read the source and update the cell and its date, even when nothing changed. The process, and how the same data drives mcptest's host verdicts, is described in the host compatibility engine documentation (opens in a new tab).
Check your server against these clients
The matrix tells you what a client documents; it does not tell you whether your server meets it. Open the MCP Playground, paste your endpoint and connect to see the transport, OAuth discovery and capabilities each of these clients will run into.