先记住这个答案
roots 表示客户端能回应服务端的根列表请求;sampling 表示可以经客户端请求模型生成;elicitation 表示可以通过客户端向用户询问信息。三者分别面向工作区范围、模型调用与用户交互,不能互相替代。按 2025-11-25,sampling.tools 额外声明采样中的工具使用支持,elicitation 可以分别声明 form 和 url 模式。宿主仍控制模型选择、数据共享和用户交互,声明能力只是说明协议处理路径存在,不是给予服务端无限文件访问、任意模型预算或用户同意。
- roots 提供范围信息,实际文件隔离另行落实
- sampling 由客户端管理模型访问
- elicitation 需要尊重支持模式与用户选择
根目录列表不是操作系统权限设置
代码分析服务可以先询问当前工作区根目录,再在该范围内解析文件。根对象给出了位置与可选名称,但一份列表不会自动改变服务端进程的系统权限;路径归一化、符号链接处理和实际访问控制仍需由执行环境落实。
当宿主切换项目时,支持 listChanged 的客户端可以发出根列表变化通知,服务端随后获取新列表并更新缓存。不要让旧项目路径继续留在后台扫描任务里,也不能把“列表改变”理解为所有旧任务都已经自动取消。
{
"roots": { "listChanged": true },
"sampling": {},
"elicitation": { "form": {} }
}这是 capabilities 字段的值,不是完整 JSON-RPC 报文。它不包含 sampling.tools 和 elicitation.url,因此服务端不能据此假定两种扩展调用已经可用。
采样请求需要由宿主执行预算和模型策略
例如静态分析服务希望把若干诊断整理成说明,可以请求客户端进行采样。服务端提出消息、输出长度和模型偏好,宿主负责决定实际模型以及请求能否执行;模型偏好不是强制指定某个供应商的凭证或型号。
对嵌套采样需要记录它属于哪个用户任务,避免一次工具调用衍生出不可控的模型请求链。宿主可以落实已授权预算、上下文范围和超时策略。支持基本 sampling 也不能被解释为支持采样内部的工具调用循环。
询问用户与调用模型有不同的信息来源
报告工具缺少统计月份时,可以通过 form 请求用户提供,而不应让 sampling 猜出一个月份当成用户选择。客户端需要明确谁在询问并保留拒绝与取消路径;没有用户输入时,服务端应处理这个结果,不能默默补成同意。
这一版本中,elicitation 空对象兼容表示仅支持 form。敏感凭证不能通过普通表单收集,应使用支持的 URL 模式在带外完成相应交互;用户接受打开交互也不等于流程已经结束,更不等于给 MCP 客户端本身新增了服务端访问授权。
容易答错的地方
- 客户端声明 roots 后服务端只能读取这些路径
- 协议声明不会自动建立进程沙箱,服务端实现与宿主执行环境还要落实边界;不能用一份 JSON 列表代替真实文件权限。
- 支持 elicitation 就代表用户已经同意提供数据
- 支持功能只说明客户端能够呈现询问,用户仍可拒绝或取消;服务端必须处理这些结果,不能把能力存在当成每次交互的授权。
面试官还会怎么问?
服务端没有这些客户端能力还能提供工具吗?
可以,只要工具不依赖缺失的反向请求,普通工具服务仍能工作。业务确实依赖时应明确提示缺少哪项能力,并提供可用的替代路径。
可以让 sampling 读取宿主所有聊天上下文吗?
不能从基本能力直接推出这种权限。上下文共享有单独规则与宿主策略,服务端应只请求任务所需信息,不能默认获得其他会话内容。
用户关闭了询问弹窗还能继续提交操作吗?
应按照取消或拒绝的实际结果处理,不能推定用户同意。需要该输入才能完成的动作应停止依赖步骤,并保留可恢复的任务状态。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。