MCP Client Compatibility Matrix

An MCP client compatibility matrix compares which config format each Model Context Protocol client reads: the top-level wrapper key, supported transports, the remote-server URL field, and where the config file lives.No single MCP config works everywhere unchanged — the wrapper alone differs across three families (mcpServers, servers,context_servers).

Every cell below is derived at build time from the same adapter registry and diagnostics profiles that power the generator and the doctor on this site, so this page cannot drift from what the tool actually emits and checks. The stdio / HTTP / SSE columns describe hand-written JSON/config support only — a client with a “No” there may still reach remote MCP servers through a UI flow (Claude Desktop’s Connectors UI is listed in the Remote entry column). Last reviewed: 2026-08-07.

The matrix

MCP client configuration compatibility, derived from the same adapter registry and diagnostics profiles that power the generator and the doctor on this site. "Schema compatible" means the config structure matches the client’s documented format - it does not prove any server actually runs. The stdio / HTTP / SSE columns describe hand-written JSON/config support only: a "No" for HTTP or SSE means the client does not accept a hand-written remote JSON entry, not that the client cannot use remote MCP servers at all (Claude Desktop reaches remote servers through its Connectors UI, listed in the Remote entry column).
ClientTop-level wrapperScopesHand-written JSON/config transport supportRemote entryHeaders / env
stdioHTTPSSE
Claude DesktopmcpServersuserYesNoNoConnectors UI (no hand-written JSON)No / Yes
Claude CodemcpServersproject, user, localYesYesYes (legacy)url with type:"http"Yes / Yes
CursormcpServersproject, userYesYesYes (legacy)urlYes / Yes
VS Codeserversproject, userYesYesYes (legacy)url with type:"http"Yes / Yes
WindsurfmcpServersuserYesYesYes (legacy)serverUrl (url also accepted)Yes / Yes
ClinemcpServersuserYesYesYes (legacy)url with type:"streamableHttp"Yes / Yes
Zedcontext_serverslegacy: mcpuser, projectYesYesYes (legacy)urlYes / Yes
Config file locations per client, OS, and scope. Where the official sources define no single stable path, the cell says so instead of inventing one.
ClientOSScopePath or entry point
Claude Desktopmacosuser~/Library/Application Support/Claude/claude_desktop_config.jsonEdit via Settings > Developer > Edit Config, or open the file directly.
windowsuser%APPDATA%\Claude\claude_desktop_config.jsonEdit via Settings > Developer > Edit Config, or open the file directly.
Claude Codewindowsproject.mcp.jsonCommit-safe project config at the repository root.
macosproject.mcp.jsonCommit-safe project config at the repository root.
linuxproject.mcp.jsonCommit-safe project config at the repository root.
windowsuser%USERPROFILE%\.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`.
macosuser~/.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`.
linuxuser~/.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`.
windowslocal%USERPROFILE%\.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`.
macoslocal~/.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`.
linuxlocal~/.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`.
Cursorwindowsproject.cursor/mcp.jsonPer-project, safe to commit (minus secrets).
macosproject.cursor/mcp.jsonPer-project, safe to commit (minus secrets).
linuxproject.cursor/mcp.jsonPer-project, safe to commit (minus secrets).
windowsuser%USERPROFILE%\.cursor\mcp.jsonGlobal config applying to all projects.
macosuser~/.cursor/mcp.jsonGlobal config applying to all projects.
linuxuser~/.cursor/mcp.jsonGlobal config applying to all projects.
VS Codewindowsproject.vscode/mcp.jsonPer-workspace, shareable via git.
macosproject.vscode/mcp.jsonPer-workspace, shareable via git.
linuxproject.vscode/mcp.jsonPer-workspace, shareable via git.
windowsuserUI flow / version-dependent — no single stable path.Open the Command Palette and run "MCP: Open User Configuration"; VS Code creates/edits the user-level file (location varies by version).
macosuserUI flow / version-dependent — no single stable path.Open the Command Palette and run "MCP: Open User Configuration"; VS Code creates/edits the user-level file (location varies by version).
linuxuserUI flow / version-dependent — no single stable path.Open the Command Palette and run "MCP: Open User Configuration"; VS Code creates/edits the user-level file (location varies by version).
Windsurfwindowsuser%USERPROFILE%\.codeium\windsurf\mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config".
macosuser~/.codeium/windsurf/mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config".
linuxuser~/.codeium/windsurf/mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config".
ClinewindowsuserUI flow / version-dependent — no single stable path.Open the Cline panel -> MCP Servers -> Configure -> "Configure MCP Servers". Cline opens the real settings file for you (current global path: ~/.cline/data/settings/cline_mcp_settings.json).
macosuserUI flow / version-dependent — no single stable path.Open the Cline panel -> MCP Servers -> Configure -> "Configure MCP Servers". Cline opens the real settings file for you (current global path: ~/.cline/data/settings/cline_mcp_settings.json).
linuxuserUI flow / version-dependent — no single stable path.Open the Cline panel -> MCP Servers -> Configure -> "Configure MCP Servers". Cline opens the real settings file for you (current global path: ~/.cline/data/settings/cline_mcp_settings.json).
Zedwindowsuser%APPDATA%\Zed\settings.jsonTop-level "context_servers" object inside Zed's user settings.json (JSONC).
macosuser~/Library/Application Support/Zed/settings.jsonTop-level "context_servers" object inside Zed's user settings.json (JSONC).
linuxuserUI flow / version-dependent — no single stable path.Run "zed: open settings file" from the Command Palette. The path is $XDG_CONFIG_HOME/zed/settings.json, or ~/.config/zed/settings.json when XDG_CONFIG_HOME is unset.
windowsproject.zed/settings.jsonProject-level settings.json with a top-level "context_servers" object. Official source: https://zed.dev/docs/ai/mcp
macosproject.zed/settings.jsonProject-level settings.json with a top-level "context_servers" object. Official source: https://zed.dev/docs/ai/mcp
linuxproject.zed/settings.jsonProject-level settings.json with a top-level "context_servers" object. Official source: https://zed.dev/docs/ai/mcp

Per-client facts that break copied configs

Claude Desktop: hand-written JSON is local stdio only

claude_desktop_config.json covers only local stdio servers (command/args/env). Remote MCP servers are added through Settings > Connectors (a UI flow with OAuth sign-in), never as a url entry in the JSON. There is no project-level file.

Claude Code: local scope is not a top-level mcpServers

Claude Code has three scopes: project (.mcp.json), user (~/.claude.json), and local. Local scope is nested inside~/.claude.json atprojects[<absolute-project-path>].mcpServers — it isnot a top-level mcpServers key. Pasting a top-level block over ~/.claude.json would overwrite every other project’s servers; use claude mcp add --scope local instead.

VS Code: the wrapper is servers

.vscode/mcp.json uses the top-level keyservers, not mcpServers, plus an optional top-level inputs[] array for prompting secrets. MCP tools only surface inside Copilot Chat agent mode.

Windsurf: serverUrl by default, url also accepted

Windsurf’s remote endpoint field is officially serverUrl, and the official docs also accept url. It also supports${env:VAR} / ${file:path}interpolation, which most other clients do not.

Cline: streamableHttp, and the IDE entry comes first

Cline’s Streamable HTTP token is the exact camelCasetype:"streamableHttp" (plain "http"is rejected; omitting type falls back to legacy SSE). In the IDE, the supported entry is Cline panel → MCP Servers → Configure, which opens the real settings file for you — not a hand-navigated internal path.

Zed: context_servers, and paths differ per platform

Zed’s wrapper is context_servers inside its JSONCsettings.json, and local servers use a flat{command, args, env} object. The user-level file is platform-specific (%APPDATA%\Zed\settings.json on Windows,~/Library/Application Support/Zed/settings.json on macOS,$XDG_CONFIG_HOME/zed/settings.json with a~/.config/zed fallback on Linux) — there is no single cross-platform path.

Cursor: url for remote, never serverUrl

Cursor reads mcpServers in project (.cursor/mcp.json) and global (~/.cursor/mcp.json) files. Remote entries useurl; a serverUrlfield copied from a Windsurf config is not read.

Why ChatGPT and GitHub Copilot are excluded

The matrix covers exactly the seven clients that have a hand-editable, officially documented config format.ChatGPT connects to remote MCP servers through a developer-mode connector UI and does not read a local mcpServers file, so there is no JSON to compare.GitHub Copilot’s MCP support inside VS Code uses the VS Codeservers format shown above; there is no separate cross-host “Copilot MCP JSON”. Listing either as an eighth or ninth row would fabricate a format that does not exist.

Schema compatible ≠ server runtime verified

Every “Yes” in the matrix means the config structure matches the client’s documented format. It says nothing about whether a server binary exists, whether the client’s PATH can find it, whether a token is valid, or whether an endpoint speaks the transport you declared. Those checks only happen when the client actually launches or connects to the server. Aspawn ENOENT error, for example, is a runtime PATH problem, not a schema problem — see the spawn ENOENT / npx not found guide.

Sources and verification method

Format truth comes only from each client’s own official documentation — never from third-party blogs, forums, or search-result summaries. direct_fetch means the official page was fetched and read verbatim; search_snippet means the conclusion rests on indexed official-page excerpts cross-checked across sources and has not yet been re-verified verbatim. Last reviewed: 2026-08-07.

Official documentation pages backing each row of the matrix, with the verification method for each source.
ClientOfficial sourceVerification method
Claude Desktop (local)support.claude.com — local MCP servers on Claude Desktopsearch_snippet
Claude Desktop (remote)support.claude.com — custom connectors (remote MCP)search_snippet
Claude Codecode.claude.com — MCPdirect_fetch
Cursordocs.cursor.com — Model Context Protocolsearch_snippet
VS Codecode.visualstudio.com — MCP configurationsearch_snippet
Windsurfdocs.windsurf.com — Cascade MCP (redirects to docs.devin.ai)search_snippet
Clinedocs.cline.bot — MCP overview anddocs.cline.bot — configurationdirect_fetch
Zedzed.dev — MCPdirect_fetch
Zed (extension API, clarification only)zed.dev — context server extensions (extension development API, not the user JSON shape)search_snippet
ChatGPT (exclusion boundary)help.openai.com — developer mode and full MCP connectors (why no local ChatGPT JSON exists)search_snippet

Frequently asked questions

Is one MCP config compatible with every client?

No. The top-level wrapper differs per client: Claude Desktop, Claude Code, Cursor, Windsurf, and Cline read "mcpServers", VS Code reads "servers", and Zed reads "context_servers". Remote-server fields differ too: Windsurf uses "serverUrl" (and also accepts "url"), Cline requires type:"streamableHttp", and VS Code uses type:"http". A config that is schema-compatible with one client usually needs changes for another.

Does "schema compatible" mean my server will run?

No. Schema compatibility only means the JSON structure matches the client's documented format. Whether the server actually starts depends on the command existing on the client's PATH, valid credentials, and a reachable endpoint - none of which a static check can prove. Verify in the client itself.

Why are ChatGPT and GitHub Copilot not in the matrix?

Neither has a hand-editable generic MCP JSON to compare. GitHub Copilot's MCP support inside VS Code uses the VS Code "servers" format, and ChatGPT connects to remote MCP servers through a developer-mode UI flow, not a local config file. Generating a "ChatGPT config JSON" would invent a format that does not exist.

Fixing a specific problem? SeeVS Code MCP server not showing,Claude Desktop MCP not showing on Windows, orspawn ENOENT / npx not found. Setting up a client from scratch? Start with theClaude Desktop,Cursor,VS Code,Windsurf,Zed, orCline guides.