MCP && Function Calling

Function Calling 和 MCP 通过一组外部工具,帮助 LLM 获取其无法直接知晓的信息或者难以执行的操作。本文分别对他们进行说明,并对比异同
背景
如今,随着 LLM的发展,参数都达到了千亿级别,虽然LLM 的模型参数蕴含丰富的通用知识,但仍然无法掌握两类信息:
- LLM 无法访问专属内容,例如文件系统中的文件、数据库里的订单,或私有 wiki 和笔记中的文本。
- 无法联网,LLM 无法获取实时信息,例如当前股价、最新财报、明日天气预报或前沿科技新闻。
此外,LLM 属于生成任务,仅仅生成 token ,无法直接执行一些精细且需操作的具体任务,这也不是当前 LLM 的强项:
- 比如调用其他服务的 API 帮你完成订餐和购票。
Function Calling 和 MCP 分别提供了一套标准协议来解决这些问题。简而言之,它门都是通过一组外部工具,帮助 LLM 获取其无法直接知晓的信息或者难以执行的操作。
Function Calling
Function Calling由OpenAI 提出,它的运用能让大模型能够调用特定函数的能力,这对于构建更强大的 Agent 特别有用,因为它可以让模型不仅仅是生成文本,还可以执行实际的操作(例如数据库查询、文件读写等)
下面是Open AI官网让模型调用函数获天气的例子:
第一步: 实现模型调用函数:
import requests
def get_weather(latitude, longitude):
response = requests.get(f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}¤t=temperature_2m,wind_speed_10m&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m")
data = response.json()
return data['current']['temperature_2m']
第二步: 定义目前可供模型选择的函数以及对应参数的描述
from openai import OpenAI
client = OpenAI()
tools = [{
"type": "function",
"name": "get_weather",
"description": "Get current temperature for a given location.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City and country e.g. Bogotá, Colombia"
}
},
"required": [
"location"
],
"additionalProperties": False
}
}]
response = client.responses.create(
model="gpt-4.1",
input=[{"role": "user", "content": "What is the weather like in Paris today?"}],
tools=tools
)
print(response.output)
第三步: 模型会根据用户的输入,选择函数,并提取对应的数据作为参数
[{
"type": "function_call",
"id": "fc_12345xyz",
"call_id": "call_12345xyz",
"name": "get_weather",
"arguments": "{\"location\":\"Paris, France\"}"
}]
第四步: 执行函数
tool_call = response.output[0]
args = json.loads(tool_call.arguments)
result = get_weather(args["latitude"], args["longitude"])
第五步: 将函数执行的结果加入到对模型的输入,模型根据此结果生成回答
input_messages.append(tool_call) # append model's function call message
input_messages.append({ # append result message
"type": "function_call_output",
"call_id": tool_call.call_id,
"output": str(result)
})
response_2 = client.responses.create(
model="gpt-4.1",
input=input_messages,
tools=tools,
)
print(response_2.output_text)
最终模型输出结果
"The current temperature in Paris is 14°C (57.2°F)."
可以看到,通过Function Calling ,让大模型可以进行对应函数的调用,了解当天的天气了!
那么为什么还要提出 MCP 呢?
MCP
MCP(Model Context Protocol,模型上下文协议) ,是2024年11月由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。
MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。
Anthropic 也就是最近推出最强编程大模型—— Claude4 的公司
MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.
通过MCP,开发者不需要为每一个系统(比如CRM、数据库、文件存储等)单独开发新的插件或连接器。只要系统支持MCP,任何使用这个协议的AI都可以和它通信。这样就避免了需要为多个模型和多个工具分别进行定制集成的问题。
MCP 结构
这是官网给出的MCP架构图:
可以看到,MCP 由三个核心组件构成:Host 、Client 和 Server
MCP Server
MCP 服务器是一个程序,提供 LLM 可以使用的工具和数据。与传统的远程 API 服务器不同,MCP 服务器可以作为用户设备上的本地应用程序运行,也可以部署到远程服务器。当一个 LLM 决定在处理任务时需要使用某个工具时,它将使用 MCP 服务器提供的工具来获取所需数据并返回给 LLM。

MCP Client
MCP 客户端是连接 LLM 和 MCP 服务器的桥梁。嵌入在 LLM 中,它负责:
- 接收来自 LLM 的请求
- 将请求转发至适当的 MCP 服务器
- 将 MCP 服务器的结果返回给 LLM

MCP 主机
像 Claude Desktop、Cursor 等这样的程序,或希望通过 MCP 访问数据的 AI 工具,它们为用户提供与 LLM 交互的界面,同时集成 MCP 客户端以连接到 MCP 服务器,使用 MCP 服务器提供的工具扩展 LLM 功能。

MCP的示例工作流程如下:

MCP 与 Function Calling 的区别
Feature | Function Calling | MCP (Model Context Protocol) |
---|---|---|
目的 | 将用户提示转换为结构化函数调用(可本地调用)👆 | 标准化执行和响应处理(更灵活,需进行通信)👆 |
使用对象 | LLM厂商 | 外部厂商、个人都可以提供👆 |
输出格式 | 不同LLM有不同标准 | 统一的标准(正如Type-C)👆 |
灵活性 | 不同的LLM以不同的构建方式 | 多个工具之间的可以交互👆 |
构建一个简单的MCP Server
代码
pip install fastmcp
@mcp.tool()
提供tool,并在注释中写好函数的功能以及需要什么参数,返回的结果mcp.run()
,运行 MCP Server
from fastmcp import FastMCP
mcp = FastMCP("Demo")
@mcp.tool()
def add(a: int, b: int):
'''
获取两数之和
Args:
a: 相加的数
b: 相加的数
Returns:
相加的结果
'''
return a + b
if __name__ == "__main__":
mcp.run()
与MCP Client通信
以cursor为例:
点击 MCP -> Add new global MCP server

然后配置如下:
{
"mcpServers": {
"Demo":{
"command":"cmd",
"args":["/c","fastmcp","run","E:/PythonProject1/MCP_demo/server.py"]
}
}
}
-
"Demo":MCP Server 名称
-
"command":执行的命令
-
"args":执行的参数
在cursor中进行测试:

由于这是一个很简单的 MCP Server 所以仅仅是在本地执行,没有进行联网通信。
这样看是不是和 Function Call 很像?