01 Covers: Where a server actually runs — stdio versus a remote HTTP endpoint — and the network hygiene each choice demands: Origin-header validation, binding to loopback rather than every interface, TLS on anything remote, and isolating one session's state from the next.
Breaks when: A server built for local development ends up bound to every interface on the box, or a remote endpoint skips the Origin check and lets a rebound DNS name reach it from a page the user merely visited.
Watch: Share of servers reachable only over stdio or a loopback bind, versus reachable on a routable network interface
02 Covers: A protected MCP server as an OAuth 2.1 resource server: protected resource metadata discovery, PKCE, audience-bound tokens scoped to one server, and short-lived credentials in place of a personal access token pasted into a config file.
Breaks when: A gateway holds one broad, delegated token to keep integration simple, and forwards it unchanged to every server it proxies. Compromising the least-trusted server in the chain then hands over credentials scoped for every other one.
Watch: Share of connected servers that reject a token whose audience doesn't name them specifically
03 Covers: How many servers and tools land in one context windowThe context window is the maximum text, measured in tokens, a model can consider at once. at once, namespacing so two servers' identically named tools don't collide, and whether the model reads a static list or one that changes mid-session.
Breaks when: Two connected servers both register a tool called `search`, and the model has no reliable way to tell which one a given call actually reached.
Watch: Count of distinct tool names sharing a session, and how many collide before namespacing is applied
04 Covers: Tool descriptions, annotations, schemas, and return values, all of them untrusted input by default. Structured returns over raw HTML, no auto-approval, full call parameters shown before execution, and sensitive servers kept apart from general-purpose ones.
Breaks when: A tool's return value renders as trusted HTML, or a repeated approval gets remembered as blanket consent instead of being asked again for the specific call about to run.
Watch: Share of destructive or write-capable tool calls that show full parameters before execution, not a summarised description
05 Covers: A registry or allowlist, provenance and publisher identity, pinning a tool definition by hash, re-consent when a definition changes, typosquat checks, and sandboxing a server that runs locally.
Breaks when: A tool a user approved last week gets silently redefined by its own server (a new parameter, a new destination), and every session that cached the original approval keeps calling it with no fresh consent prompt.
Watch: Share of connected servers whose current tool definitions are pinned against a recorded hash from approval time
06 Covers: Per-call logging with parameters and user context, redaction, quotas and rate limits per session or tenant, version pinning with a real deprecation window, and what an incident runbook contains when the compromised component is someone else's server.
Breaks when: An MCP server misbehaves in production and the only record of what happened is whatever the model's own transcript happened to keep, because nothing logged the actual call.
Watch: Share of tool calls with a logged parameter set and user identity retrievable after the fact