前置知识
阅读本文前,建议先了解:
- Function Call - 了解 Function Call 基础
- 02-MCP 的架构与核心概念 - 了解 MCP 架构
一、先回顾:Function Call 是什么?
Function Call(函数调用) 是 LLM 调用外部函数的能力。
基本流程:
用户:今天北京天气怎么样?
↓
LLM:分析需要调用 get_weather 函数
↓
调用:get_weather("北京")
↓
返回:{"temperature": 25, "condition": "晴"}
↓
回答:北京今天天气晴朗,气温 25 度。
这是单个 AI 应用与特定函数之间的调用机制。
二、Function Call 的局限性
2.1 平台碎片化
每个 LLM 平台都有自己的 Function Call 实现:
❌ 混乱的现状:
┌───────────────────────────────────────┐
│ OpenAI Function Calling │
│ - 有自己的 JSON Schema 格式 │
│ - 有自己的调用方式 │
├───────────────────────────────────────┤
│ Anthropic Tools │
│ - 有自己的工具定义格式 │
│ - 有自己的调用方式 │
├───────────────────────────────────────┤
│ Google Function Calling │
│ - 有自己的格式 │
│ - 有自己的调用方式 │
└───────────────────────────────────────┘
互不兼容!
2.2 重复开发成本高
❌ 开发者视角:
想让一个数据库被多个 AI 使用,需要:
ChatGPT 版本 → 写一套适配代码
↓
Claude 版本 → 再写一套(逻辑类似但格式不同)
↓
Gemini 版本 → 再写一套(又要改)
↓
... 每加一个 AI 平台,重写一遍
成本 = AI 平台数量 × 外部系统数量
2.3 功能单一
❌ Function Call 只能:
- 调用函数
- 传递参数
- 获取结果
但 AI 还需要:
- 📖 读取参考资料(没有)
- 📝 复用提示模板(没有)
- 🔄 实时更新能力(没有)
- 🔍 动态发现功能(有限)
2.4 无法动态发现
❌ Function Call 的使用方式:
1. 开发者手动在代码中注册函数
2. AI 只能调用预先注册的函数
3. 新增函数需要重新配置
4. AI 不知道还有哪些"隐藏功能"
三、MCP vs Function Call:核心区别
3.1 定位不同
| 维度 | Function Call | MCP |
|---|---|---|
| 定位 | 单个 AI 的函数调用能力 | AI 连接外部的标准协议 |
| 范围 | 单个应用内部 | 整个生态系统 |
| 标准化 | 各平台私有标准 | 开放统一标准 |
| 类比 | 每个品牌的私有充电口 | USB-C 统一接口 |
3.2 能力对比
| 能力 | Function Call | MCP |
|---|---|---|
| 调用函数 | ✓ | ✓ (Tools) |
| 读取数据 | ✗ | ✓ (Resources) |
| 提示模板 | ✗ | ✓ (Prompts) |
| 动态发现 | 有限 | ✓ (*/list 方法) |
| 实时更新 | ✗ | ✓ (Notifications) |
| 用户交互 | 有限 | ✓ (Elicitation) |
| LLM 采样 | ✗ | ✓ (Sampling) |
3.3 架构对比
Function Call 架构:
┌─────────┐
│ AI 应用 │
│ │──→ 直接调用函数
│ │
└─────────┘
MCP 架构:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ AI 应用 │──→ │ Client │──→ │ Server │
│ (Host) │ │ │ │ │
└─────────┘ └─────────┘ └─────────┘
标准化协议
四、比喻理解
4.1 充电接口比喻
flowchart LR subgraph FC["📞 Function Call 时代"] direction TB A1["📱 iPhone"] A2["📱 Android"] A1 -->|"⚡ 专用协议"| B1["🔌 充电器 A"] A2 -->|"⚡ 专用协议"| B2["🔌 充电器 B"] A3["❌ 每个设备<br/>需要专用充电器"] end subgraph MCP["🔌 MCP 时代"] direction TB C1["📱 iPhone"] C2["📱 Android"] C1 -->|"⚡ USB-C 标准"| D["🔌 充电器"] C2 -->|"⚡ USB-C 标准"| D C3["✅ 统一接口<br/>所有设备通用"] end FC ~~~ MCP style FC fill:#ffebee,stroke:#c62828,stroke-width:2px,rx:10 style MCP fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,rx:10 style B1 fill:#ffe0b2,stroke:#f57c00 style B2 fill:#ffe0b2,stroke:#f57c00 style D fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
4.2 社交圈比喻
Function Call:
"打电话给某个朋友"
- 你需要知道他的电话号码
- 每次联系都要单独拨号
- 他换了号码你要重新存
MCP:
"加入一个社交圈,随时联系所有人"
- 加入群聊就能看到所有人
- 有人加入新群会自动通知
- 统一的方式联系任何人
4.3 餐厅比喻
Function Call:
每家餐厅有自己的点餐方式:
- 中餐厅:用中文点菜
- 西餐厅:用英文点菜
- 日料店:用日文点菜
→ 服务员要会多种语言
MCP:
统一的点餐系统:
- 所有餐厅用同一种点餐卡
- 顾客只需学会一种方式
- 新餐厅开业自动加入系统
→ 标准化、可扩展
五、MCP 的优势
5.1 一次开发,处处运行
flowchart TB A["👨💻 开发者<br/>编写 MCP Server"] A -->|"一次开发"| B["✅ 所有 AI 平台可用"] B --> C["🤖 Claude"] B --> D["💬 ChatGPT"] B --> E["💻 VS Code"] B --> F["⚡ Cursor"] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style B fill:#fff3e0,stroke:#f57c00,stroke-width:3px style C fill:#c8e6c9,stroke:#2e7d32 style D fill:#c8e6c9,stroke:#2e7d32 style E fill:#c8e6c9,stroke:#2e7d32 style F fill:#c8e6c9,stroke:#2e7d32
5.2 更丰富的 AI 能力
✅ MCP 提供三大原语:
┌─────────────────────────────────────┐
│ Tools(工具) → 执行操作 │
│ Resources → 读取数据 │
│ Prompts → 复用模板 │
└─────────────────────────────────────┘
vs
┌─────────────────────────────────────┐
│ Function Call │
│ 只能调用函数 │
└─────────────────────────────────────┘
5.3 动态发现能力
✅ MCP 的工作方式:
1. AI 连接 MCP 服务器
2. AI 问:"你有什么能力?" (tools/list)
3. 服务器回答:"我有这些工具..."
4. AI 自动知道能做什么
5. 服务器更新时,AI 会自动知道新能力
5.4 实时同步
✅ MCP 支持 Notifications:
当服务器的工具变化时
→ 服务器主动发送 notification
→ Client 立即收到更新
→ AI 立即可用新工具
无需重新配置,无需重启!
5.5 生态系统
✅ MCP 生态资源:
┌─────────────────────────────────────┐
│ 官方服务器 │
│ github.com/modelcontextprotocol/ │
│ servers │
├─────────────────────────────────────┤
│ 社区服务器列表 │
│ mcpservers.org │
├─────────────────────────────────────┤
│ Awesome MCP Servers │
│ github.com/punkpeye/awesome-mcp- │
│ servers │
└─────────────────────────────────────┘
数百个现成的 MCP 服务器可用!
六、工作原理对比
6.1 Function Call 工作原理
Step 1: 开发者在代码中定义函数
def get_weather(city): ...
Step 2: 注册到 AI 平台
client.register_function(get_weather)
Step 3: AI 决定调用
LLM → 输出函数调用 JSON
Step 4: 平台执行函数
执行 get_weather("北京")
Step 5: 返回结果给 AI
6.2 MCP 工作原理
Step 1: 开发者创建 MCP Server
@mcp.tool()
def get_weather(city): ...
Step 2: AI 通过 MCP Client 连接
Host → Client → Server (初始化握手)
Step 3: 动态发现能力
Client 发送 tools/list → Server 返回工具列表
Step 4: AI 选择工具
LLM 分析工具描述,决定调用哪个
Step 5: 执行并返回
Client 发送 tools/call → Server 执行 → 返回结果
Step 6: 实时更新(可选)
Server 变化 → 发送 notification → Client 更新
6.3 关键差异
| 环节 | Function Call | MCP |
|---|---|---|
| 工具定义 | 代码中硬编码 | 装饰器 + 自动发现 |
| 工具注册 | 手动注册到平台 | 自动通过 */list 发现 |
| 工具调用 | 平台专有格式 | 统一 JSON-RPC 格式 |
| 更新机制 | 需要重新配置 | 实时 notification |
七、什么时候用哪个?
7.1 简单场景:用 Function Call
✅ Function Call 适合:
- 只需要调用几个固定函数
- 只针对单一 AI 平台
- 不需要跨 AI 应用复用
- 简单的工具集成
- 快速原型开发
例子:
- 给自己的 ChatGPT 应用加个天气查询
- 内部使用的简单 AI 助手
7.2 复杂场景:用 MCP
✅ MCP 适合:
- 需要集成多个外部系统
- 希望工具能被多个 AI 应用使用
- 需要 Resources 和 Prompts 功能
- 需要动态更新能力
- 构建复杂的 AI Agent
- 企业级应用集成
例子:
- 企业知识库系统(连接多个数据库)
- 开发者工具套件(GitHub + 文件系统 + 终端)
- 个人 AI 助手(日历 + 邮件 + 文件 + Notion)
7.3 决策树
flowchart TB A["❓ 需要连接外部系统?"] A -->|"❌ 否"| B["✅ 不需要<br/>Function Call 或 MCP"] A -->|"✅ 是"| C["❓ 只用一种 AI 平台?"] C -->|"✅ 是"| D["📞 Function Call<br/>可能够了"] C -->|"❌ 否"| E["❓ 需要 Resources/Prompts?"] E -->|"✅ 是"| F["🔌 必须用 MCP"] E -->|"❌ 否"| G["❓ 需要动态更新?"] G -->|"✅ 是"| H["🔌 建议用 MCP"] G -->|"❌ 否"| I["❓ 想让别人也用?"] I -->|"✅ 是"| J["🔌 建议用 MCP"] I -->|"❌ 否"| K["📞 Function Call<br/>可能够了"] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style B fill:#c8e6c9,stroke:#2e7d32 style F fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px style H fill:#c8e6c9,stroke:#2e7d32 style J fill:#c8e6c9,stroke:#2e7d32
八、总结
8.1 核心对比表
| 特性 | Function Call | MCP |
|---|---|---|
| 本质 | 单个 AI 的函数调用机制 | AI 连接外部的标准协议 |
| 范围 | 应用内部 | 生态系统 |
| 标准化 | 各平台私有 | 开放标准 |
| 能力 | 仅函数调用 | Tools + Resources + Prompts |
| 发现 | 静态注册 | 动态发现 |
| 更新 | 需要重新配置 | 实时通知 |
| 开发成本 | 每平台单独开发 | 一次开发,多处使用 |
| 未来 | 继续存在但局限 | 行业统一标准趋势 |
8.2 一句话总结
简单理解
Function Call = “打电话给某个朋友”(一对一,需要知道号码)
MCP = “加入一个社交圈”(一对多,自动发现,实时更新)
MCP 是 Function Call 的升级版和统一版。
九、延伸阅读
- 01-MCP 的定义与意义 - MCP 基本概念
- 02-MCP 的架构与核心概念 - 深入理解 MCP
- Function Call - Function Call 基础
- MCP 总览 - 返回 MCP 模块首页
| 日期 | 更新内容 |
|---|---|
| 2026-03-18 | 初始版本 |
| 2026-04-13 | 基于参考资料重写,补充决策树和对比表 |