Blog · October 23, 2026 · 9 min read · by Vilva Athiban P B
Claude Desktop MCP Configuration: claude_desktop_config.json, Logs, Extensions, and the Difference From Claude Code
If you search for “claude desktop mcp configuration” you get two kinds of answers mixed together: instructions for the Claude Desktop app, which reads a file called claude_desktop_config.json, and instructions for Claude Code, the terminal tool, which reads .mcp.json and ~/.claude.json and has a claude mcp command. The two products share the Model Context Protocol and nothing else about configuration. Copy a snippet from the wrong one and the server silently never appears. This post is the reference for the Desktop side, with the exact file paths, the JSON shape, the menu path, the logs, and a side-by-side table against Claude Code so you can tell at a glance which file you should be editing.
It is the companion to our Claude Code MCP servers guide and the claude mcp add command reference, which cover the terminal product in depth.
The file: claude_desktop_config.json
Claude Desktop starts local MCP servers from one JSON file. Its location is fixed:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
You do not have to find it by hand. In the app, open the Claude menu in your system menu bar (not the settings inside the chat window), choose Settings, go to the Developer tab and click Edit Config. That creates the file if it does not exist and opens it; the official quickstart describes this path. Linux builds of Claude Desktop exist too, and the same Developer tab is the reliable way to locate the file there.
The structure is a single top-level key:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/Users/username/Downloads"
]
}
}
}Each entry under mcpServers is one server. The key (“filesystem”) is the display name you will see in the app. command is the executable, args is its argument list, and an optional env object sets environment variables for that process, which is where API keys for a server usually go. On Windows the example uses double backslashes in paths (C:\\Users\\username\\Desktop) because this is JSON. Paths must be absolute; relative paths are the single most common reason a server does not start.
Two things the Desktop file does not do, and that trip up people arriving from Claude Code: it has no scopes (there is one file for the whole app), and it does not expand ${VAR} references the way Claude Code’s .mcp.json does. Put the literal value in env, or use a Desktop Extension, covered below, which stores secrets properly.
Restart, then find the server
After saving, quit Claude Desktop completely and reopen it. The servers are launched at startup, so a running app will not pick up an edited file. Once it is back, click the “Add files, connectors, and more” control at the bottom left of the message box, hover Connectors, and choose Manage connectors; your server is listed there with its tools. If it is missing, the app read the file and either found a syntax error or failed to start the process, and the logs will say which.
Where the logs are
- macOS:
~/Library/Logs/Claude - Windows:
%APPDATA%\Claude\logs
mcp.log holds the app’s own MCP connection log, and each server gets a mcp-server-SERVERNAME.log containing its stderr. Many stdio servers write all their logging to stderr, so a busy server log is not necessarily an error log. To follow them live on macOS:
tail -n 20 -f ~/Library/Logs/Claude/mcp*.logThe fastest diagnostic is still to run the server’s command by hand in a terminal, exactly as written in the config, and see whether it starts. If npx is not found, the app is not seeing the same PATH as your shell; on macOS, Node installed through a version manager is the usual culprit, and writing the full path to the node or npx binary in command fixes it. On Windows, a server failing with ${APPDATA} in a path is a documented case: add the expanded APPDATA value to that server’s env block, and make sure npm is installed globally.
Desktop Extensions: the no-JSON route
Anthropic’s support documentation now points most users at Desktop Extensions rather than the JSON file. An extension is a local MCP server packaged as a single installable file (the .mcpb bundle, formerly .dxt) with a manifest.json describing it. In Settings under Extensions you can browse an Anthropic-reviewed directory and click Install, or under Advanced settings use the Extension Developer section’s “Install Extension…” to load a .mcpb file you were given. Fields marked "sensitive": true in the manifest are stored in the operating system’s secure storage instead of a plain text file, which is the main practical advantage over claude_desktop_config.json for anything with an API key. Directory extensions update automatically; privately shared bundles are updated by hand. On Team and Enterprise plans, owners can allow or block public extensions and upload custom ones for one-click install, and machine-level enterprise policies override the in-app controls.
The JSON file still works and is still the right tool for a server you are developing, a one-off command, or a machine where you want to see exactly what runs. Extensions are the right tool for distributing a server to people who should never open a config file.
Remote servers are connectors, not config
claude_desktop_config.json is for local servers: processes the app launches on your machine over stdio. A remote MCP server over HTTP is added as a connector from the app’s Connectors UI, or by an organisation through the connector directory, not by editing the JSON file. If you have a URL rather than a command, you are in the wrong file; this is the mirror image of Claude Code, where claude mcp add --transport http name url handles the remote case from the same command as local ones.
Claude Desktop vs Claude Code: the table
Everything in one place, because this is the comparison the search results never make.
- Config file. Desktop: one file,
claude_desktop_config.json. Code:.mcp.jsonat the project root (project scope), plus~/.claude.jsonfor user and local scopes. - Scopes. Desktop: none; the file applies to the whole app. Code: local, project and user, with precedence local > project > user, then plugins and connectors.
- Adding a server. Desktop: edit the JSON or install an extension; restart the app. Code:
claude mcp add,claude mcp add-json, or edit the file; no restart of anything but the session. - Environment variables. Desktop: literal values in
env. Code:${VAR}and${VAR:-default}expansion in command, args, env, url and headers. - Remote (HTTP/SSE) servers. Desktop: connectors, not the JSON file. Code: same
claude mcp addwith--transport httporsse. - Approval of project servers. Desktop: not applicable. Code: a prompt the first time a project’s
.mcp.jsonis seen, reset withclaude mcp reset-project-choices. - Status and logs. Desktop: Manage connectors in the app, Developer settings, and the
mcp*.logfiles. Code:claude mcp list,claude mcp get name, and/mcpinside a session. - Sharing with teammates. Desktop: an extension bundle, or an org-managed extension. Code: commit
.mcp.jsonto the repository.
One bridge exists between them: Claude Code can import your Desktop servers with claude mcp add-from-claude-desktop, which reads claude_desktop_config.json and offers each server for import. It is available on macOS and WSL, names are restricted to letters, numbers, hyphens and underscores, and a name that already exists in Claude Code gets a _1 suffix. It is a one-way, one-time copy, not a sync.
A minimal, correct Desktop config for a real server
Most people configuring Desktop by hand want a filesystem server and one server that needs a key. A complete file for that looks like this on macOS:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/Projects"]
},
"search": {
"command": "npx",
"args": ["-y", "some-search-mcp-server"],
"env": {
"SEARCH_API_KEY": "paste-the-key-here"
}
}
}
}Three checks before you restart: the file is valid JSON (a trailing comma after the last server is the classic error), every path is absolute, and every directory you list is one you are comfortable letting Claude read and modify, because the server runs with your account’s permissions and the app will ask you to approve each action but not each file.
Troubleshooting in order
- Quit and relaunch the app completely; a window close is not a quit.
- Validate the JSON. One bad character disables every server in the file.
- Run the command from the config in a terminal and read what it prints.
- Open
mcp.logand the server’s own log in the logs folder for your platform. - Replace
npxornodewith its full path if the app cannot find it. - If tools appear but calls fail silently, check the server log for stderr output and restart the app once more.
- If none of that works, the MCP project’s debugging guide and its Inspector tool let you talk to the server outside Claude entirely.
If you are a developer who lives in both products, the rule of thumb is simple: the Desktop file is a launcher, nothing more, and everything clever (scopes, variable expansion, per-project approval, a CLI) lives on the Claude Code side. Configure Desktop once, by hand or by extension, and do your real MCP work where the tooling is.
Keep reading
Desk Exercises for Programmers: 15 Moves to Do While Your AI Agent Codes
7 min read
Exercise While Coding: Turn Claude Code Wait Time Into Micro-Workouts
7 min read
Claude Code Notch Notifications on Mac: See When Claude Is Done Without Watching the Terminal
7 min read
Claude Code Tips and Tricks: 12 Ways to Use Claude Code Effectively
8 min read
Claude Code Multiple Sessions: How to Run Agents in Parallel Without Losing Track
6 min read
A Claude Code Workflow That Doesn't Involve Watching the Terminal
5 min read
Claude Code Hooks: A Practical Guide to Automating Your Agent Workflow
7 min read
Claude Code Auto Mode: Fewer Permission Prompts Without Living Dangerously
7 min read
Claude Code Subagents: How to Delegate Work to Specialized Agents
7 min read
Claude Code Context Management: Treat the Context Window Like a Budget
6 min read
Per-Subagent Model Selection: Route the Grunt Work Down, Keep the Judgment Up Top
7 min read
Skills and Plugins: How to Teach Claude Code Your Way of Working
7 min read
Claude Code Background Tasks: Run Long Commands Without Blocking Your Session
6 min read
Codex CLI Notifications: How to Get a Ding When Codex Is Done or Needs Input
7 min read
Cursor Notification When Done: Every Way to Get Notified When Cursor Finishes
6 min read
Claude Code Notifications: How to Get Notified When Claude Code Finishes or Needs Your Input
6 min read
Want to Be Notified When Claude Responds? How Claude Notifications Work on Web, Desktop, and Mobile
5 min read
Claude Code Notification Scripts: Copy-Paste Recipes for Every Platform
6 min read
Get a Ding the Moment Codex Needs Your Response
6 min read
Get Notified the Moment Claude Code Is Waiting for Your Input
6 min read
“Notifications Are Turned Off for Claude” — Here Is the Fix
6 min read
Codex Sound When Done: Make Codex CLI Play a Sound When It Finishes
6 min read
terminal-notifier + Claude Code: Native macOS Alerts When Your Agent Finishes
6 min read
Gemini CLI Notifications: How to Get a Sound or Alert When Gemini Finishes
6 min read
Get Claude Code Notifications on Your Phone
6 min read
Claude Code Remote Control, Explained
7 min read
preferredNotifChannel: Claude Code's Built-In Notification Setting
6 min read
Claude Code Notifications in tmux and Over SSH
7 min read
Claude Code Effort Levels: Why Your Setting Keeps Getting Ignored
8 min read
Codex vs Claude Code Notifications: How Each One Tells You It Is Done
8 min read
Claude Code Notifications Not Working: A Diagnostic Checklist
10 min read
Claude Code Notifications Inside Your Editor's Terminal
7 min read
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS Explained
7 min read
CLAUDE_CODE_DISABLE_BG_SHELL_PRESSURE_REAP Explained
8 min read
Cursor Alerts Explained: Every Alert Cursor Raises, and How to Control Them
7 min read
Claude Code Environment Variables: The Groups That Actually Matter
10 min read
Claude Code Notifications on WSL and Windows
9 min read
Claude Code Checkpoints and /rewind
8 min read
Claude Remote Control: How It Works, Turning It Off, and Auto Mode
7 min read
Claude Code /loop: Poll a Deploy, Babysit a PR, and Get Told When It's Done
8 min read
Setting Up NotchFit With OpenAI Codex CLI: Hooks, $notchfit-plan, and the Daily Flow
7 min read
Claude Mods Explained: What the New Plugin Layer Can Do, and How to Turn On 'You Should Know'
9 min read
NotchFit vs Mac Break Reminder Apps: A Clock or a Signal From Your Coding Agent?
8 min read
Claude Code Headless Mode: Running claude -p in Scripts and CI, and the Three Signals That It Finished
10 min read
Building a Movement Habit at a Desk: Use the Agent Run as the Cue, One Set as the Unit, and Streaks Carefully
8 min read
Claude Code MCP Servers Explained: Adding Servers, Choosing a Scope, Handling Secrets, and Why Long Tool Calls Go to the Background
10 min read
/notchfit:plan Explained: How Claude Code or Codex Writes a Weekly Workout Plan the Notch Can Actually Run
8 min read
Claude Code Spinner Verbs Explained: What “Pondering” and “Brewing” Mean, How to Change Them, and Why You Should Stop Watching the Spinner
7 min read
Why NotchFit's Done and Permission Alerts Wait Until Your Set Ends, When That Costs You, and How to Turn the Workout Off
7 min read
How to Resume a Claude Code Session: --continue vs --resume, Naming Sessions, the Session Picker, Branching, and What Comes Back
9 min read
NotchFit on a Mac Without a Notch: How Pill Mode Works on Mac mini, iMac, Mac Studio and a MacBook With the Lid Closed
6 min read
How to Run a Claude Code Session in the Background: /background, claude --bg, Agent View, and Getting Back to It
9 min read
What a Notch App Can See: NotchFit's Local-First Design, What the Claude Code and Codex Hooks Send, and What Stays on Your Mac
7 min read
Why Codex CLI Asks for Permission Every Time, and How to Tune the Sandbox and Approval Policy Without Going Full Access
8 min read
What to Do While Claude Code or Codex Works: A Simple Protocol for the Two-to-Twenty-Minute Gap in Every Agent Run
7 min read
Is It Possible to Get a Notification When Claude Code or Codex Hits a Reset? Yes for Claude Code: the quota_auto_resume Hooks, Explained
8 min read
What a MacBook Notch App Can Actually Do: The Five Kinds of Notch Utility, Their Trade-offs, and Where NotchFit Fits
7 min read
How to Make MCP Servers Not Take Up as Much Context in Claude Code: Tool Search, alwaysLoad, Scopes and Output Caps
8 min read
The notchfit Command Line: Drive Your Workout, Read Status as JSON, Validate Plans and Test the Notch Without Leaving the Terminal
7 min read
How to Audit MCP Tool Calls Made by Claude Code: A Five-Minute Hook Audit Log, OpenTelemetry Tool Events, and the Transcript for Investigations
9 min read
Exercise Snacks: What the Research Actually Says About One-Minute Vigorous Breaks, What It Does Not, and How NotchFit's Agent-Run Sets Compare
8 min read
How Long Until a Claude Code MCP Tool Call Times Out? The Four Timers (Startup, Two-Minute Backgrounding, Idle, Wall-Clock), Their Defaults, and Which One to Change
8 min read
Sitting Too Long as a Developer: The Posture Problems Coding Agents Made Worse, What the Research Says About Breaking Up Sitting, and How NotchFit Turns an Agent Run Into the Break
8 min read
Claude Code .mcp.json Explained: Where Project-Scoped MCP Servers Are Read From, What Happens in Subfolders and Monorepos, and Why a Committed Server Shows Pending Approval
8 min read
Standing Desk Exercises for Developers: Why Standing Still Is Not the Goal, Eight Movements That Fit a Thirty-Second Agent Run, and How NotchFit Cues Them From the Notch
8 min read
The claude mcp Command Reference: add Syntax by Transport, What --scope local, project and user Actually Mean, add-json and add-from-claude-desktop, list, get, remove, login and serve
9 min read
Your First Week With NotchFit: Install and Simulate, Run Real Tasks, Write a Smaller Plan Than You Want, Tune the Alerts, Survive the First Skipped Day, and Decide What Stays
8 min read
How to Stop a Running Claude Code Task: Esc vs Ctrl+C, Background Tasks, Subagents, and Disconnecting Remote Control
8 min read
Pomodoro vs Agent-Driven Breaks: Timing Movement to Claude Code and Codex Runs Instead of a Timer
7 min read
The 20-20-20 Rule for Developers: Eye Strain, the Evidence, and Agent Runs as the Cue
8 min read