MCP vs Function Calling vs Plugins:三者定位对比
很多人在接触 MCP 时的第一个问题是:"这和 OpenAI 的 Function Calling 有什么区别?和 ChatGPT Plugins 又是什么关系?" 本节做清晰的三方对比,帮你在不同场景选择合适的方案。
三者核心定位
graph TD
subgraph "工具调用技术家族"
A["Function Calling
(OpenAI 标准)"] B["ChatGPT Plugins
(已停用)"] C["MCP
(Anthropic 开源标准)"] end A --> D["调用方式:API 参数传递
作用域:单次 API 调用
实现方:应用开发者"] B --> E["调用方式:HTTP REST
作用域:ChatGPT.com 平台
实现方:第三方开发者"] C --> F["调用方式:JSON-RPC 进程间通信
作用域:任意 MCP 兼容客户端
实现方:工具开发者,一次实现多处复用"] style A fill:#4A90D9,color:#fff style B fill:#999,color:#fff style C fill:#27AE60,color:#fff
(OpenAI 标准)"] B["ChatGPT Plugins
(已停用)"] C["MCP
(Anthropic 开源标准)"] end A --> D["调用方式:API 参数传递
作用域:单次 API 调用
实现方:应用开发者"] B --> E["调用方式:HTTP REST
作用域:ChatGPT.com 平台
实现方:第三方开发者"] C --> F["调用方式:JSON-RPC 进程间通信
作用域:任意 MCP 兼容客户端
实现方:工具开发者,一次实现多处复用"] style A fill:#4A90D9,color:#fff style B fill:#999,color:#fff style C fill:#27AE60,color:#fff
详细对比表
| 维度 | Function Calling | ChatGPT Plugins | MCP |
|---|---|---|---|
| 创建者 | OpenAI | OpenAI(已于2024年停用) | Anthropic(开源) |
| 协议标准 | 私有(OpenAI API 格式) | 私有(OpenAPI YAML) | 开放标准(JSON-RPC 2.0) |
| 工具运行位置 | 由应用开发者自己调用 | 第三方服务器(HTTP) | 本地进程或远程服务 |
| 客户端绑定 | 绑定到 OpenAI API | 绑定到 ChatGPT.com | 任意 MCP Host |
| 工具发现 | 每次请求手动传入 | Plugin Store | Server 启动时自动注册 |
| 多工具编排 | 需要应用层实现 | 平台内置 | MCP Client 自动路由 |
| 状态保持 | 无状态(每次 API 调用) | 无状态 | Server 进程持续运行,可有状态 |
| 本地资源访问 | ❌ 需要开发者代理 | ❌ | ✅ 直接访问本地文件/DB |
| 开源生态 | 有第三方封装 | 已停止维护 | 活跃(官方 + 社区 Server 库) |
什么时候选 Function Calling
适合 Function Calling 的场景:
- 你在用 OpenAI API 开发应用,工具逻辑由你的后端控制
- 你需要精细控制工具调用时机(force / auto / none 模式)
- 工具调用是应用业务逻辑的一部分,不需要被其他 AI 客户端复用
- 你的工具需要访问后端私有服务(数据库、内部 API)
# Function Calling 典型用法
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "查询订单 #12345 的状态"}],
tools=[{
"type": "function",
"function": {
"name": "get_order_status",
"description": "查询订单状态",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"}
}
}
}
}]
)
什么时候选 MCP
适合 MCP 的场景:
- 你想让 Claude Desktop、Cursor 等工具直接访问你的本地资源
- 你构建的工具想被多个 AI 客户端复用,不绑定单一平台
- 你需要 AI 操作本地文件系统、数据库、浏览器等本地环境
- 你是工具/插件开发者,想一次实现,分发给多个用户
// MCP Server 工具定义(一次,所有 Host 都能用)
{
"name": "query_database",
"description": "查询 SQLite 数据库",
"inputSchema": {
"type": "object",
"properties": {
"sql": { "type": "string", "description": "SQL 查询语句" }
},
"required": ["sql"]
}
}
能否混合使用?
可以,两者不互斥:
graph LR
subgraph "同一个 AI 应用"
A[LLM 推理层]
B["MCP Tools
(本地工具:文件、浏览器)"] C["Function Calling
(后端业务逻辑:订单、支付)"] end A --> B A --> C
(本地工具:文件、浏览器)"] C["Function Calling
(后端业务逻辑:订单、支付)"] end A --> B A --> C
典型的混合架构:使用 MCP 访问本地开发环境(读代码、运行测试),用 Function Calling 处理业务系统调用(查库存、创建工单)。
关于 ChatGPT Plugins
ChatGPT Plugins 已于 2024 年初正式停用,OpenAI 的方向转向了 GPT Actions(本质是 Function Calling + OpenAPI 规范)。如果你还有 Plugin 的历史代码,可以考虑:
- 将 Plugin 的 HTTP 接口包装成 MCP Server(适合本地使用)
- 将 Plugin 逻辑移植为 OpenAI Function Calling(适合 API 应用)
本节执行清单
- [ ] 明确 MCP 与 Function Calling 的核心区别(本地 vs API 层、多客户端 vs 单平台)
- [ ] 判断自己的场景适合哪种方式(或混合使用)
- [ ] 了解 ChatGPT Plugins 已停用,不再投入新资源
下一节:MCP 生态地图与工具选型思路