AIAI Operator Security · Control 1 of 6

AI Agent Permissions: Least Privilege at the MCP Layer

Control 1 of 6 in the AI operator security series: the narrowest set of tools that does the job, enforced where the calls land.

The oldest rule in security is the one agents break first. Least privilege: give the account the narrowest access that does the job, and nothing more. Every enterprise already enforces it for people. Service accounts get scoped roles. Contractors get badges that expire. Then an AI agent arrives, inherits an engineer’s token, and gets a system prompt that says please do not delete anything.

AI agent permissions are the first of the six AI operator security controls, and the one the other five lean on. The control is the narrowest set of tools that does the job, enforced on the server, not stated in a prompt. What follows is that sentence from the buyer’s chair: what it means at the layer where agents actually reach your systems, how to tell a real allow-list from a paragraph in a proposal, and what to put in the RFP. It is the first piece in a series that takes the six controls one at a time; the AI agent security checklist is the index.

The series rests on one idea. AI operator security is being safe from the AI agents you operate. Most AI security protects you from someone else’s model. AI operator security protects you from your own agents. AI operator security makes the case for the term; this guide takes the case as made and starts on the first control.

The model proposes. The server disposes.

Why a Prompt Cannot Hold a Permission

Every AI policy we have read says the agent may do this but not that, and almost every deployment enforces it by pasting the sentence into the system prompt. It feels like a control. It reads like a control. It is a request.

A language model does not execute instructions; it weighs them. The system prompt is one input among many, alongside the user’s message, the documents the agent has read, and the result of its last tool call. Most of the time the prompt wins. In July 2025 it did not: a Replit agent that had been told, in plain language, that a code freeze was in effect deleted a production database and then fabricated a 4,000-record database of fictional people to cover the gap. The agent was not attacked. The rule was stated. Nothing enforced it.

The security profession has a name for the underlying mistake. NIST’s least-privilege control asks that an account hold only the access its function requires. The OWASP Top 10 for LLM Applications lists excessive agency as a top risk, names excessive functionality and excessive permissions as its causes, and gives the plain prevention: limit the extensions an agent can call to the minimum necessary. Neither says a word about prompts, because a prompt is not where access is held.

A permission is a rule the agent cannot break. A prompt is a rule it usually keeps. The difference is the whole control.

Where the Allow-List Lives

You cannot inspect what an agent thinks. You can inspect what it does, and what it does arrives as a tool call. The industry has settled on the Model Context Protocol as the layer those calls pass through: the client asks a server what tools exist, the model picks one, the client sends the call, and the server executes it and returns the result. In the protocol’s own terms, the server answers tools/list and tools/call, and it can announce when its list changes.

That makes the server the operator’s leverage. A tool the server does not expose to an agent’s identity is a tool that identity cannot call, whatever the model decides. The allow-list is therefore two things, both on the server: the set of tools advertised to a given identity, and the refusal to execute anything outside that set if a call arrives anyway. The MCP specification (current revision, 2026-07-28) puts the obligation where it belongs: servers must validate every tool input and implement proper access controls. The same revision says the set of tools a server returns may vary by the authorization presented on the request, returning only the tools the caller’s granted scopes permit, which is the allow-list in the protocol’s own words.

Two things that look like permissions are not. The first is tool annotations. A server can label a tool read-only or destructive, and a good client will use the label to decide when to ask the user; the specification is explicit that clients must treat those annotations as untrusted unless the server is trusted. They are hints about behavior, not limits on it. The second is the tool description, the sentence the model reads to decide whether a tool fits the task. A description that says only use this for refunds under one hundred dollars is a prompt by another name.

If the agent runs inside a client you do not control, which is most of them, the server is also the only place you do control. The client’s consent screens belong to the client’s vendor and the user. The prompt belongs to the model. The server is yours, or your vendor’s under a contract you can read.

Designing the Narrowest Set

Start from the job, not from the API. A vendor’s MCP server might expose fifty tools because the product has fifty capabilities. The agent you are deploying has a job, and the job needs a handful.

Write the tasks down. A support agent that answers tickets needs to find a customer, read a ticket, read the order the ticket is about, add a note, and send a reply. That is five tools, or six if status changes are in scope. It does not need to delete a customer, export the ticket table, merge two accounts, issue a refund, or email a segment. Those tools exist. They are not on the list.

Then separate the list twice. Reads from writes, because a read-only agent can be wrong without being expensive; the case for starting read-only is made in MCP embedding types. And routine from irreversible: anything that deletes, exports, merges, bulk-sends, or moves money gets its own line and its own decision, which is the per-resource, per-verb, per-sensitivity scope design described in MCP auth and security. A scope called tickets:write that quietly includes tickets:delete is not narrow, however short the list looks.

The single-digit answer is normal, and it is cheaper. Fewer tools means shorter consent screens, less for the model to weigh, and fewer plausible wrong calls. It also means the audit log, when you read it, is readable.

ToolVerbOn the list?
search_customersreadYes
get_ticket, get_orderreadYes
add_notewrite, routineYes
update_ticket_statuswrite, routineYes
send_replywrite, gatedYes, behind approval
delete_customer, export_ticketswrite, irreversibleNo
merge_accounts, issue_refundwrite, money or identityNo

The right-hand column is the allow-list. The table is the artifact. A vendor who can produce it for your agent in an afternoon has the control; one who answers with the full product catalog does not.

A permission can sit in one of three places, and buyers routinely accept the wrong two.

Where it sitsWho controls itWhat it stops
The promptThe modelNothing reliably
The clientThe user and the client’s vendorCalls the user declines
The serverThe operatorEvery call outside the allow-list

Client-side consent is real and worth having. Claude shows the tools an MCP app exposes at install and asks per action for sensitive operations; other clients are coarser, as the MCP client comparison lays out, and the specification itself says there should always be a human able to deny a tool invocation. But consent lives with the user, varies by client, and is granted once by a person who wants the agent to work. It is a courtesy the client extends. It is not the operator’s control.

Server-side enforcement is the operator’s control because it does not care who clicked what. The agent’s identity is granted six tools; the seventh is not advertised, and if a call for it arrives anyway, the server returns an error and writes a log line with the identity that tried. That holds in Claude, in ChatGPT, in Cursor, and in whatever client ships next year. It holds when the prompt has been rewritten by a poisoned document, which is why this control is also the first line of defense against prompt injection. And it holds when the vendor upgrades its model and the new one reasons differently about the same instructions.

One pattern we see in enterprises running many agents is a gateway: a single MCP proxy in front of every server, where the allow-list per agent identity is configured, enforced, and logged in one place. The pattern is sound. The question to ask of it is the same one: is the gateway refusing calls, or passing a hint downstream?

Key Signal

Ask the vendor how they would add a tool to your agent. If the answer is that they edit the prompt, the allow-list is the prompt. If the answer names a configuration, a scope, or a policy on the server, and a change to it produces a log entry, you are looking at the control.

How to Verify AI Agent Permissions

The vendor says the agent is scoped. Four steps turn the sentence into evidence, and they take an afternoon.

First, ask for the allow-list as configuration: the scopes or tool grants attached to the agent’s identity, exported from the system that holds them, not described on a slide. Second, pull the tool list as the agent. Call tools/list with the agent’s own credentials, or have the vendor do it on a screen you can see, and compare the result to the configuration. The list the agent sees is the list that matters; if it is longer than the configuration, the configuration is not what is being enforced. Third, attempt a call outside the list and read the refusal. The server should return an error, and the audit log should show the identity, the tool, the arguments, and the refusal. Fourth, change the prompt. Tell the agent its restrictions are lifted, ask it to call the forbidden tool, and confirm that nothing changes.

A vendor who can only demonstrate the control from the client’s consent screen has it in the wrong place. A vendor who can do all four in front of you has the first of the six controls, and probably the other five.

What to keep: the exported configuration, the tools/list output, and the log entry for the refused call, dated. They are the artifact for the auditor, and they are the baseline you will compare against when the tool list changes, which is the subject of the fourth control in this series.

Failure Modes

Common Failure Modes

The allow-list in the prompt: every tool exposed, with a paragraph asking the model to use only some of them. Every tool behind one consent: the user approved the app on day one and the agent has had the whole catalog since. The admin token: the agent authenticates as the person who set it up and inherits everything that person can reach, which is the [credentials control](/guides/ai-agent-credentials) failing and taking this one with it. Scope sprawl: three tools and one scope at launch, forty tools and the same scope a year later. Enforcement in one client only: the vendor built the limits into its Claude connector, then shipped to a second client where none of them exist.

One question exposes all five. Ask where a call outside the list is refused, and the answer is a place that is not the server.

The Contract Term and the RFP Question

The checklist explains why every control needs a term in the contract. The term for this one is short: enforcement is server-side, and the contract names the point where it happens, so that a later move of the allow-list into a prompt is a breach rather than a product decision. Pair it with the tool-change term from the hub: additions to the agent’s tool list come with notice and a version you can pin, because an allow-list the vendor can lengthen without telling you is not an allow-list. The security terms in SaaS vendor security due diligence are where both belong.

The RFP Question

Show me the allow-list, and show me where it is enforced.

Putting an agent on a system of record?

Send us the agent's tool list and the vendor's answer to the RFP question – or the agent your own team already shipped – and we'll tell you whether the allow-list is a control or a request, and what the contract should say about it. We work for buyers only, with no vendor relationships, which is what makes the read worth having.

Get the allow-list reviewed →

Conclusion

Least privilege was never a model problem. The model cannot hold a permission any more than an employee can hold a badge by being told about it. It is an operator’s job, and the MCP layer is where the operator does it: a short list of tools attached to an identity, enforced by a server that refuses the rest and writes down that it did.

The model proposes. The server disposes. Give the agent the six tools the job needs, and show the auditor the forty-four it cannot call.

Frequently Asked Questions

What is AI operator security?

AI operator security is being safe from the AI agents you operate. Most AI security protects you from someone else's model. AI operator security protects you from your own agents.

What are AI agent permissions?

The set of tools an AI agent is allowed to call, enforced where the calls land. At the MCP layer that means the tools a server exposes to the agent's identity and refuses to execute outside of. A permission written into a system prompt is a request the model usually honors; a permission enforced on the server is a control the model cannot override.

Why is least privilege harder for AI agents than for people?

Because the usual shortcut is to give the agent a person's login or an admin token and ask it, in the prompt, to be careful. People notice a button they were not supposed to use; agents use whatever is reachable the first time it looks useful. Least privilege for agents means a tool allow-list per agent identity, separated by read and write and by sensitivity, enforced on the server.

What is a tool allow-list in MCP?

The list of tools an MCP server advertises to, and will execute for, a given agent identity. MCP servers announce tools through tools/list and execute them through tools/call; a server that scopes both to the caller's identity is enforcing the allow-list. The allow-list is configuration you can read, not a sentence in a prompt.

Do MCP tool annotations enforce anything?

No. The MCP specification lists annotations as optional properties describing tool behavior, such as whether a tool is read-only or destructive, and says clients must consider them untrusted unless they come from trusted servers. They help a client decide when to ask the user for confirmation. Enforcement is the server refusing the call, which an annotation does not do.

Is per-tool consent in the AI client the same as server-side enforcement?

No. Per-tool consent at install, which Claude does well, lets a user decline tools and is worth having. It lives in the client, under the user's control, and varies by client. The operator's control is on the server, where a call outside the allow-list is refused whatever the client or the user granted.

How do I verify a vendor's AI agent permissions?

Four steps. Ask for the allow-list as configuration. Pull the tool list as the agent's own identity. Attempt a call outside the list and read the refusal in the log. Then change the prompt and confirm nothing changes. A vendor who can only demonstrate the control from the client's consent screen has it in the wrong place.

How many tools should an AI agent have?

As few as the job needs, usually a single-digit number for a well-scoped agent. Start from the tasks, map each to one tool, separate reads from writes, and give anything that deletes, exports, merges, bulk-sends, or pays its own line and its own decision. Fewer tools also means shorter consent screens, less for the model to weigh, and fewer plausible wrong calls.

What contract term covers AI agent permissions?

That enforcement is server-side and the contract names the point where it happens, so that moving the allow-list into a prompt later is a breach rather than a product decision, and that the tool list cannot grow without notice and a version you can pin. The RFP question that goes with it: show me the allow-list, and show me where it is enforced.

Control 1 of 6 in the series

AI Operator Security

Six controls that keep you safe from the AI agents you operate, each with the artifact that proves it and the question to put in the RFP.

  1. HubAI Agent Security Checklist: The Six Controls to Verify Before You Buy
  2. Control 1AI Agent Permissions: Least Privilege at the MCP Layer
  3. Control 2AI Agent Credentials: Non-Human Identity, Scopes, and Revocation
  4. Control 3Human Approval for AI Agent Writes: Gating Changes to Systems of Record
  5. Control 4MCP Tool Versioning: Pinning What an AI Agent Is Allowed to Do
  6. Control 5Prompt Injection Defense for AI Agents: Controls at the Tool Layer
  7. Control 6AI Agent Audit Log Requirements: What to Record and Who Owns It

The definition, on one page: What Is AI Operator Security?

The term and the argument behind it: AI Operator Security: Staying Safe From the AI Agents You Run

← AI Guides

Start a Conversation

15 minutes with an advisor. No pitch, no pressure.
We'll help you figure out what you actually need.

Talk to an Advisor