Resources

Architecture

MCP vs function calling: how are they different?

A practical comparison of MCP and model function calling for developers designing reusable AI tool workflows.

10 min readUpdated 2026-07-02
MCPFunction callingTool callingAI agents

Written by RTT Intelligence Engineering

Technical notes from the team building MCP surfaces for OpenAPI APIs and database scopes with server-side credentials, validation, and audit-oriented logs.

Reviewed for practical implementation

Focused on usable architecture, security boundaries, and production tradeoffs rather than generic definitions.

Short version

Function calling is usually a model API feature. MCP is a protocol and client-server pattern for reusable tool access.

Function calling lets a model return a structured request such as call search_orders with these arguments. Your application code then decides what to do with that request.

MCP gives AI clients a standard way to connect to tool servers, discover available tools, inspect names and descriptions, and send tool calls over a protocol. It is about tool distribution and interoperability, not just the model's ability to produce JSON.

The two ideas can work together. A model may reason that a tool is needed, while MCP defines where that tool catalog comes from and how the client calls it.

Where the tool contract lives

The main architectural difference is ownership of the tool catalog.

With function calling, the application normally sends tool definitions to the model as part of one model integration. The function list belongs to that application runtime.

With MCP, the tool catalog belongs to an MCP server. A compatible host or client can connect to that server and discover the tools. This makes MCP more useful when the same tool surface must be reused by Claude, Cursor, VS Code, internal agents, or multiple teams.

Comparison

The difference is where the tool contract lives and how clients connect to it.

AreaFunction callingMCP
Primary layerModel API integration inside one application.Protocol connection between AI clients and MCP servers.
DiscoveryFunctions are provided by the application to the model.Tools are listed by the MCP server through tools/list.
Tool catalog ownerThe application that calls the model.The MCP server or gateway publishing the tools.
Execution pathApplication code receives the model's call request and runs the function.The MCP client sends a tool call to the server, which validates and executes.
ReuseOften app-specific unless every app repeats the same function definitions.Designed for reusable tool servers used by many compatible clients.
Best fitOne product experience tightly coupled to one model integration.Shared tools, team workflows, SaaS integrations, IDEs, and remote tool endpoints.

Practical example

The same order lookup can be exposed through either pattern, but the operational shape is different.

NeedFunction calling approachMCP approach
Order lookup inside one support assistantDefine a search_orders function in the support app and execute it in that backend.Publish search_orders from an MCP server and let the support assistant connect to that server.
Same tool in an IDE, chat app, and internal agentCopy or regenerate function definitions for every integration.Expose one MCP tool catalog and connect each compatible client to it.
Credential handlingThe support app must hold and protect upstream credentials.The MCP server or Gateway holds upstream credentials and clients authenticate to that MCP surface.
Changing a descriptionUpdate each app that sends function definitions.Update the published tool description once at the MCP server or Gateway layer.

Governance still matters

Neither function calling nor MCP should be treated as a security boundary by itself.

The model can suggest a tool call, but trusted backend code should decide whether the call is allowed. That means validating arguments, checking ownership and scope, protecting credentials, enforcing limits, and logging execution.

Function calling does not make a function safe. MCP does not make a tool safe. Safety comes from the execution layer: known source mapping, schema validation, permission checks, result limits, and redacted observability.

How they work together

A model may use tool calling behavior while the tool surface comes from MCP.

In a real product, the model still needs to choose tools and produce arguments. MCP does not remove that reasoning step. It standardizes how clients discover the tools and how calls are sent to a server.

A gateway pattern is useful when tool definitions come from existing systems. OpenAPI operations can become MCP tools, database scopes can become schema and executor tools, and the same MCP surface can be tested in chat before external clients use it.

Layered mental model

text
User asks a question
  -> model decides a tool is needed
  -> MCP client reads the server tool catalog
  -> client sends a structured tool call
  -> MCP server or gateway validates the call
  -> backend API, database executor, or workflow runs
  -> result returns to the model for the final answer

Production checklist

The checklist is almost the same whichever pattern you choose.

  • Keep the tool catalog small enough for the model to choose from reliably.
  • Write descriptions that explain when to use the tool, required inputs, constraints, and expected result.
  • Validate every tool call in trusted backend code before touching an upstream API or database.
  • Keep upstream API keys and database connection strings out of prompts and local client configuration when possible.
  • Add limits, timeouts, result-size controls, and retry policy before broad rollout.
  • Log tool name, caller, source, success or error, latency, and validation failures with sensitive values redacted.
  • Test realistic prompts before connecting more clients or enabling higher-risk write actions.

Common mistakes

Most mistakes come from treating the tool call format as the whole architecture.

  • Calling everything function calling even when the real need is a reusable tool server.
  • Using MCP only as a thin proxy while leaving credentials and policy in the client.
  • Publishing a full API catalog as tools without curation.
  • Assuming a clear tool description replaces server-side permission checks.
  • Mixing broad free-text tools with sensitive systems instead of using structured schemas.

Sources and further reading

Common questions

Is MCP better than function calling?

They solve different layers. Function calling is often model-specific, while MCP is a client-server protocol for reusable tool access.

Can MCP tools use function calling internally?

Yes. A product can combine the ideas. The model may use function calling behavior to produce structured arguments, while MCP supplies the shared tool catalog and server connection. The server still needs validation and execution controls.

Which one should a product team expose?

If the goal is reusable tool access across clients such as Claude, Cursor, VS Code, or internal agents, MCP is usually the better external surface.

Does MCP remove the need for model tool calling?

No. The model still needs to decide whether a tool is useful and produce arguments. MCP standardizes discovery and transport between clients and tool servers.

Can function calling be enough for production?

Yes, when the tool surface is limited to one controlled application and the backend validates calls properly. MCP becomes more attractive when the same tools need to be reused across clients or managed as a shared server surface.

Which layer should store upstream credentials?

Credentials should live in trusted backend infrastructure. In an MCP setup, that is usually the MCP server or Gateway, not the desktop client, prompt, or copied function description.