tools/list 和 tools/call 分别是什么?一个 MCP Client 从连接到调用工具要走哪几步?
tools/list 是向 Server 要当前可用工具清单,返回每个工具的 name、description 和 inputSchema(参数结构);tools/call 是按清单里的 name 加 arguments 真正执行一个工具。完整步骤:建立连接 → initialize 握手 → 发 notifications/initialized 确认就绪 → tools/list 拿清单 → 按 inputSchema 组装参数发 tools/call。
完整回答
tools/list 的价值是让 Host 拿到工具定义后喂给模型做选择——它对应 function calling 里的 tools 参数,模型看到 name、description、inputSchema 才知道有什么可调、怎么填参,所以清单以握手后的 tools/list 为准,不该在 Client 里硬编码。tools/call 的 params 固定是 name(字符串)加可选 arguments(对象),结果放在 content 数组里返回;注意工具执行失败不是协议错误,按约定返回带 isError: true 的正常结果。顺序不能乱:没完成 initialize 和 initialized 通知就调用,属于跳过握手。以本站 POST /api/mcp 为例:tools/call 缺 name 或参数结构不合法返回 -32602;调用未暴露的工具名同样返回 -32602,并在 error.data.exposedTools 里列出可用工具。
加分信息
- 把 tools/list 与 function calling 的 tools 参数对应起来,说明模型选工具的信息来源
- 指出工具清单应以 tools/list 动态获取而非硬编码,便于 Server 侧增删工具
常见问题
- 从不调 tools/list,把工具名和参数硬编码在 Client 里
- 以为 tools/call 执行失败会返回协议错误码,其实走结果里的 isError 字段
面试官可能追问
- 工具列表在会话中途变化了,Client 怎么感知?(提示:回看 capabilities 里的 listChanged)
- tools/call 返回 isError: true 时,上层 Agent 应该怎么处理?
/labs/mcp-tools 完整演示 initialize → notifications/initialized → tools/list → tools/call 四步轨迹,每帧都是真实请求/响应原文;站内 MCP server 只暴露 2 个只读工具,写工具 save_learning_note 不经 MCP 暴露,调它会收到 -32602。