MCP Elicitations:
深度解析与未来展望
通过结构化信息请求机制,彻底改变 AI 辅助开发工具的交互模式,实现精准的上下文获取和无缝的开发者工作流集成。
概述
MCP Elicitations 通过允许 MCP 服务器在对话中向用户发起结构化的信息请求,解决了传统 AI 助手因猜测导致输出不准确的问题。
它利用 JSON Schema 定义请求信息的结构和验证规则,并通过如 Visual Studio Code 等客户端的原生 UI 呈现,实现了精准的上下文获取和无缝的开发者工作流集成。尽管当前禁止请求敏感信息,但未来计划引入带外凭证等安全机制。MCP Elicitations 有望推动 AI 工具向更智能、更具协作性的方向发展。
核心价值
通过结构化的信息请求机制,MCP Elicitations 改变了 MCP 客户端收集上下文的方式,消除了因猜测导致的"几乎正确但又不完全正确"的问题,显著提升了 AI 辅助编程的准确性和效率。
MCP Elicitations 核心机制解析
结构化信息请求:告别猜测,精准获取上下文
MCP (Model Context Protocol) Elicitations 的核心机制在于其能够使 MCP 服务器在对话过程中,主动向用户提出结构化的、明确的问题,以获取完成任务所需的精确上下文信息。 这一机制的出现,旨在解决传统 AI 助手在与开发者协作时,因信息不足或理解偏差而导致的"猜测"问题。
例如,AI 助手可能错误地假设开发者使用的是 PostgreSQL 数据库,而实际上开发者使用的是 MongoDB;或者 AI 助手生成了 REST 端点,而开发者需要的是 GraphQL [1]。这些情况的发生,往往是因为大型语言模型 (LLM) 无法直接向用户提问以澄清模糊点,或者用户的输入被误解。
JSON Schema 的关键作用:定义、验证与标准化
JSON Schema 在 MCP Elicitations 中扮演着至关重要的角色,它为结构化信息请求提供了定义、验证和标准化的基础。 当 MCP 服务器需要向用户请求特定信息时,它会发送一个包含
requestedSchema
的 elicitation 请求。
{
"method": "elicitation/create",
"params": {
"message": "Please provide your contact information",
"requestedSchema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "email"]
}
}
}
JSON Schema 的强大之处在于其能够精确描述复杂的数据结构,支持多种数据类型(如字符串、数字、布尔值),定义字段是否必需,以及提供内置的格式验证(如
email
, uri
, date
, date-time
)和枚举值(用于多选一的情况)[1]。
交互流程:请求、响应与状态管理
MCP Elicitations 的交互流程设计得简洁而高效,确保了在获取额外上下文信息的同时,能够保持当前工作流的状态,避免因信息询问而中断用户的操作。 整个过程始于 MCP 服务器识别到对更多上下文信息的需求。
MCP Elicitations 交互流程图
对于每一个 elicitation 请求,用户通常有三种响应方式:接受并提供信息 (Accept)、拒绝提供信息 (Decline),或者取消整个交互过程 (Cancel) [1]。这种设计保证了交互的流畅性和上下文的一致性。
Visual Studio Code 中的 MCP Elicitations 实现
原生集成:无缝融入开发者工作流
Visual Studio Code (VS Code) 在其最新的 Insiders 版本中,已经原生支持了 MCP Elicitations 规范,这使得开发者可以在自己熟悉的集成开发环境 (IDE) 中,无缝体验到这种新型的上下文获取机制。 这种原生集成意味着 MCP Elicitations 不再是作为一个独立的插件或工具存在,而是深度融入到 VS Code 的底层功能和用户界面中。
优势
- • 避免工具切换的麻烦
- • 减少学习新交互模式的需要
- • 自然融入现有工作流程
- • 保持开发者专注度
特性
- • 深度融入底层功能
- • 与 IDE 风格一致的 UI
- • 直接处理服务器请求
- • 不打断开发者思路
这种无缝融入对于提升开发效率和用户体验至关重要,因为它确保了 AI 辅助功能能够以一种不突兀、不打断思路的方式为开发者提供服务。
用户界面呈现:Command Palette 风格的交互体验
在 Visual Studio Code 中,MCP Elicitations 的用户界面呈现方式借鉴了其广受欢迎且用户熟悉的 Command Palette (命令面板) 风格。 当 MCP 服务器发起一个 elicitation 请求时,VS Code 会弹出一个原生的 UI 提示,这个提示的交互方式与开发者日常使用的命令面板非常相似 [1]。
这种设计选择不仅降低了用户的学习曲线,也使得 elicitation 的交互过程更加高效和自然。对于经常依赖命令面板执行操作的开发者来说,这种 UI 呈现方式感觉就像是编辑器本身在请求更多信息,从而使得与 AI 模型的交互更加顺畅和直观。
配置与启动:在 VS Code Insiders 中实践 MCP 服务器
为了在 Visual Studio Code Insiders 版本中实践 MCP Elicitations,开发者需要配置并启动一个支持 elicitation 功能的 MCP 服务器。 Den Delimarsky 的文章中提供了一个基于 "Everything MCP server" 的示例,通过一个 pull request 为其添加了 elicitation 支持 [1]。
{
"servers": {
"test-elicitations": {
"type": "stdio",
"command": "npm",
"args": [
"start",
"--prefix",
"/path/to/src/everything"
]
}
},
"inputs": []
}
配置步骤
- 1. 克隆仓库: 克隆 fork 的 Everything MCP server 仓库
- 2. 构建服务器: 在
src/everything
目录下运行npm run build
- 3. 添加服务器: 在 VS Code 中使用 "Add MCP server" 命令
- 4. 配置参数: 指定类型为
stdio
,命令为npm
,并添加相应参数 - 5. 启动测试: 使用
#
前缀触发 elicitation 工具
一旦服务器运行起来,就可以通过特定的方式触发 elicitation 工具,服务器便会向用户发起结构化的信息请求,例如询问用户最喜欢的颜色、一个1到100之间的数字,或者偏好的宠物类型 [1]。这个示例虽然简单,但它清晰地展示了 elicitation 的整个流程。
MCP Elicitations 与传统聊天模式的对比分析
MCP Elicitations 与传统聊天模式在多个关键方面存在显著差异,这些差异使得 MCP Elicitations 在特定场景下,尤其是在需要精确、结构化信息输入的开发者工作流中,展现出明显优势。
详细对比分析
特性 | MCP Elicitations | 传统聊天模式 |
---|---|---|
数据收集方式 | 结构化数据收集,通过 JSON Schema 定义精确信息需求 [1] | 自由格式对话,依赖自然语言理解提取信息 |
上下文保持 | 高,信息请求嵌入当前工作流,不中断或丢失上下文 [1] | 较低,多轮对话可能导致上下文稀释或偏移 |
输入验证 | 内置强大验证,基于 JSON Schema 进行客户端实时验证,有效预防错误 [1] | 验证能力有限,依赖自然语言处理,错误判断可能不精确 |
用户体验 | 原生集成与自然交互,客户端以原生 UI 呈现请求,交互更直接高效 [1] | 可能存在隔阂感,通常在独立聊天界面进行,对于结构化信息输入不够直观 |
MCP Elicitations 优势
-
结构化数据收集: 通过 JSON Schema 确保信息格式正确、完整
-
工作流连续性: 保持当前任务状态,不会中断开发者思路
-
实时验证: 在客户端进行即时验证,预防输入错误
-
原生体验: 与 IDE 深度集成,感觉像是编辑器自身的功能
传统模式局限性
-
信息歧义: 自然语言表达可能产生误解或信息不完整
-
上下文丢失: 多轮对话可能偏离原始任务焦点
-
验证困难: 难以确保用户提供的信息格式正确
-
交互隔阂: 独立聊天界面感觉与主工作流分离
MCP Elicitations 的实际应用案例
Everything MCP 服务器示例:收集用户偏好
Den Delimarsky 在其文章中提供了一个基于 "Everything MCP server" 的简单示例,用以演示 MCP Elicitations 的实际运作方式 [1]。 这个示例虽然被作者称为 "silly demo",但它清晰地展示了 Elicitation 的核心机制。
实现代码示例
const requestElicitation = async (
message: string,
requestedSchema: any
) => {
const request = {
method: 'elicitation/create',
params: {
message,
requestedSchema
}
};
return await server.request(request, z.any());
};
在 Visual Studio Code 中配置并启动该服务器后,用户可以通过特定的命令(例如,在聊天视图中使用
#
前缀触发
startElicitation
工具)来激活 Elicitation 流程。服务器随后会向客户端发送一个 Elicitation 请求,其中包含一个消息和一个
requestedSchema
。
这个示例虽然简单,但它有效地说明了 Elicitation 如何通过结构化的方式从用户那里收集特定的、非敏感的信息,为更复杂的应用场景奠定了基础。
更广泛的潜在应用场景:数据库类型、文件路径、API端点等
MCP Elicitations 的实际应用潜力远不止于收集简单的用户偏好。其核心价值在于能够为 MCP 服务器提供一种标准化的方式来动态获取执行任务所需的特定上下文信息,从而在各种复杂的开发场景中提高 AI 助手的准确性和实用性。
数据库类型
让用户在 MySQL、PostgreSQL、MongoDB 等之间选择,确保生成的代码与目标数据库兼容
文件路径
请求用户指定配置文件或代码文件的路径,用于代码生成或测试自动化
API 端点
请求用户提供需要调用的 REST API 的 URL 和认证信息
认证方法
询问用户偏好的认证方式,如 OAuth、API 密钥或基本认证
Den Delimarsky 的文章明确指出,在真实场景中,MCP 服务器可以利用 Elicitations 请求诸如数据库类型、文件路径、API 端点等关键信息 [1]。通过将这些信息请求结构化并集成到工作流中,MCP Elicitations 使得 AI 工具能够更智能地适应不同的开发环境和用户需求,减少错误假设,并提供更精准的协助。
MCP Elicitations 的安全考量
当前限制:禁止请求敏感信息
在 MCP Elicitations 的当前实现中,一个至关重要的安全考量是明确禁止 MCP 服务器通过此机制请求敏感信息。 Den Delimarsky 在其文章中强调,由于他深度参与了 MCP 的安全工作,因此特别指出了这一限制:MCP 服务器绝不能通过当前的 Elicitation 实现来请求密码、API 密钥或其他敏感数据 [1]。
安全限制说明
这一限制是基于对用户数据安全和隐私保护的审慎考虑。如果允许通过这种标准化的、可能由不同开发者实现的通用界面来请求敏感凭证,将会引入显著的安全风险。
禁止请求的敏感信息
- • 用户密码和认证凭证
- • API 密钥和访问令牌
- • 个人身份信息 (PII)
- • 加密密钥和证书
- • 数据库连接字符串
允许请求的非敏感信息
- • 数据库类型和版本
- • 文件路径和目录结构
- • API 端点和接口规范
- • 用户偏好和配置选项
- • 项目和代码结构信息
因此,在当前的规范和实践层面,Elicitation 被严格限制在非敏感数据的收集上。开发者在使用 Elicitations 时,必须遵守这一原则,确保其服务器不会尝试通过
elicitation/create
请求来获取任何形式的敏感凭证或个人身份信息 (PII)。
未来安全机制:带外凭证与授权请求(OAuth等)
尽管当前的 MCP Elicitations 实现禁止请求敏感信息,但社区已经认识到在某些场景下,AI 工具确实需要安全地获取用户凭证或授权才能访问受保护的资源。 为了满足这一需求,同时确保安全性,相关工作正在进行中,旨在引入更安全的机制来处理凭证和授权请求。
社区安全开发工作
Den Delimarsky 的文章提到,Wils Dawson 和 Nate Barbettini 来自 Arcade.dev 的团队正在致力于开发一种安全的、带外 (out-of-band) 的凭证或授权请求方式 [1]。
这种机制很可能涉及到使用成熟的授权框架,如 OAuth 2.0 或 OpenID Connect。社区鼓励开发者关注相关的 Pull Request 并提供反馈,以共同塑造这一重要安全功能的未来。
带外安全认证流程
通过带外请求,敏感凭证的交换不会直接通过 MCP Elicitation 通道进行,而是可能引导用户到一个安全的授权服务器进行认证和授权,然后通过回调或令牌的方式将授权结果传递给 MCP 服务器。这种方式可以将敏感信息的处理与通用的 Elicitation 流程分离开来,利用 OAuth 等协议提供的安全特性来保护用户数据。
社区参与与反馈:共同构建安全生态
MCP Elicitations 作为一个新兴的技术,其安全性的构建和完善离不开社区的积极参与和反馈。 Den Delimarsky 在文章中特别提到了由 Wils Dawson 和 Nate Barbettini 领导的关于安全凭证请求的工作,并鼓励读者查看相关的 Pull Request 并提供反馈 [1]。
关注发展
密切关注官方规范的最新更新和安全建议
参与讨论
积极参与社区讨论,向规范维护者提供反馈
报告问题
发现安全漏洞时及时报告,帮助完善安全性
这种集体智慧有助于识别和修复安全问题,推动 MCP 生态系统向更安全、更可靠的方向发展。通过社区的共同努力,可以确保 MCP Elicitations 在提供强大功能的同时,也能有效保护用户的数据和隐私,赢得开发者的信任。
MCP Elicitations 的未来发展趋势
迈向更智能、更具上下文感知能力的AI工具
MCP Elicitations 的引入预示着 AI 辅助开发工具将朝着更智能、更具上下文感知能力的方向发展。 Den Delimarsky 在其文章的 "Looking ahead" 部分指出,随着越来越多的 MCP 服务器采用 Elicitation 模式,我们可以期待 AI 工具能够更深入地理解开发者的具体需求和所处的工作环境 [1]。
当前局限性
- 传统 AI 助手因缺乏足够上下文而做出不准确假设
- 生成的代码或建议与实际情况不符
- 无法理解项目特定的配置和要求
未来增强
- 主动获取缺失的上下文信息
- 基于更完整、准确的数据进行推理
- 理解项目背景和开发者意图
这种增强的上下文感知能力将使 AI 助手不再仅仅是执行指令的工具,而是能够更像一个理解项目背景和开发者意图的智能伙伴,从而提供更相关、更个性化的辅助。
从聊天机器人到真正的协作伙伴
MCP Elicitations 的出现是推动 AI 开发工具从简单的聊天机器人向真正的协作伙伴转变的关键一步。 当前许多 AI 编码助手主要以聊天界面的形式存在,用户通过自然语言描述需求,AI 则尝试生成代码或回答问题。
交互模式转变
- • 被动等待指令
- • 表面对话交互
- • 独立于工作流
- • 缺乏深度理解
- • 主动询问关键信息
- • 结构化精准交互
- • 深度工作流集成
- • 理解任务复杂性
Elicitations 通过引入结构化的信息请求和原生 UI 集成,使得 AI 与开发者的交互更加直接、高效和自然,更像是一种"并肩作战"的合作关系 [1]。正如 Den Delimarsky 所展望的,未来的 AI 工具将更少地像聊天机器人,而更像知识渊博的结对编程伙伴,能够与开发者进行更深层次的协作,共同解决复杂的编程问题。
开发者生态与规范演进
MCP Elicitations 的未来发展与开发者生态的繁荣和 MCP 规范的持续演进紧密相关。 Den Delimarsky 提到,MCP Elicitations 仍处于早期阶段,但其影响是显著的 [1]。
规范演进
持续迭代和完善 Elicitation 的协议细节、安全模型和互操作性标准
社区发展
涌现更多创新的应用场景和最佳实践,共同推动技术成熟
文档完善
清晰的文档、易用的 SDK 和丰富的示例降低开发门槛
只有通过规范的持续演进和开发者社区的积极参与,MCP Elicitations 才能充分发挥其潜力,成为下一代 AI 辅助开发工具的核心组件。
结论:MCP Elicitations 的价值与影响
MCP Elicitations 的引入,标志着 AI 辅助开发工具在交互模式和上下文理解能力上的一次重要飞跃。
核心价值
- 解决传统 AI 工具因猜测导致输出不准确的问题
- 显著提升 AI 助手的实用性和可靠性
- 实现精准的上下文获取和无缝的工作流集成
- 优化用户体验,使交互更加流畅自然
竞争优势
- 结构化数据收集确保信息准确性
- 上下文保持维护工作流连续性
- 输入验证有效预防错误发生
- 原生集成提供更佳用户体验
安全与未来展望
尽管当前 Elicitations 在安全方面存在限制,禁止请求敏感信息,但社区已经在积极探索更安全的带外凭证和授权机制(如 OAuth)来弥补这一不足。这体现了 MCP 协议在安全性和功能性之间寻求平衡的审慎态度。
展望未来,随着 MCP Elicitations 技术的不断成熟和开发者生态的壮大,我们可以预见 AI 辅助开发工具将变得更加智能、更具上下文感知能力,并最终从简单的代码生成器或问答机器人,演变为开发者真正意义上的、能够进行深度协作的"结对编程"伙伴。
MCP Elicitations 为这一愿景的实现奠定了坚实的基础,其对于提升开发效率、改善代码质量以及推动软件开发范式变革的潜在影响是深远的。通过结构化的信息请求机制,它正在重新定义开发者与 AI 工具之间的协作方式,为下一代智能开发工具的演进指明了方向。