Skip to content
预计 1 分钟右侧目录可快速定位

一次 MCP 交互为什么可能多轮:MRTR、Elicitation 与 Extensions ​

前置:MCP 谁可以调用什么:Authorization、OAuth 与 Enterprise Managed Auth
核心问题:一次 MCP 请求需要多轮询问用户或扩展交互时,谁保存中间状态,怎样防止协议交互越过 Harness 的控制边界?

创建工单时缺少 project id,Server 可以明确返回还需要什么输入;Host 收集用户补充后继续,而不是把“等待用户”绑在某条 HTTP 连接或进程内存里。多轮是 请求语义上的状态推进,不是把旧式长连接 session 重新包装回来。

Multi Round-Trip Requests (MRTR) ​

普通 RPC 假设一次 request 很快得到一次 response;MRTR 允许同一个逻辑请求在完成前暂停并要求额外信息。

例如 Tool 想创建生产资源,但还缺 region:

text
Host → tools/call
Server → input_required(region)
Host 收集用户输入 / 做 policy check
Host → continuation request(region=...)
Server → final result

它解决的是协议层的“请求尚未完成,需要补输入”,不是 Agent 自己决定再思考一轮。Host 仍然掌握用户交互、authorization 和是否继续请求的控制权。

Elicitation / input_required ​

Elicitation 是 MRTR 的具体用户输入场景:server 明确描述缺少什么,Host 决定如何向用户/上层系统收集并再次调用。Host 必须保留 approval/security 边界,不能把 server 请求直接当高权限用户指令。

它是协议化的等待/输入边界,不应被当普通 tool error 自动 retry。

Extensions Framework ​

Extensions Framework 允许非核心能力独立协商和演进。本文只建立“Core 不因新增能力而重新膨胀”的边界;长任务 Tasks Extension 的 durable handle、poll/cancel 与 Harness 映射在下一篇单独讲。

实现必须显式识别 extension support 和版本,未知扩展应可安全忽略/拒绝。

多轮协议交互和 Agent Loop 不是一回事 ​

一个 MCP 操作在完成前可能需要额外往返,例如 Server 需要 Host 提供缺失输入或触发用户交互。此时可以把控制过程理解为:

text
Runtime invokes MCP capability
        ↓
MCP interaction needs more input
        ↓
Host handles protocol-level round trip / elicitation
        ↓
result becomes Tool observation
        ↓
Agent Loop continues

关键边界是:协议内部多一次 round trip,不等于 Agent 自动多做了一轮推理。 Runtime 仍然掌握 Run 状态;如果交互需要等待用户数小时,则应转成 durable wait/approval,而不是让一个 HTTP coroutine 永久挂住。

Extensions 也应当通过 capability detection 明确启用。不要因为某个 Server 实现了扩展,就让核心 Runtime 直接依赖扩展专有对象;通过 MCP Adapter 把它收敛成内部统一状态和事件。

Failure Modes ​

把 MRTR 实现成长生命周期 Transport Session ​

症状: Server 依赖同一进程/连接保存中间状态,连接断开后无法继续。

处理: 每轮请求自描述;需要持久化的 task/input state 放 durable store,并通过明确 identity 继续。

自测 ​

  1. 一次 MCP 调用中 Server 还需要向用户补充询问信息。为什么这种交互不能简单假设为单 request/response?
  2. Elicitation 产生的新用户输入进入 Harness 后,应以什么 authority 重新参与后续决策?

Sources ​

AI Engineering · Agent · Harness · Backend Systems