什么是 MCP?
Model Context Protocol(MCP)由 Anthropic 提出,旨在为大模型与外部工具之间的交互提供统一标准。就像 USB-C 统一了物理接口一样,MCP 试图统一 AI 模型与各类工具的对接方式。它采用 C/S 架构,既支持客户端调用远程 Server 服务,也支持 stdio 流式传输模式,允许在本地启动 MCP 服务端。只需在配置文件中注册 MCP 服务端,即可让大模型便捷地使用各种外部能力。
MCP 是开源协议,鼓励所有 AI 厂商和工具将其集成到客户端中。生态越丰富,协议的生命力就越强。
回顾 Function Call
在 MCP 普及之前,AI Agent 开发若要调用外部工具,往往需要针对不同的模型 SDK 编写适配代码。其中 OpenAI 的 Function Call 是最常见的实现逻辑。
配置工具与参数生成
调用 Chat Completions 接口时,可通过 tools 参数传入外部工具定义。这包括工具的功能描述、所需参数及其释义。tool_choice 字段控制模型行为:设为 auto 允许自动选择工具,设为 none 则禁止调用。
以下是一个简单的 Python 示例,展示了如何定义天气查询工具并发送给模型:
import openai
import json
def main():
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.example.com/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_123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"上海\"}"
}
}
]
}
调用工具并维护上下文
拿到参数后,我们需要执行实际函数并获取结果,然后将其作为新消息加入对话历史,让模型基于结果进行二次回复。这一步的关键是维护正确的角色(role)顺序。
首先插入模型的第一次回复(role: assistant),接着插入工具调用的结果(role: tool)。格式大致如下:
{
"role": "tool",
"tool_call_id": "call_123",
"content": "上海今天的天气晴朗,气温 25 度。"
}
将这条消息追加到 messages 列表中再次发送,模型就能结合工具返回的数据给出最终回答。这种机制确保了 AI 不仅能'想'出要做什么,还能真正'做'出来并理解结果。
总结
MCP 本质上是对工具调用能力的标准化封装。相比于原生 Function Call 往往绑定特定 SDK,MCP 更强调协议层面的互通性,使得不同来源的工具可以被同一个客户端统一管理。对于开发者而言,理解这一区别有助于在构建复杂 Agent 系统时选择合适的集成方案。


