Your AI already knows how to think.
Dillo gives it a backend. Meet Scout, an external agent running on a function-scoped key. Run it below and watch every call it makes. Inspect exactly what its key allows, then play Danny and make the human decision yourself. No setup, everything is live.
Watch the agent work
Scout's mission: find the Q4 consulting agreement and get Danny's approval. Each step below is a real call to this page's live Dillo backend, made by this page's server with Scout's function-scoped key, so the secret never reaches your browser. Scout can search and request, but it cannot read file bytes and it cannot approve anything. The decision belongs to a human.
Open the approval link
The key
Scout's credential is real, and it is scoped to six functions and nothing else: no table reads, no table writes, no file bytes, no key management. The secret itself is held by the server and is never served to a browser. This demo used to hand the secret to every visitor, which quietly undid the point of scoping it. Now the page's server makes Scout's calls for it, and everything about the key is still here to inspect, except the secret.
loading the key's public facts…
That prefix is all that ever leaves the server. There is no reveal and no copy, because there is nothing here to reveal or copy.
With this key, Scout can
- Prove who it is (
agent_identity) - Search the owner's documents and people by title
- Request an approval for a specific document and person
- Check whether an approval is still pending
- Read the audit trail of its own calls
With this key, Scout cannot
- List or read any table directly
- Read file bytes without a human's grant
- Approve or reject its own requests
- Create keys, manage users, or touch billing
Run it with your own key. Create an account on this backend, sign in, and mint a key from your account (POST /v1/api-keys) with the scopes you choose, then swap YOUR_OWN_KEY for it above. A key you mint answers agent_identity right away. It cannot see Danny's documents: the search and approval functions only answer callers the owner enrolled in the demo circle, and enrollment is the owner's call, exactly as it should be.
Play Danny
The approval link alone opens nothing: Danny signs in with the demo account, then the link's token unlocks one document, five reads, one decision. Approve or reject, and watch Scout's status check flip.
Activity
Every function call writes an audit row: who called, what they did, and under which authorization. This feed reads the live audit trail through activity_feed, one of Scout's six functions.
| When | Principal | Action | Authorization |
|---|---|---|---|
| Loading the audit trail… | |||
How it works
Three moving parts, all of them real on this page.
The owner issues Scout a key with functions:* scopes only, and the secret stays on the server. The MCP surface at /mcp exposes the same four agent tools to any external agent holding a scoped key.
Scout never touches the database. It calls find_document, find_person, request_approval, and approval_status inside the demo's trusted circle, and the backend enforces ownership on every call.
An approval is a single-decision, expiring grant. Only Danny's signed-in session can read the file or record the decision, and every step is audited.