Desktop Commander MCP: Terminal and File Control for Claude, Reviewed From the Documentation
This is MCP server for Claude that gives it terminal control, file system search and diff file editing capabilities
At a glance
- What is it?
- Desktop Commander MCP is an MIT-licensed MCP server that hands Claude Desktop terminal execution, recursive file search and diff-style editing. The interesting part is not the feature list but the process model: sessions, paginated output and a blocklist that is explicitly not a sandbox.
- Who is it for?
- Adopt Desktop Commander if you already pay for Claude Desktop or another MCP client and want terminal and filesystem work to run on that subscription rather than on metered API tokens, and if you are comfortable that the safety features are guardrails rather than isolation. Do not adopt it as a multi-tenant or untrusted-input execution layer; the README points to Docker installation for complete isolation, and SECURITY.md states plainly that the server is not a sandbox.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The gap Desktop Commander fills between Claude and your machine
Claude Desktop can read and write files through the reference filesystem server, but that server does not run processes. Desktop Commander is built on top of the MCP Filesystem Server and adds the parts that server leaves out: terminal execution, process control, recursive search and pattern-based editing. The README frames the audience directly, describing work with code and text, running processes and automating tasks while using host client subscriptions instead of API token costs. That last clause is the real positioning. If you already pay for Claude Desktop, the marginal cost of a long agent session is zero, which is not true when the same work is driven through a metered API.
The feature list is broader than terminal access alone. The project reads and writes Excel files (.xlsx, .xls, .xlsm) without external tools, extracts text from PDFs and creates new ones from markdown, and edits DOCX files through what the README calls surgical XML editing. There is also in-memory code execution for Python, Node.js and R, so a snippet can be run without leaving a file behind. For an engineer who spends the day moving between a shell, a spreadsheet and a document, that combination is the argument. It is one chat surface with hands.
Sessions, pagination and negative offsets: the mechanism that matters
The design decision that separates this from a naive shell wrapper is how it handles output. Terminal commands stream output, but an agent context window is finite, so the server supports command timeouts, background execution and session management for long-running commands. Process output is paginated with offset and length controls, which the README describes as preventing context overflow. Recursive directory listing has the same protection for large folders, and file reads accept negative offsets so you can read from the end of a file the way tail does. Each of these is a small feature. Together they describe a server that assumes the agent will lose the thread if it is handed a 40,000-line log.
The process model goes further than fire-and-forget. The README lists interactive process control and the ability to interact with running processes such as SSH sessions, databases and development servers. That is a different class of capability from running a command and reading its exit code. It implies the agent can hold a session open and send input to it over time. The documentation does not spell out the transport for that interaction in the material available here, so treat the exact mechanics as something to confirm against the source before you depend on it for an interactive SSH workflow.
State is also inspectable. Tool calls and their arguments are recorded locally on the machine running the server, and a get_recent_tool_calls tool exposes recent history with bounded output previews. Size-based rotation keeps the active history files from growing without limit. For anyone who has tried to reconstruct what an agent did to a directory after the fact, a local audit trail is a practical addition rather than a decorative one.
Installing it: the npx path and the config surface
The shortest installation path is a single command, run in a terminal:
npx @wonderwhy-er/desktop-commander@latest setup
For debugging, the same command accepts a flag that allows a Node.js inspector connection:
npx @wonderwhy-er/desktop-commander@latest setup --debug
The setup command also takes --no-onboarding, which disables onboarding prompts for new users. Restart Claude after setup. This option requires Node.js and auto-updates when Claude restarts. Manual updates mean running the setup command again, and removal is handled by:
npx @wonderwhy-er/desktop-commander@latest remove
On macOS there is a bash script installer that handles dependencies and configuration, including installing Node.js if it is missing. The README notes that options 1, 2, 3, 4 and 6 auto-update while option 5 requires manual updates, and that option 6 is the Docker installation, which the README describes as requiring no Node.js and providing complete isolation. If you want isolation, that is the path the project itself points to.
Configuration is not frozen at install time. The server exposes configuration management tools that get and set values, update multiple settings at once, and apply dynamic changes without a server restart. The README does not enumerate the configuration keys in the material available here, so the specific key names are something to read from the source or the app rather than guess at.
The safety model is a blocklist, and the README says so
The README labels its safety features guardrails and adds the parenthetical that this is not a sandbox, pointing to SECURITY.md. The listed protections are symlink traversal prevention on file operations, a command blocklist to prevent accidental execution, and Docker isolation for complete isolation. Read that list carefully. A blocklist stops commands someone thought to enumerate. It does not stop a command that is not on the list, and it does not stop a destructive command constructed at runtime from pieces. Symlink traversal prevention addresses one escape route, not the general problem of an agent with write access to a filesystem.
This is the honest framing and it is worth taking at face value. The threat model here is a cooperative agent making mistakes, not an adversary steering the agent. If your use case involves untrusted input flowing into the agent's context, prompt injection is a live path to arbitrary command execution, and a blocklist is a weak control against it. The project's own answer to that is Docker, which is a stronger boundary but changes the workflow: the agent then operates inside a container rather than on your actual desktop, which is the opposite of the product's premise. There is a real tension between the convenience of local terminal control and the containment you would want before pointing this at anything you cannot afford to lose.
Where the maintenance cost actually sits
The release cadence is visible in the repository metadata: v0.2.50 in September 2026, v0.2.48 a week earlier, and v0.2.44 back in July. That is frequent enough that pinning matters. The auto-update behavior described for most installation options means the version you validated is not necessarily the version that runs after the next Claude restart. For a personal machine that is convenient. For a team, it means the server can change underneath a workflow without a deliberate upgrade step. If you need reproducibility, the manual-update option and a pinned version are the levers the README offers.
Licensing is straightforward. The repository is MIT, which permits commercial use and modification. The README also points to a separate Desktop Commander App in beta with its own download and its own feature set, including support for models other than Claude, live file previews and custom MCPs without config files. The app is a distinct product from the MCP server, and the README is explicit that the server still works with Claude Desktop and other MCP clients. Do not assume the app's roadmap items, such as the skills system or scheduled background tasks, describe the server you are installing today. This is a description of the licence and the project structure, not legal advice; read the LICENSE file for the operative terms.
Compared with the reference filesystem server and with a plain editor agent
The closest comparison is the MCP Filesystem Server that Desktop Commander is built on. That server gives an agent read, write, directory listing and search within configured roots. It does not execute commands, does not manage processes, and does not hold sessions open. The difference in approach is containment by omission: the filesystem server is safer precisely because it cannot run anything. Desktop Commander trades that away for terminal control, then adds guardrails to soften the trade. If your task is editing files, the reference server is the smaller attack surface and you should prefer it. If your task is running the test suite, restarting a dev server, or driving a database client, the reference server simply cannot do the job.
The second comparison is with AI editors that ship their own agent loop and their own execution sandbox. Those tools constrain what the agent can touch by design, usually to a project directory. Desktop Commander's premise is the opposite: the agent works on your actual desktop, with your actual tools, under your subscription. That is a meaningful difference in reach and a meaningful difference in blast radius. The right question is not which is more capable but which failure you can tolerate. A sandboxed editor failing badly wastes a session. A desktop-level agent failing badly can touch anything your user account can touch.
Who should install it, and what to check on the first run
Install it if you are a solo developer or a small team already paying for Claude Desktop, you want the agent to run commands and edit files on your own machine, and you accept that the guardrails are not a security boundary. The subscription-cost argument is genuine and the file-format coverage (Excel, PDF, DOCX) is unusual for an MCP server. Install it inside Docker if you want the agent to work on a codebase without holding write access to your home directory, and accept the reduced reach that comes with it.
Do not install it if the agent will process untrusted content, if the machine holds credentials you cannot rotate, or if you need a reproducible, pinned execution environment across a team without an upgrade process. The blocklist is not a substitute for isolation and the README does not claim otherwise.
On the first run, verify three concrete things. Confirm the command blocklist rejects the destructive commands you actually care about, rather than assuming coverage. Confirm symlink traversal prevention behaves as documented on your platform by testing it against a symlink you create yourself. And check where the local tool-call history files are written, since get_recent_tool_calls depends on them and their rotation is size-based. Those three checks take minutes and they map directly to the three guardrails the project names.
Editorial conclusion
Adopt Desktop Commander if you already pay for Claude Desktop or another MCP client and want terminal and filesystem work to run on that subscription rather than on metered API tokens, and if you are comfortable that the safety features are guardrails rather than isolation. Do not adopt it as a multi-tenant or untrusted-input execution layer; the README points to Docker installation for complete isolation, and SECURITY.md states plainly that the server is not a sandbox. Before trusting it on a real repository, verify two things yourself: that the command blocklist covers the destructive commands you actually run, and that the symlink traversal prevention behaves as described on your platform. The tool-call history is written locally, so decide where that log lives before you point the server at anything sensitive.
Community notes