- 表单模式:服务器可以使用可选的 JSON Schema 向用户请求结构化数据以验证响应
- URL 模式:服务器可以将用户引导至外部 URL 进行敏感交互,这些交互 不得 通过 MCP 客户端传递
用户交互模型
MCP 中的信息征集允许服务器通过启用用户输入请求 嵌套 在其他 MCP 服务器功能内来实现交互式工作流。 实现可以自由暴露信息征集通过任何适合其需求的界面模式——协议本身不强制任何特定的用户交互模型。能力
支持信息征集的客户端 必须 在每次请求中于_meta.io.modelcontextprotocol/clientCapabilities 声明 elicitation 能力:
form 模式:
elicitation 能力的客户端 必须 支持至少一种模式(form 或 url)。
服务器 不得 发送客户端不支持的模式的信息征集请求。
协议消息
信息征集请求
服务器 可以 在处理客户端请求期间,通过发送包含elicitation/create 请求的 InputRequiredResult 来向用户请求信息。
所有信息征集请求 必须 包含以下参数:
| 名称 | 类型 | 选项 | 描述 |
|---|---|---|---|
mode | string | form, url | 信息征集的模式。对于表单模式为可选(如果省略则默认为 "form")。 |
message | string | 人类可读的消息,解释为什么需要此交互。 |
mode 参数指定信息征集的类型:
"form":带内结构化数据收集,带有可选的 Schema 验证。数据暴露给客户端。"url":通过 URL 导航的带外交互。数据(URL 本身除外) 不 暴露给客户端。
mode 字段。客户端 必须 将没有 mode 字段的请求视为表单模式。
表单模式信息征集请求
表单模式信息征集允许服务器通过 MCP 客户端直接收集结构化数据。 表单模式信息征集请求 必须 指定mode: "form" 或省略 mode 字段,并包含这些附加参数:
| 名称 | 类型 | 描述 |
|---|---|---|
requestedSchema | object | 定义预期响应结构的 JSON Schema。 |
请求的 Schema
requestedSchema 参数允许服务器使用 JSON Schema 的受限子集来定义预期响应的结构。
为了简化客户端用户体验,表单模式信息征集 Schema 仅限于具有原始属性的扁平对象。
Schema 仅限于这些原始类型:
-
字符串 Schema
支持的格式:
email,uri,date,date-time -
数字 Schema
-
布尔值 Schema
-
枚举 Schema
单选枚举(无标题):
单选枚举(带标题):多选枚举(无标题):多选枚举(带标题):
- 生成适当的输入表单
- 在发送前验证用户输入
- 为用户提供更好的指导
示例:简单文本请求
Input request (delivered insideInputRequiredResult.inputRequests):
inputResponses on the retried request):
示例:结构化数据请求
Input request (delivered insideInputRequiredResult.inputRequests):
inputResponses on the retried request):
URL 模式信息征集请求
新功能: URL 模式信息征集是在
2025-11-25 版本的 MCP 规范中引入的。其设计和实现可能会在未来的协议修订中更改。mode: "url",message,并包含这些附加参数:
| Name | Type | Description |
|---|---|---|
url | string | 用户应导航到的 URL。 |
url 参数 必须 包含有效的 URL。
重要:URL 模式信息征集 不是 用于授权 MCP 客户端访问 MCP 服务器(那由 MCP 授权 处理)。相反,当 MCP 服务器需要代表用户获取敏感信息或第三方授权时使用它。客户端的持有者令牌保持不变。客户端的唯一责任是为用户提供关于服务器希望他们打开的信息征集 URL 的上下文。
示例:请求敏感数据
此示例显示了一个 URL 模式信息征集请求,将用户引导至一个安全 URL,他们可以在那里提供敏感信息(例如 API 密钥)。 相同的请求可以将用户引导至 OAuth 授权流程或支付流程。唯一的区别是 URL 和消息。 Input request (delivered insideInputRequiredResult.inputRequests):
inputResponses on the retried request):
action: "accept" 的响应表示用户已同意该交互。这并不意味着交互已完成。交互在带外进行,客户端不会直接获知结果。当客户端重试原始请求时,服务器会根据回显的 requestState(或其自身存储的状态)判断带外交互是否已完成,并返回最终结果或再次响应 InputRequiredResult。客户端 应 提供手动控件,让用户重试或取消原始请求(或以其他方式恢复与客户端的交互)。
消息流程
表单模式流程
URL 模式流程
响应操作
信息收集响应使用三操作模型来清楚地区分不同的用户操作。这些操作适用于表单和 URL 信息收集模式。-
接受 (
action: "accept"): 用户明确批准并提交数据- 对于表单模式:
content字段包含与请求模式匹配的提交数据 - 对于 URL 模式:
content字段被省略 - 示例:用户点击了“提交”、“确定”、“确认”等。
- 对于表单模式:
-
拒绝 (
action: "decline"): 用户明确拒绝请求content字段通常被省略- 示例:用户点击了“拒绝”、“谢绝”、“否”等。
-
取消 (
action: "cancel"): 用户解散而未做出明确选择content字段通常被省略- 示例:用户关闭了对话框、点击了外部、按了 Escape 键、浏览器加载失败等。
- 接受:处理提交的数据
- 拒绝:处理明确拒绝(例如,提供替代方案)
- 取消:处理解散(例如,稍后再次提示)
实现注意事项
状态性
信息征集不要求服务器通过 multi round-trip requests 机制维护关于用户的状态。 然而,如果存储了状态,实现信息征集的服务器 必须 按照 security best practices 文档中的指南,将此状态与单个用户安全关联。具体而言:- 状态存储 必须 防止未经授权的访问
- 对于远程 MCP 服务器,用户身份 必须 尽可能从通过 MCP 授权 获取的凭证中派生(例如
sub声明)
本节中的示例是非规范性的,并说明了信息收集的潜在用途。
实现者应在保持安全最佳实践的同时,将这些模式适应其特定需求。
用于敏感数据的 URL 模式信息收集
对于与需要敏感信息的外部 API 交互的服务器(例如,凭证、支付信息),URL 模式信息收集提供了一种安全机制,让用户提供此信息而不将其暴露给 MCP 客户端。 在此模式中:- 服务器将用户引导至安全网页(通过 HTTPS 服务)
- 页面在用户信任的域上展示品牌化的表单界面
- 用户直接将敏感凭证输入到安全表单中
- 服务器安全地存储凭证,绑定到用户身份
- 后续的 MCP 请求使用这些存储的凭证进行 API 访问
用于 OAuth 流程的 URL 模式信息收集
URL 模式信息收集启用了一种模式,其中 MCP 服务器充当第三方资源服务器的 OAuth 客户端。 通过 URL 模式信息收集启用的外部 API 授权与 MCP 授权 是分开的。MCP 服务器 不得 依赖 URL 模式信息收集来为用户授权自身。理解区别
- MCP 授权:MCP 客户端和 MCP 服务器之间所需的 OAuth 流程(在 授权规范 中涵盖)
- 外部(第三方)授权:MCP 服务器和第三方资源服务器之间的可选授权,通过 URL 模式信息收集发起
- OAuth 资源服务器(对于 MCP 客户端)
- OAuth 客户端(对于第三方资源服务器)
- MCP 客户端连接到 MCP 服务器
- MCP 服务器集成各种不同的第三方服务
- 当 MCP 客户端调用需要访问第三方服务的工具时,MCP 服务器需要该服务的凭证
- 第三方凭证不得通过 MCP 客户端传输:客户端绝不能看到第三方凭证以保护安全边界
- MCP 服务器不得将客户端的凭证用于第三方服务:那将是 令牌透传,这是禁止的
- 用户必须直接授权 MCP 服务器:交互发生在 MCP 协议之外,不涉及 MCP 客户端
- MCP 服务器负责令牌:MCP 服务器负责存储和管理通过 URL 模式信息征集获得的第三方令牌(换句话说,MCP 服务器必须是有状态的)。
有关更多背景信息,请参阅安全最佳实践文档的 令牌透传
部分
以了解为什么 MCP 服务器不能充当透传代理。
实现模式
当通过 URL 模式信息征集实现外部授权时:- MCP 服务器生成一个授权 URL,充当第三方服务的 OAuth 客户端
- MCP 服务器存储内部状态,将 elicitation 请求与用户身份关联(绑定)
- MCP 服务器向客户端发送一个 URL 模式 elicitation 请求,其中包含可启动授权流程的 URL,以及一个可选的
requestState,用于编码关于 elicitation 请求和用户的信息(如有需要) - 用户直接与第三方授权服务器完成 OAuth 流程
- 第三方授权服务器重定向回 MCP 服务器
- MCP 服务器安全地存储第三方令牌,并将其绑定到用户身份
- 未来的 MCP 请求可以利用这些已存储的令牌访问第三方资源服务器
错误处理
Servers SHOULD NOT 假设 elicitation 请求总是会成功,并且 MUST 处理用户拒绝或取消 elicitation,或客户端无法处理请求的情况。安全考虑
- Servers MUST 将 elicitation 请求绑定到客户端和用户身份
- Clients MUST 明确指示哪个服务器正在请求信息
- Clients SHOULD 实现用户批准控制
- Clients SHOULD 允许用户随时拒绝 elicitation 请求
- Clients SHOULD 以清楚说明所请求信息及其原因的方式呈现 elicitation 请求
安全 URL 处理
请求诱导的 MCP 服务器:- MUST NOT 在发送给客户端的 URL elicitation 请求中的 URL 里包含关于最终用户的敏感信息,包括凭证、个人可识别信息等。
- MUST NOT 提供一个已预先认证、可访问受保护资源的 URL,因为恶意客户端可能使用该 URL 冒充用户。
- SHOULD NOT 在表单模式 elicitation 请求的任何字段中包含旨在可点击的 URL。
- SHOULD 在非开发环境中使用 HTTPS URL。
- 不得 自动预取 URL 或其任何元数据。
- 不得 在未经用户明确同意的情况下打开 URL。
- 必须 在同意前向用户显示完整 URL 以供检查。
- 必须 以安全的方式打开服务器提供的 URL,使得客户端或 LLM 无法检查内容或用户输入。 例如,在 iOS 上,SFSafariViewController 是合适的,但 WkWebView 不合适。
- 应当 突出显示 URL 的域名以减轻子域名欺骗。
- 应当 对模糊/可疑的 URI(即包含 Punycode 的)发出警告。
- 不应当 在诱导请求的任何字段中将 URL 渲染为可点击,除非是 URL 诱导请求中的
url字段(受上述限制约束)。
识别用户
服务器 不得 依赖未经服务器验证的客户端提供的用户身份识别,因为这可能被伪造。 相反,服务器 应当 遵循 安全最佳实践。 非规范性示例:- 错误:将用户输入(如 “I am [email protected]”)视为权威
- 正确:依赖 授权 来识别用户
表单模式安全
- 服务器 不得 通过表单模式请求敏感信息(密码、API 密钥等)
- 客户端 应当 针对提供的模式验证所有响应
- 服务器 应当 验证接收到的数据是否符合请求的模式
网络钓鱼
URL 模式诱导返回一个攻击者可用于发送给受害者的 URL。MCP 服务器 必须 在接受信息之前验证打开 URL 的用户身份。 通常身份验证是通过利用 MCP 授权服务器 来识别用户,通过浏览器中的会话 cookie 或等效机制完成。 例如,URL 模式诱导可用于执行 OAuth 流程,其中服务器充当另一个资源服务器的 OAuth 客户端。如果没有适当的缓解措施,可能发生以下网络钓鱼攻击:- 连接到良性服务器的恶意用户(Alice)触发诱导请求
- 良性服务器生成授权 URL,充当第三方授权服务器的 OAuth 客户端
- Alice 的客户端显示 URL 并请求同意
- Alice 没有点击链接,而是诱骗同一良性服务器的受害用户(Bob)点击它
- Bob 打开链接并完成授权,认为他们正在授权自己与良性服务器的连接
- 良性服务器收到来自第三方授权服务器的回调/重定向,并假设这是 Alice 的请求
- 第三方服务器的令牌绑定到 Alice 的会话和身份,而不是 Bob 的,导致账户接管
https://mcp.example.com/connect?... rather than the third-party authorization endpoint.
This “connect URL” must ensure the user who opened the page is the same user for whom the elicitation was generated.
It would, for example, check that the user has a valid session cookie and that the session cookie is for the same user who was using the MCP client to generate the URL mode elicitation.
This could be done by comparing the authoritative subject (sub claim) from the MCP server’s authorization server to the subject from the session cookie.
Once that page ensures the same user, it can send the user to the third-party authorization server at https://example.com/authorize?... where a normal OAuth flow can be completed.
在其他情况下,服务器可能无法通过 Web 访问,也可能无法使用会话 cookie 来识别用户。
在这种情况下,服务器必须使用不同的机制来识别打开 elicitation URL 的用户与生成该 elicitation 的用户是同一人。
在所有实现中,服务器 必须 确保确定用户身份的机制能够抵御攻击者可以修改诱导 URL 的攻击。