When your MCP server fails with “Connection closed” or tools silently fail to execute in Claude Desktop, use this systematic diagnostic guide to fix the underlying issue.
The top 4 reasons MCP servers fail in Claude Desktop
Stdio Pollution (Console Logging): In stdio transport, stdout is reserved strictly for JSON-RPC messages. If your code calls console.log("Starting server..."), the text corrupts the JSON-RPC stream, causing Claude to terminate the connection instantly. Always use console.error() for debug logs.
Missing Environment Variables: Claude Desktop does not inherit your full terminal shell profile (.zshrc / .bashrc). Explicitly define environment variables inside claude_desktop_config.json.
Schema Type Mismatches: If a tool parameter is marked as number in Zod but the LLM supplies "50" as a string without coercion, the server will reject the call with code -32602.
Path Resolution Failures: Using relative paths (e.g. ./server.js) fails because Claude spawns processes from the application root. Always use absolute paths or npx.
# Test raw MCP handshake over stdio
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-07-28","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}}}' | npx tsx server.ts
Verifying with the Official MCP Inspector
Run npx @modelcontextprotocol/inspector tsx server.ts to open a local web UI where you can inspect every JSON-RPC frame, inspect error codes, and benchmark tool latencies.
Read more about MCP Server Debugging: https://sadasend.com/blog/debugging-mcp-connection-timeouts-tool-failures
Top comments (0)