理解 MCP 服务器:核心特性(工具、资源、提示词)及工作原理详解
MCP 服务器是一类程序,通过标准化协议接口向人工智能应用开放特定功能。
常见示例包括用于文档访问的文件系统服务器、用于数据查询的数据库服务器、用于代码管理的 GitHub 服务器、用于团队沟通的 Slack 服务器,以及用于日程安排的日历服务器。
服务器核心特性
服务器通过三大核心组件提供功能:
| 特性 | 说明 | 示例 | 控制方 |
|---|---|---|---|
| 工具(Tools) | 大型语言模型(LLM)可主动调用的功能,模型会根据用户请求决定使用时机。工具可写入数据库、调用外部 API、修改文件或触发其他逻辑。 | 搜索航班 发送消息 创建日历事件 |
模型(Model) |
| 资源(Resources) | 被动数据源,提供只读访问权限,为模型提供上下文信息,例如文件内容、数据库架构或 API 文档。 | 检索文档 访问知识库 读取日历 |
应用(Application) |
| 提示词(Prompts) | 预构建的指令模板,指导模型结合特定工具和资源完成任务。 | 规划假期 总结会议内容 草拟邮件 |
用户(User) |
下文将通过一个假设场景,演示每个特性的作用及协同工作方式。
工具(Tools)
工具使人工智能模型能够执行具体操作。每个工具定义一项特定操作,包含类型化的输入和输出。模型会根据上下文请求执行工具。

工具的工作原理
工具是大型语言模型可调用的、基于模式定义的接口,MCP 采用 JSON Schema 进行验证。每个工具仅执行单一操作,输入和输出定义明确。工具执行前可能需要用户授权,确保用户对模型的操作保持控制权。
协议操作:
| 方法 | 用途 | 返回结果 |
|---|---|---|
tools/list |
发现可用工具 | 包含模式的工具定义数组 |
tools/call |
执行特定工具 | 工具执行结果 |
工具定义示例:
{
name: "searchFlights",
description: "搜索可用航班",
inputSchema: {
type: "object",
properties: {
origin: { type: "string", description: "出发城市" },
destination: { type: "string", description: "到达城市" },
date: { type: "string", format: "date", description: "出行日期" }
},
required: ["origin", "destination", "date"]
}
}
示例:旅行预订
工具支持人工智能应用代表用户执行操作。在旅行规划场景中,人工智能应用可能通过多个工具协助完成假期预订:
航班搜索
searchFlights(origin: "纽约(NYC)", destination: "巴塞罗那", date: "2024-06-15")
查询多家航空公司,返回结构化的航班选项。
日历占用
createCalendarEvent(title: "巴塞罗那之旅", startDate: "2024-06-15", endDate: "2024-06-22")
在用户日历中标记出行日期。
邮件通知
sendEmail(to: "team@work.com", subject: "休假通知", body: "...")
向同事发送自动休假通知。
用户交互模式
工具由模型控制,意味着人工智能模型可自动发现并调用工具。但 MCP 强调通过多种机制实现人工监督:
为保障信任与安全,应用可通过以下方式实现用户控制:
- 在用户界面中显示可用工具,允许用户定义特定交互场景下可使用的工具
- 为单个工具执行弹出确认对话框
- 提供权限设置,预先批准部分安全操作
- 生成活动日志,记录所有工具执行过程及结果
资源(Resources)
资源为人工智能应用提供结构化的信息访问渠道,供模型获取上下文。
资源的工作原理
资源暴露来自文件、API、数据库或其他来源的数据,满足人工智能理解上下文的需求。应用可直接访问这些信息,并决定使用方式——例如筛选相关部分、通过嵌入向量搜索,或直接传递给模型。
每个资源都有唯一的统一资源标识符(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- 返回巴塞罗那的所有博物馆
-
资源模板包含标题、描述和预期 MIME 类型等元数据,具备可发现性和自文档化特性。
协议操作:
| 方法 | 用途 | 返回结果 |
|---|---|---|
resources/list |
列出可用的直接资源 | 资源描述符数组 |
resources/templates/list |
发现资源模板 | 资源模板定义数组 |
resources/read |
检索资源内容 | 含元数据的资源数据 |
resources/subscribe |
监控资源变更 | 订阅确认 |
示例:获取旅行规划上下文
延续旅行规划示例,资源为人工智能应用提供相关信息访问:
- 日历数据(
calendar://events/2024)- 查看用户可用时间 - 旅行证件(
file:///Documents/Travel/passport.pdf)- 访问重要文件 - 历史行程(
trips://history/barcelona-2023)- 参考过往旅行及偏好
人工智能应用检索这些资源后,决定处理方式——无论是通过嵌入向量或关键词搜索筛选部分数据,还是直接将原始数据传递给模型。
本场景中,应用向模型提供日历数据、天气信息和旅行偏好,支持模型检查可用性、查询天气模式并参考过往旅行偏好。
资源模板示例:
{
"uriTemplate": "weather://forecast/{city}/{date}",
"name": "weather-forecast",
"title": "天气预报",
"description": "获取任意城市任意日期的天气预报",
"mimeType": "application/json"
}
{
"uriTemplate": "travel://flights/{origin}/{destination}",
"name": "flight-search",
"title": "航班搜索",
"description": "查询城市间的可用航班",
"mimeType": "application/json"
}
这些模板支持灵活查询。天气数据方面,用户可获取任意城市/日期的预报;航班方面,可查询任意两个机场间的航线。当用户输入“纽约(NYC)”作为出发地,并开始输入“Bar”作为目的地时,系统可推荐“巴塞罗那(BCN)”或“巴巴多斯(BGI)”。
参数补全
动态资源支持参数补全。例如:
- 为
weather://forecast/{city}输入“Par”时,可能推荐“巴黎”或“帕克城” - 为
flights://search/{airport}输入“JFK”时,可能推荐“JFK - 约翰·肯尼迪国际机场”
系统帮助用户发现有效参数值,无需掌握精确格式。
用户交互模式
资源由应用驱动,使其在检索、处理和呈现可用上下文时具备灵活性。常见交互模式包括:
- 树形或列表视图,以熟悉的文件夹式结构浏览资源
- 搜索和筛选界面,查找特定资源
- 基于启发式算法或人工智能选择的自动上下文纳入或智能推荐
- 手动或批量选择界面,支持单个或多个资源的纳入
应用可自由选择适合自身需求的界面模式实现资源发现。协议不强制特定用户界面模式,支持具备预览功能的资源选择器、基于当前对话上下文的智能推荐、支持多个资源纳入的批量选择,或与现有文件浏览器和数据探索器的集成。
提示词(Prompts)
提示词提供可复用模板。MCP 服务器开发者可通过提示词提供特定领域的参数化指令,或展示 MCP 服务器的最佳使用方式。
提示词的工作原理
提示词是结构化模板,定义预期输入和交互模式。提示词由用户控制,需显式调用而非自动触发。提示词可感知上下文,引用可用资源和工具构建完整工作流。与资源类似,提示词支持参数补全,帮助用户发现有效的参数值。
协议操作:
| 方法 | 用途 | 返回结果 |
|---|---|---|
prompts/list |
发现可用提示词 | 提示词描述符数组 |
prompts/get |
检索提示词详情 | 含参数的完整提示词定义 |
示例:简化工作流
提示词为常见任务提供结构化模板。在旅行规划场景中:
“规划假期”提示词:
{
"name": "plan-vacation",
"title": "规划假期",
"description": "引导完成假期规划流程",
"arguments": [
{ "name": "destination", "type": "string", "required": true },
{ "name": "duration", "type": "number", "description": "天数" },
{ "name": "budget", "type": "number", "required": false },
{ "name": "interests", "type": "array", "items": { "type": "string" } }
]
}
相比非结构化自然语言输入,提示词系统支持:
- 选择“规划假期”模板
- 结构化输入:巴塞罗那、7 天、3000 美元、[“海滩”, “建筑”, “美食”]
- 基于模板执行一致的工作流
用户交互模式
提示词由用户控制,需显式调用。协议允许开发者设计符合应用场景的自然界面,核心原则包括:
- 便于发现可用提示词
- 清晰描述每个提示词的功能
- 支持带验证的自然参数输入
- 透明展示提示词的底层模板
应用通常通过以下用户界面模式暴露提示词:
- 斜杠命令(输入“/”查看可用提示词,如 /plan-vacation)
- 可搜索的命令面板
- 常用提示词的专用按钮
- 推荐相关提示词的上下文菜单
服务器协同工作
MCP 的真正价值在于多个服务器协同工作,通过统一接口整合各自的专业功能。
示例:多服务器旅行规划
假设一个个性化人工智能旅行规划应用,连接三个服务器:
- 旅行服务器 - 处理航班、酒店和行程安排
- 天气服务器 - 提供气候数据和预报
- 日历/邮件服务器 - 管理日程和通讯
完整流程
- 用户调用带参数的提示词:
{
"prompt": "plan-vacation",
"arguments": {
"destination": "巴塞罗那",
"departure_date": "2024-06-15",
"return_date": "2024-06-22",
"budget": 3000,
"travelers": 2
}
}
-
用户选择要纳入的资源:
-
calendar://my-calendar/June-2024(来自日历服务器) -
travel://preferences/europe(来自旅行服务器) -
travel://past-trips/Spain-2023(来自旅行服务器)
-
-
人工智能通过工具处理请求:
人工智能首先读取所有选定资源以收集上下文——从日历中确认可用日期、从旅行偏好中获取心仪航空公司和酒店类型、从过往旅行记录中发现喜欢的地点。
基于这些上下文,人工智能执行一系列工具:
-
searchFlights()- 查询纽约到巴塞罗那的航班 -
checkWeather()- 检索出行日期的气候预报
随后,人工智能利用这些信息完成预订及后续步骤,并在必要时请求用户批准:
-
bookHotel()- 查找符合预算的酒店 -
createCalendarEvent()- 将行程添加到用户日历 -
sendEmail()- 发送含行程详情的确认邮件
结果: 通过多个 MCP 服务器,用户完成了贴合自身日程的巴塞罗那旅行调研与预订。“规划假期”提示词引导人工智能整合跨服务器的资源(日历可用性和旅行历史)与工具(航班搜索、酒店预订、日历更新)——收集上下文并完成预订。原本需要数小时的任务,借助 MCP 仅用几分钟即可完成。