MCP
在之前的文章中介绍了MCP的编写和使用,今天介绍一下其理论知识。
纯大模型本质上就是一个"封闭系统",它们只能基于内部参数生成响应,无法直接调用 API、访问数据库或执行实际操作。
这意味着它们缺乏"代理能力"(agency),不能主动改变外部环境,大模型自己无法实时处理数据。
MCP 的核心价值:为大模型与外部数据、应用和服务之间建立了桥梁,提供了一种安全、标准化的通信方式。
MCP 就像一个"中介管家",它能把各种本地或远程的资源和服务连接起来,让它们通过统一的协议"聊天"。
| 组件 | 作用 | 类比 |
|---|---|---|
| MCP Server | 提供数据、逻辑处理能力的轻应用 | 本地仓库管理员 |
| MCP Client | 协议翻译,将内容转成 Host 可读的格式 | 翻译官 |
| MCP Host | 需要通过 MCP 获得数据的程序 | 智能管家 App |

MCP 使用了 JSON-RPC 2.0 作为消息传输协议:

Function Calling 是由 OpenAI 创造出来让大模型能够调用外部函数的能力。
| 步骤 | 描述 |
|---|---|
| 1. 用户提问 | "北京天气怎么样?" |
| 2. LLM 决策 | 判断需要调用工具,输出函数调用 |
| 3. 执行工具 | 调用 get_weather(city="北京") 返回结果 |
| 4. 生成回复 | LLM 基于工具结果生成最终回答 |
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如:北京"
}
},
"required": ["city"]
}
}
}
]
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
if message.tool_calls:
tool_call = message.tool_calls[0]
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if function_name == "get_weather":
result = get_weather(arguments["city"])
second_response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"},
message,
{"role": "tool", "tool_call_id": tool_call.id, "content": result}
]
)
print(second_response.choices[0].message.content)
from anthropic import Anthropic
client = Anthropic()
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
tools=[{
"name": "get_weather",
"description": "查询城市天气",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}],
messages=[{"role": "user", "content": "北京今天天气怎么样?"}]
)
for content in message.content:
if content.type == "tool_use":
result = get_weather(content.input["city"])
Function Calling 是可以用自己的函数当作调用 ChatGPT 的参数,在函数中我们可以做任何事情,例如获取网络上的数据、查询自己的数据库等。白话就是大模型函数调用,不是说去调用大模型函数,而是告诉大模型它需要调用哪些函数完成处理,然后返回结果。
这么看着和 MCP 感觉差不多,其实两者都是为了解决大模型的两个核心问题而设计的。
Function Call 是大模型根据上下文自动执行函数的机制,它充当了 AI 模型与外部系统之间的桥梁,但是不同的模型有不同的 Function Calling 实现,代码集成的方式也不一样,这种方式是由不同的 AI 模型平台来定义和实现。
而 MCP 是一个标准协议,如同电子设备的 Type C 协议(可以充电也可以传输数据),使 AI 模型能够与不同的 API 和数据源无缝交互,从而使 AI 系统更可靠,更有效。通过建立通用标准,服务商可以基于协议来推出它们自己服务的 AI 能力,从而支持开发者更快的构建更强大的 AI 应用。开发者也不需要重复造轮子,通过开源项目可以建立强大的 AI 生态。MCP 可以在不同的应用 / 服务之间保持上下文,从而增强整体自主执行任务的能力。
随着 MCP 获得广泛认可,OpenAI 也支持对手公司提出的 MCP 协议了,其实 OpenAI 是有协议指定的先机的,可是机会稍纵即逝,就这么让给了 Anthropic 了。
| 维度 | Function Calling | MCP |
|---|---|---|
| 定位 | 大模型根据上下文自动执行函数的机制 | 标准协议,如同设备的 Type-C |
| 实现 | 不同模型有不同实现,代码集成方式各异 | 统一标准协议,所有支持 MCP 的应用通用 |
| 灵活性 | 需要为每个模型单独集成 | 一次开发,处处运行 |
| 生态 | 各模型厂商各自实现 | 开放的 AI 生态系统 |
| 上下文 | 跨应用上下文保持能力有限 | 可在不同应用/服务间保持上下文 |
行业趋势:随着 MCP 获得广泛认可,OpenAI 也开始支持 MCP 协议了。MCP 有望成为 AI Agent 时代的"USB Type-C"。