前置知识

阅读本文前,建议先了解:


一、先回顾: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 CallMCP
定位单个 AI 的函数调用能力AI 连接外部的标准协议
范围单个应用内部整个生态系统
标准化各平台私有标准开放统一标准
类比每个品牌的私有充电口USB-C 统一接口

3.2 能力对比

能力Function CallMCP
调用函数✓ (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 CallMCP
工具定义代码中硬编码装饰器 + 自动发现
工具注册手动注册到平台自动通过 */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 CallMCP
本质单个 AI 的函数调用机制AI 连接外部的标准协议
范围应用内部生态系统
标准化各平台私有开放标准
能力仅函数调用Tools + Resources + Prompts
发现静态注册动态发现
更新需要重新配置实时通知
开发成本每平台单独开发一次开发,多处使用
未来继续存在但局限行业统一标准趋势

8.2 一句话总结

简单理解

Function Call = “打电话给某个朋友”(一对一,需要知道号码)

MCP = “加入一个社交圈”(一对多,自动发现,实时更新)

MCP 是 Function Call 的升级版统一版


九、延伸阅读

日期更新内容
2026-03-18初始版本
2026-04-13基于参考资料重写,补充决策树和对比表