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
| Client | Top-level wrapper | Scopes | Hand-written JSON/config transport support | Remote entry | Headers / env | ||
|---|---|---|---|---|---|---|---|
| stdio | HTTP | SSE | |||||
| Claude Desktop | mcpServers | user | Yes | No | No | Connectors UI (no hand-written JSON) | No / Yes |
| Claude Code | mcpServers | project, user, local | Yes | Yes | Yes (legacy) | url with type:"http" | Yes / Yes |
| Cursor | mcpServers | project, user | Yes | Yes | Yes (legacy) | url | Yes / Yes |
| VS Code | servers | project, user | Yes | Yes | Yes (legacy) | url with type:"http" | Yes / Yes |
| Windsurf | mcpServers | user | Yes | Yes | Yes (legacy) | serverUrl (url also accepted) | Yes / Yes |
| Cline | mcpServers | user | Yes | Yes | Yes (legacy) | url with type:"streamableHttp" | Yes / Yes |
| Zed | context_serverslegacy: mcp | user, project | Yes | Yes | Yes (legacy) | url | Yes / Yes |
| Client | OS | Scope | Path or entry point |
|---|---|---|---|
| Claude Desktop | macos | user | ~/Library/Application Support/Claude/claude_desktop_config.jsonEdit via Settings > Developer > Edit Config, or open the file directly. |
| windows | user | %APPDATA%\Claude\claude_desktop_config.jsonEdit via Settings > Developer > Edit Config, or open the file directly. | |
| Claude Code | windows | project | .mcp.jsonCommit-safe project config at the repository root. |
| macos | project | .mcp.jsonCommit-safe project config at the repository root. | |
| linux | project | .mcp.jsonCommit-safe project config at the repository root. | |
| windows | user | %USERPROFILE%\.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`. | |
| macos | user | ~/.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`. | |
| linux | user | ~/.claude.jsonUser scope applies across all your projects. Managed via `claude mcp add --scope user`. | |
| windows | local | %USERPROFILE%\.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`. | |
| macos | local | ~/.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`. | |
| linux | local | ~/.claude.jsonLocal scope is private to you on this machine only (the default). Managed via `claude mcp add --scope local`. | |
| Cursor | windows | project | .cursor/mcp.jsonPer-project, safe to commit (minus secrets). |
| macos | project | .cursor/mcp.jsonPer-project, safe to commit (minus secrets). | |
| linux | project | .cursor/mcp.jsonPer-project, safe to commit (minus secrets). | |
| windows | user | %USERPROFILE%\.cursor\mcp.jsonGlobal config applying to all projects. | |
| macos | user | ~/.cursor/mcp.jsonGlobal config applying to all projects. | |
| linux | user | ~/.cursor/mcp.jsonGlobal config applying to all projects. | |
| VS Code | windows | project | .vscode/mcp.jsonPer-workspace, shareable via git. |
| macos | project | .vscode/mcp.jsonPer-workspace, shareable via git. | |
| linux | project | .vscode/mcp.jsonPer-workspace, shareable via git. | |
| windows | user | UI 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). | |
| macos | user | UI 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). | |
| linux | user | UI 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). | |
| Windsurf | windows | user | %USERPROFILE%\.codeium\windsurf\mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config". |
| macos | user | ~/.codeium/windsurf/mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config". | |
| linux | user | ~/.codeium/windsurf/mcp_config.jsonSingle global config. Edit via Settings > Cascade > MCP servers > "View raw config". | |
| Cline | windows | user | UI 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). |
| macos | user | UI 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). | |
| linux | user | UI 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). | |
| Zed | windows | user | %APPDATA%\Zed\settings.jsonTop-level "context_servers" object inside Zed's user settings.json (JSONC). |
| macos | user | ~/Library/Application Support/Zed/settings.jsonTop-level "context_servers" object inside Zed's user settings.json (JSONC). | |
| linux | user | UI 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. | |
| windows | project | .zed/settings.jsonProject-level settings.json with a top-level "context_servers" object. Official source: https://zed.dev/docs/ai/mcp | |
| macos | project | .zed/settings.jsonProject-level settings.json with a top-level "context_servers" object. Official source: https://zed.dev/docs/ai/mcp | |
| linux | project | .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.
| Client | Official source | Verification method |
|---|---|---|
| Claude Desktop (local) | support.claude.com — local MCP servers on Claude Desktop | search_snippet |
| Claude Desktop (remote) | support.claude.com — custom connectors (remote MCP) | search_snippet |
| Claude Code | code.claude.com — MCP | direct_fetch |
| Cursor | docs.cursor.com — Model Context Protocol | search_snippet |
| VS Code | code.visualstudio.com — MCP configuration | search_snippet |
| Windsurf | docs.windsurf.com — Cascade MCP (redirects to docs.devin.ai) | search_snippet |
| Cline | docs.cline.bot — MCP overview anddocs.cline.bot — configuration | direct_fetch |
| Zed | zed.dev — MCP | direct_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.