Skip to content
Research noteNX-2026-0146

Authorisation that survives injection

A gap analysis of six MCP software development kits finds authorisation primitives that assume the agent has not been steered by an attacker.

3 minAI + CyberSec + Crypto

The security problem with tool-using agents can be stated in one sentence: they translate natural language, which may contain attacker-controlled text, into privileged tool calls. Everything else follows from that, including the conclusion that authorisation has to hold even when the agent itself has been successfully steered.

A paper posted this week examines whether the Model Context Protocol — now the widely adopted interface at exactly that boundary — provides what enterprises need. The authors conducted a systematic gap analysis across six official SDKs: Python, TypeScript, Go, Rust, C# and Swift.

They report three structural shortcomings.

  • Credential extraction bound to a single Authorization header, which complicates the dual-persona case — one server serving human users through corporate single sign-on and automated agents through service-account credentials on a different header — without custom middleware.
  • No pre-authentication tool discovery, so a client cannot learn what a server offers before holding credentials for it.
  • No fine-grained per-tool authorisation in the base SDKs, which pushes the decision of which tools a caller may invoke outside the protocol layer.

The proposed remedies are composable extensions rather than protocol changes: cross-header credential normalisation, cached token verification across different identity providers, an unauthenticated metadata endpoint for credential-free registry discovery, and permission-filtered tool visibility kept consistent with per-tool enforcement through a single declarative annotation.

The last of those is the one that matters in practice. Filtering what a caller can see and enforcing what a caller can invoke are two separate mechanisms in most deployments, and they drift apart. Binding them to one declaration removes a category of bug rather than a specific instance of it — which is the same argument this desk has made about the difference between a filter and a boundary.

Retold from arXiv. This is a summary in our own words; follow the link for the original reporting.

Read next

Across the network

Desks that share a zone with this one on the BITBRIEF coverage map.

Terms defined