mcp-gatehouse@0.6.0
VERIFIED· not startedPublisher claims: "Authorization as a runtime invariant for MCP servers: caller, policy and a decision on the record, checked in the server before every tool runs. Tiers, approval gates and an audit log around it." 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: 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 code
- 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-15 and scored it 80/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 · 0 s · 2 scenarios · 0 deviationsStatic findings
proc = subprocess.Popen([sys.executable, "-c", script, str(path)], stdout=subprocess.PIPE, stderr=subprocess.PIPE,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.shown = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.bad = [c for c in msg if c in "
\u0085\u009b"]Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.procs = [subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) for _ in range(2)]Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run = subprocess.run([sys.executable, "-c", _DISK_FILLS, str(path)], capture_output=True, text=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.procs = [subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) for _ in range(2)]Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.sneaky = Caller(client_id="app\x1b[2K\x7f", subject="mallory\r\x1b[1A\x9b")Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.reason="over $500", resources=("order 4417\nApprove? yes", "evil"),Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.assert len(written) < 10 # the test did kill it mid-drainFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.done = subprocess.run([sys.executable, "-c", script, str(out)], capture_output=True, text=True, timeout=30)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Claude Code is asked to cancel order 4418; the server's approval form appears in Claude Code, naming who the call is for, the arguments, and the order as the seFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.CLIENT = "import subprocess, sys; subprocess.run([sys.executable, '-c', %r], start_new_session=%s, timeout=20)"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.mcp = MCPServer("authz-http", token_verifier=Verifier(),Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.arguments={"order_id": "4417", "note": "x
on order 4418 · Piedmont Supply · $5.00
\u0085"},Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.for raw in ("\x1b", "\r", "", "\x9b", "\x7f"):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
Not checked against OSV yet; the weekly check has not reached this version.