💡 说明:本文为便于理解,会将流程描述为"AI发出请求""AI调用API"等。严格来说,AI模型本身不直接执行网络通信。实际执行的是AI运行所在的客户端环境(如应用程序、MCP客户端)。AI模型的作用是生成符合规范的请求指令,由客户端代为发送和接收。本文是对真实过程的简化,不影响对MCP核心概念的理解。
一、从对话到行动:工具调用的出现 🗣️➡️⚡
最早的大语言模型,做的事很简单:你问,它答。它的全部能力就是自己训练时学到的知识。
但很快人们发现一个问题:模型的知识是静态的、过时的。你问它今天的天气,它不知道;你让它查一下明天的航班,它做不到。
于是,一个重要的能力被加入了AI系统——工具调用 🛠️。它的核心思路是:
当AI遇到自己不知道的事情(比如实时天气),它可以输出一个"请求"——请外部系统帮我查一下杭州的天气。外部系统收到这个请求后,去调用真实的API(应用程序之间的通信接口),把结果返回给AI,AI再回答用户。
2023年6月,OpenAI率先推出了 Function Call 功能,Claude、Gemini等也陆续跟进。这个能力让AI从"只会聊天"变成了"可以行动" 🚀
📌 关于 Function Call 与 MCP 的关系,详见第十章。
二、新问题:调用方式太乱 🌀
工具调用解决了"AI能不能用工具"的问题,但很快暴露了下一个问题:调用方式不统一。
每个平台、每个模型,调用工具的格式都不一样:
🔧 A模型 → 输出 JSON 格式A
🔧 B模型 → 输出 JSON 格式B
🔧 C模型 → 输出 JSON 格式C
↓
😵 每个API参数格式不同、认证方式不同、错误处理不同……
如果你想让AI调用你公司内部的10个工具,你可能要:
为 GPT 写一套集成逻辑
为 Claude 再写一套
为其他模型再写第三套
维护成本极高 💸
三、MCP的诞生:统一协议 🤝
2024年11月,Anthropic提出了 MCP(模型上下文协议) 📋
MCP是一个开放协议,并非Anthropic产品独占。任何AI模型(包括GPT、Gemini等)和任何工具都可以遵循这一标准进行集成。
它想做的事情很明确:给AI调用工具制定一套统一的标准。
就像 USB 统一了设备接口一样,MCP试图统一AI与外部工具的连接方式 🔌
┌──────────────────────────────────────────────┐
│ 有了 MCP 之后 │
│ │
│ AI 不需要知道: │
│ ❌ 每个工具的 API 地址 │
│ ❌ 每个工具的参数格式 │
│ ❌ 每个工具的认证方式 │
│ │
│ AI 只需要知道: │
│ ✅ 工具名 │
│ ✅ 按 MCP 标准格式发出请求 │
│ │
│ 剩下的 → MCP 服务器处理 ✨ │
└──────────────────────────────────────────────┘
四、一个绕不开的疑问 🤔
但这里有一个直觉性质疑:
MCP在AI和真实API之间多加了一层。多一层就意味着多一次转发、多一次封装、多一次解析。单次请求的效率不是降低了吗?
直接调用: AI ──────→ API ──────→ 结果 (少环节 ⚡)
MCP调用: AI ──→ MCP客户端 ──→ MCP服务器 ──→ API ──→ 结果 (多环节 🐢)
环节更多了,速度更慢了,那为什么还要用MCP?直接让AI调API不是更简单高效吗?
这个疑问是对的。接下来,我们对比两种方式的完整流程,然后回到这个问题,给出答案。
五、方式一:直接API调用(传统模式) 📡
当用户问"杭州今天天气怎么样?",直接API调用的流程如下:
① 用户
│ 提问:"杭州今天天气怎么样?"
▼
② AI模型
│ 理解意图,决定调用工具
│ 输出函数调用指令:{"function":"get_weather","arguments":{"city":"杭州"}}
▼
③ 开发者编写的客户端
│ 根据预先配置的 API 地址和密钥,发起真实 HTTP 请求
▼
④ 外部 API
│ 天气 API 返回数据:{"condition":"晴","temp":26}
▼
⑤ 开发者编写的客户端
│ 将结果回传给 AI
▼
⑥ AI模型
生成自然语言回答:"杭州今天晴,26℃。" ☀️
🔑 关键特征:每个工具都需要开发者编写独立的调用代码(URL、参数、认证、解析)。
六、方式二:通过MCP调用 🔄
同样的用户问题,通过MCP调用的流程如下:
① 用户
│ 提问:"杭州今天天气怎么样?"
▼
② AI模型
│ 理解意图,按 MCP 协议构造标准请求
│ 输出:{"method":"tools/call","params":{"name":"weather_api","arguments":{...}}}
▼
③ MCP客户端(框架提供)
│ 将请求转发给 MCP 服务器
▼
④ MCP服务器
│ 解析请求,查找工具注册表,找到真实 API 地址和密钥
▼
⑤ MCP服务器
│ 发起真实 HTTP 请求
▼
⑥ 外部 API
│ 天气 API 返回数据
▼
⑦ MCP服务器
│ 将结果封装成 MCP 标准格式
▼
⑧ MCP客户端
│ 将结果返回给 AI
▼
⑨ AI模型
生成自然语言回答:"杭州今天晴,26℃。" ☀️
🔑 关键特征:工具在MCP服务器中注册一次,之后任何支持MCP的AI都可调用,无需重复编码。
七、两种方式的核心区别 ⚖️
┌─────────────────┬────────────────────┬────────────────────┐
│ 对比维度 │ 直接 API 调用 │ MCP 调用 │
├─────────────────┼────────────────────┼────────────────────┤
│ 谁存储密钥 │ 🔑 开发者客户端代码 │ 🔒 MCP 服务器配置 │
│ 谁执行HTTP请求 │ 👨💻 开发者编写的客户端 │ 🖥️ MCP 服务器 │
│ AI需要知道什么 │ 📝 函数名+参数说明 │ 📋 工具名+参数 │
│ 开发者需要做什么 │ 😫 每个工具写调用代码 │ 😊 注册一次工具配置 │
│ 工具变更时 │ 💥 改每个客户端+重部署 │ 🔄 只改服务器配置 │
│ 多个AI共享工具 │ ❌ 每个AI单独集成 │ ✅ 所有AI直接复用 │
│ 单次请求环节 │ ⚡ 6步 │ 🐢 9步 │
└─────────────────┴────────────────────┴────────────────────┘
📌 结论:MCP环节更多,单次请求的理论延迟更高。
八、为什么还要用MCP?(回应疑问) 💡
MCP不是为了优化单次请求的延迟,而是为了解决规模问题。
当工具数量少、调用简单时,直接调用足够;但当系统复杂到一定程度,MCP的优势就体现出来:
工具数量 ──────────────────────────→
少量工具 大量工具
┌──────────┐ ┌──────────────┐
│ 直接调用 │ → │ MCP 调用 │
│ ✅ 简单 │ │ ✅ 可维护 │
│ ✅ 快速 │ │ ✅ 安全 │
│ ✅ 延迟低 │ │ ✅ 易扩展 │
└──────────┘ └──────────────┘
↑ ↑
推荐 👍 推荐 👍
MCP解决的四个核心问题 🎯
1️⃣ 避免重复造轮子
几十个工具,每个AI应用都要为每个工具编写调用代码?MCP一次注册,所有AI共享。
没有 MCP: 有了 MCP:
AI-A ──→ 写调用代码 ──→ 工具1 AI-A ──┐
AI-B ──→ 写调用代码 ──→ 工具1 AI-B ──┼──→ MCP服务器 ──→ 工具1
AI-C ──→ 写调用代码 ──→ 工具1 AI-C ──┘ ↑
😫 重复3次! ✅ 注册1次!
2️⃣ 工具变更不求人
API地址改了?直接调用需要改所有客户端代码;MCP只需改服务器配置,所有AI自动生效 🔄
3️⃣ 安全集中管控
没有 MCP: 有了 MCP:
🔑 密钥散落在无数客户端 🔒 密钥集中存储在服务器
⚠️ 泄露风险高 ✅ AI和客户端都接触不到
❌ 难以统一控制权限 ✅ 统一控制权限
❌ 无法记录调用日志 ✅ 完整调用日志审计
4️⃣ 跨模型复用
同时使用GPT、Claude、Gemini?没有MCP时,每个模型都要单独集成。有MCP,一套服务器服务所有模型 🌐
🌐 一个类比:DNS
互联网早期,你要访问网站需要记住IP地址(如 93.184.216.34)。直接输入IP最快,但你能记住几个?
DNS增加了解析层,让你输入 example.com 即可——多了毫秒级延迟,但换来了无限扩展能力。
输入 IP 地址 → 最快 ⚡ 但记不住 🤯
↓
DNS 解析 → 多一层 🔄 但好记 😊 可扩展 📈
↓
MCP 也是如此 → 多一层 🔄 但统一 🤝 可扩展 📈
MCP就是AI世界的DNS。 🌍
九、如何选择? 🧭
🏠 个人项目,1-2个稳定工具 → 直接API调用 —— 简单、快速、延迟低
🏢 企业内部,几十个工具 → MCP —— 可维护、安全、易扩展
🔁 工具频繁变更 → MCP —— 不用修改每个AI应用
🤖 多个AI需要共享工具 → MCP —— 一次配置,到处使用
🔐 需要权限控制和审计 → MCP —— 集中管理,可审计
你的场景是?
│
├── 工具少(1-2个)且稳定 ──→ 直接调用 ✅
│
└── 以下任一条件满足 ─────→ MCP ✅
├── 工具多(10+)
├── 工具经常变
├── 多个AI共享
└── 需要安全审计
十、补充:Function Call 是什么? 📚
你可能还听过 Function Call,它和MCP是什么关系?
Function Call 是直接API调用的一种实现模式,由OpenAI在2023年6月率先提出。它的流程是:
模型输出结构化的函数调用指令(如 {"function":"get_weather","arguments":{...}})
开发者客户端收到指令后,自己写代码去调用真实API
客户端把API返回结果再送回模型
本质上,Function Call 仍属于"直接API调用"——模型的输出格式被标准化了,但每个工具的调用逻辑仍需开发者手动编写。
而 MCP 更进一步,把整个调用链全部标准化,开发者不再需要为每个工具编写调用代码。
关系简图:
🏗️ 工具调用(设计模式)
│
├── 📡 直接API调用(传统方式)
│ → 开发者需编写每个工具的调用代码
│ │
│ └── 📋 Function Call(输出格式标准化)
│ → 模型输出格式统一了,但调用逻辑仍需手写
│
└── 🔌 MCP调用(标准化协议)
→ 从请求到执行到返回,全链路标准化
→ 工具一次注册,AI直接调用 ✨
写在最后 ✍️
MCP不是银弹。它增加了一层抽象,付出了延迟的代价。但它解决了一个真实的问题:当工具多起来、系统大起来、AI多起来之后,统一协议带来的可维护性和安全性,远超那毫秒级的损失。
理解MCP的核心,就是记住四点:
┌─────────────────────────────────────────┐
│ │
│ 🔌 它是什么:统一AI调用外部工具的开放协议 │
│ │
│ 🚫 它不是什么:不是工具本身, │
│ 而是调用工具的规范 │
│ │
│ ✅ 解决了什么:多工具场景下的 │
│ 统一性、可维护性、安全性 │
│ │
│ ⚖️ 付出了什么:单次请求多一层转发, │
│ 延迟略高 │
│ │
└─────────────────────────────────────────┘
选择哪种方式,取决于你的场景。如果你的系统只有一个工具且不常变更,直接调用完全足够;如果你的系统正在变得复杂,MCP可能是你需要的那个"统一接口" 🔌
本文旨在帮助普通用户理解MCP的核心概念,不涉及具体的代码实现和部署细节。
夜雨聆风