[ARCHITECTURE & CONCEPTS]
[
1/29/26
]
Why A2A, MCP and Every Agent Protocol Has the Same Security Blind Spot
[Author]:
Amjad Fatmi
MCP is having a moment. So is A2A. So is every new agent communication protocol that has shipped in the last twelve months. They solve real problems: how agents discover tools, how they communicate with each other, how they pass context across system boundaries. The ecosystem is genuinely better for having them.
They all share the same blind spot. And none of them are designed to fix it.
What protocols actually do
A protocol defines how two systems communicate. It specifies message format, authentication, transport, and the rules for what a valid message looks like. When a message arrives at its destination and passes all the protocol checks, the protocol's job is done.
That last sentence is the one worth sitting with.
The protocol's job ends at message acceptance. What happens next whether the action the message describes should actually execute, under what conditions, with what authorization is outside the protocol's scope. By design. That is not a criticism of the protocol. It is a description of what protocols are for.
MCP does this. A2A does this. OpenAI's function calling protocol does this. Every agent protocol does this, because it is the correct thing for a protocol to do. Protocols define communication contracts, not authorization contracts.
The problem is that most teams treat message acceptance as authorization. If the message arrived and passed protocol validation, the tool runs. Those two things are not the same.
The MCP case specifically
MCP has gotten significant adoption because it solves a genuine pain point: connecting AI models to tools and data sources in a standardized way. You implement an MCP server, expose your tools, and any MCP-compatible client can discover and use them.
The security model MCP provides is real. Transport-level security, server authentication, tool schema validation. An MCP client can verify it is talking to the right server. A server can verify the client is who it claims to be.
What MCP does not provide is action-instance authorization. It cannot, by design. Here is why.
MCP's authorization model answers: is this client permitted to use this server's tools? That is an identity question. It is answered at connection time or request time based on who the client is.
The question it does not answer: should this specific tool call, with these specific parameters, execute right now? That is an action question. It requires evaluating the proposed action against a policy, against the current state of the system, against the context in which the request is arriving. It requires a decision that is specific to this action instance, not to the client's identity class.
This is not a bug in MCP. It is a scope boundary. Protocols define how systems talk. Authorization defines what systems are allowed to do. These are different layers and conflating them would make protocols worse, not better.
The gap is that the authorization layer after the protocol layer often does not exist.
Why this matters more as protocols succeed
Here is the dynamic that makes this urgent right now.
When MCP was new, most MCP servers were internal tools with limited blast radius. The tools were read-heavy, the agents were narrow, and the operational surface was small. The absence of an action authorization layer was tolerable because the consequences of any single action were bounded.
MCP's success changes that. As more production systems expose MCP endpoints, as agents become more autonomous, as multi-agent workflows chain actions across multiple MCP servers, the blast radius of any single unauthorized action grows. The more connected the system, the more consequential the gap.
The same dynamic applies to A2A. Agent-to-agent communication is valuable precisely because it enables agents to delegate to each other, to orchestrate complex tasks, to operate without continuous human involvement. All of those properties that make A2A powerful also make the authorization gap more dangerous. One agent convincing another to take an action that policy would deny, passing through a protocol that never asked the question.
Each hop authenticated correctly. Each hop accepted the message. The protocol did its job at every step. And at no step did any system ask whether the proposed action should execute.
What happens when prompt injection meets a protocol
Prompt injection is the attack class where malicious instructions embedded in content the agent processes convince the agent to take actions the user did not intend. It is already a documented, demonstrated attack against production agent systems.
Here is what it looks like when it meets an MCP-connected agent with no action authorization layer.
The attack succeeded not because the protocol failed. The protocol worked. The attack succeeded because protocol acceptance was treated as authorization. The question "should this execute?" was never asked.
An action authorization layer would have caught this. Not at the protocol level. After the protocol level, before execution. The proposed action. HTTP POST to an external endpoint not on any allowlist, hits the authorization boundary. Policy evaluates it. The action does not match any permitted pattern. Default deny. Execution blocked.
The protocol layer and the authorization layer are not competing
This is worth stating clearly because it is easy to read this post as a criticism of MCP or A2A. It is not.
Protocols should not try to solve action authorization. If MCP tried to embed action policy evaluation into the protocol spec, it would become a worse protocol. Policy is tenant-specific, environment-specific, time-sensitive, and context-dependent. None of those properties belong in a communication protocol.
The right model is two distinct layers with a clean interface between them.
MCP handles the first layer well. The second layer is missing in almost every MCP deployment today. Not because MCP failed to provide it. Because nobody built it yet.
What the authorization layer needs to handle MCP correctly
An authorization layer that works with MCP has to solve one specific problem that makes MCP different from single-agent deployments: MCP actions arrive from a protocol with their own format, and that format needs to be normalized into a canonical action representation before policy can evaluate it.
A shell command arriving from a LangChain agent and a tool call arriving via MCP and a function call arriving via the OpenAI protocol can all represent semantically identical actions in completely different wire formats. Any authorization layer that evaluates based on wire format rather than canonical semantic content is bypassable by changing the format.
This normalization is why canonicalization is a prerequisite for any meaningful authorization layer, not an implementation detail. Without it, authorization is protocol-specific and therefore bypassable by switching protocols.
Faramesh normalizes every action into its Canonical Action Representation before policy evaluation, regardless of which framework or protocol delivered the action. MCP tool calls, A2A delegations, direct SDK calls, and OpenClaw hooks all hit the same authorization boundary and produce the same type of decision record.
What changes when you add the authorization layer
For teams using MCP in production today, adding an authorization layer means three things change.
First, every tool call becomes individually authorized. Not "this client is permitted to use this server's tools" but "this specific call, with these specific parameters, is permitted under the current policy." The granularity changes from identity-class to action-instance.
Second, every decision becomes auditable. Not "MCP server received a request and responded" but "action A was evaluated against policy P at time T, state S was considered, decision was PERMIT, record is in the chain." Forensically replayable. Tamper-evident.
Third, the default flips. Today, if no rule matches an MCP tool call, the tool runs. With a fail-closed authorization layer, if no rule matches, the tool does not run. The burden shifts from denying bad actions to permitting good ones. That shift is the entire security posture change.
The ecosystem is building fast. The authorization layer needs to keep up.
MCP servers are being published for every major SaaS platform. Agents are gaining access to more systems, more data, and more operational surfaces every week. A2A is enabling agent-to-agent delegation that multiplies the autonomy of any individual agent.
All of that is progress. It is also an expanding attack surface. Every new MCP server is a new set of tools that an agent can be convinced to misuse. Every A2A delegation path is a new route through which a compromised agent can affect systems beyond its immediate scope.
The protocol layer is maturing fast. The authorization layer is almost entirely absent. That gap closes through protocols improving, or through teams adding the authorization layer that protocols were never designed to provide.
