By the Octri team · Updated
MCP vs function calling: how they differ and how they work together
People often describe MCP as an alternative to function calling, as though an application must choose one. In a typical agent, the two meet in the middle. The MCP server publishes tools; the AI application offers those tools to its model; the model emits a tool call; and the application executes it through the MCP client.
Understanding MCP vs function calling is mostly about seeing where one responsibility ends and the next begins. You can use function calling without MCP, but many MCP integrations use a model's function-calling mechanism under the hood.
What is the difference between MCP and function calling?
Function calling is a capability of a model API: the application supplies tool definitions and receives a structured request to call one. MCP is a protocol between a host application and external tool servers, so tools can be discovered and invoked through a shared interface.
| Question | Function calling | MCP |
|---|---|---|
| Where are definitions provided? | In the model request or session | By a tool server responding to discovery |
| Who executes a selected action? | Application code | The MCP server, via an MCP client |
| What is portable? | The idea; wire formats vary by provider | Tool discovery and calling protocol |
| Why use it? | Give one model access to your code | Let many hosts reuse the same tools |

The model still decides whether an offered tool matches the user's request. MCP does not magically improve that decision. Good names, descriptions and authorization remain important in both systems.
Function calling in one round trip
A function-calling interaction usually looks like this: the application provides a get_order schema, the model returns arguments, the application executes the function, and the result is sent back to the model. Different APIs have different field names and response envelopes, but the control loop is similar.
For example, an application might define:
{
"name": "get_order",
"description": "Read one order by ID",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"]
}
}The model can ask for the operation, but it cannot execute the function directly. Your application receives the request and decides whether to fulfill it. That is the right place to validate arguments and apply the user's permissions.
How MCP feeds function calling
A practical story comes from GitHub engineer Chris Reddington. In his August 2025 account of building a first MCP server, he wanted something visual enough to teach the protocol, so he implemented turn-based games that GitHub Copilot could play through custom tools. His example shows the value of a separate tool layer: Copilot does not need to know the game's internal code, only the advertised actions and their inputs.
The same distinction scales to business integrations. An MCP host lists tools, converts them into the function format its model expects, and maps a chosen function call back into tools/call. From the model's point of view, it is selecting a tool. From the provider's point of view, the MCP server is handling invocation and returning a result.
# Conceptual bridge from an MCP tool definition to a model tool.
def as_model_tool(tool):
return {
"name": tool.name,
"description": tool.description,
"parameters": tool.input_schema,
}Real providers may call the schema field input_schema, parameters or something else. The host performs that translation so the server does not need to know which model it is speaking to.
The cost is the same either way
MCP can reduce repeated integration work for developers, but it doesn't remove the tokens needed to describe tools to a model. If a server advertises hundreds of large schemas, the host still has to manage their context cost or expose them through a search or filtering strategy.
Nor does a model's tool call bypass network cost, authentication or failure handling. The same upstream API work remains. What MCP standardizes is how that work becomes available to many AI applications.

This is why model evaluations matter. A tool catalog with overlapping names can confuse a model regardless of whether those tools were supplied directly in a function-calling request or discovered through MCP. Measure selection accuracy, not only latency.
When to use function calling, MCP or both
If you control one application and need to call a few local functions, direct function calling can be simpler. If multiple AI hosts need access to a shared tool service, MCP avoids building a bespoke integration for each host. When an MCP host talks to a model through tool use, you will often use both in the same system.
Keep private application logic behind the execution boundary, and avoid letting an arbitrary tool description define permissions. A model's proposed call is a request to perform an action, not proof that the caller is authorized.
Checklist for choosing between them
Ask where the tool implementation lives, how many hosts need it, which model APIs you support, whether users need OAuth, and how you will review tool descriptions. Test a real task end to end, including denied actions and failures, and measure the cost of exposing the tool schemas.
Choose the simplest architecture that preserves the authorization boundary. An MCP server is valuable when portability and discovery are real requirements, not merely because it adds another protocol hop.
Function calling and MCP with Octri
Octri MCP Studio can expose an API's operations through an MCP tool catalog that different compatible hosts can discover. Those hosts may still use function calling to let their models choose among the tools. You retain the API and SDK interfaces for deterministic integrations.

The decision that improves agent behavior is usually narrower than “MCP or functions?” It is which capabilities the model sees, how clearly they are described, and where your system checks permission before doing the work.