Home · Guides

An MCP server that does not appear: the causes, in order

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.

1. The top-level key is wrong

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.

2. The file has a syntax error

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

3. You are in a different directory than the one you added it in

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.

4. The project server is waiting for approval

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.

5. A remote server was written without a type

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.

6. The command is not on the client's PATH

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.

7. The path is relative

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.

8. The client was not fully restarted

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.

9. You are in the wrong agent

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.

10. The tool ceiling is full

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.

11. The server writes something that is not MCP to stdout

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.

12. Two definitions of the same server, and the other one won

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.

What to run first

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.

Questions

The client shows the server but no tools. What is that?

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.

Why is there almost never an error message?

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.

Does restarting the machine help?

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.

How do I tell a client problem from a server problem?

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.

Related

All MCP servers and prices · All guides · Buy the bundle $39