medusa-mcp@2.2.2
CAUTION· install onlyPublisher claims: "Endpoint security agent for Model Context Protocol (MCP) servers" 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
- 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
HF_TOKENPOLICY_SIGNING_SECRETor--hf-tokenConfiguration, not credentials: MEDUSA_GITHUB_REPO, MEDUSA_LOG_FORMAT, SUDO_GID, SUDO_UID- Where it talks to
- no vendor host named in the codeAlso jsonrpc.org, evil.com, attacker.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
- use of the skill by an agent
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names jsonrpc.org, evil.com, attacker.com as well as its own vendor. The guard injects HF_TOKEN, POLICY_SIGNING_SECRET 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 (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-11 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: Privileged sudo command; Privileged sudo command; Privileged sudo command. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
"Repair with: sudo chown -R $USER:staff ~/.medusa, "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."installer without sudo failed (rc=%d): %s",Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# When `sudo medusa-agent install` is used, mkdir creates dirsFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.env_path = Path(__file__).resolve().parents[3] / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Sync auto_update_enabled from dashboard → agent configFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.self._config.auto_update_interval_seconds,Fix: Pin versions and sources; vendor anything fetched at install time.# Set HF_TOKEN in medusa/.env, then:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print("Error: HF_TOKEN not found. Set it in medusa/.env or as an environment variable.")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.fix="Run: chmod 600 ~/.medusa/agent-config.yaml",Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* **macOS** — ``installer -pkg`` → ``sudo -n installer`` → direct swapFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.help='Tool arguments as a JSON object, e.g. \'{"path":"/etc/passwd"}\'',Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Best-effort: failure to bind doesn't kill the daemon.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.description="Unsafe pipe command (curl|sh pattern) in server config",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Attempt 2: installer with non-interactive sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.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.# Try .env in project rootFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.``path`` matches ``/etc/shadow``).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."Repair with: sudo chown -R $USER:staff ~/.medusa, "Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."Re-run without sudo — Medusa is installed per-user. "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.auto_update = data.get("auto_update_enabled")Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.key is left in the YAML at chmod 0600 (legacy behavior).Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""Start the server. Best-effort — failures don't kill the daemon."""Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."linux": "~/.aws/amazonq/mcp.json",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if self._config.auto_update_enabled:Fix: Pin versions and sources; vendor anything fetched at install time.auto_update_enabled: bool = TrueFix: Pin versions and sources; vendor anything fetched at install time.if auto_update is not None:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.# Attempt 1: installer without sudo (works if running as admin/root)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.auto_update_interval_seconds: int = 3600 # check hourlyFix: Pin versions and sources; vendor anything fetched at install time.* **Linux** — ``dpkg -i`` → ``sudo -n dpkg`` → direct swapFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."darwin": "~/.aws/amazonq/mcp.json",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Load HuggingFace token from .env file or environment."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.remotely toggle auto-update behavior on individual agents.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.Also handles ``auto_update_enabled`` to allow the dashboard toFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.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.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.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Also kill the process group to clean up node childrenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.medusa-agent gateway-proxy -- npx -y @modelcontextprotocol/server-everythingFix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.start_new_session=True, # Own process group for clean killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.``~/.medusa/agent-config.yaml`` at chmod 600. That's enough to keepFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# Best-effort: a write failure shouldn't kill the sync.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.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.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.medusa gateway-proxy -- npx -y @modelcontextprotocol/server-everythingFix: Pin versions and sources; vendor anything fetched at install time.# process group (npx spawns node children that survive a simpleFix: Pin versions and sources; vendor anything fetched at install time.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.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["tail", "-f", "-n", str(lines), str(log_file)])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.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
No advisories in OSV for medusa-mcp@2.2.2 as of 3d 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%- Unclaimed publisher≈ +8 on the totalClaim joshmaster2165: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Privileged sudo command≈ +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.
- Auto-update or dynamic fetch configuration≈ +4 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.