Work down this list. It is ordered so that the checks which cost seconds come before the ones that cost minutes, and each entry names the exact symptom, because nearly every failure here is silent. A client that loads no servers looks identical to a client with no servers configured.
Symptom: the file parses, the client starts, no server is listed, no error appears anywhere.
VS Code expects servers. Claude Desktop, Claude Code, Cursor, Windsurf and Cline expect
mcpServers. A block copied from the wrong README is valid JSON that contributes nothing.
Full table at MCP config file locations.
Symptom: every server disappears at once, including ones that worked yesterday.
A trailing comma after the last entry is the usual cause. If the count went from three servers to zero rather than from three to two, suspect the file rather than the entry you just added.
python3 -c 'import json,sys;json.load(open(sys.argv[1]))' ~/.cursor/mcp.json
Symptom: claude mcp list shows the server in one folder and not in
another.
Claude Code's default scope is local: private to you and to the directory you ran the
command in. --scope user makes it available in every project;
--scope project writes .mcp.json for the whole repository.
Symptom: Claude Code prints ⏸ Pending approval (run `claude` to approve)
in claude mcp list and claude mcp get <name>.
A server defined in a repository's .mcp.json is not started until you approve it
interactively. That is deliberate: a cloned repository must not be able to run code on your machine by
committing a config file. As of Claude Code v2.1.196 the approval is read only from settings files that
are not checked into the repository, until you trust the workspace by running claude in it
and accepting the trust dialog.
Symptom, Claude Code: a named error. An entry with a url and no
type is read as a stdio server, the server is skipped, and Claude Code reports that the
entry has a url but no type.
Symptom, Cline: no error at all. Omitting type falls back to the
legacy SSE transport, so a streamable HTTP endpoint fails to connect while looking correctly
configured.
{ "type": "http", "url": "https://example.com/mcp" }
Claude Code accepts streamable-http as an alias for http, so a config
copied from a server's own documentation works unchanged.
Symptom: spawn npx ENOENT, or spawn node ENOENT, in the
client's log. On Claude Desktop that is ~/Library/Logs/Claude/mcp-server-<name>.log
on macOS and %APPDATA%\Claude\logs on Windows.
A stdio server launched by a desktop application inherits only a limited, platform-dependent subset
of environment variables, and that subset frequently does not include the PATH your shell has. If node
came from nvm or homebrew, paste what which node prints instead of the bare word. GitHub's
issue search returned 1,428 results for the exact phrase "spawn npx ENOENT" on 2026-09-08,
which is the single most common shape of this failure.
Symptom: the same ENOENT, or a server that starts and immediately exits.
Claude Desktop's documentation requires every path in claude_desktop_config.json to be
absolute. The working directory a desktop client launches a subprocess from is not the one you think
it is.
Symptom: the config is correct and the server list has not changed.
Claude Desktop needs a complete quit and relaunch; reloading the window is not enough. Claude Code
picks the entry up in the next session, and /mcp reconnects one on demand. Cline and
Windsurf refresh from their own panels without an application restart.
Symptom: Windsurf shows the server in one tab and not in a new one.
~/.codeium/windsurf/mcp_config.json applies to the legacy Cascade agent only. The Devin
Local agent, the default for new tabs, reads the Devin CLI config files instead.
Symptom: the server connects, and some of its tools are missing.
Windsurf's Cascade reaches at most 100 tools at once and every enabled server spends from it. Claude Code imposes no fixed per-server cap; its documentation says the practical limit is the context window budget, and with tool search enabled only tool names and server instructions load at session start.
Symptom: the connection drops during startup, sometimes with a JSON parse error in the log.
The stdio binding is explicit: the server MUST NOT write anything to stdout that is not a valid MCP
message. A stray console.log, a banner, or a dependency's progress bar corrupts the
stream. Logging goes to stderr, which clients may capture, forward or ignore, and which the
specification says should not be read as an error signal on its own.
Symptom: the server appears, and it is the wrong version of it.
Claude Code connects once, using the definition from the highest-precedence source, and does not merge fields across scopes. The order is local, then project, then user, then plugin-provided servers, then claude.ai connectors. Scopes match duplicates by name; plugins and connectors match by endpoint.
claude mcp list # Claude Code, with a health check per server
/mcp # inside a session, shows what is connected
tail -f ~/Library/Logs/Claude/mcp.log # Claude Desktop, macOS
In Cursor, open the Output panel and select MCP Logs from the dropdown. In VS Code, run
MCP: List Servers. In Cline, the MCP settings actions include restarting an unresponsive
server.
Every symptom above came from the vendor's own documentation, read on 2026-09-08, or from the
stdio transport binding in the MCP specification revision 2026-07-28. The 30 servers published from
this repository hit most of them at least once while being packaged for six clients; the per-client
caveats are recorded with their source URLs in billing/src/setup.js.
Usually the server started and then failed during initialisation, or it is filling a tool ceiling. Read the per-server log first: on Claude Desktop, mcp-server-<name>.log holds the server's stderr, and a stdio server may use stderr for all of its logging, so that file is not limited to errors.
Because most of these are not errors from the client's point of view. A config with the wrong top-level key is a valid config describing zero servers. A local-scope entry in another directory is correctly absent. The client is doing what it was told.
Only by accident, when it happens to reload a client that was holding a stale config. Nothing on this list is fixed by a reboot, and starting there costs you the two minutes in which the log would have told you the answer.
Run the server yourself from a terminal with the exact command and arguments in the config. If it starts and speaks when you send it an initialize message, the problem is in the client's config or environment. If it does not, it is the server.
All MCP servers and prices · All guides · Buy the bundle $39