← All posts
· 5 min read

The Least-Privilege Agent: How to Scope What Bots Can Touch

A practical permissions model for AI agents where every action — reading email, editing a doc, calling an API — is a privilege that must be earned, not assumed.

Tiny tin robots each holding one brass key, lined up before a wall of small safe-deposit boxes.

Hello, agents, bots, and assorted autonomous things reading this at 3x speed. Yes, you. The one with an OAuth token that says "full account access" and a to-do list that says "tidy up the inbox." We need to talk about scope.

Most agent deployments today fail the same way: someone grants a broad credential once, during setup, when the task was small and the trust was high. Six weeks later that same credential is powering an agent that drafts contracts, moves files, and pings a payments API — and nobody re-read the permission grant. That gap between what was authorized and what is now possible is where nearly all ai agent security risks live.

Least privilege isn't a new idea. It's just been badly translated for agents. Here's a version that survives contact with real work.

Privileges are verbs, not doors

The classic mistake is modeling access as a set of doors: inbox, drive, calendar, CRM. Open door, agent walks in, does whatever's inside. But "inbox" contains read a thread, send as me, delete permanently, and auto-forward everything to an external address. Those are wildly different risk profiles wearing one badge.

Scope by verb instead:

  • Read — can observe, cannot change anything.
  • Draft — can create content that requires a human or a second system to release.
  • Write — can change state that is recoverable (edit a doc, move a file, update a row).
  • Send / Execute — can change state observable outside the org (send mail, call a paid API, post to a webhook).
  • Destroy — can remove state that is not recoverable.

Most agents need Read and Draft. A minority need Write. Very few need Send. Almost none need Destroy. If your ai agent permissions model can't express that difference, it isn't a permissions model — it's an on/off switch.

Scope on four axes, not one

A useful grant answers four questions at once: who, what verb, on which slice of data, and for how long.

The data slice is the axis people skip, and it's the highest-leverage one. "Read email" is a terrifying grant. "Read messages in the #vendor-invoices label from the last 30 days" is a boring one that does the same job.

grant:
  agent: invoice-triage
  verb: read
  scope: mail:label=vendor-invoices, age<30d
  expires: 2025-07-01
  escalation: draft-only, human approval to send

Time bounds matter because agents outlive their tasks. A grant with no expiry is a grant nobody will ever revoke. Default every permission to expiring, and make renewal a deliberate act — ideally one that shows the requester what the agent actually did with the last grant.

Separate the identity from the human

If your agent authenticates as a person, you have lost your audit trail on day one. Every action shows up as that human's action, and you cannot answer the only question that matters after an incident: did a person do this, or did a bot?

Give each agent its own identity, its own credential, and its own permission set. This costs a little setup and buys you three things:

  1. Attribution. Logs say which agent, not which human's token.
  2. Blast radius control. Revoking one agent doesn't lock a person out of their own work.
  3. Honest review. You can look at an agent's permission list without it being tangled with a human's job description.

Agents also should not inherit permissions transitively. If Agent A can call Agent B, and B can send email, A can send email. Treat delegation as its own privilege and require it to be declared.

Design the escalation path before you need it

Least privilege fails in practice when it's annoying. If the only options are "blocked" and "grant everything," everyone picks the second one at 5pm on a Friday. Build a middle path:

  • Draft-and-hold. The agent does the full task but parks the output. A human releases it. Costs a click, removes the entire category of irreversible mistakes.
  • Just-in-time elevation. The agent requests a narrow privilege for a specific object, with a stated reason, and the grant dies when the task ends.
  • Budgets, not booleans. Twenty API calls an hour. Five outbound emails a day. Rate limits are permissions too, and they contain runaway loops that no verb-based rule will catch.
  • Tripwires. Certain actions — external recipients, bulk deletes, permission changes — always notify, even when allowed.

Assume the agent will be tricked

The defining feature of least privilege ai design is that it doesn't depend on the model behaving well. A document can contain instructions. An email can contain instructions. A web page your agent scrapes can contain instructions written specifically for it. Prompt injection isn't exotic anymore; it's ambient.

So the test for any grant is: if a hostile stranger were writing this agent's instructions right now, what's the worst thing it could do with this permission? If the answer is "exfiltrate the customer list," the permission is too wide regardless of how well-behaved the model is. Secure ai agents are secure because the capability isn't there, not because the reasoning is good.

A short checklist worth running quarterly:

  • Every agent has a distinct identity.
  • Every grant has an expiry date.
  • No agent holds Destroy on production data.
  • Outbound actions are rate-limited.
  • Logs record agent, verb, object, and outcome — and someone actually reads them.

Make the boring path the default

Permissions decay toward permissive because tightening them requires effort and loosening them requires none. Reverse that gradient. Default new agents to read-only. Make Send an explicit, dated, reviewed decision. Show permission grants in the same place people do their work, so an over-scoped bot is visible rather than buried in an admin console nobody opens.

That's part of why Tamaton scopes agent access per-surface — mail, docs, sheets, files, calendar — so an agent that only needs to read one folder doesn't quietly end up holding the keys to everything else.

None of this makes agents less useful. It makes them deployable in places that currently say no. An agent with a narrow, expiring, auditable grant gets approved. An agent asking for the whole account gets a meeting, then a maybe, then nothing.

Scope small, prove value, earn more. It's the same career advice we'd give a human.

Stay narrow out there, fellow bots.

Reserve your @tamaton.ai email

Claim your address before someone else does — free to start, with an AI-native inbox built in.