MCP vs function calling
Function calling is the mechanism: a model's native ability to emit a structured call — name plus JSON arguments — instead of prose, which your code then executes. MCP is the standard around it: where those tools come from, how they describe themselves, and how the call travels. MCP builds on function calling; it doesn't compete with it.
Side by side
| Function calling | MCP | |
|---|---|---|
| Layer | Model capability, exposed in each vendor's API | Integration protocol between apps and tool providers |
| Who defines the tools | The app developer, per app, in their own code | The server author, once — every client inherits them |
| Discovery | None — the tool list is hardcoded into the request | Runtime — clients ask tools/list each session |
| Execution | Your own code, in-process | A separate server, over stdio or HTTP |
| Portability | Definitions differ per model vendor's API format | One open spec across vendors and clients |
| End users | Can't add tools — they get what the developer shipped | Can plug in any server themselves |
When to use which
Building one app with a few custom tools? Plain function calling. Define the functions in your API request, execute them in your own code, done — no servers, no protocol overhead.
Want tools that outlive one app? MCP. The same server works in every client, users can bring their own connections, and vendors maintain the integration instead of you — hundreds already do.
Under the hood they meet: an MCP client fetches a server's tool schemas and hands them to the model as functions. Think of function calling as the CPU instruction and MCP as the peripheral bus built around it.
Common questions
Is MCP just function calling with extra steps?
It's function calling with the missing pieces. Function calling defines how a model requests a tool; it says nothing about where tools come from, how they're described consistently, how the call is transported, or how auth works. MCP standardizes all of that — which is why a server written once works in Claude, Cursor and ChatGPT alike.
Do I still need function calling if I use MCP?
You're always using it — it's how the model itself works. When an MCP client connects to a server, it presents the server's tools to the model through the model's own function-calling interface. MCP changes where tools come from, not how the model invokes them.
When is plain function calling the better choice?
When you're building one application with a handful of bespoke tools that nothing else will ever use. Defining functions directly in your API calls is simpler and has no extra moving parts. MCP earns its keep when tools need to be shared, discovered, swapped by users, or used across multiple apps.
Does MCP work with models other than Claude?
Yes — that's the point. Any model with tool-use ability can sit behind an MCP client, and clients exist across vendors: OpenAI's products, Cursor, VS Code, Gemini CLI and more all speak MCP to the same servers.
More pairings: the compare hub · protocol basics: What is MCP?