MCP Server Configured but Not Showing Up? url vs httpUrl vs serverUrl
The most common reason a remote MCP server silently fails is a config key that belongs to a different client. The root key, the URL field, and the type field all vary — here is the full matrix, and how each client behaves when you get one wrong.
Last verified August 24, 2026
Why is my MCP server configured but not showing up?
Because the config you pasted is written in another client's dialect. Remote MCP servers are configured with three or four small keys — a root object, a URL field, sometimes a type — and those keys differ between MCP clients that otherwise look interchangeable. The file is valid JSON either way, so most clients raise no error: the entry is read as something else, and the server silently never appears.
This page is the cross-client matrix. Find your client's row, check your keys against it, and follow the row's guide for the full setup if more than the key is wrong.
The three failure shapes
Wrong root key. VS Code nests servers under servers. OpenCode uses mcp. Zed uses context_servers. Nearly everything else uses mcpServers. Paste an mcpServers block into VS Code and it is silently ignored — no error, no warning, no entry in the server list.
Wrong URL field. In Gemini CLI and Qwen Code, url is not a more generic spelling of httpUrl — it selects the legacy SSE transport. The entry is accepted, the transport mismatches, and the failure shows up downstream as timeouts, odd behavior, or auth that never triggers.
Missing type. Some clients need to be told the entry is a remote server. Claude Code requires "type": "http" (or "streamable-http") — since v2.1.202 it skips the entry with an explicit error naming the fix, where older builds failed with a confusing command: expected string message. Cline requires "type": "streamableHttp", and without it falls back to legacy SSE. OpenCode requires "type": "remote".
The matrix
| Client | Root key | URL field | Notes |
|---|---|---|---|
| Cursor | mcpServers | url | No type needed — url implies remote |
| VS Code | servers | url + "type": "http" | mcpServers is silently ignored |
| Claude Code | mcpServers | url + "type": "http" | Missing type = explicit error since v2.1.202 |
| Gemini CLI | mcpServers | httpUrl | url = legacy SSE, silently wrong transport |
| Qwen Code | mcpServers | httpUrl | Same lineage as Gemini CLI, same trap |
| Zed | context_servers | url | A configured Authorization header skips OAuth |
| OpenCode | mcp | url + "type": "remote" | Without type, the entry is misclassified |
| LM Studio | mcpServers | url | Follows Cursor's notation |
| Windsurf / Devin Desktop | mcpServers | Cascade: serverUrl or url · Devin Local: url only | Two agents, two config files — check which you are in |
| Kiro | mcpServers | url | Config hot-reloads at the next idle boundary |
| JetBrains (Junie) | mcpServers | url | No type key in Junie's schema |
| Antigravity | mcpServers | serverUrl | Google's own pages conflict on url — use serverUrl, which works on every build |
Clients not in the table almost always follow the majority pattern: mcpServers → url. When a client documents its own dialect, its page in the guides index has the verified specifics.
How to check your config in under a minute
- Find the root key your client expects in the matrix above. This is the highest-value check: a wrong root key produces the purest silence.
- Check the URL field name. If your client is in the Gemini CLI lineage,
httpUrlis load-bearing. - Add the
typefield if your client requires one. The matrix marks the three that do. - Then, and only then, debug the URL itself — against exactly what the server publishes, including the path and any trailing slash.
A worked example
You can test any row of the matrix with a real hosted server. Tempreon is a remote MCP server with OAuth, so it exercises the full path — config key, transport, and auth:
https://api.tempreon.com/functions/v1/tempreon-mcp/mcp
Drop it into your client's dialect from the matrix. If the consent screen opens in your browser, every key in your config is right. If nothing happens, the row above tells you which key to look at first. Cross-client connection issues beyond config keys are covered in the troubleshooting doc.
Sources
The dated claims on this page were checked against these vendor documents. Client UIs move constantly, so if one of these has changed since the date shown, trust the vendor over this page — and tell us.
- MCP servers — VS Code docs — read 2026-08-24
- MCP servers with Gemini CLI — read 2026-08-24
- Connect Qwen Code to tools via MCP — read 2026-08-24
- Connect Claude Code to tools via MCP — read 2026-08-24
- MCP — Cursor docs — read 2026-08-24
- MCP servers — OpenCode docs — read 2026-08-24
- Model Context Protocol (MCP) in Zed — read 2026-08-24
Frequently asked questions
- Why does my MCP server config do nothing, with no error?
- Almost always because a config key from one client was pasted into another. The three usual mistakes are the wrong root key (VS Code wants servers, OpenCode wants mcp, most others want mcpServers), the wrong URL field (Gemini CLI and Qwen Code want httpUrl for hosted servers, and a plain url selects the legacy SSE transport instead), and a missing type field where the client requires one. The config is valid JSON either way, so nothing complains — the entry is just read as something else.
- What is the difference between url, httpUrl, and serverUrl in MCP configs?
- They are the same idea wearing three names. Most clients — Cursor, Zed, Claude Code, VS Code, LM Studio, OpenCode — use url for a remote server. Gemini CLI and Qwen Code reserve url for the legacy SSE transport and use httpUrl for Streamable HTTP, which is what hosted servers speak today. Antigravity documents serverUrl, and in Windsurf the answer depends on which agent you are in: legacy Cascade documents serverUrl or url, while Devin Local uses url only, in a different file.
- How do I tell which config mistake I made?
- Read the symptom. A server that never appears anywhere points at the wrong root key. A server that appears but times out, behaves oddly, or never triggers auth points at url where httpUrl was needed — the entry was accepted on the wrong transport. An explicit error naming a missing type field is Claude Code telling you exactly what to add. And a server that works in one project but not another is usually scope, not syntax.