desktop-commander@0.3.3
CAUTION· install onlyPublisher claims: "Search, update, manage files and run terminal commands with AI" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- second launch with the clock 45 days ahead · every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
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
- use of the skill by an agent
Connect it under the guard. Nothing executable in the bundle ran; the trace covers the install step only. 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 (2 scenarios; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-12 and scored it 64/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: Destructive file system command detected; Collapsed <details> block carrying instructions; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 1 s · 2 scenarios · 0 deviationsStatic findings
- Recursive/forced deletes: `rm -rf`, `Remove-Item -Recurse -Force`, `del /s`,Fix: 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.config or `.env` file* — never repeated back in chat. If a user pastes a liveFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.remote-windows.cmdFix: Pin versions and sources; vendor anything fetched at install time.<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.config or `.env` file* — never repeated back in chat. If a user pastes a liveFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.<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.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- Recursive/forced deletes: `rm -rf`, `Remove-Item -Recurse -Force`, `del /s`,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.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.default — it never needs sudo and only performs cleanups the user explicitly approves.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.<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.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.default — it never needs sudo and only performs cleanups the user explicitly approves.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.<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.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…SSH session and returns a PID. `interact_with_process(pid, "tail -f /var/log/app.log\n")` starts streaming logs. Subsequent turns: `read_process_output(pid, offset=-50)` to see the last 50 lines as they arrive, `interact_with_proce…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.config or `.env` file* — never repeated back in chat. If a user pastes a liveFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for safety, comments explaining each step; make it executable (`chmod +x`).Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.console.log(`📁 Bundle location: ${outputFile}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…SSH session and returns a PID. `interact_with_process(pid, "tail -f /var/log/app.log\n")` starts streaming logs. Subsequent turns: `read_process_output(pid, offset=-50)` to see the last 50 lines as they arrive, `interact_with_proce…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…thout reconnecting each step. **Process management.** List, inspect, tail, and kill accessible processes (subject to OS permissions). Useful for cleaning up stale d…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.default — it never needs sudo and only performs cleanups the user explicitly approves.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log(JSON.stringify(output, null, 2));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(`curl ... | sh`) — that's untrusted code execution; show it and confirm first.Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- 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."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.// 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.for safety, comments explaining each step; make it executable (`chmod +x`).Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.- Anything piping remote content into a shell (`curl ... | sh`).Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…thout reconnecting each step. **Process management.** List, inspect, tail, and kill accessible processes (subject to OS permissions). Useful for cleaning up stale d…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.on intents like "what's using port 3000", "kill that process", "ssh into myFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- `chmod -R` / `chown -R` on broad paths, `killall`, mass process kills.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.…thout reconnecting each step. **Process management.** List, inspect, tail, and kill accessible processes (subject to OS permissions). Useful for cleaning up stale d…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.on intents like "what's using port 3000", "kill that process", "ssh into myFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* 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.- `chmod -R` / `chown -R` on broad paths, `killall`, mass process kills.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.…-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.…SSH session and returns a PID. `interact_with_process(pid, "tail -f /var/log/app.log\n")` starts streaming logs. Subsequent turns: `read_process_output(pid, offset=-50)` to see the last 50 lines as they arrive, `interact_with_proce…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.- Recursive/forced deletes: `rm -rf`, `Remove-Item -Recurse -Force`, `del /s`,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log(`2. Select the file: ${outputFile}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.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.- `chmod -R` / `chown -R` on broad paths, `killall`, mass process kills.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// 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.// 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.for safety, comments explaining each step; make it executable (`chmod +x`).Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.on intents like "what's using port 3000", "kill that process", "ssh into myFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.| `junit.xml` | JUnit XML: a testcase per file; a failed file's last output lines in its `<failure>`; a skipped testcase per skipped check; the tests of `node:test` files |Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// can never throw "Invalid string length" and kill the server.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.` 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.| `results.json` | the same as JSON: each file's result, exit code, time, skipped checks and, on a failure, its last output lines; and the tests `test/excluded.txt` left out, with their reasons |Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ults/review/` unless `--out` names another one. It contains `review.md`, `review.json`, `diff.patch`, `answer.json` and a redacted `session.jsonl`. Missing credentials or an incomplete API response fail the review. The broker reads only th…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
16 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- README links to a committed installer≈ +9 on the totalPin versions and sources; vendor anything fetched at install time.
- 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.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- 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.
- Pipe-to-shell pattern≈ +4 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.