分两种完全独立场景,讲清「自动识别 AI 调用」和「手动 callTool 主动调用」
一、场景 1:VSCode Copilot / Claude Desktop 这类 AI 客户端(日常开发用)
1. 自动识别 + AI 自动调用(无需你写callTool)
- MCP Server 启动握手时,会把所有
server.tool()的名称、描述、inputSchema上报给客户端; - 客户端把全部工具元数据注入 LLM 上下文;
- 当你对话提问时,大模型会自动判断是否需要调用工具:
- 例如你问:
帮我生成一条随机用户写入json - LLM 识别匹配
create-random-user工具,客户端自动底层发送tools/call请求; - 全程不用开发者手动写
callTool,完全是 AI 自动驱动。
- 例如你问:
执行链路
你聊天提问 → LLM 识别需要工具 → 客户端自动执行底层callTool→ 服务端执行逻辑 → 结果返回对话。
二、场景 2:自建脚本 / CLI 客户端(你写 Node 代码控制 MCP)
只能手动callTool()主动调用,不存在自动识别
如果你自己用@modelcontextprotocol/sdk/client写独立脚本、终端工具:
typescript
运行
// 必须手动写这一行主动发起调用,不会有任何AI自动帮你调用 const res = await mcp.callTool({ name: "create-random-user", arguments: {} });- 这里没有大模型参与判断;
- 程序、你自己的代码决定什么时候、调用哪个工具;
- 不存在 “自动识别”,完全由代码主动触发。
三、核心区分对比表
表格
| 模式 | 触发方式 | 是否需要手写callTool | 谁决定调用工具 | 代表客户端 |
|---|---|---|---|---|
| AI 自动调用 | 自动识别工具,模型自主发起 | 不需要,底层插件内部封装 | LLM 大模型 | VS Copilot、Claude Desktop、Cursor |
| 代码手动调用 | 代码主动发起 | 必须手写mcp.callTool() | 开发者代码逻辑 | 自建 Node CLI、自动化脚本、第三方程序 |
四、关键补充知识点
工具列表是统一自动同步的无论哪种模式,客户端启动时都会自动拉取全部工具元数据(
tools/list),这个同步动作是自动的; 区别只在于:谁来决定要不要执行 call。- AI 客户端:LLM 判断执行 call
- 自建脚本:你的代码判断执行 call
底层通信报文完全一致 不管是 AI 自动调用,还是你手动写
callTool,发给 MCP Server 的 JSON-RPC 报文一模一样:json
{"method":"tools/call","params":{"name":"xxx","arguments":{}}}结合你
create-random-user的完整例子
例子 A:VS Copilot 自动调用(不用写 callTool)
你输入:生成随机用户
- Copilot LLM 自动识别对应工具;
- 插件底层静默执行 callTool;
- 服务端内部走 sampling 反向调用模型生成用户;
- 结果直接输出聊天框。
例子 B:自建 CLI 手动调用(必须写 callTool)
typescript
运行
// 代码主动触发,没有AI自动识别逻辑 const res = await mcp.callTool({ name: "create-random-user", arguments: {} }); console.log(res.content[0].text);五、一句话总结
- 带 AI 的可视化客户端(Copilot/Claude):工具会被自动识别,大模型可自动发起工具调用,你不用手写
callTool; - 纯代码自建 MCP 客户端脚本:没有 AI 自动判断,只能你手动调用
callTool()主动执行工具; - 两种场景底层通信标准完全相同,只是上层触发主体不同。