MCP config converter
Convert MCP server settings between Claude Desktop, Claude Code's .mcp.json and ~/.claude.json, and claude mcp add-json commands, with credentials moved out.
What it does
Paste the MCP server settings written for one client, and get them written for another:
- Claude Desktop:
claude_desktop_config.json; - Claude Code, project scope:
.mcp.jsonat the root of your project, shared through version control; - Claude Code, user scope: the top level of
~/.claude.json; - Claude Code commands: one
claude mcp add-jsoncommand per server, quoted for a shell.
Everything that does not carry over is listed: a field the target does not take, a name it would reject, a remote server where support is not documented.
This is about your MCP client, Claude Code or Claude Desktop, and the servers it starts or connects to. It is not Salyro's MCP Expose, where a Salyro gateway is the server your client connects to, and not MCP Connect, where a gateway is the client of an outside server.
Credentials
A configuration often carries an API key in env or a token in a header, and the file is then copied, shared and committed.
- On the page, credentials are masked. A switch shows them.
- "Move credentials to $" writes each one as a reference, such as
"GITHUB_TOKEN": "${GITHUB_TOKEN}"or"Authorization": "Bearer ${AUTHORIZATION}", and lists the variables to set. Claude Code expands${VAR}and${VAR:-default}incommand,args,env,urlandheaders. No page read here says Claude Desktop expands them, so converting to it with this on comes with a warning. - A link never holds a credential. The page keeps what you pasted. The address and any shared link hold only the file's structure: the server names, transports, commands, flags and package names, and each address's scheme and host. Every value of
envandheadersbecomes a${VARIABLE}, and every other value a placeholder. A flag keeps its name, never its value. A name with a slash is kept only as a scoped package (@scope/name) or an image with its registry's host (ghcr.io/…), and a tag other thanlatestor a version such as3.12becomes‹tag›. Only the servers are kept, not the rest of a~/.claude.json. Text that is not JSON is not put in a link at all, and when anything credential-shaped would still be there, the link holds no file. "Share settings only" leaves the file out altogether.
A credential is recognised in three ways:
- Its shape. The tool recognises what Salyro's own log redactor recognises, for example a
sk-…,ghp_…,AKIA…orBearer …value, and addsgithub_pat_…andsk_live_…keys. - Its name. Any value under a name such as
API_KEY,TOKEN,DB_PASS,PASSWORDorAuthorizationcounts. So does a number under one of those names. - Its place. The value after a flag such as
--api-key, a--token=argument, a URL'sapi_key=parameter, or a user name and password in a URL.
A suggested variable never uses a name that Claude Code reads as empty in a remote server's headers, such as NPM_TOKEN or an ANTHROPIC_ name.
How it converts
- Transports:
stdio(a command to start),http,sseandws.streamable-httpis read ashttp. Every entry is written with itstype: Claude Code reads an entry with aurland notypeas a stdio server, and skips it. - Names: Claude Code's commands accept only letters, numbers, hyphens and underscores. Claude Desktop accepts any name, so a name like
local filesbecomeslocal-files, and the tool says so. - Claude Code's own fields, such as
headersHelper,timeoutandalwaysLoad, are kept. Converting to Claude Desktop keeps them too, with a note, because no page read here says whether Claude Desktop reads them.
What it does not know
- A credential nothing marks. One with no known shape and no credential's name, such as a random segment in an address's path, is not recognised on the page. A link never holds it, because a link keeps only an address's scheme and host.
- Cursor, VS Code and Windsurf. Their pages could not be read when this tool was built, so their formats are unknown, and not guessed.
- Where Claude Desktop's file lives on each OS. The page naming the location could not be read.
- Whether Claude Desktop's file takes remote (
url) servers. Anthropic's pages show it with stdio entries only. A remote entry is written in the shape Claude Code reads, with a warning. - Whether a server works. The tool reads the configuration. It does not start or reach any server.
Sources
The file names, the mcpServers key, the transports, the naming rules and ${VAR} expansion quote Claude Code's MCP page on code.claude.com. It is also where Anthropic describes Claude Desktop's file. Every fact is recorded as Reference Data with the date it was read.
Where the numbers come from
- Facts about models and providers that are not in that catalogue carry their own source and the date they were checked, and are shown as unknown where no reliable source exists.
