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