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.

Practitioner9 min readLast reviewed

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.

ClientVersionStreamable HTTPLegacy SSEstdioProtocol versionsOAuth registrationOther credentialsPrivate hostsConfigurationVerified
Claude.ai custom connectors (opens in a new tab) (guide)unknownYesYesNounknownDCR, CIMD, pre-registered clientno auth; custom headers, bearer token, API key header limitedNoUI: Customize > Connectors > Add custom connector; UI: Team/Enterprise: Organization settings > Connectors > Add > Custom > Web2026-10-20
Claude Desktop (opens in a new tab) (guide)unknownYesYesYesunknownDCR, CIMD, pre-registered clientno auth; custom headers, bearer token, API key header limitedNoUI: 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 only2026-10-20
Claude Code (opens in a new tab) (guide)2.1.304YesYesYesunknownDCR, CIMD, pre-registered clientcustom headers, bearer token, API key header, no authunknownCLI: 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)unknownYesYesBridge requiredunknownDCR, CIMD, pre-registered clientno auth; custom headers unknownBridge requiredUI: ChatGPT web: Plugins > Add custom MCP server, then configure authentication and accept the risk warning2026-10-20
Codex CLI (opens in a new tab) (guide)rust-v0.163.0YesBridge requiredYesunknownDCR, CIMD, pre-registered clientcustom headers, bearer token, API key header; no auth unknownunknownCLI: 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.24YesYesYesunknownDCR, pre-registered client; CIMD unknowncustom headers, bearer token, API key header, no authunknownFile: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global), mcpServers; UI: Customize > MCPs2026-10-20
VS Code with GitHub Copilot (opens in a new tab) (guide)1.142YesYesYesunknownDCR, CIMD, pre-registered clientcustom headers, bearer token, API key header, no authYesUI: 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)unknownYesYesYesunknownDCR, CIMD, pre-registered client unknowncustom headers, bearer token, API key header; no auth unknownunknownFile: ~/.config/devin/mcp_config.json (%APPDATA%\devin\mcp_config.json on Windows), serverUrl or url; UI: Cascade panel > ... > MCPs > Open MCP config file2026-10-20
Gemini CLI (opens in a new tab) (guide)unknownYesYesYesunknownDCR, pre-registered client; CIMD unknowncustom headers, bearer token, API key header, no authYesCLI: gemini mcp add --transport http <name> <url>; File: ~/.gemini/settings.json (user) or .gemini/settings.json (project), mcpServers2026-10-20
MCP TypeScript SDK client (opens in a new tab)2.3.1YesYesYes2024-10-07, 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25, 2026-07-28DCR, CIMD, pre-registered clientcustom headers, bearer token, API key header, no authYesCLI: Programmatic: new Client(...).connect(new StreamableHTTPClientTransport(url))2026-10-20

Known limitations:

"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.