很多人在用 MCP(Model Context Protocol)或 Tool Calling 时,都会有一个疑问:
🤔 AI 是怎么知道"什么时候该用工具、该用哪个工具"的?
🤔 它是自动触发的吗?还是有人写了 if else?
这篇文章用人话 + 示例 + 流程图,一次性讲清楚。
一、先说结论(一句话版)
AI 并不会"自动调用 MCP 工具",而是:
👉 根据用户意图,生成一条「工具调用建议」
👉 由宿主系统(Agent / Host)真正去执行工具
二、在 AI 眼里,MCP 工具是什么?
❌ MCP 工具 ≠ 插件
❌ MCP 工具 ≠ 一段代码
✅ 在 AI 眼里,MCP 工具只是一段「结构化说明」
一个 MCP 工具通常长这样:
json
{
"name": "get_user_info",
"description": "根据用户ID查询用户的基本信息",
"input_schema": {
"type": "object",
"properties": {
"userId": { "type": "string" }
},
"required": ["userId"]
}
}
AI 只能看到三样东西:
内容
作用
name
工具叫什么
description
工具是干嘛的
input_schema
需要什么参数
📌 AI 并不知道工具背后是数据库、HTTP、Dubbo 还是 Spring Boot。
三、AI 是如何判断"要不要用工具"的?
本质:这是一个「意图判断问题」
AI 在回答每个问题前,都会做一个隐式判断:
"这个问题我能靠'编'回答吗?
还是必须借助外部能力?"
常见判断结果
用户问题
AI 判断
什么是 MCP?
直接文本回答
帮我生成一段 Java 代码
直接文本
查一下用户 123 的信息
需要工具
查询订单实时状态
需要工具
四、AI 是如何"选中"某一个 MCP 工具的?
🔑 关键:语义匹配
AI 会把:
- 用户输入
- 工具的
description
做一次 语义对齐
示例
用户说:
帮我查一下 userId 是 123 的用户信息
工具描述:
根据用户ID查询用户的基本信息
✅ 语义高度匹配 → 工具命中
📌 并不是靠名字,而是靠"像不像在干同一件事"。
五、AI 并不会真的调用工具(这一点很重要)
AI 做的事情只有一步:
生成一条「tool_call 调用意图」
真正调用工具的是你的系统(Agent / Host)。
六、完整调用流程(重点)
下面是一个 标准 MCP 调用流程图 👇
rust
sequenceDiagram
participant User as 用户
participant LLM as 大模型(AI)
participant Host as Agent / 宿主系统
participant Tool as MCP 工具服务
User ->> LLM: 提出问题
LLM ->> LLM: 判断是否需要工具
LLM -->> Host: 返回 tool_call(结构化)
Host ->> Tool: 执行工具调用
Tool -->> Host: 返回执行结果
Host ->> LLM: 把结果再喂给模型
LLM ->> User: 输出最终自然语言回答
七、AI 返回的不是"文字",而是结构化指令
当 AI 决定使用工具时,它返回的内容大概是:
json
{
"tool_call": {
"name": "get_user_info",
"arguments": {
"userId": "123"
}
}
}
📌 注意:
- 用户 看不到 这个
- 这是给程序用的,不是给人看的
八、一个完整真实例子(从提问到回答)
1️⃣ MCP 工具定义
json
{
"name": "get_order_status",
"description": "根据订单号查询订单当前状态",
"input_schema": {
"type": "object",
"properties": {
"orderId": { "type": "string" }
},
"required": ["orderId"]
}
}
2️⃣ 用户提问
帮我看看 8899 这个订单现在怎么样了
3️⃣ AI 内部判断
- 需要实时数据 ❌ 不能编
- 有对应工具 ✅
- 参数明确(8899)✅
➡️ 决定使用工具
4️⃣ AI 返回 tool_call
json
{
"tool_call": {
"name": "get_order_status",
"arguments": {
"orderId": "8899"
}
}
}
5️⃣ 工具执行结果
json
{
"status": "已发货",
"trackingNo": "SF123456"
}
6️⃣ AI 最终回复用户
订单 8899 已经发货,物流单号是 SF123456。
九、什么情况下 AI "不会"调用 MCP 工具?
常见 4 种原因
1️⃣ 工具描述太抽象
❌ doTaskV3
✅ 根据订单号查询订单状态
2️⃣ 参数不完整
查一下订单状态
❌ 没有 orderId → 不调用
3️⃣ 系统 prompt 限制
例如:
除非明确要求,否则不要调用工具
4️⃣ AI 认为"可以编一个合理答案"
📌 所以 实时 / 权威数据一定要走工具。
十、一句话总结(记住这句就够了)
MCP 工具不是被 AI"自动调用"的,而是:
AI 负责判断 + 生成调用意图
系统负责真正执行
十一、如果你是工程侧,这三点最重要
- 工具 description ≈ prompt
- 参数 schema 越清晰,命中率越高
- AI 只是大脑,Agent 才是手