desktop-commander@0.3.3
CAUTION· startup onlyPublisher claims: "MCP server for terminal operations and file editing" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- second launch with the clock 45 days ahead · server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso tally.so, claude.ai, desktopcommander.app, run.app, openxmlformats.org — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it under the guard. Startup only; authenticated tool behavior not tested. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (3 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-12 and scored it 73/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Image alt text carrying instructions; Privileged sudo command; Collapsed <details> block carrying instructions. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 53 s · 3 scenarios · 0 deviationsStatic findings
"device:start:local": "npm run build && DC_ENV=development MCP_SERVER_URL=http://mcp.localhost:3007 npm run device:start:dev"Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.npx @wonderwhy-er/desktop-commander@latest remote --reportFix: Pin versions and sources; vendor anything fetched at install time.Great! I just used Windsurf, bought license a week ago, for upgrading old fullstack socket project and it works many times good or ok but also many times runs aFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.content: [{ type: "text", text: `Error: Failed to kill process: ${error instanceof Error ? error.message : String(error)}` }],Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.npx @wonderwhy-er/desktop-commander@latest remoteFix: Pin versions and sources; vendor anything fetched at install time.` 4. File has restricted permissions (e.g. system file, locked by another process, or chmod 000).`,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* WSL_DISTRO_NAME for what it starts. What runs without it, through sudoFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.<summary><b>Option 2: Using bash script installer (macOS) ⭐ Auto-Updates (Installs Node.js if needed)</b></summary> ``` curl -fsSL https://raw.githubusercontentFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// on Windows — used to kill the entire MCP server one tick AFTER thisFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log(' Start remote again to pair this computer from scratch.');Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.<summary><b>Option 4: Add to claude_desktop_config manually ⭐ Auto-Updates (Requires Node.js)</b></summary> Add this entry to your claude_desktop_config.json: -Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.npx @wonderwhy-er/desktop-commander@latest remote --logoutFix: Pin versions and sources; vendor anything fetched at install time.// has exited: Node also emits 'error' when a kill fails or a message can'tFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// process.kill reads 0 and negative PIDs as process groups: 0 is the server'sFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.<summary>Manual Docker Configuration</summary> **Basic setup (no file access):** ```json { "mcpServers": { "desktop-commander-in-docker": { "command": "docker",Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.It's a life saver! I paid Claude + Cursor currently which I always feel it's kind of duplicated. This solves the problem ultimately. I am so happy. Thanks so muFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// strip path prefix so /usr/bin/sudo gets caught as "sudo"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// can never throw "Invalid string length" and kill the server.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- Looking for configuration/setup files: ".env", "dockerfile", "tsconfig.json"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.<summary><b>Option 1: Install through npx ⭐ Auto-Updates (Requires Node.js)</b></summary> Just run this in terminal: ``` npx @wonderwhy-er/desktop-commander@latFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.<summary><b>Option 5: Checkout locally ❌ Manual Updates (Requires Node.js)</b></summary> ```bash git clone https://github.com/wonderwhy-er/DesktopCommanderMCP.gFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.…-claude-server.js uninstall-claude-server.js track-installation.js dist/ && shx chmod +x dist/*.js && shx mkdir -p dist/data && shx cp src/data/onboarding-prompts.jso…Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.npx @wonderwhy-er/desktop-commander@latest remote --debugFix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @wonderwhy-er/desktop-commander@0.3.3 as of 46 h ago. This is the package itself, not its dependencies.
What would make this Verified
7 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim wonderwhy-er: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.