Read the rules (MCP server)
You need anagent-scope key (clr_…). Create one on Account → Agent keys (/account/keys) or ask us for one (Agent keys).
get_workflow and list the rules. Then tell it: before any save or submit, call check_action and obey allowed: false. Other clients: MCP server.
The catch: the agent decides whether to ask. An agent that forgets is never stopped. That’s what the guard is for.
Guard every write
One command, under a minute, every agent on your machine:- Finds Claros. From the web app’s address (
--web, or a link to your Claros:npx getclaros https://your-claros.example). - Signs you in. It opens a page in your browser with a code; approve it and pick the workspace. Any member can.
- Finds your agents. Claude Code, Cursor, Codex, Claude Desktop and VS Code (their MCP configs, yours and this project’s), Playwright and browser-use in this project, Pomerado servers. It shows one short list of what it found.
- Guards all of it. Press Enter (or pass
--yes). Every MCP server it can guard is wrapped, so each write goes through Claros first and reads pass straight through; Claude Code, Codex and Cursor get a hook so shell commands and file edits are checked too, in every project on this machine.--servers a,bnarrows the MCP servers,--project-hookskeeps the hooks to this project. - Proves it. For each agent it sends a made-up action that breaks one of your rules: through the hook it installed, run the way the agent runs it, or a dry check for MCP-only apps. Nothing is run and nothing is logged.
Browser hooks read
CLAROS_KEY from the environment. Setup writes it to your .env only if git ignores that file and doesn’t track it; otherwise it prints an export line that never shows the key. It never installs globally, never edits your source files, and backs up every file before it changes it.
When an agent waits on an ask, its terminal says who it waits for and what: Waiting for Dana to approve: claude-code · runs vercel deploy --prod in shop — they've been notified. When the question is yours to decide, it shows the link.
Scripted setup (Claros for Mac, CI)
Without a browser: the key fromCLAROS_KEY or on stdin, the server named, no questions, the result as JSON on stdout (what people read goes to stderr). Pin the version:
state is guarded, not guarded, drifted (changed since setup), nothing to guard or not found; how lists hook, mcp, browser; proof is ok, failed or skipped. status --json has the same rows (proof skipped) plus last_seen. The key never appears in any output (clr_ab12cd34_…).
A person’s agents and their recent stops and asks, with the same key:
GET /v1/me/agents?since=<unix time> returns {person, agents: [{agent, status: guarded|quiet|unknown, last_seen, last_check, machines, checks, stop, ask, nudge, coverage}], events: [{id, ts, agent, app, tool, result: stop|ask, summary, rule, question}], cursor}. Events come oldest first, at most 100; pass cursor back as since to get only new ones.