MCP Protocol Primer: Why AI Agents Need a Unified Tool-Calling Standard

30-Second Takeaway

  • Problem Solved: Every AI app defines its own tool-calling approach (OpenAI function calling, Anthropic tool use, LangChain tool layer) — the ecosystem is deeply fragmented. MCP provides a unified standard.
  • Core Method: The architecture triangle Host → Client → Server, three primitives Tools/Resources/Prompts, built on JSON-RPC 2.0, transport-agnostic.
  • Key Insight: MCP isn't a function-calling replacement — it's a higher protocol abstraction. If you understand how LSP unified the editor ecosystem, you understand MCP's value.
  • What You'll Gain: A clear mental model of MCP's architecture, the ability to distinguish MCP from native function calling, and the theoretical foundation to start coding in the next article.

In 2025, AI Agent developers face an uncomfortable reality:

You want Claude Desktop to connect to GitHub, Slack, and a Postgres database. What do you do? Write custom integration code for each service — GitHub via REST API, Slack via WebSocket, Postgres via a database driver. Each tool has different authentication, different data formats, different error handling.

Worse, if you switch AI applications (say from Claude Desktop to Cursor), you have to rewrite all the integration code.

This isn't any single developer's oversight. It's systemic fragmentation across the entire AI tool-calling ecosystem.

And MCP (Model Context Protocol) was created precisely to solve this problem.

Understand MCP Instantly Through the LSP Analogy

Before diving into MCP, let's look at a standard you already benefit from: LSP (Language Server Protocol).

From 1980 to around 2015, the code editor world looked like this: every editor had to implement code completion, go-to-definition, and diagnostics for every language — independently. VS Code wrote a Python plugin, Vim wrote one, Sublime wrote another. N editors × M languages = N×M implementations.

In 2016, Microsoft released LSP. The core idea was simple: write one Language Server per language, and every editor connects to it through a unified protocol.

Dimension LSP (Editor Ecosystem) MCP (AI Tool Ecosystem)
Problem Each editor implements language support separately Each AI app implements tool integration separately
Core Idea One Language Server per language, shared by all editors One MCP Server per tool, shared by all AI apps
Protocol Roles Editor (Client) ↔ Language Server Host/Client ↔ MCP Server
Result N+M replaces N×M Write once, plug into any AI app

LSP revolutionized the editor ecosystem. Today, the intelligent Python completions you enjoy come from the same Pyright Server — whether you're coding in VS Code, Vim, or Zed.

MCP does the same thing for AI tool calling. With MCP, you write one MCP Server for GitHub, and Claude Desktop, Cursor, Continue, Zed — any AI app with an MCP Client — can plug into it instantly.

The Architecture Triangle: Host → Client → Server

MCP's architecture consists of three roles — understand this triangle, and you understand MCP's entire structure:

Host

The Host is the AI application the end user sees. Think Claude Desktop, Cursor IDE, or a custom chat interface. The Host is responsible for:

The Host never communicates directly with MCP Servers. All protocol operations go through the embedded Client.

Client (Protocol Client)

The Client is the MCP protocol implementation layer embedded inside the Host. It handles:

The Client is the critical bridge in MCP architecture — it connects the LLM to external tools, translating between both sides.

Server (Tool Provider)

The Server is the program that actually executes tools. An MCP Server exposes a set of capabilities:

A Server can provide all three capability types, or just a subset.

A Minimal Call Flow

Here's one complete MCP invocation chain, described step by step:

User asks in Host: "Find the latest MCP-related GitHub Issues"

  ┌─────────────── Host (Claude Desktop) ───────────────┐
  │                                                      │
  │  ① User input                               ⑧ Display │
  │     ↓                                                ↑ │
  │  ┌──────────────── Client ────────────────────┐     │ │
  │  │                                              │     │ │
  │  │  ② tools/list ────────────────→  MCP Server │     │ │
  │  │     ← [search_issues, create_issue, ...]     │     │ │
  │  │                                              │     │ │
  │  │  ③ LLM sees available tools, decides to call │     │ │
  │  │     search_issues                             │     │ │
  │  │                                              │     │ │
  │  │  ④ tools/call ─────────────────→  MCP Server │     │ │
  │  │     {"name":"search_issues",                  │     │ │
  │  │      "arguments":{"query":"MCP","limit":5}}   │     │ │
  │  │                                              │     │ │
  │  │  ⑤ ← Returns Issue list as JSON                │     │ │
  │  │                                              │     │ │
  │  │  ⑥ LLM receives results, generates response   │     │ │
  │  └──────────────────────────────────────────────┘     │ │
  │                                                      │ │
  └──────────────────────────────────────────────────────┘

Key point: the LLM doesn't know the MCP Server exists, and never communicates with it directly. The LLM only sees tool names, descriptions, and parameter schemas — it decides "which tool to call, with what parameters." The actual protocol communication is handled entirely by the Client.

This layered design is MCP's most elegant feature: model and protocol are decoupled. Swap LLM providers — the Client stays the same, the Server stays the same. Only the model API call in the Host changes.

The Three Core Primitives at a Glance

MCP defines three categories of capabilities, each serving a different invocation scenario:

Primitive Controlled By One-Sentence Description Typical Use Cases
Tools Model-controlled Executable functions the LLM actively invokes Check weather, send Slack messages, run SQL queries, create GitHub Issues
Resources App-controlled Structured contextual data read by the application layer Read project files, fetch database schemas, load knowledge-base documents
Prompts User-controlled Predefined prompt templates for quick conversation starts "Summarize this codebase", "Review this PR", "Generate API documentation"

Why separate these three? Because each scenario has different invocation permissions. Tools are automatically invoked by the LLM — expose them carefully (you don't want the model accidentally deleting files). Resources are read proactively by the application layer — no LLM decision-making needed. Prompts are manually chosen by the user — they're shortcut entry points. This categorization lets MCP Servers precisely control "which role can do what, under what circumstances."

All primitives are transmitted via JSON-RPC 2.0, supporting two transport methods:

MCP vs Native Function Calling: The Key Differences

This is where developers get confused most often. Let's clarify with a side-by-side comparison:

Dimension Native Function Calling MCP
Abstraction Level Model capability (model understands and outputs function calls) Protocol-layer standard (how tools are discovered, described, invoked, transmitted)
Tool Discovery Hardcoded: pass the tool list manually with every API call Dynamic discovery: Client sends tools/list to Server, gets tools automatically
Cross-Model Compatibility Each vendor defines it differently (OpenAI format ≠ Anthropic format) Unified tool description schema — Client adapts to each model
Transport Bound to the model API request/response cycle Transport-agnostic: stdio, HTTP+SSE — local or remote
Tool Reuse Each app integrates separately Write an MCP Server once, all Clients plug in instantly
Context Injection Only tool call/result cycle Resources provide an additional context-injection channel (bypassing LLM decisions)

In one sentence: Function calling defines "how the model outputs a tool call" — MCP defines "how tools are managed and connected." The two aren't competing. MCP's Client layer ultimately translates MCP tool descriptions into whatever function-calling format the target model expects. MCP is the higher-level abstraction.

A Concrete Scenario: With vs Without MCP

Imagine you need Claude Desktop to connect to three external tools: GitHub (view Issues), Slack (send messages), and Postgres (query a database).

Without MCP

Three codebases, three authentication schemes, three error-handling strategies. Want to add a fourth tool (say Jira)? Write another one. And if you switch to Cursor IDE? Rewrite everything.

With MCP

Claude Desktop, as Host, automatically discovers all tools exposed by the three Servers through its built-in Client. The LLM sees a unified tool list and calls them as needed. Adding a fourth tool? Just launch another MCP Server. Switching to Cursor IDE? The three Servers stay the same — Cursor's built-in Client connects directly.

That's the power of a standardized protocol. Same idea as USB unifying peripheral interfaces — you don't write a driver for every mouse.

Who's Behind MCP?

Originator: Anthropic open-sourced MCP in November 2024.

Current Steward: Transferred to the Linux Foundation in 2025, now a formal open-source standards project.

License: Apache 2.0 — fully open, no vendor lock-in.

This is worth emphasizing: MCP is not an Anthropic-proprietary protocol. The Linux Foundation transfer means:

If you're worried "does using MCP lock me into Anthropic?" — don't be. MCP is positioned like Kubernetes or Node.js: an open standard with multi-vendor implementations.

Common Misconception: "MCP Is Just Function Calling 2.0"

This is the most frequent misunderstanding. Let me restate it clearly:

Function calling is a model capability. The model says "I understand this tool, I want to invoke it, here are the parameters."

MCP is a protocol-layer standard. It defines "how tools are discovered, how they describe themselves, what a call request looks like, how results come back, what transport channel to use."

An analogy:

A person can speak English (function calling), but if everyone formats letters differently, cross-organization communication is still chaos. MCP establishes a unified "envelope format" — where the sender, recipient, subject, and body each go — so anyone who speaks English can communicate efficiently.

Before You Start Coding: Concepts to Internalize

Before the next article gets hands-on with code, make sure you've absorbed these four concepts:

  1. MCP's Architecture Triangle: Host (user interface) → Client (protocol bridge) → Server (tool execution). Three layers, each with a distinct role.
  2. The Three Primitives' Distinctions: Tools (model-invoked), Resources (app-read), Prompts (user-chosen). Know who controls what.
  3. MCP ≠ Function Calling: MCP is the protocol layer, function calling is a model capability. The MCP Client translates MCP tools into the model's function-calling format.
  4. Transport-Agnostic: stdio for local, HTTP+SSE for remote. You don't need to worry about transport details when writing a Server.

If you're not yet comfortable with AI Agents themselves, start here:

Series Roadmap

The MCP Protocol Series spans 6 articles, from concept to production:

  1. ← You are here: MCP Protocol Primer — concepts, architecture, comparisons
  2. Build Your First MCP Server — a weather-query tool in 50 lines of Python
  3. Deep Dive: MCP's Three Primitives — Tools/Resources/Prompts hands-on
  4. MCP Transport Layer Explained — stdio vs Streamable HTTP, when to use which
  5. Advanced MCP — server-initiated LLM sampling, user elicitation, and async tasks
  6. MCP in Production — OAuth 2.1, gateway proxies, audit trails, and registry publishing

📖 Next: Build Your First MCP Server — A Weather Query Tool in 50 Lines of Python

Frequently Asked Questions

Q: What exactly is the MCP protocol?

A: MCP (Model Context Protocol) is an open standard that defines how AI applications interact with external tools and data sources. Built on JSON-RPC 2.0, it standardizes tool discovery, invocation, resource reading, and prompt templates. Think of it as the LSP (Language Server Protocol) for AI tool calling.

Q: Is MCP the same thing as function calling?

A: No. Function calling is a model capability — the model understands tool descriptions and outputs structured call instructions. MCP is a protocol-layer standard — it defines how tools are discovered, described, invoked, and transmitted. MCP replaces vendor-specific function calling interfaces with a unified, cross-model approach.

Q: Is MCP proprietary to Anthropic? Can OpenAI models use it?

A: MCP is not Anthropic-proprietary. Although initiated by Anthropic, it was transferred to the Linux Foundation in 2025 under the Apache 2.0 open-source license. Any model — OpenAI, DeepSeek, Llama, etc. — can call MCP Servers by implementing an MCP Client. MCP is an open standard, not vendor lock-in.

Q: What do I need to learn to start using MCP?

A: Basic Python or TypeScript programming is all you need. MCP is built on JSON-RPC 2.0 — if you can write an HTTP API or use stdio, you can get started. The next article in this series walks you through building your first MCP Server in under 50 lines of Python, from zero to running in about 10 minutes.