MCP Directory

MCP vs Function Calling: How They Actually Differ

Function calling is the model choosing a tool. MCP is the standard that serves the tools. Stop comparing them like rivals.

Hua·June 30, 2026·6 min read
Detailed image of a black pencil resting on architectural blueprints, ideal for design and planning themes.
Photo by Pixabay on Pexels

MCP vs function calling is not a fight — they sit at different layers. Function calling is the model deciding which tool to call and with what arguments. MCP (the Model Context Protocol) is the wire format and lifecycle that serves those tools to any client. One is a model capability; the other is an integration standard. In practice you use them together, and most confusion about "mcp vs function calling" disappears once you see that.

The short version: the model still does function calling under the hood. MCP just changes where the tool definitions come from and how they get wired in. If you've written an OpenAI or Anthropic tool schema by hand, MCP is what stops you from doing that for the fiftieth integration.

What function calling actually is

Function calling is the model emitting a structured request to invoke a tool you defined. You hand the model a list of function schemas (name, description, JSON-Schema parameters); it reads the user's intent and returns a JSON blob saying "call get_weather with {city: "Tokyo"}." Your code runs the function and feeds the result back.

That's the whole mechanism, and it hasn't fundamentally changed since 2023. The model never runs anything itself — it only proposes a call. Execution, auth, and error handling are entirely on you. Function calling is a model feature baked into the API you're already using.

The catch is that you write and maintain every schema, every dispatcher, and every credential path yourself. Ten tools is fine. A hundred tools across a dozen services, kept in sync as those APIs change, is the part nobody enjoys. That maintenance tax is exactly the gap MCP was built to close.

What MCP actually is

MCP is a standard for serving tools to any AI client over a defined protocol, so you write the integration once instead of per app. An MCP server exposes a set of tools (plus resources and prompts) that any MCP-compatible client — Claude Desktop, Cursor, your own agent — can discover and call. The client asks the server "what tools do you have?", the server answers, and the client hands those definitions to the model.

Under the hood the model still does function calling on those definitions. MCP's job is the plumbing around it: discovery, a stable schema, transport, and lifecycle. If you want the ground-up version, what is an MCP server walks through it.

Two things worth internalizing. Many MCP servers run locally over stdio — the server is a subprocess on your machine, not a hosted endpoint — while others are exposed over HTTP for remote use. And there's a split between official (first-party) servers, built by the vendor whose product they wrap, and community builds wrapping someone else's API. Both matter when you pick one, because they differ in trust and in where the code actually runs.

The layers, side by side

The cleanest mental model: function calling is the decision, MCP is the delivery. Here's how the responsibilities split.

ConcernFunction callingMCP
LayerModel capabilityIntegration standard
Who defines the toolsYou, by hand, per appThe MCP server, once
Who picks the toolThe modelThe model (unchanged)
Who executes itYour codeThe MCP server
Reuse across clientsNone — rewrite per appAny MCP client, no changes
DiscoveryStatic list you pass inClient queries the server at runtime
Where it runsIn your app processA local stdio subprocess or a remote HTTP endpoint

Read the table top to bottom and the relationship is obvious: MCP doesn't replace the "model picks a tool" step. It replaces the you-wrote-all-this-yourself step. This is the same layering argument as MCP vs API, just from the model's side of the wire.

When to use which

Use raw function calling when you have a handful of tools, tight control needs, or a single app. Use MCP when you want to reuse integrations across clients or pull in tools you didn't write. They are not mutually exclusive — an MCP client is doing function calling on the server's tools.

Reach for hand-written function calling when: you have 5–10 bespoke tools; the logic is internal and app-specific; you need to shape schemas or post-process results precisely; or you don't want a separate process in the loop. There's no reason to add MCP to a small, closed toolset.

Reach for MCP when: you want the same GitHub, Postgres, or Slack integration to work in Cursor and Claude and your own agent; you'd rather adopt a maintained server than write and babysit another API wrapper; or you want tools to be swappable without touching app code. Browse the best MCP servers or the full capabilities index to see what's already built before you write anything.

The trap: MCP doesn't fix the tool budget

Because MCP makes adding tools trivial, it makes overloading the model trivial too — and function calling degrades well before you'd guess. Cursor, for example, warns that it works best under roughly 40 active tools total; past that, the model's tool selection gets sloppy regardless of how the tools were served.

Here's the part people skip. A single MCP server often exposes a whole cluster of tools at once, so it doesn't take many servers to crowd out that budget. Every tool definition, MCP-served or hand-written, eats the same context and competes for the model's attention. Adding a server is easy; the tool count it brings with it is the thing to watch.

So the discipline is the same in both worlds: expose the fewest tools that do the job, with clear names and descriptions. MCP just removes your excuse for having too few — and hands you an easy way to have far too many.

The takeaway

MCP vs function calling is a category error dressed up as a comparison. Function calling is how a model selects and shapes a tool call; MCP is how tools get published so any client can offer them for selection. You almost never choose one over the other — you write function schemas by hand for a small internal toolset, and you adopt MCP the moment you want reuse, and both run through the same model mechanism. Pick based on how many tools you have and how many places need them, not on which acronym sounds newer.

FAQ

Is MCP a replacement for function calling?

No. MCP does not replace function calling — it feeds it. The model still uses function calling to pick a tool and its arguments; MCP is the standard that serves those tool definitions to the client so you don't hand-write them per app. They operate at different layers and are used together.

Do I need MCP if my LLM already supports function calling?

Not always. If you have a small, app-specific set of tools you control, plain function calling is simpler and there's no reason to add a separate MCP server. Adopt MCP when you want the same integration to work across multiple clients, or when you'd rather use a maintained server than write and keep syncing another API wrapper yourself.

Is MCP free to use?

The protocol is open and free, and many MCP servers run locally over stdio at no cost beyond your own machine. Individual servers may still require an API key or a paid account for the underlying service (a Stripe or database server needs your credentials), but MCP itself adds no fee.

Does the model behave differently with MCP vs hand-written function calling?

No — the model's tool-selection behavior is identical, because MCP-served tools reach the model as the same function-call schemas you'd write by hand. What changes is where those schemas come from and who executes the call. The same limits apply too: keep total active tools under roughly 40 or selection quality drops either way.

Put this into practice

Browse MCP servers by capability, or check your own setup's tool budget and security.

More essays