MCP 协议简介
2025 年,Anthropic 提出了 MCP(Model Context Protocol),即大模型上下文协议。它的核心目标是统一 AI 大模型与外部工具之间的交互方式。这就好比 USB-C 接口统一了物理连接标准,MCP 旨在解决大模型接入不同工具时的碎片化问题。
MCP 采用 C/S 架构,支持客户端调用远程服务,也支持本地启动服务端(stdio 模式)。只需在配置文件中注册 MCP 服务端,即可让大模型直接调用各类工具,大幅提升了 Agent 开发的便捷性。
Function Call 回顾
在 MCP 普及之前,开发 AI Agent 调用外部工具通常需要针对不同模型的 SDK 编写特定逻辑,最典型的就是 OpenAI 的 Function Call。这种方式虽然有效,但缺乏统一标准,迁移成本高。
Function Call 示例
以 OpenAI Chat Completions 接口为例,我们可以通过 tools 参数传入外部工具定义。工具描述包含名称、功能说明及参数结构。tool_choice 设为 auto 时,模型会自动判断是否调用工具;设为 none 则禁止调用。
import openai
import json
def main():
client = openai.OpenAI(
api_key="your_api_key_here",
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)
运行后,如果模型决定调用工具,content 字段通常为空,而 tool_calls 会返回具体的函数名和参数。例如:
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"上海\"}"
}
}
]
}
处理工具响应
拿到模型生成的参数后,我们需要执行实际函数,并将结果回传给模型进行二次处理。这一步需要维护对话上下文,将工具调用的结果以 tool 角色插入消息列表。
# 模拟执行工具并获取结果
tool_result = "上海当前天气晴朗,气温 25 度"
# 构建新的消息列表,追加工具响应
messages.append(res.choices[0].message.to_dict())
messages.append({
"role": "tool",
"content": tool_result,
"tool_call_id": res.choices[0].message.tool_calls[0].id
})
# 再次请求模型生成最终回答
final_res = client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=messages,
tools=tools,
tool_choice="auto"
)
print(final_res.choices[0].message.content)
这样,整个'提问 - 选工具 - 执行 - 回答'的闭环就完成了。MCP 的优势在于它试图将这一套流程标准化,减少重复造轮子的成本。


