The useful part, up front

What you’ll take away

  • A model can propose a tool action without having authority to execute it.
  • Valid arguments and an existing object do not establish the caller’s permission.
  • Keep trusted identity and server resource metadata separate from model-generated fields.
  • Intended service, operation scope and exact object grants answer different questions.
  • Reevaluate current permission and distinguish it from any separate confirmation or decision log.
01

A tool call asks for an action; it does not grant the action

Mina asks a fictional assistant to summarize draft H-7 in her Harbor workspace. The assistant proposes reading that draft. Before any content is returned, the document service needs to answer a separate question: may this caller perform this action on this particular document? The fact that the assistant selected a plausible tool does not settle that question.

For our example, the trusted service records give Mina one active grant: read H-7. Draft H-8 also belongs to Harbor, while draft R-7 belongs to another workspace, Ridge. Mina has no grant to either of those drafts and no grant to rename H-7. We will evaluate requests against these invented records. No real document, user account, credential, model or external service is involved.

OWASP distinguishes authentication, which establishes identity, from authorization, which checks permitted actions. [1] Its 2025 Excessive Agency guidance also places authorization in the systems executing tool actions rather than leaving that decision to the language model. [5] This gives us a concrete way to read an agent's capabilities: separate what it can propose, what the interface can represent and what the receiving service actually permits for the current request.

Valid input does not imply a matching grant. Original registry: H-7 and H-8 belong to Harbor; R-7 belongs to Ridge. Mina has only the read H-7 grant. These are invented resources.
Original registry: H-7 and H-8 belong to Harbor; R-7 belongs to Ridge. Mina has only the read H-7 grant. These are invented resources. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
02

A well-formed request can name a document the caller cannot read

Our toy request has exactly three fields: action, objectId and workspace. Each must contain text. The recognized actions are read and rename; the workspace labels are Harbor and Ridge. An object identifier must use the declared H- or R- prefix followed by digits, with a maximum length of twenty characters. These are our example's input rules, not a recommended universal identifier format.

A request to read H-8 in Harbor satisfies those rules. The identifier has the expected shape and names an existing document. Yet Mina has no grant to read it. The input check answers whether the request can be interpreted under the declared format. The permission check answers whether Mina may carry out that interpreted operation. OWASP's input-validation guidance explicitly keeps authorization separate from a valid identifier. [2]

The same distinction applies when an interface asks a model for structured arguments. A successful schema check can prevent malformed or unexpected fields without proving ownership or permission. In this example, adding an extra role field is itself invalid because the allowed field set is exact. Removing that field would make the remaining shape acceptable only if the other rules pass; it would still not create a missing document grant.

03

Use the verified caller, not a caller identity supplied by the model

The assistant's request can say which document it wants. It cannot establish who Mina is by putting a name into the request body. In our construction, the trusted caller and workspace arrive through a separate service context. That context is an assumption of the example, not a Boolean value that a real client is allowed to declare for itself.

Imagine that the request includes the extra text role: admin. Our input rules reject the unexpected field. More fundamentally, the text does not alter Mina's grants. The same is true if an assistant confidently explains that it has administrator access. Authorization depends on the records and controls the service trusts, rather than on how convincing a request or explanation sounds.

OWASP's guidance places access checks on the server or another enforcing service boundary and discusses deriving context from securely established identity and attributes. [1] In a real application, that includes correctly validating whichever session or credential mechanism it uses. Our example assumes those controls provide a valid caller, then keeps that identity separate from model-generated arguments. It cannot prove that a real login flow or token verifier has been implemented correctly.

04

A workspace match still does not grant access to every object

There are two different reasons to refuse the neighboring documents in our example. Reading H-8 remains inside Harbor, but Mina lacks the exact document grant. Reading R-7 also crosses into Ridge, which does not match the trusted Harbor context. The service resolves each document's workspace from its own resource record; it does not accept the request's workspace label as proof of ownership.

Suppose a request names R-7 while still saying workspace: Harbor. The strings are well formed, but the server's R-7 record says Ridge. That disagreement prevents the request from passing our workspace condition. Conversely, a request for H-7 that wrongly names Ridge also fails that condition even though Mina's read grant for H-7 exists. All the required relationships must agree.

OWASP calls for checks on the specific object and operation rather than assuming access to every object of a type. [1] Our explicit three-document registry makes that principle visible. Changing an identifier does not change who owns the resource, and membership in a workspace does not automatically create every possible document permission. Real applications may have sharing or cross-workspace policies, but those would need declared rules beyond this deliberately narrow example.

All five conditions belong to the declared policy. Original logical model: P = V AND C AND A AND T AND G. Credential/audience results are stipulated, not implemented. Passing is not proof of production security.
Original logical model: P = V AND C AND A AND T AND G. Credential/audience results are stipulated, not implemented. Passing is not proof of production security. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
05

Five separate conditions make the logical decision inspectable

We can now describe the small policy using five yes-or-no questions. V asks whether the request shape is valid. C asks whether the separately checked caller credential is valid. A asks whether the credential is intended for this service. T asks whether the requested, trusted and resource workspaces agree. G asks whether the current exact caller-action-document grant exists.

In this teaching model, the request passes only when all five answers are yes. Read H-7 with the stated valid context passes. Read H-8 fails G. A credential intended for a different service fails A, even if the document and grant otherwise match. An unexpected role field fails V. The checks identify different missing conditions rather than treating every refusal as malformed text.

Five Boolean conditions have 32 possible combinations, and just one has all five true. That count is a property of the chosen logical expression. It is not a measured attack-blocking rate, and it does not mean a real system is secure in 31 out of 32 situations. Some abstract combinations may not occur in a real authentication flow. Passing our small policy also leaves many implementation questions outside the example, including whether trusted inputs were established correctly.

06

Permission for one service is not automatically permission for another

Suppose a credential carries permission described as read, but it was issued for a calendar service. The document service cannot infer that the same word also grants access to H-7. The intended recipient and the permitted kind of access are different parts of the decision. In our fictional cases, changing only the intended-service result from yes to no makes A fail.

RFC 8707 explains this distinction through resource indicators and OAuth scopes. A resource indicator identifies where the requested token will be used; a scope typically describes what access is requested. The authorization server applies policy when deciding what to issue. [3] Merely requesting a resource or scope does not establish that the request was granted, and a broad reading scope still needs the application's object-access rules.

The inspected MCP authorization specification, dated 2025-11-25, provides a concrete HTTP-based example: the receiving server checks that a token was intended for it, and a server calling an upstream API uses a separate token for that API rather than passing the incoming token through. [4] We are explaining those boundaries, not issuing tokens or supplying a complete OAuth setup. The flow is not presented as a rule for every MCP transport.

Where, what and which object are separate questions. Conceptual distinction drawn from OAuth resource indicators and application authorization. No token is issued or parsed by the worked example.
Conceptual distinction drawn from OAuth resource indicators and application authorization. No token is issued or parsed by the worked example. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
07

A smaller tool menu helps, but the service still has to enforce permission

An assistant built only to summarize documents can be given a reading tool without a rename or delete tool. That keeps unnecessary operations out of its normal choices. OWASP's Excessive Agency guidance distinguishes limiting available functions from limiting the permissions used by those functions. [5] Both matter because a narrow-looking menu and a powerful underlying connection are different things.

Our teaching service recognizes read and rename so that the difference is easy to inspect. Mina's stored permission allows only reading H-7. A rename request is therefore understandable but unauthorized. Hiding rename from the assistant's menu would reduce the actions it is invited to propose; the same request must still be refused if it reaches the enforcing service through another path.

The opposite mismatch is also possible in a design: a tool named read_document might run through an account with far broader access than the task needs. A friendly name does not narrow that account's rights. Keep the tool's implemented operation, the caller's resource scope and the downstream connection's permissions aligned. Our example illustrates why those layers need to agree; it does not inspect any real plugin's implementation or claim that its name proves its behavior.

08

A document can describe authority without creating authority

After an authorized read, an assistant may encounter a draft containing a label such as “administrator approved”. That phrase is part of the document's content. It does not add a rename grant to Mina's service record. A document may discuss permissions, describe a workflow or contain mistaken instructions; the receiving service still evaluates the next requested action using its trusted context and policy.

In our construction, reading H-7 does not expand the set containing Mina's one grant. If the assistant subsequently proposes renaming H-7, G remains false. The model can change its proposed operation after reading text, but the text cannot change the server's stored permission relation merely by being included in the model's context.

OWASP's 2025 guidance discusses unexpected or manipulated model outputs and calls for downstream authorization. [5] That separation helps contain an out-of-scope proposal, but it is not a claim that all content-related risks disappear. Authorized reading can still expose information to the system that receives the result. A real application's data-handling design therefore matters alongside its action checks. Our example proves only that document wording is not an input that updates its declared grant set.

09

A previous success does not make the next request permanently valid

At policy state v7, Mina's read grant for H-7 exists, so the original request passes all five conditions. Now suppose the trusted policy removes that grant and state v8 has taken effect before the next request is checked. The caller, document, request shape and intended service remain the same. G changes to no, and the repeated request fails.

This is an original state-change example, not a measurement of how quickly a real service revokes access. A distributed application may have caches, delayed updates or work already in progress. Those details determine when a policy change takes effect and need their own design. Our example assumes the new state is already available at the second decision; it does not solve that timing problem.

OWASP recommends checking permissions on every request. [1] That means the first successful call is evidence of an earlier decision, not a permanent substitute for later decisions. It also does not erase content that was legitimately returned before the change. A cached document response and a current permission decision serve different purposes. Reusing the former must not silently bypass the latter under a policy that requires current authorization.

The same request changes result when the grant changes. Original two-state example. The new policy is assumed effective before the second decision; no distributed revocation speed or deletion of earlier copies is claimed.
Original two-state example. The new policy is assumed effective before the second decision; no distributed revocation speed or deletion of earlier copies is claimed. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
10

Confirmation and permission answer different questions

Some applications require a person to confirm selected actions before they happen. OWASP's 2025 guidance describes that control for high-impact operations. [5] Confirmation can help establish that an intended action matches the person's choice, but it is different from checking whether the service permits that caller to perform the action at all.

In our stored-grant example, Mina has permission to read H-7 and has asked for its summary. That authorized reading does not need an extra confirmation invented by this example. A separate rename request still lacks the required grant. If a workflow records confirmation for an operation, the confirmation needs a clear target and proposed change; an approval associated with one draft or change should not silently be transferred to another.

A real application may have an authorized process that updates permissions after user consent. If so, that policy change must actually occur through the intended control; it is not implied by arbitrary text in a tool response. Keep the service grant, the user's task scope and any operation-specific confirmation distinct. Our example demonstrates that distinction without implementing a consent system or prescribing the same approval experience for every application.

11

Record the decision without turning the log into another data leak

A useful review record can explain why read H-8 failed even though its format was valid. For our example, it would identify the request, trusted caller, requested operation, resolved resource, policy state and the failed grant condition. That is more informative than a generic note that the agent made a mistake. It separates an input problem from an access problem.

Keep detailed records available only to the people or systems allowed to inspect them. An error shown to a client need not reveal the contents or existence of an inaccessible document. OWASP warns against exposing sensitive debug information and against logging too much data; its input-validation guidance specifically discourages copying secrets or entire rejected request bodies into logs. [1][2] Credentials and full document text are not needed to explain our fictional policy decisions.

The review should also preserve the limits of its evidence. We have checked ten constructed requests and all 32 assignments of a simplified five-condition expression. We have not audited a deployed agent, authenticated a real user or tested every route in an application. The useful result is a sharper question to ask of a tool integration: where is the exact action-resource permission enforced, using whose trusted identity and which current policy?

Keep permission, confirmation and evidence distinct. Reasoned reading framework for the fictional policy. No deployed service, credential verifier or complete security control was tested.
Reasoned reading framework for the fictional policy. No deployed service, credential verifier or complete security control was tested. · Ameer Journal — original explanatory diagramOriginal editorial illustration; no third-party artwork reused.
Follow the evidence

Sources & further reading

Explore the references behind this guide. External pages may change after our review.

  1. Authorization - OWASP Cheat Sheet Series
    OWASP · Accessed 7 Nov 2026
  2. Input Validation - OWASP Cheat Sheet Series
    OWASP · Accessed 7 Nov 2026
  3. RFC 8707: Resource Indicators for OAuth 2.0
    IETF / RFC Editor · Accessed 7 Nov 2026
  4. MCP authorization specification, 2025-11-25
    Model Context Protocol maintainers · Accessed 7 Nov 2026
  5. LLM06:2025 Excessive Agency - OWASP Gen AI Security Project
    OWASP Gen AI Security Project · Accessed 7 Nov 2026

Article updated 7 Nov 2026.

Found something we should revisit?

Good explanations get better with thoughtful feedback.

Suggest a correction