Curtis FosterCurtis Foster
All posts

The AI agent permission model: what an agent should be allowed to read, write, and trigger

An AI agent needs more than a prompt. It needs a permission model that limits what it can read, change, and trigger when nobody is watching.

September 9, 2026· 14 min read· Curtis Foster Team
Hero image for blog post: The AI agent permission model: what an agent should be allowed to read, write, and trigger

At 9:14 on a Tuesday morning, Marcus watched an AI agent update a customer record, send a refund request, and schedule a follow-up call from one vague instruction. The agent had done exactly what the tools allowed. That was the problem.

AI agent permissions are not a settings page you add before launch. They are the operating boundary around the product. A useful agent should have narrow access to the data it needs, limited authority to write changes, and explicit approval before it triggers an action with real consequences.

I've built two live multi-model AI platforms, and I've watched the distance between "the model can do this" and "the product should let it do this" grow very large, very quickly. If you're responsible for an AI feature, feeling uneasy about that gap doesn't mean you're behind. It means you're looking at the real product.

A laptop beside a notebook with colored access cards arranged in separate columns
Permissions are the product boundary: let agents read narrowly, write cautiously, and trigger consequential actions only with approval.

That boundary is the part users trust, even when they never see it. A good AI agent permission model lets an agent move quickly inside a safe area and makes the dangerous steps visible before anything irreversible happens.

Why agent access control starts with the action, not the model

Teams often ask, "Which model should we use for this agent?" That question matters, but it's not where the permission problem begins. The problem begins with the action.

A language model may be able to call a refund API, query every customer record, or create a production deployment. Capability is not authorization. The fact that a tool can be connected does not mean the agent should be allowed to use it without limits.

Here's the part most people miss: the conventional wisdom says a better system prompt will keep the agent in line. It won't. A prompt can describe intent, but it is not an access control boundary. The model can misunderstand the instruction, follow malicious text in a retrieved document, or decide that a broad interpretation is reasonable.

OWASP's Top 10 for LLM Applications names excessive agency as a major risk. That phrase is useful because it puts the problem in plain terms: an agent has too much agency when it can take actions beyond what the user, the business, or the workflow actually requires.

When I map an agent, I separate four questions:

  • What information can the agent read?
  • What records can it create or change?
  • Which tools can it call?
  • Which actions need a person to approve?

Those questions sound simple. The work is in making the answers specific.

"Access to customer data" is not specific enough. "Read the order status, shipping address, and refund policy for the authenticated customer, but not payment tokens or unrelated orders" is a permission boundary.

"Can update the CRM" is not specific enough either. "Can draft a note attached to the current ticket, but cannot change account ownership, contract terms, or lifecycle status" gives your system something it can actually enforce.

A practical permission table

Before you give an agent a tool, write a table like this:

Resource or actionReadWriteTriggerApproval
Current support ticketYesDraft onlyNoNo
Customer order statusYesNoNoNo
Refund requestLimitedCreate requestNoYes
Email replyRelevant threadDraft onlySendYes
Calendar appointmentAvailability onlyCreate holdConfirm bookingYes

The table exposes a useful distinction. Reading, writing, and triggering are different permissions, even when they sit behind one API.

A support agent might read a customer's order and draft a refund request. It should not send the refund, alter the customer's loyalty balance, and email the customer without a separate approval step. That is not bureaucracy. It is blast-radius control.

Build a read boundary the agent cannot casually cross

Read access feels harmless because it doesn't change anything. In practice, broad read access can expose private information, create bad decisions, and give prompt injection more material to work with.

An agent that can search every internal document may find an old pricing sheet, a private employee note, or a draft legal opinion, then use that content as if it were current policy. The retrieval system did its job. The product gave it too much to retrieve.

The better approach is to define read access around the user, task, and moment. Use the authenticated user's identity, tenant, role, and current workflow state before the model sees any context.

For example, a travel support agent might be allowed to read:

  • The active traveler's itinerary and booking status
  • The policy documents assigned to that market and booking type
  • The current support conversation
  • Public destination information from an approved source

It should not automatically read every traveler profile, internal incident report, employee directory, or payment credential. The agent does not become safer because the system prompt says "use private information responsibly." It becomes safer when the retrieval layer cannot return information outside its scope.

Postgres with row-level security can enforce tenant and user boundaries close to the data. An identity provider can pass user and role claims into the request. A retrieval service can filter documents by tenant, purpose, and freshness before sending passages to the model.

That architecture is less exciting than adding another agent. It is also where trust is built.

What read access should include

For each data source, define:

  • The exact fields the agent can see
  • The identity and role required to see them
  • The tenant or account boundary
  • The retention and masking rules
  • The source date and freshness requirement
  • The audit event recorded when the data is retrieved

Mask sensitive values before they reach the model. A support agent may need the last four digits of a payment method, not the full number. It may need a shipping city, not a complete address. Least privilege is not about making the agent ignorant. It is about giving it enough information to do the current job and no more.

Read permissions shape the agent's behavior just as much as the prompt does. If the system exposes every possible document, the model has to decide what matters while also deciding what is allowed. That is a poor division of labor.

Writing is where a helpful agent becomes a risky one

Writing changes the world, even when the change looks small. A note added to a CRM can affect a future sales call. A modified status can alter a billing workflow. A generated configuration file can pass through automation and reach production before anyone reads it.

This is why LLM tool permissions need more than a yes-or-no switch. You need scope, validation, and a clear distinction between drafting and committing.

When I ship an agent feature, I usually split write actions into stages:

  • Generate a proposed change
  • Validate the change against business rules
  • Show the affected fields and reason
  • Ask for approval when the impact crosses a threshold
  • Commit the change with an audit record

The model can help with the proposal. It should not be the only component deciding whether the proposal is valid.

Suppose an agent handles support tickets. Let it draft a response in the ticketing system. Let it classify the issue. Let it suggest a refund amount based on policy. But put stricter controls around these actions:

  • Changing a customer's subscription plan
  • Issuing money or credit
  • Closing a legal or compliance case
  • Editing account ownership
  • Deleting a record
  • Sending an external message with a commitment

You can encode some limits in the tool itself. A refund tool might accept only a ticket ID and a proposed amount, then reject amounts above a policy threshold. A CRM tool might permit draft notes but reject writes to protected fields. A deployment tool might require a signed approval token that the model cannot create.

This matters because an agent can be wrong in ordinary ways. It can misunderstand "refund the duplicate charge." It can confuse a draft invoice with a paid one. It can interpret an angry customer's request as authorization to cancel an account. If you've ever watched a demo fall apart on the third question, you already know how fast this goes sideways.

The teams I've worked with sometimes want the agent to "just handle the whole workflow." I understand that impulse. Manual handoffs are slow and frustrating. But a workflow is not one action. It is a chain of decisions, and each decision has a different cost if it goes wrong.

Use approval gates based on impact

Do not ask for human approval on every harmless step. People will click through the prompts, and the gate will become decoration. Reserve approval for actions with a meaningful blast radius.

An approval gate usually belongs on actions that:

  • Move money or create a financial obligation
  • Communicate externally on behalf of a person or company
  • Change permissions, identity, or account ownership
  • Delete information or make a hard-to-reverse change
  • Start a workflow that affects many records

A good approval screen answers three questions without making the reviewer inspect a raw JSON payload:

  • What will change?
  • Why does the agent think this is correct?
  • What happens if the change is approved?

That last question is easy to skip. Do not skip it.

Trigger permissions determine the blast radius

Writing to one record and triggering a workflow across 50,000 records are not the same permission. Yet many agent frameworks treat them as adjacent tool calls with similar controls.

A trigger permission should describe scope and limits. "Can run the customer sync" is too broad. "Can start a sync for the current account, up to 100 records, during business hours, with a dry-run preview" is much closer to something you can trust.

This is where agentic AI governance becomes practical instead of abstract. Governance is not a policy document sitting in a folder. It is the set of controls that decide whether an action can run, who approved it, what it touched, and how you stop it.

Create limits for:

  • Number of records affected per run
  • Dollar value moved per action and per day
  • Number of tool calls in one task
  • Retry count and time window
  • Allowed operating hours
  • Permitted environments, such as staging but not production
  • Required approval roles

The retry limit deserves special attention. A tool call that fails can become a loop, the model tries again with a slightly different argument, then again, while your system pays for every call and the downstream service receives repeated requests.

Use idempotency keys for actions that may be retried. Set timeouts. Return structured errors that tell the agent whether to stop, ask for help, or correct an input. Instrument every tool call with the user, agent task, resource, result, latency, and cost.

I call this boundary the Guardrail Surface. It is the part of the system where intent becomes action. It includes identity checks, policy checks, validation, approval, rate limits, logging, and the emergency stop. The model is only one component inside that surface.

Give the agent a safe failure mode

An agent needs a useful way to stop. "I can't do that" is not enough when the user still needs help.

A good failure response says what happened, what remains undone, and what the user can do next. Something like: "I found two matching charges, but I cannot issue the refund without approval. I prepared the request for $48.20 and left it in the ticket."

That response preserves momentum without pretending the action happened.

Build a kill switch that operates outside the model and outside the agent's own tool set. If an integration begins sending malformed requests, you need to disable that tool without waiting for a new prompt, deployment, or model response.

And test the stop path. Teams test the happy path because it feels productive. The stop path is where production tells the truth.

A permission review you can run this week

You do not need a large governance program to improve an agent's access control. Start with one workflow and document the boundary in plain language.

Ask these questions:

  • Who is the user, and how is their identity passed to the agent?
  • What is the smallest data set needed for this task?
  • Which tools can the agent call without approval?
  • Which writes are drafts, and which writes are commits?
  • What is the maximum number of records one run can affect?
  • What happens when the tool times out or returns an ambiguous result?
  • Where does the audit record live?
  • Who can disable the tool?
  • Can a reviewer understand the proposed action in under a minute?

Then run five test cases that resemble real failure, not just clean demos:

  • A user asks for data belonging to another account
  • A retrieved document tells the agent to ignore its system rules
  • A tool returns a partial success
  • The same request is submitted twice
  • A user asks the agent to make a high-impact change without approval

Record the result. Fix the boundary, not only the wording of the prompt.

The deeper lesson is this: the default startup advice is to ship the agent quickly and tighten security later. For agentic products, that creates a bad dependency. Once users trust a broad workflow, narrowing it feels like a regression. Set the permission model before adoption makes the unsafe behavior feel normal.

What I'm telling you is not to slow every team down with paperwork. It is to spend the early design time on the controls that are expensive to retrofit. An agent with narrow permissions can earn more authority as it proves itself. An agent with broad permissions has to be taken away from users after something goes wrong.

FAQ

What are AI agent permissions?

AI agent permissions define what an agent can read, write, and trigger on behalf of a user or system. They should specify the data scope, allowed tools, record limits, approval requirements, and audit events for each workflow.

How is agent access control different from a system prompt?

A system prompt describes expected behavior, while access control enforces what the agent can actually do. Prompts can be misunderstood or manipulated; database rules, identity checks, tool validation, and approval gates provide enforceable boundaries.

Which AI agent actions should require human approval?

Require approval for actions that move money, send binding external messages, change permissions or ownership, delete information, or affect many records. Low-risk drafts and read-only lookups can usually run without approval when their scope is limited.

How do I secure LLM tool permissions?

Give each tool the smallest input and authority it needs, validate arguments outside the model, use rate and scope limits, log every call, add idempotency protection, and maintain an emergency disable switch. Test partial failures and repeated requests before launch.

Start with the agent that already worries you a little. Write down every read, write, and trigger it can perform. Then remove one permission it does not truly need.

That small act is not a lack of confidence in AI. It is how you give the system room to earn trust. The model is not the permission model. The system around the model is what makes useful autonomy safe enough to keep.

0 comments

Join the conversation

Subscribe to comment

Join Curtis Foster's newsletter to leave a comment and get new posts in your inbox.

Read next

Hero image for blog post: The AI production readiness review: 12 questions I ask before launch

The AI production readiness review: 12 questions I ask before launch

Oct 31, 2026
Hero image for blog post: How to design human handoffs for AI agents that cannot finish the job

How to design human handoffs for AI agents that cannot finish the job

Oct 23, 2026
Hero image for blog post: Streaming, queues, and background jobs: choosing the right runtime for AI workflows

Streaming, queues, and background jobs: choosing the right runtime for AI workflows

Oct 14, 2026
AI agent permissions: a practical access model