信息征集是本版本 MCP 规范中新引入的,其设计可能会在未来的协议版本中演变。
- 表单模式:服务器可以使用可选的 JSON Schema 向用户请求结构化数据以验证响应
- URL 模式:服务器可以将用户引导至外部 URL 进行敏感交互,这些交互 不得 通过 MCP 客户端传递
用户交互模型
MCP 中的信息征集允许服务器通过启用用户输入请求 嵌套 在其他 MCP 服务器功能内来实现交互式工作流。 实现可以自由暴露信息征集通过任何适合其需求的界面模式——协议本身不强制任何特定的用户交互模型。能力
支持信息征集的客户端 必须 在 初始化 期间声明elicitation 能力:
form 模式:
elicitation 能力的客户端 必须 支持至少一种模式(form 或 url)。
服务器 不得 发送客户端不支持的模式的信息征集请求。
协议消息
信息征集请求
要向用户请求信息,服务器发送elicitation/create 请求。
所有信息征集请求 必须 包含以下参数:
| 名称 | 类型 | 选项 | 描述 |
|---|---|---|---|
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
单选枚举(无标题):
单选枚举(带标题):多选枚举(无标题):多选枚举(带标题):
- 生成适当的输入表单
- 在发送前验证用户输入
- 为用户提供更好的指导
示例:简单文本请求
请求:示例:结构化数据请求
请求:URL 模式信息征集请求
新功能: URL 模式信息征集是在
2025-11-25 版本的 MCP 规范中引入的。其设计和实现可能会在未来的协议修订中更改。mode: "url",message,并包含这些附加参数:
| 名称 | 类型 | 描述 |
|---|---|---|
url | string | 用户应该导航到的 URL。 |
elicitationId | string | 信息征集的唯一标识符。 |
url 参数 必须 包含有效的 URL。
重要:URL 模式信息征集 不是 用于授权 MCP 客户端访问 MCP 服务器(那由 MCP 授权 处理)。相反,当 MCP 服务器需要代表用户获取敏感信息或第三方授权时使用它。客户端的持有者令牌保持不变。客户端的唯一责任是为用户提供关于服务器希望他们打开的信息征集 URL 的上下文。
示例:请求敏感数据
此示例显示了一个 URL 模式信息征集请求,将用户引导至一个安全 URL,他们可以在那里提供敏感信息(例如 API 密钥)。 相同的请求可以将用户引导至 OAuth 授权流程或支付流程。唯一的区别是 URL 和消息。 请求:action: "accept" 的响应表示用户已同意该交互。这并不意味着交互已完成。交互发生在带外,客户端不知道结果,直到服务器发送指示完成的通知。
URL 模式信息征集的完成通知
当由 URL 模式信息征集启动的带外交互完成时,服务器 可以 发送notifications/elicitation/complete 通知。这允许客户端在适当时以编程方式反应。
发送通知的服务器:
- 必须 仅将通知发送给发起信息征集请求的客户端。
- 必须 包含原始
elicitation/create请求中建立的elicitationId。
- 必须 忽略引用未知或已完成 ID 的通知。
- 可以 等待此通知以自动重试收到 URLElicitationRequiredError 的请求,更新用户界面,或以其他方式继续交互。
- 应该 仍然提供手动控制,让用户重试或取消原始请求(或以其他方式恢复与客户端的交互),如果通知从未到达。
示例
需要 URL 信息征集的错误
当请求在完成信息征集之前无法处理时,服务器 可以 返回URLElicitationRequiredError(代码 -32042)以向客户端指示需要 URL 模式信息征集。除非需要 URL 模式信息征集,否则服务器 不得 返回此错误。
错误 必须 包含在完成原始请求之前可以重试所需的信息征集列表。
错误中返回的任何信息征集 必须 是 URL 模式信息征集并具有 elicitationId 属性。
错误响应:
消息流程
表单模式流程
URL 模式流程
需要信息收集错误的 URL 模式流程
响应操作
信息收集响应使用三操作模型来清楚地区分不同的用户操作。这些操作适用于表单和 URL 信息收集模式。-
接受 (
action: "accept"): 用户明确批准并提交数据- 对于表单模式:
content字段包含与请求模式匹配的提交数据 - 对于 URL 模式:
content字段被省略 - 示例:用户点击了“提交”、“确定”、“确认”等。
- 对于表单模式:
-
拒绝 (
action: "decline"): 用户明确拒绝请求content字段通常被省略- 示例:用户点击了“拒绝”、“谢绝”、“否”等。
-
取消 (
action: "cancel"): 用户解散而未做出明确选择content字段通常被省略- 示例:用户关闭了对话框、点击了外部、按了 Escape 键、浏览器加载失败等。
- 接受:处理提交的数据
- 拒绝:处理明确拒绝(例如,提供替代方案)
- 取消:处理解散(例如,稍后再次提示)
实现注意事项
状态性
大多数实际的信息收集用例要求服务器维护关于用户的状态:- 是否已收集所需信息(例如,通过表单模式信息收集获取用户的显示名称)
- 资源访问状态(例如,通过 URL 模式信息收集获取 API 密钥或支付流程)
- 状态 不得 仅与会话 ID 关联
- 状态存储 必须 防止未经授权的访问
- 对于远程 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 服务器存储内部状态,将信息收集请求与用户身份关联(绑定)。
- MCP 服务器向客户端发送 URL 模式信息收集请求,包含一个可以启动授权流程的 URL。
- 用户直接与第三方授权服务器完成 OAuth 流程
- 第三方授权服务器重定向回 MCP 服务器
- MCP 服务器安全地存储第三方令牌,绑定到用户身份
- 未来的 MCP 请求可以利用这些存储的令牌访问第三方资源服务器的 API
错误处理
服务器 必须 为常见失败情况返回标准 JSON-RPC 错误:- 当请求在完成诱导(elicitation)之前无法处理时:
-32042(URLElicitationRequiredError)
- 服务器发送的
elicitation/create请求中包含的模式未在客户端能力中声明:-32602(无效参数) - 服务器发送的
elicitation/create请求没有关联的客户端到服务器请求:-32602(无效参数)
安全考虑
- 服务器 必须 将诱导请求绑定到客户端和用户身份
- 客户端 必须 清楚指示是哪个服务器正在请求信息
- 客户端 应当 实现用户批准控制
- 客户端 应当 允许用户随时拒绝诱导请求
- 客户端 应当 实现速率限制
- 客户端 应当 以清晰表明正在请求什么信息以及为何请求的方式呈现诱导请求
安全 URL 处理
请求诱导的 MCP 服务器:- 不得 在 URL 诱导请求中发送给客户端的 URL 里包含关于最终用户的敏感信息,包括凭证、个人身份信息等。
- 不得 提供预认证即可访问受保护资源的 URL,因为恶意客户端可能利用该 URL 冒充用户。
- 不应当 在表单模式诱导请求的任何字段中包含旨在可点击的 URL。
- 应当 在非开发环境中使用 HTTPS URL。
- 不得 自动预取 URL 或其任何元数据。
- 不得 在未经用户明确同意的情况下打开 URL。
- 必须 在同意前向用户显示完整 URL 以供检查。
- 必须 以安全的方式打开服务器提供的 URL,使得客户端或 LLM 无法检查内容或用户输入。 例如,在 iOS 上,SFSafariViewController 是合适的,但 WkWebView 不合适。
- 应当 突出显示 URL 的域名以减轻子域名欺骗。
- 应当 对模糊/可疑的 URI(即包含 Punycode 的)发出警告。
- 不应当 在诱导请求的任何字段中将 URL 渲染为可点击,除非是 URL 诱导请求中的
url字段(受上述限制约束)。
识别用户
服务器 不得 依赖未经服务器验证的客户端提供的用户身份识别,因为这可能被伪造。 相反,服务器 应当 遵循 安全最佳实践。 非规范性示例:- 错误:将用户输入(如 “I am joe@example.com”)视为权威
- 正确:依赖 授权 来识别用户
表单模式安全
- 服务器 不得 通过表单模式请求敏感信息(密码、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?elicitationId=... 而不是第三方授权端点。
此“连接 URL”必须确保打开页面的用户与生成诱导的用户是同一人。
例如,它将检查用户是否具有有效的会话 cookie,并且该会话 cookie 属于使用 MCP 客户端生成 URL 模式诱导的同一用户。
这可以通过比较 MCP 服务器授权服务器中的权威主体(sub 声明)与会话 cookie 中的主体来完成。
一旦该页面确保是同一用户,它可以将用户发送到 https://example.com/authorize?... 处的第三方授权服务器,在那里可以完成正常的 OAuth 流程。
在其他情况下,服务器可能无法通过 Web 访问,并且可能无法使用会话 cookie 来识别用户。
在这种情况下,服务器必须使用不同的机制来识别打开诱导 URL 的用户与生成诱导的用户是同一人。
在所有实现中,服务器 必须 确保确定用户身份的机制能够抵御攻击者可以修改诱导 URL 的攻击。