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