核心客户端能力
除了使用 server 提供的上下文外,client 也可以向 server 提供若干能力。这些客户端能力让 server 作者可以构建更丰富的交互。| 能力 | 说明 | 示例 |
|---|---|---|
| Elicitation | Elicitation 让 server 可以在交互过程中向用户请求特定信息,为 server 按需收集信息提供结构化方式。 | 旅行预订 server 可能询问用户的座位偏好、房型或联系电话,以完成预订。 |
| Roots | Roots 允许 client 指定 server 应关注哪些目录,通过协调机制表达预期作用范围。 | 旅行预订 server 可能获得某个特定目录的访问范围,并从中读取用户日历。 |
| Sampling | Sampling 允许 server 通过 client 请求 LLM 补全,从而支持 agentic workflow。这种方式让 client 完全控制用户权限和安全措施。 | 旅行预订 server 可能把航班列表发给 LLM,并请求 LLM 为用户选择最佳航班。 |
Elicitation
Elicitation 让 server 可以在交互过程中向用户请求特定信息,从而创建更动态、更有响应性的工作流。概览
Elicitation 为 server 按需收集必要信息提供结构化方式。Server 不需要一开始就要求用户提供所有信息,也不必在缺少数据时失败;它可以暂停当前操作,向用户请求特定输入。这会形成更灵活的交互,让 server 能适应用户需求,而不是遵循僵硬流程。 Elicitation 流程: 这个流程支持动态信息收集。Server 可以在需要时请求特定数据,用户通过合适的 UI 提供信息,server 再使用新获得的上下文继续处理。 Elicitation 组件示例:示例:假期预订审批
旅行预订 server 可以通过最终预订确认流程展示 elicitation 的能力。当用户选择了理想的巴塞罗那度假套餐后,server 需要在继续之前收集最终审批和任何缺失信息。 Server 会使用结构化请求引出预订确认,其中包含行程摘要(6 月 15-22 日巴塞罗那航班、海滨酒店、总价 $3,000),以及任何额外偏好的字段,例如座位选择、房型或旅行保险选项。 随着预订推进,server 会引出完成预订所需的联系信息。它可能要求提供航班预订的旅客详情、酒店特殊要求,或紧急联系人信息。用户交互模型
Elicitation 交互的设计目标是清晰、具备上下文,并尊重用户自主权: 请求展示:Client 会展示 elicitation 请求,并清楚说明是哪个 server 在请求、为什么需要这些信息,以及信息将如何使用。请求消息解释目的,schema 提供结构和校验。 响应选项:用户可以通过合适的 UI 控件(文本框、下拉框、复选框)提供请求的信息,也可以选择拒绝提供并附带说明,或取消整个操作。Client 会根据提供的 schema 校验响应,然后再返回给 server。 隐私注意事项:Elicitation 永远不应请求密码或 API key。Client 应对可疑请求发出警告,并让用户在发送前检查数据。Roots
Roots 定义 server 操作的文件系统边界,允许 client 指定 server 应关注哪些目录。概览
Roots 是 client 向 server 传达文件系统访问边界的机制。它们由 file URI 组成,用来表示 server 可以操作的目录,帮助 server 理解可用文件和文件夹的范围。虽然 roots 会传达预期边界,但它们并不强制执行安全限制。真正的安全性必须通过操作系统层面的文件权限和/或沙箱来强制保证。 Root 结构:file:// URI scheme。它们帮助 server 理解项目边界、工作区组织和可访问目录。随着用户处理不同项目或文件夹,roots 列表可以动态更新;边界变化时,server 会通过 roots/list_changed 接收通知。
示例:旅行规划工作区
处理多个客户行程的旅行顾问,可以用 roots 来组织文件系统访问。设想一个工作区中有多个目录,分别对应旅行规划的不同方面。 Client 向旅行规划 server 提供文件系统 roots:file:///Users/agent/travel-planning- 包含所有旅行文件的主工作区。file:///Users/agent/travel-templates- 可复用的行程模板和资源。file:///Users/agent/client-documents- 客户护照和旅行文件。
file:///Users/agent/archive/2023-trips 的归档文件夹,client 会通过 roots/list_changed 更新 roots 列表。
关于尊重 roots 的完整 server 实现,请参阅官方 servers 仓库中的 filesystem server。
设计理念
Roots 是 client 与 server 之间的协调机制,而不是安全边界。规范要求 server “SHOULD respect root boundaries”,而不是 “MUST enforce” 它们,因为 server 运行的是 client 无法控制的代码。 当 server 可信或已经过审查、用户理解 roots 的建议性质,并且目标是防止意外而不是阻止恶意行为时,roots 最有效。它们擅长上下文限定(告诉 server 应关注哪里)、防止误操作(帮助行为良好的 server 保持在边界内)和工作流组织(例如自动管理项目边界)。用户交互模型
Roots 通常由 host 应用根据用户行为自动管理,不过有些应用可能会暴露手动 root 管理: 自动 root 检测:当用户打开文件夹时,client 会自动将其暴露为 roots。打开旅行工作区后,client 可以把该目录作为 root 暴露出去,帮助 server 理解当前工作范围内有哪些行程和文档。 手动 root 配置:高级用户可以通过配置指定 roots。例如,添加/travel-templates 作为可复用资源目录,同时排除包含财务记录的目录。
Sampling
Sampling 允许 server 通过 client 请求语言模型补全,在保持安全和用户控制的同时支持 agentic 行为。概览
Sampling 让 server 可以执行依赖 AI 的任务,而不必直接集成 AI 模型或为模型付费。Server 可以请求已经具备 AI 模型访问能力的 client 代为处理这些任务。这种方式让 client 完全控制用户权限和安全措施。由于 sampling 请求发生在其他操作上下文中,例如某个 tool 正在分析数据,并且作为独立模型调用处理,因此它能在不同上下文之间保持清晰边界,更高效地使用上下文窗口。 Sampling 流程: 这个流程通过多个人在环检查点确保安全。用户可以在响应返回 server 前,审查并修改初始请求和生成结果。 请求参数示例:示例:航班分析工具
设想一个旅行预订 server,其中有一个名为findBestFlight 的 tool,它使用 sampling 分析可用航班并推荐最佳选择。当用户说“帮我预订下个月去巴塞罗那的最佳航班”时,这个 tool 需要 AI 协助评估复杂权衡。
该 tool 查询航空公司 API,收集 47 个航班选项。随后它请求 AI 协助分析这些选项:“Analyze these flight options and recommend the best choice: [47 flights with prices, times, airlines, and layovers] User preferences: morning departure, max 1 layover.”
Client 发起 sampling 请求,让 AI 评估各种权衡,例如更便宜的红眼航班与更方便的早晨出发航班。该 tool 使用分析结果展示前三个推荐。