先说结论
许多人在初学阶段容易混淆两个概念:

- MCP Server 是否等同于墨迹天气、高德地图这类第三方 API?——并非如此
- MCP 发布后,Function Calling 是否会被淘汰?——同样错误
正确的理解是:MCP 是一套标准化协议,它并没有替代任何现有技术,而是让 AI 应用对接外部工具的过程变得更简单、更统一。
一个生活类比
假设你家里有各种电器:台灯、风扇、手机充电器……
过去,每种电器都有独特的插头形状,买一台新设备就需要配一个专用插座,非常麻烦。
后来行业统一了 USB 接口标准,所有设备都支持,即插即用。
MCP 正是 AI 领域的“USB 接口标准”。
- 电器 = 各类外部工具(天气、地图、数据库)
- 插座 = AI 应用(千问、Claude、Cursor)
- USB 标准 = MCP 协议
MCP 和 Function Calling 是什么关系?
很多人误以为 MCP 是 Function Calling 的替代品,实则关系更微妙。
Function Calling 好比 AI 的“手”,而 MCP 相当于“手套的标准尺码”。
手还是那双手,但戴上标准手套后,无论抓什么物体都能适配——不再需要每次量身定制手套。
从调用链路上看就一目了然:
没有 MCP 时:LLM --> 自己写代码对接 --> 天气 APILLM --> 自己写代码对接 --> 地图 APILLM --> 自己写代码对接 --> 数据库(每个工具都需要单独开发,改动一处就牵动全局)有了 MCP 之后:LLM --> MCP Client --> MCP Server --> 天气 APILLM --> MCP Client --> MCP Server --> 地图 APILLM --> MCP Client --> MCP Server --> 数据库(中间协议统一后,更换工具就像更换插头一样简单)
四层架构,一次说清楚
MCP 体系中包含四个角色,各司其职。
flowchart TDA[用户提问] --> B[MCP Hostn运行 LLM 的应用]B --> C[MCP Clientn协议连接器]C --> D[MCP Servern工具适配器]D --> E[第三方 APIn真正的数据源]style A fill:#f0f4ff,stroke:#7c9ef5style B fill:#dbeafe,stroke:#3b82f6style C fill:#dcfce7,stroke:#22c55estyle D fill:#fef9c3,stroke:#eab308style E fill:#fce7f3,stroke:#ec4899
逐层拆解说明:
第一层 MCP Host(应用层) 即你使用的 AI 软件,例如日常的千问 App、Claude Desktop、Cursor 编辑器。它负责运行 LLM,接收你的问题,并决定调用哪些工具。
第二层 MCP Client(协议层) 相当于一个翻译官。当 Host 提出“我要查天气”的指令时,Client 会将该请求转换为符合 MCP 协议的格式,并发送给对应的 Server。
第三层 MCP Server(适配层) 这是最容易混淆的部分——它并非天气 API 本身,而是封装了天气 API 的适配程序。它既理解 MCP 协议,也懂得如何调用天气 API,起到中间的桥梁作用。
第四层 第三方 API(数据源) 这才是真正提供数据的来源,例如墨迹天气、高德地图、你的业务数据库。
用一次查天气来走一遍流程
假设你询问:“上海今天天气怎么样?”
sequenceDiagramparticipant 用户participant Host as MCP Host(千问)participant Client as MCP Clientparticipant Server as MCP Server(天气)participant API as 墨迹天气 API用户->>Host: 上海今天天气怎么样?Host->>Client: 调用"查天气"工具,城市=上海Client->>Server: 发送 MCP 协议请求Server->>API: HTTP 请求墨迹天气API-->>Server: 返回 {temp: 13, 天气: 小雨}Server-->>Client: 格式化为 MCP 响应Client-->>Host: 返回结果Host-->>用户: 上海今天13度,小雨,记得带伞
不难看出:Host 完全不关心数据从何而来,它只负责发起请求并接收结果。这正是分层设计的优势所在。
用微服务来类比,程序员秒懂
如果你有后端开发经验,一定接触过 OpenFeign 或 gRPC 这类 RPC 框架,MCP 的思路与之高度相似。
flowchart LRsubgraph MCP 世界direction TBA1[MCP Host] --> B1[MCP Client] --> C1[MCP Server] --> D1[墨迹天气]endsubgraph 微服务世界direction TBA2[商品服务] --> B2[OpenFeign] --> C2[库存服务] --> D2[菜鸟物流]endstyle A1 fill:#dbeafe,stroke:#3b82f6style B1 fill:#dcfce7,stroke:#22c55estyle C1 fill:#fef9c3,stroke:#eab308style D1 fill:#fce7f3,stroke:#ec4899style A2 fill:#dbeafe,stroke:#3b82f6style B2 fill:#dcfce7,stroke:#22c55estyle C2 fill:#fef9c3,stroke:#eab308style D2 fill:#fce7f3,stroke:#ec4899
对照关系一目了然:
| MCP 世界 | 微服务世界 | 核心职责 |
|---|---|---|
| MCP Host | 商品服务 | 核心业务,发起调用 |
| MCP Client | OpenFeign | 协议层,统一通信方式 |
| MCP Server | 库存服务 | 封装逻辑,对外暴露接口 |
| 墨迹天气 | 菜鸟物流 | 真正的数据提供方 |
唯一的差异在于:MCP Client 是一个独立运行的本地进程,而 OpenFeign 是内嵌在代码中的 SDK。原因也很简单——AI 应用常常需要访问本地文件或本地数据库,因此需要一个独立进程来执行该任务。
为什么会有 MCP?它解决了什么问题?
这个问题可以借助微服务的演进过程来理解:
flowchart LRA[单体应用n数据写死] -->|扩展需求增加| B[点对点集成n耦合严重] -->|维护成本爆炸| C[OpenFeign + 微服务n标准化解耦]D[只有 LLMn靠训练数据] -->|需要实时数据| E[硬编码对接工具n每个都要单独写] -->|工具越来越多| F[MCP 标准协议n即插即用]style A fill:#fce7f3,stroke:#ec4899style B fill:#fef9c3,stroke:#eab308style C fill:#dcfce7,stroke:#22c55estyle D fill:#fce7f3,stroke:#ec4899style E fill:#fef9c3,stroke:#eab308style F fill:#dcfce7,stroke:#22c55e
两条演进路径几乎完全一致:
- 初期只管能用就行,简单直接
- 业务复杂度提升,开始点对点对接,耦合严重
- 维护成本过高,最终引入标准协议,统一规范
MCP 出现的根本原因与微服务出现的理由相同——系统规模扩大后,必须通过解耦来降低复杂度。
总结
- Function Calling 是 LLM 调用工具的底层能力,并未被取代
- MCP 在其之上增加了一层标准协议,使工具对接变得统一规范
- MCP Server 是适配器,而非数据源本身
- 完整体系分为四层:Host(应用)> Client(协议)> Server(适配)> API(数据)
- 理解困难?回想 USB 接口,或参考 OpenFeign 与微服务架构,本质相同
