> ## Documentation Index
> Fetch the complete documentation index at: https://mcp.zhcndoc.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 理解 MCP 服务器

MCP 服务器是通过标准化协议接口向 AI 应用程序暴露特定能力的程序。

常见示例包括用于文档访问的文件系统服务器、用于数据查询的数据库服务器、用于代码管理的 GitHub 服务器、用于团队沟通的 Slack 服务器，以及用于日程安排的日历服务器。

## 核心服务器功能

服务器通过三个构建块提供功能：

| 功能      | 说明                                                                | 示例                               | 由谁控制 |
| ------- | ----------------------------------------------------------------- | -------------------------------- | ---- |
| **工具**  | 你的 LLM 可以主动调用的函数，并根据用户请求决定何时使用它们。工具可以写入数据库、调用外部 API、修改文件，或触发其他逻辑。 | 搜索航班<br />发送消息<br />创建日历事件       | 模型   |
| **资源**  | 提供只读信息访问的被动数据源，用于上下文，例如文件内容、数据库模式或 API 文档。                        | 检索文档<br />访问知识库<br />读取日历        | 应用程序 |
| **提示词** | 预先构建的指令模板，用于告诉模型配合特定工具和资源工作。                                      | 规划一次旅行<br />总结我的会议<br />起草一封电子邮件 | 用户   |

我们将使用一个假设场景来演示这些功能各自的作用，并展示它们如何协同工作。

### 工具

工具使 AI 模型能够执行操作。每个工具定义了一个具有类型化输入和输出的特定操作。模型根据上下文请求执行工具。

#### 工具的工作方式

工具是由模式定义的接口，LLM 可以调用这些接口。MCP 使用 JSON Schema 进行验证。每个工具执行一个具有明确定义输入和输出的单一操作。工具可能需要用户在执行前同意，从而帮助确保用户能够控制模型执行的操作。

**协议操作：**

| 方法           | 用途     | 返回内容        |
| ------------ | ------ | ----------- |
| `tools/list` | 发现可用工具 | 包含模式的工具定义数组 |
| `tools/call` | 执行特定工具 | 工具执行结果      |

**工具定义示例：**

```typescript theme={null}
{
  name: "searchFlights",
  description: "Search for available flights",
  inputSchema: {
    type: "object",
    properties: {
      origin: { type: "string", description: "Departure city" },
      destination: { type: "string", description: "Arrival city" },
      date: { type: "string", format: "date", description: "Travel date" }
    },
    required: ["origin", "destination", "date"]
  }
}
```

#### 示例：旅行预订

工具使 AI 应用能够代表用户执行操作。在旅行规划场景中，AI 应用可能会使用多个工具来帮助预订假期：

**航班搜索**

```
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
```

查询多家航空公司并返回结构化的航班选项。

**日历标记**

```
createCalendarEvent(title: "Barcelona Trip", startDate: "2024-06-15", endDate: "2024-06-22")
```

在用户的日历中标记旅行日期。

**电子邮件通知**

```
sendEmail(to: "team@work.com", subject: "Out of Office", body: "...")
```

向同事发送自动的离岗通知。

#### 用户交互模型

工具由模型控制，这意味着 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` - 返回巴塞罗那的所有博物馆

资源模板包含诸如标题、描述和预期 MIME 类型等元数据，使其可被发现且具备自描述能力。

**协议操作：**

| 方法                         | 目的        | 返回        |
| -------------------------- | --------- | --------- |
| `resources/list`           | 列出可用的直接资源 | 资源描述符数组   |
| `resources/templates/list` | 发现资源模板    | 资源模板定义数组  |
| `resources/read`           | 获取资源内容    | 带元数据的资源数据 |
| `subscriptions/listen`     | 监控资源变化    | 更新通知流     |

要监视特定资源的变化，客户端会发送一个 [`subscriptions/listen`](/specification/draft/basic/patterns/subscriptions) 请求，并在 `resourceSubscriptions` 过滤器中列出资源 URI。只要被监视的资源发生变化，服务器就会在结果流上发送 `notifications/resources/updated`。

#### 示例：获取旅行规划上下文

继续以旅行规划示例为例，资源为 AI 应用提供了对相关信息的访问：

* **日历数据**（`calendar://events/2024`）- 检查用户可用时间
* **旅行文档**（`file:///Documents/Travel/passport.pdf`）- 访问重要文档
* **之前的行程**（`trips://history/barcelona-2023`）- 参考过去的旅行和偏好

AI 应用会检索这些资源，并决定如何处理它们，无论是通过嵌入或关键字搜索选择数据子集，还是将原始数据直接传递给模型。

在这种情况下，它会向模型提供日历数据、天气信息和旅行偏好，使其能够检查可用性、查询天气模式，并参考过去的旅行偏好。

**资源模板示例：**

```json theme={null}
{
  "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"
}
```

这些模板支持灵活查询。对于天气数据，用户可以访问任意城市/日期组合的预报。对于航班，他们可以搜索任意两个机场之间的航线。当用户将 `origin` 机场输入为“NYC”，并开始在 `destination` 机场输入“Bar”时，系统可以建议“巴塞罗那（BCN）”或“巴巴多斯（BGI）”。

#### 参数补全

动态资源支持参数补全。例如：

* 输入“Par”作为 `weather://forecast/{city}` 的输入时，可能建议“巴黎”或“帕克城”
* 输入“JFK”作为 `flights://search/{airport}` 时，可能建议“JFK - 约翰·F·肯尼迪国际机场”

系统帮助发现有效值，而无需精确了解格式。

#### 用户交互模型

资源由应用程序驱动，因此它们在检索、处理和呈现可用上下文方面具有灵活性。常见的交互模式包括：

* 树状或列表视图，用于以类似文件夹的熟悉结构浏览资源
* 搜索和筛选界面，用于查找特定资源
* 基于启发式规则或 AI 选择的自动上下文包含或智能建议
* 用于包含单个或多个资源的手动或批量选择界面

应用程序可以自由实现任何适合其需求的资源发现界面模式。该协议不强制特定的 UI 模式，因此可以提供带预览功能的资源选择器、基于当前对话上下文的智能建议、用于包含多个资源的批量选择，以及与现有文件浏览器和数据浏览器的集成。

### 提示词

提示词提供可复用的模板。它们允许 MCP 服务器作者为某个领域提供参数化提示词，或展示如何最佳地使用 MCP 服务器。

#### 提示词的工作方式

提示词是结构化模板，用于定义预期输入和交互模式。它们由用户控制，需要显式调用，而不是自动触发。提示词可以具备上下文感知能力，引用可用资源和工具来创建完整的工作流。与资源类似，提示词支持参数补全，帮助用户发现有效的参数值。

**协议操作：**

| 方法             | 目的       | 返回           |
| -------------- | -------- | ------------ |
| `prompts/list` | 发现可用的提示词 | 提示词描述符数组     |
| `prompts/get`  | 获取提示词详情  | 包含参数的完整提示词定义 |

#### 示例：精简工作流

提示词为常见任务提供结构化模板。在旅行规划场景中：

**“规划一次假期”提示词：**

```json theme={null}
{
  "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" } }
  ]
}
```

与非结构化的自然语言输入不同，提示词系统能够实现：

1. 选择“规划一次假期”模板
2. 结构化输入：巴塞罗那，7 天，3000 美元，\["海滩", "建筑", "美食"]
3. 基于模板一致地执行工作流

#### 用户交互模型

提示词由用户控制，需要显式调用。该协议赋予实现者自由去设计在其应用中感觉自然的界面。关键原则包括：

* 易于发现可用的提示词
* 清晰说明每个提示词的作用
* 具有验证的自然参数输入
* 透明展示提示词背后的底层模板

应用通常通过多种 UI 模式暴露提示词，例如：

* 斜杠命令（输入“/”查看可用提示词，如 /plan-vacation）
* 可搜索访问的命令面板
* 用于高频使用提示词的专用 UI 按钮
* 建议相关提示词的上下文菜单

## 将服务器连接在一起

当多个服务器协同工作、通过统一接口整合各自的专长时，MCP 的真正威力就会显现出来。

### 示例：多服务器旅行规划

想象一个个性化的 AI 旅行规划应用，它连接了三个服务器：

* **旅行服务器** - 处理航班、酒店和行程
* **天气服务器** - 提供气候数据和预报
* **日历/电子邮件服务器** - 管理日程和通信

#### 完整流程

1. **用户使用参数调用一个提示：**

   ```json theme={null}
   {
     "prompt": "plan-vacation",
     "arguments": {
       "destination": "Barcelona",
       "departure_date": "2024-06-15",
       "return_date": "2024-06-22",
       "budget": 3000,
       "travelers": 2
     }
   }
   ```

2. **用户选择要包含的资源：**
   * `calendar://my-calendar/June-2024`（来自日历服务器）
   * `travel://preferences/europe`（来自旅行服务器）
   * `travel://past-trips/Spain-2023`（来自旅行服务器）

3. **AI 使用工具处理请求：**

   AI 首先读取所有选定的资源以收集上下文——从日历中识别可用日期，从旅行偏好中了解偏好的航空公司和酒店类型，并从过往行程中发现曾经喜欢的地点。

   基于这些上下文，AI 随后执行 AI 应用提供的提示。在我们的示例中，AI 应用将连接的 MCP 天气服务器中的天气工具暴露给模型。由于天气会影响旅行计划，AI 在解释提示时选择调用 `checkWeather()`。

   因此，AI 执行了一系列工具：

   * `searchFlights()` - 查询从纽约到巴塞罗那的航班
   * `checkWeather()` - 获取旅行日期的气候预报

   然后 AI 使用这些信息创建预订及后续步骤，并在必要时请求用户批准：

   * `bookHotel()` - 查找符合指定预算的酒店
   * `createCalendarEvent()` - 将行程添加到用户日历中
   * `sendEmail()` - 发送包含行程详情的确认邮件

**结果：** 通过多个 MCP 服务器，用户研究并预订了一个根据其日程量身定制的巴塞罗那之旅。 “Plan a Vacation” 提示引导 AI 将资源（可用日历时间和旅行历史）与工具（搜索航班、预订酒店、更新日历）结合起来，并跨不同服务器执行——既收集上下文，又完成预订。原本可能需要数小时的任务，如今借助 MCP 在几分钟内就完成了。
