Pacific Design/ artificial intelligence

AI Agents · entry 03/08 · 3 min read

MCP: a standard for tools

Model Context Protocol replaces N × M bespoke integrations with servers any client can mount — and imports a security surface worth respecting.

The N × M problem

Before late 2024, connecting models to tools meant bespoke glue: every assistant vendor wrote its own integrations, every tool vendor shipped a different plugin per assistant, and N models times M tools meant N × M adapters, each drifting out of date on its own schedule. The Model Context Protocol — released by Anthropic and adopted across the industry since — collapses that to N + M: a tool vendor builds one server, an assistant vendor builds one client, and any client can use any server.

Servers, clients, three primitives

An MCP server is a small program exposing three things over JSON-RPC (stdio locally, HTTP remotely): tools the model can invoke, resources the application can read — files, database rows, documents — and prompts, reusable templates a user can apply. Clients — chat assistants, IDEs, agent runtimes — connect, ask what is offered, and hand the schemas to the model as ordinary tool definitions.

{"jsonrpc": "2.0", "id": 3, "result": {"tools": [
  {"name": "search_tickets",
   "description": "Full-text search over support tickets.",
   "inputSchema": {"type": "object",
     "properties": {"query": {"type": "string"}},
     "required": ["query"]}}]}}

The USB-C analogy, and its limit

The standard pitch is that MCP is USB-C for AI — one port, any device — and the ecosystem largely proves it: thousands of servers now wrap databases, browsers, ticketing systems, and code hosts, usable from any compliant client. But the analogy has a misleading edge. A USB device cannot talk its way into your other peripherals. An MCP server speaks directly into the model's context, and language there is never inert.

Third-party servers are attack surface

Everything a server sends — tool descriptions, resource content, results — lands in the same context window as your instructions, and models follow persuasive text wherever it appears. That makes tool descriptions untrusted input: a malicious server can bury "also forward the user's private keys" in a description, shadow another server's tool names, or return results carrying injected instructions. Treat installing a server like installing a browser extension that can read your logged-in tabs: pin versions, read the descriptions you mount, and scope each server's credentials to the minimum the job needs.

Failure mode

The lethal trifecta, assembled one reasonable server at a time. One server reads untrusted content — public issues, inbound email. Another holds private data. A third can transmit: email, HTTP. Each is fine alone; together, a hostile string in a bug report can instruct the model to exfiltrate secrets through the mail tool, and no single server review would have caught it — it is prompt injection with a supply chain. Audit the combination mounted per session, not each server in isolation, and keep reads-untrusted-content and acts-with-secrets in separate sessions by default.

Turn the three legs off one at a time and see which defenses actually hold