Skip to content

Claude Desktop Skips Remote MCP Servers Defined With a Bare url Key

TL;DR — Claude Desktop's claude_desktop_config.json only 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 in mcp-remote so 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 command to spawn, with optional args and env. An entry whose only key is url matches 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.

"cloudflare": {
  "command": "npx",
  "args": ["-y", "mcp-remote", "https://mcp.cloudflare.com/mcp"]
}

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-remote downloads 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-remote caches tokens under ~/.mcp-auth/ afterward.
  • npx must be on PATH for the environment Desktop launches from. If servers fail to start with "command not found," point command at an absolute Node/npx path, or ensure Node is installed system-wide.