MCP 协议详解:与 Function Call 的区别及实战
2025 年,Anthropic 提出了 MCP(Model Context Protocol)协议。简单来说,这是大模型上下文协议,旨在为 AI 大模型和外部工具之间的交互提供一个统一的处理标准。就像 USB-C 统一了物理接口一样,MCP 统一了大模型与工具的对接方式。
MCP 采用 C/S 架构,支持客户端调用远程 Server 服务,也支持 stdio 流式传输模式,即可以在客户端本地启动 MCP 服务端。只需在配置文件中新增 MCP 服务端,就能便捷地使用其提供的各种工具,大幅提升了大模型调用外部资源的效率。

作为开源协议,MCP 鼓励所有 AI 厂商和工具将其集成到客户端中。生态越丰富,协议的生命力就越强。
理解 Function Call 机制
在 MCP 普及之前,AI Agent 开发若要调用外部工具,往往需要针对不同的 SDK 编写特定代码。最经典的方案莫过于 OpenAI 的 Function Call 处理逻辑。
Function Call 实战演示
1. 配置工具与参数
调用 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 代码如下。我们将工具列表放入 create 函数的 tools 参数中。注意,这里使用的是硅基流动的 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')]
响应 JSON 结构清晰,包含了工具名称和参数字符串。
2. 调用工具并二次处理
拿到模型返回的参数后,我们需要执行实际的函数调用,并将结果反馈给模型进行二次处理。这一步的关键是维护对话上下文。
首先将第一次请求的回复插入上下文(role: assistant),紧接着插入工具调用的数据。格式如下:
{
"role": "tool",
"name": "get_weather",
"content": "{\"temperature\": 25, \"condition\": \"sunny\"}"
}
这样,模型就能结合工具返回的实际数据,生成最终的自然语言回答。这种流程虽然有效,但不同平台实现细节各异,这正是 MCP 试图标准化的地方——它让工具接入变得像插拔 USB 设备一样简单通用。


