1. 什么是引导? #
引导(Elicitation)是 MCP 服务器通过客户端向用户请求额外信息的标准化方式。服务器在执行工具或完成任务时,可能需要用户提供配置、选择或敏感凭据,引导即用于此。
协议版本:2025-11-25
| 通俗理解 | 说明 |
|---|---|
| 表单模式 | 服务器请求结构化数据(如用户名、选项),客户端展示表单,数据对客户端可见 |
| URL 模式 | 服务器将用户导向外部 URL(如登录页、支付页),敏感数据不经客户端 |
2. 本章你将学到 #
- 表单模式与 URL 模式的区别
- 能力声明与协议消息
- 表单模式下的 JSON Schema(字符串、数字、枚举等)
- 响应动作、错误处理与安全要点
3. 模式对比 #
| 模式 | 适用场景 | 数据可见性 |
|---|---|---|
| form | 非敏感结构化数据(用户名、选项、配置) | 客户端可见 |
| url | 敏感信息(凭据、支付、OAuth 授权) | 客户端不可见,交互在外部完成 |
安全:敏感信息必须用 URL 模式;表单模式不得请求密码、API 密钥等。
4. 能力 #
客户端必须在初始化时声明 elicitation 能力:
{
"capabilities": {
"elicitation": {
"form": {},
"url": {}
}
}
}| 子能力 | 说明 |
|---|---|
form |
支持表单模式 |
url |
支持 URL 模式(2025-11-25 新增) |
空对象 elicitation: {} 等价于仅支持 form。客户端必须至少支持一种模式。
5. 协议消息 #
5.1 引导请求(elicitation/create) #
| 参数 | 要求 | 说明 |
|---|---|---|
mode |
必须(URL)或可选(表单默认 form) |
form 或 url |
message |
必须 | 人类可读的请求说明 |
requestedSchema |
表单模式必须 | 定义预期响应的 JSON Schema |
url |
URL 模式必须 | 用户应打开的 URL |
elicitationId |
URL 模式必须 | 引导的唯一标识 |
5.2 表单模式示例 #
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "elicitation/create",
"params": {
"mode": "form",
"message": "Please provide your GitHub username",
"requestedSchema": {
"type": "object",
"properties": {
"name": { "type": "string" }
},
"required": ["name"]
}
}
}响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"action": "accept",
"content": { "name": "octocat" }
}
}5.3 表单模式 Schema 类型 #
支持扁平对象的原始类型:
| 类型 | 示例 |
|---|---|
| string | title、description、minLength、maxLength、pattern、format(email/uri/date)、default |
| number/integer | minimum、maximum、default |
| boolean | default |
| enum(单选) | enum 或 oneOf(带 title) |
| enum(多选) | type: "array" + items 含 enum 或 anyOf |
5.4 URL 模式示例 #
请求:
{
"jsonrpc": "2.0",
"id": 3,
"method": "elicitation/create",
"params": {
"mode": "url",
"elicitationId": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://mcp.example.com/ui/set_api_key",
"message": "Please provide your API key to continue."
}
}响应: action: "accept" 表示用户同意打开 URL;实际交互在外部完成,客户端不获知结果。
5.5 完成通知(URL 模式) #
当外部交互完成时,服务器可以发送:
{
"jsonrpc": "2.0",
"method": "notifications/elicitation/complete",
"params": {
"elicitationId": "550e8400-e29b-41d4-a716-446655440000"
}
}客户端可据此重试先前失败的请求。
6. 响应动作 #
| 动作 | 说明 |
|---|---|
| accept | 用户批准并提交;表单模式含 content,URL 模式通常省略 |
| decline | 用户明确拒绝;通常省略 content |
| cancel | 用户未做选择即关闭(如关对话框、按 Escape);通常省略 content |
7. 流程示意 #
表单模式:
sequenceDiagram
participant S as 服务器
participant C as 客户端
participant U as 用户
S->>C: elicitation/create (mode: form)
C->>U: 展示表单
U-->>C: 填写并提交
C-->>S: 返回 content
URL 模式:
sequenceDiagram
participant S as 服务器
participant C as 客户端
participant U as 用户
S->>C: elicitation/create (mode: url)
C->>U: 请求打开 URL 的授权
U-->>C: 批准
C->>U: 打开浏览器
Note over U: 用户在外部完成交互
S-->>C: notifications/elicitation/complete (可选)
8. 错误处理 #
| 情况 | 错误码 |
|---|---|
| 请求需 URL 引导才能处理 | -32042(URLElicitationRequiredError),data.elicitations 含待完成的引导列表 |
| 客户端不支持该模式 | -32602(无效参数) |
9. 安全要点 #
| 要点 | 说明 |
|---|---|
| 表单不请求敏感信息 | 密码、API 密钥等必须用 URL 模式 |
| URL 模式 | 客户端不得自动打开 URL;必须展示完整 URL 供用户检查;必须经用户同意后打开 |
| 用户识别 | 服务器不得依赖客户端提供的用户识别;应从授权凭据派生 |
| 状态绑定 | 引导状态必须与用户身份绑定,不得仅与会话 ID 关联 |
10. 延伸阅读 #
| 主题 | 文档 |
|---|---|
| 授权 | 授权、理解 MCP 中的授权 |
| 安全 | 安全最佳实践 |
| 任务(引导可嵌套在任务中) | 任务 |