Free tool

MCP Config Validator

Paste your .mcp.json, get every mistake flagged with a fix — plus a cleaned-up config and the exact claude mcp add commands. Runs entirely in your browser.

By Kylian Migot · Updated July 2026 · 4 min read

Found 2 errors and 0 warnings across 2 servers.
  • Errorfilesystem

    Stdio server is missing "command" — Claude Code has nothing to launch.

    Fix: Add "command": "npx" (or "node", "uvx", a binary path…) with any flags in "args".

  • Errorlinear

    Unknown key "serverUrl" — Claude Code will ignore it.

    Fix: Rename "serverUrl" to "url".

Normalized config (placeholders where fields were missing)
{
  "mcpServers": {
    "filesystem": {
      "command": "<command>",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "./"
      ]
    },
    "linear": {
      "type": "http",
      "url": "https://mcp.linear.app/mcp"
    }
  }
}
Equivalent claude mcp add commands
# Adds to user scope (~/.claude.json) by default.
# Append --scope project to write a shareable .mcp.json into the repo instead.
claude mcp add filesystem -- '<command>' -y @modelcontextprotocol/server-filesystem ./
claude mcp add --transport http linear https://mcp.linear.app/mcp

Where configs live: .mcp.json = project scope (checked into the repo, shared with the team) · ~/.claude.json = user scope (what claude mcp add writes by default) · claude_desktop_config.json = Claude Desktop, a different app — same JSON shape, different file.

01

Three config files, one classic mix-up

Claude Code reads MCP servers from more than one place, and most “my server doesn’t show up” reports are really scope confusion. There are three scopes — and a fourth file that belongs to a different app entirely.

FileScopeWho gets it
.mcp.jsonProjectEveryone who clones the repo — check it in. Servers need one-time approval per user.
~/.claude.jsonUser / localWhat claude mcp add writes by default — your machine, every project (user) or one project (local).
claude_desktop_config.jsonClaude DesktopThe desktop chat app — a different program. Same JSON shape, zero effect on Claude Code.

The claude_desktop_config.json trap deserves emphasis: countless tutorials target Claude Desktop, and their configs look byte-for-byte compatible. They are — but Claude Code never reads that file. If a server works in Desktop and is invisible in your terminal, this is why. For team projects, prefer project scope: a committed .mcp.json means every teammate (and every agent) gets the same tools, which matters once you start running several Claude Code sessions in parallel.

02

stdio vs http vs sse — when each

A stdio server is a program Claude Code launches for you — it spawns command with args as a child process and speaks JSON-RPC over stdin/stdout. Use it for anything local: filesystem access, a database on localhost, a CLI wrapper. No port, no network, dies with the session.

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": { "DATABASE_URL": "${DATABASE_URL}" }
    }
  }
}

A remote server is something already running elsewhere — you give Claude Code a URL instead of a command. "type": "http" (streamable HTTP) is the modern transport hosted providers use; "type": "sse" is the older Server-Sent Events variant, kept for servers that haven’t migrated yet.

{
  "mcpServers": {
    "linear": {
      "type": "http",
      "url": "https://mcp.linear.app/mcp",
      "headers": { "Authorization": "Bearer ${LINEAR_TOKEN}" }
    }
  }
}

Rule of thumb: runs on your machine → stdio; lives behind an https endpoint → http; the vendor’s docs literally say SSE → sse. If these terms are new, the AI glossary covers MCP, transports, and the rest of the agent vocabulary in one page.

03

Env var expansion: the right way to handle secrets

Claude Code expands ${VAR} — and ${VAR:-default} with a fallback — inside command, args, env, url, and headers when it launches a server. The token lives in your shell; the config file stays committable. This is not optional hygiene: .mcp.json is designed to be checked into git, so any literal key you paste there is one git push away from being public.

"env": {
  "GITHUB_TOKEN": "${GITHUB_TOKEN}",
  "API_BASE": "${API_BASE:-https://api.example.com}"
}

The validator above warns when an env or header value looks like a real token (long, token-shaped, or matching known prefixes like ghp_ or sk-). If you see that warning on a config you’ve already committed, rotate the key — scrubbing git history is much harder than exporting a variable.

04

The three ways MCP configs actually break

After syntax errors (trailing commas, comments, single backslashes in Windows paths), almost every broken config falls into one of three buckets — all silent, because Claude Code skips entries it can’t use rather than crashing.

Stringified args

"args": "-y my-server ./" is one argument, not three. Args must be an array with one string per token — and numbers like ports still get quoted, because process arguments are always strings.

Wrong key names

mcp_servers, serverUrl, comand — JSON has no schema, so typos don’t error, they just get ignored. The only accepted top-level key is mcpServers, exact camelCase.

Secrets in the repo

A working config with a pasted API key is a leak with good uptime. Use ${VAR} expansion, keep real values in your shell, and let the file be boring enough to commit.

The same discipline that keeps configs clean keeps agents effective: explicit, checked-in, reviewable context. That’s the idea behind a good AGENTS.md / CLAUDE.md file too — and behind choosing a small set of MCP servers that actually earn their context window instead of installing everything.

FAQ

Why doesn't Claude Code see my MCP server?
The usual causes, in order: the config is in the wrong scope (you edited claude_desktop_config.json, which belongs to Claude Desktop, not Claude Code); a key is misspelled (mcp_servers instead of mcpServers, serverUrl instead of url); a stdio server is missing its command; or you haven't restarted the session — MCP servers are launched at startup. Run claude mcp list to see what Claude Code actually loaded, and note that project-scope .mcp.json servers require a one-time approval prompt before they run.
What's the difference between .mcp.json and claude_desktop_config.json?
.mcp.json is Claude Code's project-scope config — it lives in your repo root, gets checked into git, and is shared with everyone who clones the project. claude_desktop_config.json belongs to Claude Desktop, a completely separate app, even though the inner mcpServers shape looks identical. Pasting a working Desktop config into a repo (or vice versa) and expecting the other tool to pick it up is the single most common MCP setup mistake.
How do I pass an API key to an MCP server safely?
Never hardcode the token in the config file — .mcp.json is designed to be committed, so a pasted key becomes a leaked key. Use env expansion instead: write "API_KEY": "${API_KEY}" in the env block (or "Authorization": "Bearer ${TOKEN}" in headers) and export the real value in your shell. Claude Code expands ${VAR} and ${VAR:-default} at launch, so the secret exists only in your environment.
Should I use stdio, http, or sse transport?
Use stdio for anything that runs on your machine — Claude Code spawns the command as a child process and talks to it over stdin/stdout; it's the default and needs no network. Use http (streamable HTTP) for hosted servers like Linear's or GitHub's — you just point at a URL. sse is the older Server-Sent Events transport; only use it when a server explicitly says it doesn't support streamable HTTP yet.
Does this validator upload my config anywhere?
No. Validation runs entirely in your browser with plain JavaScript — nothing is sent to a server, stored, or logged. That's deliberate, because MCP configs frequently contain API keys. That said, if you paste a config and see a hardcoded-secret warning, treat the token as sensitive and move it into an environment variable.

Keep reading

Your MCP config, working across every agent

AIDEN runs your local Claude Code on parallel git branches — and picks up your MCP servers with zero extra setup.

macOS 12+ · Bring your own Claude Code or Codex · Your code stays local