MCP client(工具客户端) 协议
别名:
工具客户端
工具的使用者:发现 server 的工具表,把远程工具当作本地工具调用。连接建模成状态机,先握手(initialize → notifications/initialized)后干活。见[第 21 章](/chapters/21-mcp-v08/)。
它是什么
MCP client(工具客户端)是工具的使用者:发现 server 的工具表(tools/list),把远程工具当作本地工具调用(tools/call)。我们的 Agent 就是 client。连接被建模成状态机——先握手、后干活:
new → initialized → ready → closed
| 状态 | 到达条件 | 合法操作 |
|---|---|---|
new |
创建连接 | 只能 initialize()(一次) |
initialized |
initialize 成功响应到达 |
只能 notifyInitialized() |
ready |
已发 notifications/initialized |
tools/list、tools/call、close() |
closed |
close() 或进程退出 |
无(一切调用拒绝) |
握手时序与实现骨架
完整握手是四步:initialize(request, id:1)→ 成功响应 → notifications/initialized(notification,无 id)→ 进入 ready。两条时序纪律:notifications/initialized 必须在任何工具调用之前发出(server 端以它为「可以干活」的信号);initialize 只发一次(失败的握手可重试,但一个在途的握手不允许再来一个)。实现是「子进程 + pending 表 + 状态机」三件套:pending Map 用 id 记住每个在途请求(json-rpc 的 id 配对),响应乱序到达也能对上号。
在本教程的位置
第 21 章手写了最小 client,并通过 registerMcpTools 把远程工具并入本地注册表:listTools() 的结果变成普通注册表项(schemaToParams + 转发 executor),命名空间前缀(如 mcp__echo)防重名,risk 选项让远程工具自动继承 ch18 的风险分级与审批门——并入之后,远程工具和 get_time 没有任何区别。到第 22 章,MCP client 成为 subagent 获取外部能力的标准通道。