Claude Desktop Skips Remote MCP Servers Defined With a Bare url Key¶
TL;DR — Claude Desktop's
claude_desktop_config.jsononly understands stdio MCP servers (command/args/env). An entry that points at a remote server with a bare"url": "https://…/mcp"is valid in Claude Code, but Desktop doesn't recognize that shape, so it silently skips the entry at launch. Fix: wrap each remote endpoint inmcp-remoteso Desktop launches it as a stdio process that proxies to the HTTP transport.
Symptom¶
On Claude Desktop launch (or in its startup log / a status notice), you see:
The following entries in claude_desktop_config.json are not valid MCP server
configurations and were skipped: cloudflare, cloudflare-docs, cloudflare-bindings,
cloudflare-builds, cloudflare-observability
The named servers never appear in Desktop's MCP list and their tools are unavailable — even though the same url-style entries work fine when placed in a Claude Code MCP config.
Why this happens¶
The two clients read MCP configs differently:
- Claude Code supports multiple transports and accepts remote servers declared as
{ "url": "https://…/mcp" }(or{ "type": "http", "url": … }/sse). - Claude Desktop (as of mid-2026) only launches stdio servers — it expects a local
commandto spawn, with optionalargsandenv. An entry whose only key isurlmatches no valid stdio shape, so Desktop discards it and lists it as "not valid … and skipped."
This bites when you copy remote-server blocks (Cloudflare's hosted MCP endpoints are the common case) from a Claude Code config into the Desktop config.
Fix¶
Wrap each remote endpoint in mcp-remote, which Desktop launches as a normal stdio process; mcp-remote then proxies to the HTTP/SSE endpoint and handles OAuth.
Apply the same shape to every remote entry. The Cloudflare set:
"cloudflare": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.cloudflare.com/mcp"] },
"cloudflare-docs": { "command": "npx", "args": ["-y", "mcp-remote", "https://docs.mcp.cloudflare.com/mcp"] },
"cloudflare-bindings": { "command": "npx", "args": ["-y", "mcp-remote", "https://bindings.mcp.cloudflare.com/mcp"] },
"cloudflare-builds": { "command": "npx", "args": ["-y", "mcp-remote", "https://builds.mcp.cloudflare.com/mcp"] },
"cloudflare-observability": { "command": "npx", "args": ["-y", "mcp-remote", "https://observability.mcp.cloudflare.com/mcp"] }
Config file location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Validate the JSON before restarting (a trailing comma or missed brace silently disables all servers):
python3 -m json.tool ~/Library/Application\ Support/Claude/claude_desktop_config.json > /dev/null && echo "valid"
After the fix — what to expect¶
- Fully quit and reopen Claude Desktop (macOS:
Cmd+Q, not just the window) so it re-reads the config. - First launch is slow.
npx -y mcp-remotedownloads the package on first run for each server. - OAuth prompts. The Cloudflare hosted servers authenticate via OAuth — expect a browser auth window per server on first connect.
mcp-remotecaches tokens under~/.mcp-auth/afterward. npxmust be on PATH for the environment Desktop launches from. If servers fail to start with "command not found," pointcommandat an absolute Node/npx path, or ensure Node is installed system-wide.
Related¶
- claude-desktop-mcp-mass-disconnect-blocking-reboot — a different Desktop MCP failure mode (transport mass-disconnect)
- pihole-blocks-claude-desktop — DNS-layer breakage of Claude Desktop connectivity