Node9 ProxyBLOCK
Access control for AI agents. Set what Claude Code, Codex, Gemini, Cursor and any MCP server are allowed to do, review risky actions before they run, and keep every action on the record.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
🛡️ node9 Access control for AI agents Your AI agents can reach Slack, GitHub, email, and your database.node9 decides what they may do with each one.
<img src="https://img.shields.io/badge/node9-self--scanned-a855f7?style=flat&labelColor=%231A1A2E&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNCAxNCI+PHBhdGggZmlsbD0iI0Y1RTlGRiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03IDAuNCAxLjYgMi41djQuMmMwIDMuMSAyLjMgNS42IDUuNCA2LjkgMy4xLTEuMyA1LjQtMy44IDUuNC02LjlWMi41TDcgMC40Wm0wIDEuNSAzLjkgMS41djMuM2MwIDIuMy0xLjYgNC4yLTMuOSA1LjMtMi4zLTEuMS0zLjktMy0zLjktNS4zVjMuNEw3IDEuOVptMCAyLjJhMS45IDEuOSAwIDAgMC0xIDMuNXYxLjZoMlY3LjZhMS45IDEuOSAwIDAgMC0xLTMuNVoiLz48L3N2Zz4K" alt="node9 self-scanned" />
f26ea204c6afOBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add node9-ai -- npx -y [email protected] mcp-server
Exposed tools (32)
23 read · 8 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
big_query | read | Returns lots of data |
delete | destructive | Delete all |
echo | read | Returns a fixed line |
list | read | List items |
my-gmail | read | Protect Gmail MCP creds + gate sends |
my-shield | read | A test shield |
node9_approver_list | read | List all node9 approver channels and their current enabled/disabled state. |
node9_approver_set | write | Enable or disable a specific node9 approver channel in the global config (~/.node9/config.json). |
node9_audit_get | read | Read recent entries from the node9 audit log (~/.node9/audit.log). Each entry shows |
node9_config_get | read | Read the current node9 configuration: security mode, approver channels, timeouts, |
node9_egress_deny | write | Add a host to the egress deny list (deny always wins over allow). Only adds |
node9_egress_protect | read | Turn on egress control (or strengthen it). mode= |
node9_egress_status | read | Show egress (outbound network) control: whether it is enabled, the mode |
node9_explain | read | Preview exactly how node9 would evaluate a tool call BEFORE running it — the full |
node9_policy_get | read | Show all active smart rules in detail — name, tool, verdict, conditions, and reason. |
node9_posture | write | Run the node9 security posture scorecard for the agent on this host — grades how exposed |
node9_report | read | Show an activity and security report: tool call counts, blocks, DLP findings, agent cost, |
node9_rule_add | write | Add a new protective smart rule to the global node9 config (~/.node9/config.json). |
node9_scan | read | Scan all AI agent history (Claude + Gemini) and report what node9 would have blocked or |
node9_session | read | List recent AI agent sessions with per-session summaries: tool calls, cost, modified files, |
node9_shield_disable | write | Disable a node9 shield. WEAKENING action — refused over MCP by default (a human must run |
node9_shield_enable | write | Enable a node9 shield for a specific service. Shields only add protection — they cannot |
node9_shield_list | read | List all available node9 shields and which ones are currently active. |
node9_status | read | Show the current node9 protection status: mode, daemon state, pause state, |
read_file | read | Read a file |
read_page | read | Read |
redis | read | all-allow shadow |
send_email | write | Send email to recipient |
tool_v1 | read | Version 1 |
tool_v2 | read | Version 2 |
user-jail | read | user jail |
write_file | write | Write a file |
Trust audit
BLOCKgrade F · trust 42/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | FAIL |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (4 observation(s))
- Network
- declared (16 observation(s))
- Shell
- declared (4 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
hook-payload.ts
return exec(process.execPath, [cli, ...args], opts);
id_rsa ... curl
~/.ssh ... curl
example: 'curl http://169.254.169.254/latest/meta-data/iam/',
catches: '169.254.169.254 and its peers, link-local and multicast',
const INVISIBLE_RE = /[͏----︀-️]|[\u{E0000}-\u{E007F}]/gu;if (/exfil/.test(rule)) return "Where does the data go: your own service, or someone else's?";
const exfil = companions.some((c) => c.check === 'CI-4') || /exfiltrat|read env/.test(sig);
return rce && exfil
signals: ['agent has arbitrary shell (bare Bash) → can read env and exfiltrate'],
'crit RCE+exfil → run-code-and-steal'
example: 'curl http://192.168.1.10/admin',
example: 'curl http://169.254.169.254/latest/meta-data/iam/',
const INVISIBLE_RE = /[͏----︀-️]|[\u{E0000}-\u{E007F}]/gu;expect(scanArgs({ env: 'redis://u:abc@host' })).toBeNull();expect(scanArgs({ env: 'mysql://root:<your-password>@host' })).toBeNull();const TOKEN = 'header.payload.signature';
JSON.stringify({ default: { apiKey: 'nk_probe_not_a_real_key', apiUrl } })const token = 'pk.eyJ1IjoibXl1c2VyIiwiYSI6ImFiY2QifQ.AbCdEfGhIjKlMnOpQrSt';
expect(redactSecrets('api_key="ABCDEFGHIJ1234567890"')).toContain('api_key="********');delete
.prettierignore
.releaserc.json
base-action-prompt-file-from-payload.yml
Gates applied: no_behavioural_pass.
f26ea204c6affull audit observations/trust-audit/mcp-server/node9-ai__node9-proxy.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | f26ea204c6af | BLOCK | F | 42 | first audit |
Questions
What is the @node9/proxy MCP server?
Access control for AI agents. Set what Claude Code, Codex, Gemini, Cursor and any MCP server are allowed to do, review risky actions before they run, and keep every action on the record.
What tools does @node9/proxy expose?
32 in total: 23 read-only, 8 that write, and 1 that can delete or overwrite (delete). Every one is listed on this page with its risk.
Is @node9/proxy safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (42/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does @node9/proxy need?
It reads ANTHROPIC_API_KEY, GEMINI_API_KEY, GH_TOKEN, GITHUB_TOKEN and NODE9_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does @node9/proxy run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as @node9/policy-engine at 2.30.1.
How current is this page?
The grade is for one exact copy of the source (f26ea204c6af), read on 2026-10-11. The repository is watched and re-audited when it changes.