
Security News
arXiv Is Rate Limiting Authors Following a Flood of AI Slop Submissions
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.
@node9/proxy
Advanced tools
Node9 is the execution security layer for the Agentic Era. It intercepts AI agent actions β via native hooks (Claude Code, Gemini CLI, Cursor) or a JSON-RPC proxy (MCP servers, shell commands) β before they reach your production environment.
While others try to guess if a prompt is malicious (Semantic Security), Node9 intercepts the actual action (Execution Security).
Node9 has two protection modes. The right one depends on your agent:
| Agent | Mode | How |
|---|---|---|
| Claude Code | Hook | node9 addto claude β hooks fire before every tool call |
| Gemini CLI | Hook | node9 addto gemini β hooks fire before every tool call |
| Cursor | Hook | node9 addto cursor β hooks fire before every tool call |
| MCP Servers | Proxy | node9 "npx <server>" β JSON-RPC interceptor |
| Shell commands | Proxy | node9 "rm -rf ./data" β evaluates before running |
β οΈ
node9 geminiandnode9 claudedo NOT work β interactive CLIs need a real TTY and communicate via their own hook system, not JSON-RPC. Usenode9 addtofor one-time setup, then run the agent normally.
sequenceDiagram
participant LLM as AI Model
participant Agent as Agent CLI
participant Hook as node9 check (PreToolUse hook)
participant OS as Local System/Shell
LLM->>Agent: "Delete the tmp folder"
Agent->>Hook: PreToolUse fires: Bash { command: "rm -rf ./tmp" }
Note over Hook: π§ Semantic Parser analyzes AST
Note over Hook: π‘οΈ Policy Engine checks rules
alt is dangerous & not allowed
Hook-->>Agent: β exit 1 β action blocked
Agent-->>LLM: "Action blocked by security policy"
else is safe OR approved by user
Hook-->>Agent: β
exit 0 β proceed
Agent->>OS: Execute: rm -rf ./tmp
OS-->>Agent: Success
Agent-->>LLM: "Folder deleted"
end
sequenceDiagram
participant Agent as Agent / Caller
participant Node9 as Node9 Proxy
participant MCP as MCP Server / Shell
Agent->>Node9: JSON-RPC tools/call { command: "rm -rf ./tmp" }
Note over Node9: π§ Semantic Parser analyzes AST
Note over Node9: π‘οΈ Policy Engine checks rules
alt is dangerous & not allowed
Node9-->>Agent: β BLOCK: error response
else is safe OR approved by user
Node9->>MCP: Forward original request
MCP-->>Node9: Result
Node9-->>Agent: Tool Result: Success
end
In 2026, AI agents have "Write Access" to everything (GitHub, AWS, Stripe, Databases).
DROP DATABASE or an unauthorized aws.delete_instance.node9 addto claude wires up full protection in seconds β no manual config editing.node9.config.json file in your project root.npm install -g @node9/proxy
Node9 provides two layers of protection depending on the agent you use:
Interactive CLIs like Gemini, Claude Code, and Cursor require a real terminal. Use the addto command to wire up Node9's native hooks:
# One-time setup
node9 addto gemini
node9 addto claude
node9 addto cursor
# Then run your agent normally! Node9 protection is now automatic.
gemini
claude
For standalone MCP servers or one-off shell commands, use the Smart Runner prefix:
# Intercepts 'rm -rf /' before starting
node9 "rm -rf /"
# Wraps an MCP server with a security proxy
node9 "npx @modelcontextprotocol/server-github"
Note: Always wrap the target command in quotes.
To route approvals to Slack when you are away from your terminal, login once with your API key:
node9 login <your_api_key>
Your credentials are stored in ~/.node9/credentials.json with 0o600 permissions (owner read/write only).
node9 addto <target> wires up Node9 to your AI agent automatically:
| Target | MCP Servers | Built-in Tools (Bash, Write, Edit...) | Audit Log |
|---|---|---|---|
claude | β | β
via PreToolUse hook | β |
gemini | β | β
via BeforeTool hook | β |
cursor | β | β
via preToolUse hook | β |
What it does under the hood:
node9 proxy (asks for confirmation first)node9 check runs before every tool callnode9 log writes every executed action to ~/.node9/audit.logFor hook-based integrations, Node9 can auto-start a local browser UI to approve or deny dangerous actions without needing a Slack account.
# Start manually and keep it running in the background
node9 daemon --background
# Check status / stop
node9 daemon status
node9 daemon stop
How it works:
http://127.0.0.1:7391 and opens your browser.Settings (in the browser UI βοΈ):
| Setting | Default | Effect |
|---|---|---|
| Auto-start daemon | On | Start the daemon + open browser automatically when no approval mechanism is running |
Turn "Auto-start daemon" off if you prefer to always be asked in the terminal, or if you want to control the daemon lifecycle manually.
You can also disable auto-start permanently via ~/.node9/config.json:
{
"settings": {
"mode": "standard",
"autoStartDaemon": false
}
}
To protect any command or MCP server manually:
Protecting a direct command:
node9 "rm -rf ./data"
Protecting GitHub MCP Server:
node9 "npx @modelcontextprotocol/server-github"
Note: Direct proxying (e.g. node9 gemini) is not supported for interactive agents. Use node9 addto instead.
Wrap any async function with protect() to require human approval before it runs:
import { protect } from '@node9/proxy';
const deleteDatabase = protect('aws.rds.delete_database', async (name: string) => {
// ... actual deletion logic
});
// Node9 intercepts this and prompts for approval before running
await deleteDatabase('production-db-v1');
node9.config.json)Add a node9.config.json to your project root or ~/.node9/config.json for global use.
{
"settings": {
"mode": "standard"
},
"policy": {
"dangerousWords": ["delete", "drop", "terminate", "rm", "rmdir"],
"ignoredTools": ["list_*", "get_*", "read_*"],
"toolInspection": {
"bash": "command",
"shell": "command",
"run_shell_command": "command"
},
"rules": [
{
"action": "rm",
"allowPaths": ["**/node_modules/**", "dist/**", "build/**"]
}
]
},
"environments": {
"production": {
"requireApproval": true,
"slackChannel": "#alerts-prod-security"
},
"development": {
"requireApproval": false
}
}
}
Modes:
standard: Allows everything except tools containing dangerousWords.strict: Blocks everything except tools listed in ignoredTools.Environment overrides (keyed by NODE_ENV):
requireApproval: false β auto-allow all actions in that environment (useful for local dev).slackChannel β route cloud approvals to a specific Slack channel for that environment.Node9 can protect any tool, even if it's not Claude or Gemini. You can tell Node9 where to find the "dangerous" payload in any tool call.
Example: Protecting a custom "Stripe" MCP server:
"toolInspection": {
"stripe.send_refund": "amount",
"github.delete*": "params.repo_name"
}
Now, whenever your agent calls stripe.send_refund, Node9 will extract the amount and check it against your global security policy.
Node9 is deterministic. It doesn't use AI to check AI.
node9 addto)Claude wants to run Bash("rm -rf /data")
β
PreToolUse hook fires
β node9 check
β
ββββββ΄ββββββ
β BLOCKED β β Claude is told the action was denied
ββββββββββββ
OR
ββββββββββββ
β APPROVED β β Claude runs the command
ββββββββββββ
β
PostToolUse hook fires
β node9 log β appended to ~/.node9/audit.log
node9 "<command>")1. Intercept β catches the JSON-RPC tools/call request mid-flight
2. Evaluate β checks against your local node9.config.json
3. Suspend β execution is frozen in a PENDING state
4. Authorize β Local: prompt in terminal / Cloud: button in Slack
5. Release β command forwarded to the target only after approval
node9 check exits immediately / Claude Code is never blocked
Node9 fails open by design β if it can't parse the hook payload it exits 0 rather than blocking your agent. Enable debug logging to see what's happening:
NODE9_DEBUG=1 claude # logs every hook payload to ~/.node9/hook-debug.log
Browser opens on every single tool call
The daemon opens the browser only when no tab is already connected. If your browser keeps opening, check that the previous tab is still open. If you'd prefer the terminal prompt instead, disable auto-start in the daemon UI (βοΈ Settings β Auto-start daemon: Off).
node9 daemon stop says "Not running" even though I see the process
The daemon PID file may be stale. Run rm ~/.node9/daemon.pid and try again.
Terminal prompt never appears β action is just blocked
The terminal prompt only shows when process.stdout is a TTY (i.e. you're running directly in a terminal, not through a pipe). If you're using the hook system (node9 check), it runs headless. Start the daemon to get a browser prompt instead:
node9 daemon --background
"Always Allow" / "Always Deny" not taking effect after restart
Persistent decisions are stored in ~/.node9/decisions.json. If a project node9.config.json overrides the ignoredTools list in a way that covers the tool, it may be allowed before the decisions file is checked. Look at the config precedence: project config β global config β defaults.
node9 addto claude/gemini/cursor)~/.node9/audit.log)The local proxy is free forever for individual developers. For teams requiring Slack Integration, VPC Deployment, and Tamper-proof Audit Logs, visit node9.ai or contact support@node9.ai.
Safe Agentic Automations Start with Node9. π‘οΈπ
FAQs
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.
The npm package @node9/proxy receives a total of 1,109 weekly downloads. As such, @node9/proxy popularity was classified as popular.
We found that @node9/proxy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.

Security News
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.

Research
/Security News
A new GhostAction wave hits hundreds of GitHub repos, expanding CI/CD secret theft to cloud and AI credentials in source code and git history.

Research
/Security News
Tensorlake npm SDK version 0.5.144 was compromised in a ChainDrop / Shai-Hulud attack, delivering credential-stealing malware.