Model Context Protocol (MCP)

Protocols & Interoperability intermediate Building with AI 12 min read

Overview

The Model Context Protocol (MCP) is an open standard introduced by Anthropic in November 2024 that defines how AI systems—particularly large language models—connect to external tools, data sources, and services through a unified client-server protocol. Think of it as the “USB-C for AI”: a single, standardized interface that replaces the tangled web of custom integrations that previously plagued AI application development.

Before MCP, every AI application that needed to access a database, call an API, or read from a file system required a bespoke connector. If you had N AI applications and M data sources, you needed up to N×M custom integrations—an unsustainable scaling problem. MCP collapses this into an N+M problem: each AI host implements one MCP client, each data source implements one MCP server, and they all interoperate through the shared protocol.

MCP’s adoption has been remarkably rapid. OpenAI adopted it in March 2025, and by December 2025, Anthropic donated the protocol to the Agentic AI Foundation (AAIF) under the Linux Foundation, co-founded with Block and OpenAI. In 2026, every major AI provider supports MCP, making it one of the fastest-adopted infrastructure standards in the AI ecosystem.

How It Works

Architecture: Hosts, Clients, and Servers

MCP’s architecture consists of three layers that work together to bridge AI models and external capabilities:

MCP Host

The AI application or environment (e.g., Claude Desktop, an AI-powered IDE, a chatbot) where the LLM runs and the user interacts. The host manages one or more MCP client instances.

MCP Client

A protocol-aware component inside the host that maintains a 1:1 connection with a specific MCP server. It translates the LLM’s requests into MCP protocol messages and converts server responses back for the model to consume.

MCP Server

A lightweight service that exposes specific capabilities—tools, resources, and prompts—to AI clients. Each server typically wraps one external system (a database, API, file system, or web service) and presents it through the standardized MCP interface.

This separation of concerns means the LLM never directly touches external systems. The client mediates all interactions, enforcing security boundaries and protocol compliance.

The Wire Protocol: JSON-RPC 2.0

MCP reuses the message-flow ideas from the Language Server Protocol (LSP)—the same standard that powers code intelligence in editors like VS Code. All messages are encoded as JSON-RPC 2.0, providing a well-understood, battle-tested format for request-response and notification patterns.

A typical message flow looks like this:

  1. The LLM decides it needs external data or wants to invoke a tool
  2. The MCP client sends a JSON-RPC request to the appropriate MCP server
  3. The server processes the request (querying a database, calling an API, etc.)
  4. The server returns a JSON-RPC response with the results
  5. The client delivers the response back to the LLM’s context

Transport Layers

MCP defines two standard transport mechanisms for client-server communication:

stdio (Standard I/O): Designed for local connections where the MCP server runs as a child process on the same machine. The client spawns the server process and communicates through standard input/output streams. This is the simplest transport—no networking, no authentication overhead—ideal for development and local tool integration.

Streamable HTTP: Introduced in March 2025 as the standard for remote MCP connections, replacing the earlier SSE-based transport. It uses a single HTTP endpoint that supports both POST (for sending JSON-RPC messages) and GET (for establishing optional Server-Sent Events streams for server-initiated messages). This transport supports bidirectional communication over standard HTTP infrastructure.

// Example: MCP message over Streamable HTTP
POST /mcp HTTP/1.1
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "query_database",
    "arguments": {
      "sql": "SELECT * FROM users WHERE active = true"
    }
  }
}

Three Core Primitives

MCP servers expose capabilities through three primitive types:

Capability Negotiation

When a client connects to a server, they perform a capability negotiation handshake. The server advertises what it supports (which tools, resources, and prompts are available), and the client confirms what it can consume. This allows both sides to evolve independently—a server can add new tools without breaking existing clients that don’t know about them.

Practical Applications

AI-Powered IDEs

Code editors like Cursor, VS Code with Copilot, and Windsurf use MCP to give AI assistants access to project files, terminal output, documentation, and external services. A single MCP server for GitHub lets the AI read issues, create pull requests, and review code—without the IDE needing to implement GitHub-specific logic.

Enterprise Data Integration

Organizations deploy MCP servers that wrap internal databases, CRM systems, knowledge bases, and monitoring dashboards. An AI assistant can query Salesforce data, check Grafana metrics, and search Confluence docs—all through the same protocol. This dramatically reduces the integration burden for enterprise AI rollouts.

Agentic Workflows

In multi-step agent systems, MCP provides a standardized way for agents to discover and use tools at runtime. An agent can enumerate available MCP servers, inspect their tool schemas, and dynamically decide which tools to invoke based on the task at hand. This is foundational for building flexible, composable AI agent architectures.

Cross-Platform AI Applications

Because MCP is vendor-neutral, the same MCP server works with Claude, ChatGPT, Gemini, or any other MCP-compatible host. A company can build one MCP server for their internal tools and immediately make it available to any AI platform their team uses.

Key Takeaways

Further Reading