跳到主要内容
MCP 服务器是通过标准化协议接口向 AI 应用程序公开特定能力的程序。 常见的例子包括:用于访问文档的文件系统服务器、用于数据查询的数据库服务器、用于代码管理的 GitHub 服务器、用于团队沟通的 Slack 服务器以及用于日程安排的日历服务器。

核心服务器功能

服务器通过三个构建模块提供功能
功能解释示例谁来控制
工具LLM 可以主动调用的函数,并根据用户请求决定何时使用。工具可以写入数据库、调用外部 API、修改文件或触发其他逻辑。搜索航班
发送消息
创建日历事件
模型
资源被动数据源,为上下文提供信息的只读访问权限,例如文件内容、数据库模式或 API 文档。检索文档
访问知识库
读取日历
应用程序
提示预构建的指令模板,指导模型使用特定的工具和资源。规划假期
总结会议
起草电子邮件
用户
我们将使用一个假设场景来演示这些功能中每一个的作用,并展示它们如何协同工作。

工具

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

工具 (Tools) 的工作原理

工具是 LLM 可以调用的模式化接口。MCP 使用 JSON Schema 进行验证。每个工具执行一个具有明确输入和输出的操作。在执行之前,工具可能需要用户许可,这有助于确保用户对模型采取的行动保持控制。 协议操作:
方法目的返回
tools/list发现可用工具带有模式的工具定义数组
tools/call执行特定工具工具执行结果
工具定义示例
{
  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 通过多种机制强调人工监督。 为了信任和安全,应用程序可以通过多种机制实现用户控制,例如:
  • 在 UI 中显示可用工具,允许用户决定某个工具是否应在特定交互中可用
  • 针对单个工具执行的批准对话框
  • 用于预先批准某些安全操作的权限设置
  • 显示所有工具执行及其结果的活动日志

资源

资源提供对信息的结构化访问,AI 应用程序可以检索这些信息并将其作为上下文提供给模型。

资源 (Resources) 的工作原理

资源公开来自文件、API、数据库或 AI 需要了解上下文的任何其他源的数据。应用程序可以直接访问此信息并决定如何使用它——无论是选择相关部分、使用嵌入进行搜索,还是将其全部传递给模型。 每个资源都有一个唯一的 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监控资源变化订阅确认

示例:获取旅行规划上下文

继续旅行规划示例,资源为 AI 应用程序提供对相关信息的访问权限
  • 日历数据 (calendar://events/2024) - 检查用户可用性
  • 旅行文档 (file:///Documents/Travel/passport.pdf) - 访问重要文档
  • 过往行程 (trips://history/barcelona-2023) - 参考过往旅行和偏好
AI 应用程序检索这些资源并决定如何处理它们,无论是使用嵌入或关键字搜索选择数据子集,还是将原始数据直接传递给模型。 在这种情况下,它向模型提供日历数据、天气信息和旅行偏好,使其能够检查可用性、查找天气模式并参考过往旅行偏好。 资源模板示例:
{
  "uriTemplate": "weather://forecast/{city}/{date}",
  "name": "weather-forecast",
  "title": "Weather Forecast",
  "description": "Get weather forecast for any city and date",
  "mimeType": "application/json"
}

{
  "uriTemplate": "travel://flights/{origin}/{destination}",
  "name": "flight-search",
  "title": "Flight Search",
  "description": "Search available flights between cities",
  "mimeType": "application/json"
}
这些模板支持灵活的查询。对于天气数据,用户可以访问任何城市/日期组合的预报。对于航班,他们可以搜索任意两个机场之间的路线。当用户输入“NYC”作为 origin(出发地)机场并开始输入“Bar”作为 destination(目的地)机场时,系统可以建议“Barcelona (BCN)”或“Barbados (BGI)”。

参数补全

动态资源支持参数补全。例如
  • 输入“Par”作为 weather://forecast/{city} 的输入可能会建议“Paris”或“Park City”
  • flights://search/{airport} 输入“JFK”可能会建议“JFK - John F. Kennedy International”
系统有助于发现有效值,而无需了解精确格式。

用户交互模型

资源由应用程序驱动,使其在检索、处理和呈现可用上下文方面具有灵活性。常见的交互模式包括
  • 用于在类似文件夹的熟悉结构中浏览资源的树状或列表视图
  • 用于查找特定资源的搜索和过滤界面
  • 基于启发式或 AI 选择的自动上下文包含或智能建议
  • 用于包含单个或多个资源的手动或批量选择界面
应用程序可以自由地通过任何适合其需求的界面模式实现资源发现。该协议不强制要求特定的 UI 模式,允许使用具有预览功能的资源选择器、基于当前对话上下文的智能建议、用于包含多个资源的批量选择,或与现有文件浏览器和数据资源管理器的集成。

提示

提示词 (Prompts) 提供可重用的模板。它们允许 MCP 服务器作者为某个领域提供参数化提示词,或展示如何最好地使用 MCP 服务器。

提示词 (Prompts) 的工作原理

提示词是定义预期输入和交互模式的结构化模板。它们由用户控制,需要显式调用而不是自动触发。提示词可以是上下文感知的,引用可用的资源和工具来创建全面的工作流程。与资源类似,提示词支持参数补全,以帮助用户发现有效的参数值。 协议操作:
方法目的返回
prompts/list发现可用提示词提示词描述符数组
prompts/get检索提示词详情带有参数的完整提示词定义

示例:精简的工作流程

提示词为常见任务提供了结构化模板。在旅行规划背景下: “规划假期”提示词:
{
  "name": "plan-vacation",
  "title": "Plan a vacation",
  "description": "Guide through vacation planning process",
  "arguments": [
    { "name": "destination", "type": "string", "required": true },
    { "name": "duration", "type": "number", "description": "days" },
    { "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. 用户调用带参数的提示词
    {
      "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 然后执行一系列工具:
    • searchFlights() - 查询纽约到巴塞罗那航班的航空公司信息
    • checkWeather() - 获取旅行日期的气候预报
    然后,AI 使用此信息进行预订并执行后续步骤,并在必要时请求用户批准
    • bookHotel() - 查找预算范围内的酒店
    • createCalendarEvent() - 将旅行添加到用户日历
    • sendEmail() - 发送带有行程详情的确认邮件
结果: 通过多个 MCP 服务器,用户研究并预订了一次量身定制的巴塞罗那之旅。 “规划假期”提示词引导 AI 跨不同服务器整合了资源(日历可用性和旅行历史)与工具(搜索航班、预订酒店、更新日历)——收集上下文并执行预订。原本可能需要数小时的任务,使用 MCP 在几分钟内即可完成。