1. MCP服务器概念:构建智能数据提供者 #
深入理解MCP服务器的核心概念和构建模块,学会创建自己的MCP服务器
2. 🎯 什么是MCP服务器 #
MCP服务器是通过标准化协议接口向AI应用暴露特定功能的程序。每个服务器专注于为特定领域提供功能,让AI应用能够访问和操作各种数据源。
2.1 常见服务器类型 #
| 服务器类型 | 功能描述 | 应用场景 |
|---|---|---|
| 文件系统服务器 | 文档管理和文件操作 | 读取文档、搜索文件 |
| 电子邮件服务器 | 邮件处理和消息管理 | 发送邮件、查看收件箱 |
| 旅行服务器 | 行程规划和预订 | 搜索航班、预订酒店 |
| 数据库服务器 | 数据查询和管理 | 执行SQL查询、数据检索 |
3. 🏗️ 核心构建模块 #
MCP服务器通过三个基本构建模块提供功能:
| 构建模块 | 目的 | 控制方 | 实际应用案例 |
|---|---|---|---|
| 🛠️ 工具 | 针对AI操作 | 模型控制 | 搜索航班、发送消息、创建日历事件 |
| 📁 资源 | 用于上下文数据 | 应用控制 | 文档、日历、电子邮件、天气数据 |
| 💬 提示词 | 交互模板 | 用户可控 | "规划一次度假"、"总结我的会议"、"起草一封邮件" |
4. 🛠️ 工具(Tools) #
4.1 概述 #
工具使AI模型能够通过服务器实现的函数执行操作。每个工具定义了具有类型化输入和输出的特定操作,模型会根据上下文请求工具执行。
关键特点:
- 用户批准:每次工具执行都需要用户明确批准
- 类型安全:使用JSON Schema进行输入验证
- 单一职责:每个工具执行单一操作
- 明确定义:具有明确的输入和输出
4.2 协议操作 #
| 方法 | 目的 | 返回 |
|---|---|---|
tools/list |
发现可用工具 | 带有模式定义的工具数组 |
tools/call |
执行特定工具 | 工具执行结果 |
4.3 工具定义示例 #
{
// 工具名称,唯一标识该工具
name: "searchFlights",
// 工具描述,简要说明工具的功能
description: "Search for available flights",
// 输入参数的JSON Schema定义
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"]
}
}4.4 实际应用示例 #
在旅行规划场景中,AI应用可能会使用多种工具:
搜索航班:
searchFlights(origin: "纽约", destination: "巴塞罗那", date: "2024-06-15")创建日历事件:
createCalendarEvent(title: "巴塞罗那之旅", startDate: "2024-06-15", endDate: "2024-06-22")发送邮件通知:
sendEmail(to: "team@work.com", subject: "外出办公", body: "...")
4.5 用户交互模型 #
工具由模型控制,但强调人工监督:
- 清晰展示:应用程序应在UI中清晰展示可用工具
- 视觉提示:在考虑或使用工具时提供视觉提示
- 批准对话框:任何工具执行前,必须向用户呈现明确的批准对话框
- 活动日志:记录所有工具执行结果的活动日志
5. 📁 资源(Resources) #
5.1 概述 #
资源提供了结构化信息访问方式,宿主应用程序可检索这些信息并将其作为上下文提供给AI模型。资源能够从文件、API、数据库或任何AI需要理解上下文的来源中暴露数据。
关键特点:
- 基于URI:每个资源都拥有唯一的URI
- MIME类型:声明MIME类型以实现恰当的内容处理
- 两种模式:直接资源和资源模板
- 动态访问:支持参数化URI模板
5.2 协议操作 #
| 方法 | 目的 | 返回 |
|---|---|---|
resources/list |
列出可用的直接资源 | 资源描述符数组 |
resources/templates/list |
发现资源模板 | 资源模板定义数组 |
resources/read |
获取资源内容 | 带有元数据的资源数据 |
resources/subscribe |
监控资源变更 | 订阅确认 |
5.3 资源类型 #
5.3.1 直接资源 #
使用固定URI的资源,例如:
file:///path/to/document.mdcalendar://events/2024file:///Documents/Travel/passport.pdf
5.3.2 资源模板 #
使用参数化URI的资源,例如:
- uriTemplate :资源的URI模板,支持城市和日期参数
- name:资源模板的唯一名称
- title:资源模板的标题
- description:资源模板的描述信息
- mimeType:资源返回的数据类型,这里为JSON
{
"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"
}5.4 实际应用示例 #
在旅行规划中,资源为AI应用提供访问相关信息的途径:
- 日历数据 (
calendar://events/2024) - 检查可用性 - 旅行证件 (
file:///Documents/Travel/passport.pdf) - 重要信息 - 之前的行程 (
trips://history/barcelona-2023) - 用户选择遵循哪种过往旅行风格
5.5 参数补全 #
动态资源支持参数自动补全功能:
- 输入"Par"作为
weather://forecast/{city}可能会建议"Paris"或"Park City" - 该系统无需掌握精确的格式知识即可帮助发现有效值
5.6 用户交互模型 #
资源的使用由应用程序驱动,常见的交互模式包括:
- 树状或列表视图:用于以类似文件夹的熟悉结构浏览资源
- 搜索和筛选界面:用于查找特定资源
- 自动包含上下文:基于启发式或AI选择
- 手动选择界面:用户手动选择需要的资源
6. 💬 提示词(Prompts) #
6.1 概述 #
提示词提供了可复用的模板,让MCP服务器的作者能够为特定领域提供参数化的提示词模板,或展示如何最佳地使用MCP服务器。
关键特点:
- 结构化模板:定义预期的输入和交互模式
- 用户控制:需要显式调用而非自动触发
- 上下文感知:能引用可用资源和工具
- 参数补全:支持参数补全功能
6.2 协议操作 #
| 方法 | 目的 | 返回 |
|---|---|---|
prompts/list |
探索可用提示 | 提示描述符数组 |
prompts/get |
获取提示详情 | 完整提示定义及参数 |
6.3 提示词示例 #
- name :提示词的唯一名称
- title :提示词的标题
- description :提示词的描述信息
- arguments :提示词的参数列表
- name :参数的名称
- type :参数的类型
- required :是否必填
- description :参数的描述信息
{
"name": "plan-vacation",
"title": "规划一次假期",
"description": "引导用户完成假期规划流程",
"arguments": [
{ "name": "destination", "type": "string", "required": true, "description": "目的地" },
{ "name": "duration", "type": "number", "description": "天数" },
{ "name": "budget", "type": "number", "required": false, "description": "预算" },
{ "name": "interests", "type": "array", "items": { "type": "string" }, "description": "兴趣偏好" }
]
}6.4 实际应用示例 #
提示为常见任务提供了结构化模板。在旅行规划场景中:
- 选择模板:用户选择"Plan a vacation"模板
- 结构化输入:填写目的地、时长、预算等参数
- 一致化工作流:基于模板的一致化工作流执行
6.5 用户交互模型 #
提示词由用户控制,需要显式调用。应用程序通常通过多种UI模式来展示:
- 斜杠命令:输入"/"可查看可用提示词如
/plan-vacation - 命令面板:支持搜索的命令面板
- 专用UI按钮:为高频提示词设计的专用UI按钮
- 上下文菜单:能推荐相关提示词的上下文菜单
7. 🔄 多服务器协同工作 #
MCP的真正威力在于多台服务器协同工作时,通过统一接口整合各自的专长能力。
7.1 多服务器旅行规划示例 #
设想一个由三台互联服务器组成的AI应用:
- 旅行服务器 - 处理航班、酒店和行程安排
- 天气服务器 - 提供气候数据和预报
- 日历/邮件服务器 - 管理日程安排与沟通协调
7.2 完整工作流程 #
7.2.1 用户调用提示词 #
- prompt :提示词的名称
- arguments :提示词的参数列表
- destination :目的地
- departure_date :出发日期
- return_date :返回日期
- budget :预算
- travelers :旅行者人数
{
"prompt": "plan-vacation",
"arguments": {
"destination": "巴塞罗那",
"departure_date": "2024-06-15",
"return_date": "2024-06-22",
"budget": 3000,
"travelers": 2
}
}7.2.2 用户选择资源 #
calendar://my-calendar/June-2024(来自Calendar Server)travel://preferences/europe(来自Travel Server)travel://past-trips/Spain-2023(来自Travel Server)
7.2.3 AI处理请求 #
AI首先会阅读所有选定的资源以收集背景信息:
- 从日历中:识别出可用的日期
- 从旅行偏好中:了解偏爱的航空公司和酒店类型
- 从过往行程中:发现曾经喜欢的旅行地点
- 通过天气数据:核查旅行期间的气候条件
利用这一上下文,AI随后会请求用户批准执行一系列协调的工具调用。
8. 🎯 总结 #
MCP服务器是AI应用生态系统的核心组件,通过三个基本构建模块提供功能:
8.1 工具(Tools) #
- 让AI模型执行具体操作
- 需要用户明确批准
- 提供类型安全的接口
8.2 资源(Resources) #
- 为AI提供上下文数据
- 支持直接资源和模板
- 应用程序控制访问
8.3 提示词(Prompts) #
- 提供可复用的交互模板
- 用户控制调用
- 支持参数化配置
8.4 🔄 协同工作 #
- 多服务器无缝集成
- 统一接口标准
- 强大的组合能力
通过理解这些核心概念,您可以构建功能强大的MCP服务器,为AI应用提供丰富的功能和数据访问能力。