mcp-web-engine@1.2.1
VERIFIED· startup onlyPublisher claims: "Self-hostable MCP search, public-page fetch and Markdown extraction" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- 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: Verified 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 astral.sh, duckduckgo.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
- 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 (2 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-10 and scored it 85/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 20 s · 2 scenarios · 0 deviationsStatic findings
result = subprocess.run(["npm", "pack", "--dry-run", "--json", "--ignore-scripts"], cwd=ROOT, text=True, capture_output=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([sys.executable, '-m', 'mcp_web_engine.main', '--typo'], input='', capture_output=True, text=True, timeout=10)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.RUN mkdir -p /home/appuser/.local/state/mcp-web-engine && chown -R appuser:appgroup /home/appuser/.localFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.child.kill = (signal) => { child.forwarded = signal; return true; };Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Path(cwd, ".env").write_text("PORT=not-a-number\n")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(command, input=''.join(json.dumps(m) + '\n' for m in MESSAGES), capture_output=True, text=True, timeout=60, env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([sys.executable, '-m', 'mcp_web_engine.main', flag], input='', capture_output=True, text=True, timeout=10)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(["node", "-e", harness, str(ROOT / "bin/cli.js"), json.dumps({"code": code, "signal": signal, "error": error})], capture_output=True, text=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert {".env", ".env.*", "**/__pycache__", ".git", ".venv", "beta_keys.json", "*.pem", "*.key"} <= set(ignore)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(command, input="".join(json.dumps(m) + "\n" for m in messages), text=True, capture_output=True, timeout=timeout, cwd=cwd, env=env)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.<a href="file:///etc/passwd">File</a><a href="/safe">Safe</a>Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.content = (ROOT / ".env.example").read_text()Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run([sys.executable, '-m', 'mcp_web_engine.main', '--serve'], cwd=tmp_path, env=env, capture_output=True, text=True, timeout=10)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(tmp_path / '.env').write_text('ALLOW_DDG_FALLBACK=true\nAPI_KEY=unexpected-key\n')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run([sys.executable, '-c', 'from mcp_web_engine.config import settings; print(settings.ALLOW_DDG_FALLBACK)'], cwd=tmp_path, env=env, capture_output=True, text=True, timeout=10)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.assert not any("__pycache__" in p or p.endswith((".pyc", ".key", ".pem")) or ".env" in p or p.endswith("beta_keys.json") for p in paths)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."http://0x7f000001/",Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.secret_url = "https://alice:[email protected]/a?token=private-query"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.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 mcp-web-engine@1.2.1 as of 4d ago. This is the package itself, not its dependencies.