跳到主要内容
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 应用程序可能会使用多个工具来协助预订假期: 航班搜索 (Flight Search)
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
查询多家航空公司并返回结构化的航班选项。 日历占位 (Calendar Blocking)
createCalendarEvent(title: "Barcelona Trip", startDate: "2024-06-15", endDate: "2024-06-22")
在用户的日历中标记旅行日期。 邮件通知 (Email notification)
sendEmail(to: "[email protected]", subject: "Out of Office", body: "...")
向同事发送自动的离职/休假回复消息。

用户交互模型

工具是由模型控制的,这意味着 AI 模型可以自动发现并调用它们。然而,MCP 强调通过多种机制进行人工监督。 为了安全与信任,应用程序可以通过各种机制实现用户控制,例如:
  • 在 UI 中显示可用工具,允许用户定义在特定交互中是否可以使用该工具
  • 针对单个工具执行的确认对话框
  • 预先批准某些安全操作的权限设置
  • 显示所有工具执行情况及其结果的活动日志

资源

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

资源 (Resources) 如何工作

资源公开来自文件、API、数据库或 AI 理解上下文所需的任何其他来源的数据。应用程序可以直接访问这些信息并决定如何使用——无论是选择相关部分、使用嵌入(embeddings)进行搜索,还是将其全部传递给模型。 每个资源都有一个唯一的 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检索资源内容带有元数据的资源数据
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)”。

参数补全

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

用户交互模型

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

提示

提示词提供可重用的模板。它们允许 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)
  • 用于可搜索访问的操作面板 (Command palettes)
  • 常用提示词的专用 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 在几分钟内即可完成。