很多人在用 MCP(Model Context Protocol)或 Tool Calling 时,都会有一个疑问:
🤔 AI 是怎么知道“什么时候该用工具、该用哪个工具”的?
🤔 它是自动触发的吗?还是有人写了 if else?
这篇文章用人话 + 示例 + 流程图,一次性讲清楚。
AI 并不会“自动调用 MCP 工具”,而是:
👉 根据用户意图,生成一条「工具调用建议」
👉 由宿主系统(Agent / Host)真正去执行工具
一个 MCP 工具通常长这样:
{
"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 判断 |
|---|---|
| 什么是 MCP? | 直接文本回答 |
| 帮我生成一段 Java 代码 | 直接文本 |
| 查一下用户 123 的信息 | 需要工具 |
| 查询订单实时状态 | 需要工具 |
AI 会把:
description做一次 语义对齐
用户说:
帮我查一下 userId 是 123 的用户信息
工具描述:
根据用户ID查询用户的基本信息
✅ 语义高度匹配 → 工具命中
📌 并不是靠名字,而是靠“像不像在干同一件事”。
生成一条「tool_call 调用意图」
真正调用工具的是你的系统(Agent / Host)。
下面是一个 标准 MCP 调用流程图 👇
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 决定使用工具时,它返回的内容大概是:
{
"tool_call": {
"name": "get_user_info",
"arguments": {
"userId": "123"
}
}
}
📌 注意:
{
"name": "get_order_status",
"description": "根据订单号查询订单当前状态",
"input_schema": {
"type": "object",
"properties": {
"orderId": { "type": "string" }
},
"required": ["orderId"]
}
}
帮我看看 8899 这个订单现在怎么样了
➡️ 决定使用工具
{
"tool_call": {
"name": "get_order_status",
"arguments": {
"orderId": "8899"
}
}
}
{
"status": "已发货",
"trackingNo": "SF123456"
}
订单 8899 已经发货,物流单号是 SF123456。
❌ doTaskV3
✅ 根据订单号查询订单状态
查一下订单状态
❌ 没有 orderId → 不调用
例如:
除非明确要求,否则不要调用工具
📌 所以 实时 / 权威数据一定要走工具。
MCP 工具不是被 AI“自动调用”的,而是:
AI 负责判断 + 生成调用意图
系统负责真正执行