mcpdone-audit@0.11.3
CAUTION· not startedPublisher claims: "Static analyzer for MCP server repos, Python and TypeScript/JavaScript: 10 checks (BadHost / Starlette CVE-2026-48710, FastMCP wrapper-layer asyncio.run bug, loose tool schemas, subprocess command-injection w/ cross-function taint propagation, destructive-filesystem sinks from tool params, keyword-guarded SQL read-only bypass, and a TS engine covering DNS-rebinding-unprotected HTTP transports / CVE-2025-66414, child_process injection, destructive fs sinks, and unconstrained zod tool schemas)." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
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 mcpdone.com — 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
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. 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; not started: dependency install failed; the server itself was not observed) on 2026-11-10 and scored it 69/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: Hidden zero-width characters detected; Destructive file system command detected; OS command execution function call detected. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
this, `_shadowed_transport_names` would be a silent kill switch."""Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.assert "subprocess.run([" in f.remediationFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return os.popen("cat " + path).read()Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.then into subprocess.run(..., shell=True)."""Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(["git", "checkout", branch], check=True).argsFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out._WS_CHARS = " \t\r\n\v\f "Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.os.system(f"sqlite3 mydb.db 'SELECT * FROM {table}'")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return subprocess.run(f"cat {safe}", shell=True, capture_output=True).stdout.decode()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""exa-mcp-server passes its raw shape by name from another module.Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.return subprocess.run("uname -a", shell=True, capture_output=True).stdout.decode()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.command string, so anything the model emits as `;rm -rf /` lands.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return subprocess.run("git log " + branch, shell=True, capture_output=True).stdout.decode()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(cmd, shell=True, capture_output=True).stdout.decode()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- `os.system(x)` / `os.popen(x)` where `x` contains a tool parameterFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return subprocess.run(["git", "log", "--oneline", branch]).argsFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(cmd, shell=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# execute_query -> _run_shell -> subprocess.run(shell=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(bom / "server.ts").write_text("" + HDR + body, encoding="utf-8")Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.return subprocess.run(["kubectl", *args], capture_output=True).stdout.decode()Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.The safe pattern is `subprocess.run(["git", "checkout", branch])` —Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(a) `subprocess.run(..., shell=True)` — the shell parses the wholeFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."`subprocess.run(['git', 'checkout', branch_param], check=True)`. "Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.run(f"git checkout {branch}").argsFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.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 mcpdone-audit@0.11.3 as of 4d ago. This is the package itself, not its dependencies.
What would make this Verified
11 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim alienbushman: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- OS command execution function call detected≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.