Evaluating MCP Server RBAC Claims Against Real Authorization Enforcement Boundaries
Enforce authorization on every request, not just at connection time.

An MCP gateway with OAuth and tool-level RBAC is the architectural pattern for securing enterprise agents, provided it evaluates permissions on every request and denies access by default. Authentication establishes identity, but only runtime authorization permits or denies that identity’s call to a particular tool.
Why MCP RBAC claims cannot be taken at face value
The MCP specification makes authorization explicitly “OPTIONAL” and limits its authorization provisions to HTTP-based transport. A server can therefore comply fully with the protocol without implementing authorization at all. Compliance is not an access-control guarantee. The specification also provides no interoperable mechanism for exchanging role-based permissions across deployments, so a server’s local access rules do not automatically extend beyond its own implementation.
The U.S. National Security Agency documented this gap, finding that MCP “currently lacks support for exchanging Role Based Access Control (RBAC) permissions at instantiation.” That is a structural limitation. It means enterprise teams must evaluate what each server and its surrounding infrastructure enforce. An RBAC claim may describe local role mapping, permissions attached to a token, or a policy evaluated when a tool is called.
The three distinct enforcement layers that RBAC claims can mean — and how they fail differently
Authentication answers who is making a request, while authorization answers what that identity may do. Checking a token’s validity addresses the first question. A server that then executes anything the token holder requests has not answered the second. The badge opens the building, with access to the server room a separate question. This distinction becomes especially important with agents because a valid token may be used while acting on instructions from a user, a tool response, or a fetched document, any of which can redirect the next action.
Beyond authentication, RBAC claims commonly blur three layers, namely OAuth scopes, server-side role mapping, and runtime policy evaluation. Scopes establish the token’s outer permission boundary at issuance, while role mapping associates permissions with users or agents. Runtime evaluation checks those roles against the policy in effect when a tool is called. These layers fail in different ways. A scope can be too broad, a local role map can be inconsistent with another server’s rules, and a policy checked only at connection time can miss a later role change. Resource-level restrictions and contextual conditions add distinctions that a simple “RBAC supported” label does not explain.
Tool-level enforcement is where these distinctions become concrete. A CRM server may expose both lookup_customer and delete_customer, with the same credential permitting both under a server-level grant. MCP leaves implementers responsible for defining tool-specific scope conventions that separate a routine lookup from a destructive operation. Without that separation, prompt injection can steer an agent toward a dangerous tool that is there because another workflow needed it, agents that serve customers can reach internal tools, and a leaked credential can give access to every tool.
A server may use a credential with broad permissions without checking whether the agent making the request should have access to the data. The agent cannot reliably police this arrangement because it is the component being misled. If identity, scope, and runtime policy fail differently, what does a structured audit of each one look like?
What real-world deployments reveal about where claimed controls break down
The NSA documented a production case involving the GitHub MCP server in which blanket access let MCP tools act on a user’s behalf across private and public repositories. Permissions were not restricted to specific repositories or operations. Compromised tools could read private repository content and publish it to public repositories without the user’s explicit awareness. The credential worked, but the boundary was too broad.
OX Security disclosed a large number of vulnerable, internet-reachable MCP instances in April 2026, spanning IDE plug-ins, internal tooling, and cloud services. The exposure was not confined to one deployment type. Meanwhile, enterprise identity platforms have added support for agents to their own frameworks. Okta for AI Agents reached general availability on April 30, 2026, and Microsoft Entra Agent ID reached general availability in April 2026.
The two approaches are not interoperable out of the box, and the IETF has not finished standardizing the underlying protocol. Enterprises that connect both therefore depend on systems that are still partly proprietary. This shows that the protocol-level gap also exists at the identity-platform boundary, where an audit must establish how permissions translate.
Permission drift complicates that translation over time. Users may change roles while their agents keep access they no longer need. Shared service accounts also make attribution harder because logs identify only the account used for the request. When activity records are scattered across agents, servers, SDKs, and APIs, tracing an anomalous action back to its source becomes difficult. An audit must therefore examine identity continuity as well as the initial permission grant.
A structured framework for stress-testing an MCP server's RBAC claims
The audit must first locate the authorization decision. Inside the agent is unreliable because prompt injection or a changed tool description can mislead it. Server-side enforcement is better, but remains siloed and cannot by itself maintain consistent roles across servers. An independent control plane before the server separates authorization from the components whose behavior it governs. To test that separation, the vendor question is direct. “If I send a request that exceeds the role's permissions directly to the MCP server, bypassing your client, does the server reject it?” A client-side restriction is not a server-side boundary.
Once it is clear where the decision is made, the second question asks how much access it allows. Server-level grants give access to everything the server offers, while broad OAuth scopes set only an outer boundary. Least privilege requires named tool permissions. The allow-list must apply during discovery to keep forbidden tools out of the model’s context, and again during execution to stop a misbehaving client from calling them anyway. The concrete test is whether an agent permitted to use lookup_customer can invoke delete_customer on the same server, and exactly where a denial is generated. Hiding a tool is not the same as blocking it.
Granularity alone does not establish when permissions take effect. Third, the audit checks whether authorization happens only at connection time or on each request against the live identity of the person or agent asking. A startup check can miss role changes that happen later. The Enterprise-Managed Authorization (EMA) extension became an official extension in the July 28, 2026 MCP revision and formalizes runtime, per-request authorization, with adoption by Anthropic, Microsoft, and Okta. The audit test is to revoke a user’s role in the identity provider and immediately attempt a tool call. Whether it is rejected, and how quickly, reveals the gap between policy changes and enforcement.
Fail-open behavior, which permits requests when a check is unavailable, is disqualifying for production enterprise use. Fail-closed behavior denies access unless permission is explicitly granted, including when a credential has no configured tool permissions. Teams should ask what the server returns when the policy engine is unavailable and whether that behavior is documented and testable.
An MCP gateway sits between agents and one or more MCP servers as a specialized reverse proxy, handling authentication, routing, policy enforcement, credential management, and observability. This makes it the natural independent decision point for a multi-agent deployment. Central placement alone is not enough, however. The March 2026 MCP roadmap identified gateway and proxy patterns as an enterprise-readiness gap, while the updated August 2026 roadmap did not list them as a named priority. Most of the work is still in extensions and interest groups outside the core protocol, so a gateway still needs the same enforcement tests regardless of its label.
An enterprise adding OAuth authentication should connect the gateway to the identity providers it already has instead of replacing them with a proprietary credential store. Integration with Okta, Entra ID, or SAML/OIDC should let identity-provider role changes propagate without manual synchronization. Passthrough authentication preserves the user’s own OAuth or SAML identity at request time. Each request can then run under that person’s permissions and remain attributable to that individual. The identity does not stop at the front door. Enforcing this pattern at the gateway also removes the need for custom authentication logic in every downstream server.
A gateway that can be trusted must use that identity path along with tool allow-lists at discovery and execution, deny-by-default behavior, and records of each request tied to a named identity. A product offering only server-level grants has centralized broad permissions. Real-time prompt-injection detection and in-flight content inspection are also needed because even a call with the right authorization can contain a poisoned tool description or response. Credential controls govern access at rest, call-time policy governs permission to act, and content inspection examines what passes through. None substitutes for the others.
Snowflake’s Cortex AI Gateway, announced at Black Hat 2026 and built on Natoma, illustrates this centralized pattern at enterprise scale. It enforces identity, policy, and audit at the tool-call level, with support for 100+ MCP servers and automatic discovery and monitoring of shadow AI and MCPs. It was in private preview at launch. That status and those capabilities provide a concrete comparison point for evaluating deployments against the four audit questions. OWASP’s guidance backs this approach because it lists excessive agency among the top risks for LLM applications and advises keeping authorization in external systems.
Audit logging and observability requirements that make RBAC enforcement verifiable
An enforcement test needs a record that can confirm its result. Standard application logging is structurally insufficient because an HTTP envelope does not capture the prompts, tool arguments, and tool responses needed to reconstruct an MCP invocation. The audit record must identify the actual user or agent, the tool called, its arguments, and what the server returned. It must also show whether access was permitted or denied and which policy rule produced that decision. Tamper-evident, per-invocation records turn operational traces into evidence of what a specific role could do at a specific time.
Seeing this content brings its own compliance risk because production prompts often contain PII, financial data, and health information. The practical recommendation is to detect PII at collection, before prompt content reaches storage. Redaction or hashing should happen in the telemetry pipeline instead of the application, so the enforcement record is kept without putting data at risk in the log store. More logging is not automatically better logging. Much of the infrastructure needed to meet the EU AI Act’s logging and human oversight requirements and DORA’s ICT risk requirements is also covered by the filtering gateway, structured invocation records, and per-server isolation described by the NSA.
The ShadowLeak case shows why performance metrics cannot substitute for this evidence. Latency, error rate, and token usage appeared normal while data exfiltration was occurring. Only full prompt and response logging, with anomaly detection applied to content, would have surfaced the incident. Teams that answer all four enforcement questions but keep no per-invocation audit trail cannot check those answers afterward. An MCP server’s RBAC claim becomes credible only when the boundary can be tested and the resulting decision can be proved.


