MCP vs Function Calling: What’s the Difference?
It is the most common confusion in MCP discussions: are MCP and function calling the same thing? Different things? Competitors? The short answer: they sit at different layers. Function calling is what the model emits. MCP is how tool servers talk to clients. You almost always use both together.
The one-sentence version
Function calling is a model capability: a frontier LLM can output a structured request like "call get_weather with location="Berlin"". MCP is a server protocol: it defines how a tool-server publishes its tools, how a client discovers them, and how requests and responses travel between them.
They compose. The model emits a function call (function calling); the client routes that call to the right MCP server (MCP). The server runs the tool and returns the result; the client feeds it back to the model. Same conversation, two layers of plumbing.
Where each lives in the stack
Function calling
A capability of specific model APIs (Anthropic, OpenAI, Google, etc.). The model returns a JSON object describing a function to call. Your code is responsible for parsing it, running the function, and returning the result.
- Defined by each provider's API
- Format varies across providers
- You write the routing logic
- Tools live in your codebase
MCP
An open standard for tool servers. The server declares its tools; the client connects, discovers them, and forwards model function calls to the server. The wire format is provider-agnostic.
- Defined by modelcontextprotocol.io
- Standardised JSON-RPC envelope
- Discovery and dispatch built in
- Tools live in reusable servers
A request, traced end-to-end
The cleanest way to see the difference is to walk one tool call through both layers. Say a user asks Claude Desktop "what is the weather in Berlin?" with the (hypothetical) Weather MCP installed.
Client lists available tools
Claude Desktop has discovered the Weather MCP at startup. It includes the server's tool descriptions (e.g. get_weather(location)) in the model's system prompt — this is the MCP layer doing discovery.
Model emits a function call
The model returns a structured response: { type: "tool_use", name: "get_weather", input: { location: "Berlin" } }. This is the function-calling layer — Anthropic's API spec defines this format.
Client routes via MCP
Claude Desktop sees a tool_use targeting a tool exposed by the Weather MCP. It forwards a CallToolRequest over the MCP transport (stdio or HTTP) to the Weather server.
MCP server executes
The Weather MCP server receives the request, calls the underlying weather API, and returns a CallToolResult with the text result. This is MCP-server code that the user never writes — it ships in the server.
Client feeds result back to model
Claude Desktop wraps the result as a tool_result message and sends it back through Anthropic's API. The model uses it to compose the final reply for the user.
Steps 2 and 5 are function calling. Steps 1, 3, and 4 are MCP. Without MCP, your application code has to do steps 1, 3, and 4 by hand — for every tool, every model API, every client.
Side-by-side comparison
| Function calling | MCP | |
|---|---|---|
| Layer | Model output format | Transport + discovery protocol |
| Defined by | Each provider API (Anthropic, OpenAI, etc.) | modelcontextprotocol.io (open spec) |
| Tools live in | Your application code | Reusable MCP servers |
| Discovery | You hand-write descriptions | Client lists tools from connected servers |
| Cross-provider | No — JSON shapes differ | Yes — clients abstract over provider |
| Cross-client | No — you write per-client glue | Yes — one MCP works in Claude/Cursor/VS Code |
| Wire format | Whatever the provider returns | JSON-RPC over stdio or HTTP |
| Auth | Your code's job | OAuth 2.1 + PKCE (remote MCPs) |
| Best for | Single-tool, single-model use cases | Shared tooling across clients/models |
They are not competing — they are complementary
When to skip MCP and write raw function calling
MCP is the right default for any tool you want available in more than one place. But there are cases where direct function calling is simpler.
Single-provider, single-client backend agent
If your only consumer is your own backend, talking to one provider's API, with one set of tools nobody else will ever use, the indirection MCP adds is overhead.
Framework-managed tools (LangChain, LlamaIndex)
These frameworks already wrap function calling. Adding MCP on top makes sense only if you also want those tools usable outside the framework.
Tightly coupled to a specific feature surface
If the tool exists to enable one specific UI behaviour and is meaningless outside it, the portability MCP offers is not worth the protocol overhead.
When MCP clearly wins
You want the same tool in Claude Desktop, Cursor, VS Code, and ChatGPT
Write the MCP server once; install in every client with a one-line config block. With raw function calling you would build per-client integrations.
Multiple teams share the same tool
A central MCP server with OAuth lets each user authenticate with their own scope. Function calling has no built-in answer for multi-tenant auth.
You are integrating a SaaS that already ships an MCP
HubSpot, Linear, Sentry, Cloudflare, Stripe, Notion all publish MCP servers. Using theirs means zero glue code — that is the literal point of an open standard.
You want LLM-portable tooling
MCP servers work with any client/model. If your agent stack might switch from Claude to GPT (or vice versa) next quarter, MCP lets the tools come along for free.
Frequently asked questions
Is MCP the same as function calling?
No. Function calling is a feature of a specific model API — the model returns a structured request describing a function to invoke. MCP is a transport-layer protocol that standardises how clients discover and call tools across providers, models, and tool servers. They operate at different layers: function calling is "what the model emits," MCP is "how tool servers talk to clients."
Do I need MCP if my model already supports function calling?
You do not need it, but it dramatically reduces glue code. With raw function calling, you write the tool descriptions, parse the model's function-call output, route to your handlers, and pipe the result back — every time, for every tool, for every model API. With MCP, those plumbing layers move into the protocol; you point the client at an MCP server and the tools become available automatically.
Can MCP work without function calling support in the model?
Conceptually no — MCP relies on the model being able to emit a structured "I want to call this tool" request, which is exactly what function calling provides. In practice, every modern frontier model (Claude, GPT, Gemini, Llama) supports function calling, so the question is mostly academic. MCP's value is portability across all of them.
Is MCP locked into Anthropic?
No. MCP is an open standard. The spec lives at modelcontextprotocol.io and the reference implementations are on GitHub under the modelcontextprotocol organization. OpenAI ChatGPT, Cursor, VS Code, Windsurf, and Zed all support MCP as clients. Many providers ship MCP servers as the official integration path.
When should I use raw function calling instead of MCP?
When you have a single tool, one specific model, one client, and full control over both sides. A small internal tool that only your backend will ever call from one provider's API is faster to wire as raw function calling. The moment you want the same tool available in Claude Desktop, Cursor, and a homegrown agent, MCP saves more time than it costs.
How does MCP compare to LangChain tools or LlamaIndex tools?
Different abstraction levels again. LangChain and LlamaIndex are frameworks that wrap function calling with helpers (chains, agents, retries). MCP is a wire-format protocol — it does not care which framework you use. You can build a LangChain agent that consumes MCP servers, or an MCP server that exposes a LangChain tool. They compose; they do not compete.
Continue reading
If MCP itself is still abstract, the what-is-mcp guide walks the plumbing in plain English. If you already understand the basics, the security and transport guides cover the harder operational questions.
More guides
Fundamentals
What Is MCP? A Plain-English Guide to Model Context Protocol
6 min read
Setup Guide
Best MCPs for Cursor in 2026 (Ranked + Setup)
8 min read
Setup Guide
Best MCPs for Claude Desktop in 2026 (Ranked + Setup)
9 min read
Setup Guide
Best MCPs for Claude Code in 2026 (Ranked + Setup)
8 min read
Setup Guide
Best MCPs for Windsurf in 2026 (Cascade-Ready Setup)
8 min read
Setup Guide
Best MCPs for VS Code in 2026 (Agent Mode + .vscode/mcp.json)
8 min read
Strategy
MCP Registry vs Curated Directory: Which Should You Use?
5 min read
Setup Guide
Best MCPs for ChatGPT: The Apps and Connectors Worth Installing
9 min read
Tutorial
How to Add an MCP Server to ChatGPT (Developer Mode + Apps Directory)
7 min read
Security
MCP Security: What to Know Before You Install
9 min read
Role Guide
Best MCPs for Marketers in 2026 (SEO, Email, Analytics)
8 min read
Strategy
Remote vs Local MCP Servers: When to Use Each
7 min read