The agent can never exceed the person.
Every call resolves to the overlap of the agent’s grants and the acting user’s own access — the smaller set always wins.
An agent reaches the overlap between what it was granted and what the person it is acting for can already do — resolved per request, enforced at the tool-call boundary, never in the prompt.
“This agent can use Slack” is not a permission model — a service account gives every agent the same access, for every person, all the time. The intern’s request and the CFO’s request come out of the same key.
Illustrative scopes. The smaller set always wins — resolved per request, at the tool-call boundary.
crm.export_allin the grant onlycrm.account.readin bothcrm.owner.changein both · heldrefunds.issuethe person onlycrm.account.readIn the overlap: the agent was granted it and the account owner can already do it. The call goes out on a vault-held credential.
crm.export_allIn the agent’s grant, outside this person’s own access — so outside the overlap. The smaller set wins and the export never runs.
crm.owner.changeInside the overlap, but a named human approver has to say yes first. Nothing changes hands while the request waits.
Illustrative scopes · nothing is reachable until it is in both sets.
Every call resolves to the overlap of the agent’s grants and the acting user’s own access — the smaller set always wins.
Read-only for one person, read-write for another — one agent, one deployment.
The tool list is built per user, so an agent is never even offered what that person can’t do.
Grant or deny specific actions per user — not just whole tools.
Nothing is reachable until granted — org, then team, then member.
Define “support tools, read-only” once; apply it everywhere.
Which agent, for which person, against which resource. Decided before anything runs.
Swipe to explore all six tools →
| AGENT × TOOL | DBDatabase | $Payments | ||||
|---|---|---|---|---|---|---|
| sales-agentfor dana@acme | ||||||
| support-botfor dana@acme | ||||||
| data-pipelinefor dana@acme | ||||||
| finance-agentfor dana@acme | ||||||
| research-agentfor dana@acme | ||||||
| ops-agentfor dana@acme |
sales-agent → Gmail, acting for Dana. Both the agent grant and the user’s permission allow this tool.
Explore the context attached to every request.
sales-agent has a defined purpose and a bounded set of tools.
The request acts for account owner, using that person’s permissions.
The policy applies to the requested action within CRM, before the tool executes.
At the tool-call boundary, outside the model — a clever prompt can ask for anything, but it can’t get past the gate.
The extra grant does nothing. Permission is the overlap of the two, so an agent allowed to issue refunds still cannot issue one for a person who has no refund access of their own.
The people accountable for the systems — admins define org and team grants, scope sets cover the common cases, and per-user overrides handle the exceptions.
That is the default. Every request resolves against the acting user’s own access and overrides, so one deployment behaves differently for a team lead than for a new hire. No forked agents, no lowest common denominator.
Usually nothing: off-limits tools aren’t even visible to the agent. A call that arrives anyway is refused before it reaches the system.
No — policy is read live on each request. Tighten a grant and the very next call obeys it; there is nothing to ship or restart.