核心服务器特性
服务器通过三个构建块提供功能:
我们将用一个假想的场景来演示这些特性各自的作用,并展示它们如何协同工作。
工具(Tools)
工具使 AI 模型能够执行操作。每个工具定义一个具有类型化输入和输出的特定操作。模型根据上下文请求执行工具。工具的工作方式
工具是 LLM 可以调用的、由 schema 定义的接口。MCP 使用 JSON Schema 进行校验。每个工具执行单一操作,具有明确定义的输入和输出。工具在执行前可能需要用户同意,从而帮助确保用户对模型所采取的操作保持控制。 协议操作:
工具定义示例:
示例:旅行预订
工具使 AI 应用能够代表用户执行操作。在一个旅行规划场景中,AI 应用可能会使用多个工具来帮助预订一次假期: 航班搜索用户交互模型
工具由模型控制,这意味着 AI 模型可以自动发现并调用它们。然而,MCP 通过若干机制强调人工监督。 为了信任与安全,应用可以通过多种机制实现用户控制,例如:- 在 UI 中显示可用的工具,使用户能够定义某个工具是否应在特定交互中可用
- 针对单次工具执行的批准对话框
- 用于预先批准某些安全操作的权限设置
- 展示所有工具执行及其结果的活动日志
资源(Resources)
资源提供对信息的结构化访问,AI 应用可以检索这些信息并将其作为上下文提供给模型。资源的工作方式
资源暴露来自文件、API、数据库或任何其他来源的数据,供 AI 理解上下文之需。应用可以直接访问这些信息并决定如何使用——无论是选取相关部分、用嵌入(embeddings)进行搜索,还是将其全部传递给模型。 每个资源都有一个唯一的 URI(例如file:///path/to/document.md),并声明其 MIME 类型以便进行恰当的内容处理。
资源支持两种发现模式:
- 直接资源(Direct Resources) —— 指向特定数据的固定 URI。示例:
calendar://events/2024—— 返回 2024 年的日历可用情况 - 资源模板(Resource Templates) —— 带参数的动态 URI,用于灵活查询。示例:
travel://activities/{city}/{category}—— 按城市和类别返回活动travel://activities/barcelona/museums—— 返回巴塞罗那的所有博物馆
示例:获取旅行规划上下文
继续以旅行规划为例,资源为 AI 应用提供对相关信息的访问:- 日历数据(
calendar://events/2024)—— 检查用户的可用时间 - 旅行文档(
file:///Documents/Travel/passport.pdf)—— 访问重要文档 - 以往行程(
trips://history/barcelona-2023)—— 参考过去的行程和偏好
origin(出发)机场,并开始输入 “Bar” 作为 destination(到达)机场时,系统可以建议 “Barcelona (BCN)” 或 “Barbados (BGI)“。
参数补全
动态资源支持参数补全。例如:- 为
weather://forecast/{city}输入 “Par” 可能会建议 “Paris” 或 “Park City” - 为
flights://search/{airport}输入 “JFK” 可能会建议 “JFK - John F. Kennedy International”
用户交互模型
资源由应用驱动,使应用在如何检索、处理和呈现可用上下文方面具有灵活性。常见的交互模式包括:- 树形或列表视图,以熟悉的类似文件夹的结构浏览资源
- 用于查找特定资源的搜索和过滤界面
- 基于启发式规则或 AI 选择的自动上下文纳入或智能建议
- 用于纳入单个或多个资源的手动或批量选择界面
提示(Prompts)
提示提供可复用的模板。它们允许 MCP 服务器作者为某个领域提供参数化的提示,或展示如何最好地使用该 MCP 服务器。提示的工作方式
提示是定义预期输入和交互模式的结构化模板。它们由用户控制,需要显式调用而非自动触发。提示可以是上下文感知的,引用可用的资源和工具以创建全面的工作流。与资源类似,提示支持参数补全,以帮助用户发现有效的参数值。 协议操作:示例:精简的工作流
提示为常见任务提供结构化模板。在旅行规划的场景中: “Plan a vacation” 提示:- 选择 “Plan a vacation” 模板
- 结构化输入:Barcelona、7 days、$3000、[“beaches”, “architecture”, “food”]
- 基于模板的一致工作流执行
用户交互模型
提示由用户控制,需要显式调用。协议给予实现者自由,去设计在其应用中感觉自然的界面。关键原则包括:- 易于发现可用的提示
- 对每个提示所做之事的清晰描述
- 带校验的自然参数输入
- 对提示底层模板的透明展示
- 斜杠命令(输入 ”/” 查看可用的提示,如 /plan-vacation)
- 用于可搜索访问的命令面板
- 为常用提示设置的专用 UI 按钮
- 建议相关提示的上下文菜单
将服务器组合到一起
当多个服务器协同工作、通过统一的接口组合各自的专门能力时,MCP 的真正威力才得以显现。示例:多服务器旅行规划
设想一个个性化的 AI 旅行规划应用,它连接了三个服务器:- 旅行服务器(Travel Server) —— 处理航班、酒店和行程
- 天气服务器(Weather Server) —— 提供气候数据和预报
- 日历/邮件服务器(Calendar/Email Server) —— 管理日程和通信
完整流程
-
用户带参数调用一个提示:
-
用户选择要纳入的资源:
calendar://my-calendar/June-2024(来自日历服务器)travel://preferences/europe(来自旅行服务器)travel://past-trips/Spain-2023(来自旅行服务器)
-
AI 使用工具处理请求:
AI 首先读取所有选定的资源以收集上下文——从日历中识别可用日期,从旅行偏好中了解偏好的航空公司和酒店类型,并从以往行程中发现之前喜欢的地点。
利用这些上下文,AI 随后执行由 AI 应用提供的提示。在我们的示例中,AI 应用将所连接的 MCP 天气服务器的天气工具暴露给模型。由于天气会影响出行计划,AI 在解释该提示时选择调用
checkWeather()。 结果,AI 执行一系列工具:searchFlights()—— 查询从 NYC 到 Barcelona 的航班checkWeather()—— 检索出行日期的气候预报
bookHotel()—— 查找指定预算内的酒店createCalendarEvent()—— 将此行程添加到用户的日历sendEmail()—— 发送包含行程详情的确认信息