The MCP protocol is identical across every client — the same JSON-RPC messages, the same tools and resources. What differs is the config wrapper: where the file lives, what the top-level key is called, and how a server entry is shaped. Copy-pasting a config from one client into another without adjusting the wrapper is the single most common setup mistake.
The four config “shapes” #
Every server entry boils down to one of four shapes:
- STDIO / local →
command+args+ optionalenv(thenpx -y @scope/packagepattern). - Remote (Claude / Cursor style) →
url+headerswith a Bearer token. - Remote (VS Code style) → adds an explicit
typefield ("stdio"or"sse"). - Array style (Continue) → same fields, but the list is an array and each entry needs a
name.
Claude Desktop #
Root key: mcpServers (object). Config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
You must fully quit and reopen the app after editing — closing the window is not enough.
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_TOKEN" }
}
}
}
Cursor #
Same mcpServers object format as Claude Desktop — you can often copy configs directly between the two. Global config at ~/.cursor/mcp.json, or project-scoped at .cursor/mcp.json in your project root. Unlike Claude Desktop, Cursor hot-reloads config changes, so no restart is needed.
For a remote server, both Claude Desktop and Cursor swap command/args for a url + headers block:
{
"mcpServers": {
"notion": {
"url": "https://mcp.notion.com/sse",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}
VS Code #
The big one people trip over: VS Code uses servers as the top-level key, not mcpServers. Use the wrong key and VS Code silently ignores every server with no error message. Config goes at .vscode/mcp.json in the project root. VS Code also wants an explicit type field ("stdio" for local, "sse" for remote) and supports an inputs block so you can be prompted for secrets instead of hardcoding them.
{
"servers": {
"github": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${input:gh-token}" }
}
}
}
Cline (VS Code extension) #
Mirrors Claude Desktop’s mcpServers schema exactly, but stored in its own extension path under VS Code’s globalStorage as cline_mcp_settings.json. Hot-reloads, no restart. Easiest path is the MCP Servers panel in the sidebar rather than editing the file by hand.
Continue #
The sneaky one. Continue uses an array for mcpServers, not an object like Claude Desktop and Cursor, and each entry needs its own name field. Mixing this up causes silent failures. Config lives at ~/.continue/config.json.
{
"mcpServers": [
{
"name": "github",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_TOKEN" }
}
]
}
Zed #
Different key entirely: context_servers, inside ~/.config/zed/settings.json. The command is nested inside a command object with a path. Zed only supports STDIO natively — to use a remote server you wrap it in the mcp-remote bridge package, which runs locally as a STDIO proxy to the remote endpoint.
{
"context_servers": {
"github": {
"command": {
"path": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_TOKEN" }
}
}
}
}
Codex CLI #
Not even JSON. Codex reads TOML from ~/.codex/config.toml. Key differences: mcpServers becomes mcp_servers (underscore, not camelCase), there is no outer object wrapper, server names use dot notation ([mcp_servers.name]), and remote Streamable HTTP servers need mcp-proxy to bridge them.
Quick reference #
| Client | Config file | Root key | Remote support | Restart needed? |
|---|---|---|---|---|
| Claude Desktop | claude_desktop_config.json |
mcpServers {} |
url + headers | Yes |
| Cursor | ~/.cursor/mcp.json |
mcpServers {} |
url + headers | No (hot reload) |
| VS Code | .vscode/mcp.json |
servers {} |
type: sse + url | Yes |
| Cline | cline_mcp_settings.json |
mcpServers {} |
Yes | No |
| Continue | ~/.continue/config.json |
mcpServers [] |
url field | No |
| Zed | ~/.config/zed/settings.json |
context_servers {} |
via mcp-remote | Yes |
| Codex CLI | ~/.codex/config.toml |
mcp_servers (TOML) |
via mcp-proxy | Yes |
If a server connects but no tools appear, or you hit a 403 on a remote server, see the companion Troubleshooting article.