Why MCP is a security boundary, not plumbing

People call MCP "USB-C for AI tools," and the analogy holds in a way its users rarely intend: you would not plug an unknown USB device into a production machine. An MCP server runs code with whatever authority you grant it. It exposes tools the model calls on its own, and it returns content that re-enters the model's context looking like trusted text. Each of those is a boundary.

The protocol does not make your system secure. It makes the tool layer uniform, so the security work is uniform too: scope, authenticate, validate, and contain at the server. The model on the other end will call whatever you expose, however an attacker convinces it to.

Diagram of the agent harness layers, with the tool / MCP layer sitting between the model and the systems it reaches.
The MCP layer sits between the model and real systems. Authority gets exercised here, so enforcement belongs here too.

The MCP attack surface

Three injection vectors are specific to the protocol, on top of the usual ones.

Confused deputy by design

An MCP server usually holds real credentials (a GitHub token, a database connection, a cloud key) so the agent doesn't have to. The server becomes a deputy with standing authority. If an attacker can induce the model to call it, the attacker borrows that authority and never sees the credential. Scope the server's own access, not just the agent's.

Building a server safely

If you are writing an MCP server, treat every tool as a public, untrusted API endpoint. That is effectively what it is.

Authentication and identity

Remote MCP servers should authenticate the caller and authorise per tool. The protocol's OAuth-based authorization exists for this. Use it instead of a shared static token.

Consuming third-party servers

Most teams install far more servers than they write. The risk model is supply-chain.

Vetting a server before you trust it

Run a short triage before any MCP server reaches a system that matters.

  1. What credentials does it hold, and what is their blast radius if the server is compromised?
  2. Do any tool descriptions contain imperative language or reference other tools? (Red flag.)
  3. Are arguments validated server-side, or does it trust the model's input?
  4. Can it reach the network, and if so, where? Is egress constrained?
  5. Does it authenticate callers and scope per tool, or is it an open endpoint behind a shared token?
  6. Can the tool set change after approval without you noticing?

Checklist

Before an MCP server touches production

  • Every tool argument is validated and allow-listed server-side.
  • Tools are narrow and single-purpose; no general-purpose escape hatches.
  • Tool descriptions carry no instructions and no secrets.
  • Output crossing a trust boundary is sanitised and bounded.
  • The server runs with its own least-privilege identity and constrained egress.
  • Callers authenticate per agent with short-lived, scoped tokens.
  • Third-party servers are version-pinned and tool-definition-pinned.
  • The client-side PEP still gates state-changing and irreversible calls.
  • Every tool call is logged with arguments and caller identity.

Building or adopting MCP tooling?

We review MCP servers and agent tool layers for the failure modes above, then design the enforcement and isolation around them. Tell us what you are connecting.