深入理解 MCP 协议:与 Function Call 的区别及 Python 实战
什么是 MCP?
官网参考:https://modelcontextprotocol.io/introduction
2025 年,Anthropic 提出了 MCP(Model Context Protocol)协议,中文译为'大模型上下文协议'。它的核心目标是为 AI 大模型与外部工具之间的交互提供一个统一的处理标准。这就好比 USB Type-C 统一了物理接口,MCP 旨在统一大模型调用各种工具的方式。
MCP 采用 C/S 架构(客户端/服务端),支持客户端设备调用远程 Server 提供的服务,同时也支持 stdio 流式传输模式,即可以在客户端本地启动 MCP 服务端。只需在配置文件中注册 MCP 服务端,就能让大模型便捷地使用服务器提供的各类工具。
![架构图示意]
作为开源协议,MCP 鼓励所有 AI 厂商和工具将其集成到客户端中。生态越丰富,协议的生命力就越强。
了解 Function Call
在 MCP 普及之前,AI Agent 开发若要调用外部工具,往往需要针对不同的模型 SDK 编写定制化代码。最典型的便是 OpenAI 提供的 Function Call 机制。
Function Call 原理演示
1. 配置工具与参数
调用 OpenAI Chat Completions 接口时,可通过 tools 参数传入外部工具定义。这包含了工具描述、所需参数及其说明。其中 tool_choice 设为 auto 允许模型自动选择工具,设为 none 则禁止调用。
{
"tool_choice": "auto",
"messages": [
{ "role": "system", "content": "你是一个天气查询助手" },
{ "role": "user", "content": "帮我查询上海的天气" }
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名" }
},
"required": ["city"]
}
}
}
]
}
对应的 Python 代码如下,我们将工具列表放入 tools 参数中,并设置 tool_choice="auto"。这里以硅基流动的 Qwen2.5 模型为例,运行前请替换正确的 API Key。
import openai
import json
def main():
client = openai.OpenAI(
api_key="xxxxx",
base_url="https://api.siliconflow.cn/v1"
)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名" }
},
"required": ["city"]
}
}
}]
res = client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=[
{"role": "system", "content": "你是一个天气查询助手"},
{"role": "user", "content": "帮我查询上海的天气"}
],
tools=tools,
tool_choice="auto"
)
print("content:", res.choices[0].message.content)
print("tools:", res.choices[0].message.tool_calls)
print("message:", res.choices[0].message.to_dict())
if __name__ == "__main__":
main()
运行后,大模型会根据用户问题生成参数。此时 content 通常为空,关键信息在 tool_calls 中。
❯ uv run main.py
content:
tools: [ChatCompletionMessageToolCall(id='...', function=Function(arguments='{"city": "上海"}', name='get_weather'), type='function')]
message: {'content': '', 'role': 'assistant', 'tool_calls': [...]}
响应 JSON 中包含具体的参数结构。
2. 执行工具并二次对话
拿到模型返回的参数后,我们需要实际调用函数,并将结果反馈给模型进行后续处理。这需要维护对话上下文:先将第一次请求的 Assistant 回复插入,再追加一条 tool 角色的消息。
{
"role": "tool",
"content": "上海今天的天气是晴朗,气温 25 度。",
"tool_call_id": "01964be6e485603d6a2a0acbbc7eba91"
}
将这条消息加入历史对话再次发送给模型,它就能结合工具返回的结果给出最终回答。
MCP 与 Function Call 的区别
虽然 Function Call 解决了部分问题,但 MCP 的出现是为了更底层的标准化。
- 通用性:Function Call 依赖特定模型的实现,不同厂商格式可能微调;MCP 试图建立跨平台的统一协议。
- 扩展性:MCP 支持更复杂的资源读取、提示词模板等能力,不仅仅是函数调用。
- 架构:MCP 明确区分了 Client 和 Server 的通信规范,便于构建独立的工具服务。
简单来说,Function Call 是模型层面的能力,而 MCP 是系统层面的连接协议。
以上就是对 MCP 协议的基础介绍与相关实践。希望这些内容能帮助你更好地构建 AI 应用。

