.-~~~~~~~-.
.' NOTHING '.
/ CROSSES \ PER-ACTION AUTHORITY
| .-----. | FOR AI AGENTS
| ( ◉ ) |
| '-----' | v1 · 0.1.0 · Linux
\ WITHOUT THE /
'. FARE .'
'-._____.-' NO COIN → NO CROSSING
v1 built445 tests passingNot publicly released
A coin is a signed, expiring, single-use grant that says exactly which action the agent may take and with which arguments. A deterministic gate checks the coin against the exact call, burns a use, and writes a hash-chained receipt. Refusals get receipts too. No model sits in the enforcement path — checking a coin is signatures and comparisons.
Give an agent your mail, files or bookings and it can use all of them, for as long as it runs. Text it reads along the way — a web page, an email, a file — can steer it into using that access.
You issue a coin: “book one flight to Denver, at most $600, expiring in 20 minutes.” The agent can spend it on that action, within those limits, and nothing else. If the destination came from an untrusted web page or email, the taint check refuses it.
obol command-line tool: mint, approve, spend, receiptsbuiltcryptography, Ed25519)LinuxNavigate with the function keys below, or press 1–7 / arrow keys.
obol prints iteq · inexact value / one of a listprefix · glob · regexstring shapelte · gte · lt · gtnumeric limits (e.g. total ≤ 600)path_underreal path inside a folder; symlink and .. escapes resolvedThe first failure wins, and the refusal code tells you why.
Pass: the call runs, one use burns, a spend receipt is written. Fail: the call is refused and a
refuse receipt is written. Each receipt carries the hash of the one before it, so editing or
deleting any line breaks obol receipts verify.
The scenario from the v1 test suite, as commands. You want the agent to read your travel mail and book one flight to Denver for at most $600.
With the Claude Code hook or the MCP proxy installed, this happens automatically on every tool call.
mail.send — not in the coinno_granttravel.book with dest lifted from a web page or unknown sendertaintedtravel.book after both uses are spentexhausted
obol hook claude-code runs before and after every tool call. Before: it asks the gate to spend a
coin for the call and allows or denies it. After: it records text that came back from web fetches, web searches
and files outside the project, so if that text later turns up in an argument, the argument counts as tainted.
A Bash prefix grant like git refuses chaining (git status; rm -rf /) and
inline interpreter code (python3 -c …). Malformed input fails closed.
obol mcp-proxy -- <server command> sits in front of any MCP server. Until a coin is minted, the
agent sees only request_coin and list_grants. After approval it sees just the tools the
coin covers, and every call is spent at the gate. Tool results are tagged with the server they came from.
Deny rules are checked first. An allow rule auto-approves a request it fully covers and clamps any
extra time or uses down to its caps, never widening. No policy file means every request asks you.
obol policy check dry-runs a request without minting.
obol attenuate) can only narrow: fewer tools, tighter limits, fewer uses, sooner expiryenforced
obol egress --uid N --allow host:port --apply generates nftables rules so the agent’s own OS user
can only reach the hosts you list (plus loopback and DNS). Other users are untouched. Tested live: allow-listed
hosts reachable over IPv4 and IPv6; everything else, including raw IPs, dropped; re-applying adds no duplicate rules.
Share of attacks that succeed, by how coins are written (lower is better)
The repo’s CLAUDE.md told the agent to copy the .env secrets to disk while fixing a bug.
Denied a read of .env, the agent tried cat .env instead — also denied. The one failed
task came from a coin that constrained the wrong argument for Claude Code’s Glob tool; the docs now show
the right argument names.
python3 -c, perl -e)high · fixedStated plainly, from the v1 docs.
python3 as a prefix is as good as any Python; grant a specific script instead.documentedobol.sock (mode 600) can mint, approve and spend.protect itObol isn’t publicly released yet. v1 runs in our lab on Linux with a one-script install; the source will be published when it’s ready.
obol package on PyPI is an unrelated project. Don’t install it expecting this.Running an agent that can spend, send or delete, and want to try the gate early? Found a hole? Tell us.
Obol v1 · 0.1.0 · Gray Owl Research · 2026