MCP servers 是通过标准化协议接口向AI应用暴露特定能力的程序。 常见例子包括用于文档访问的文件系统服务器,用于数据查询的数据库服务器,用于代码管理的GitHub服务器,用于团队通信的Slack服务器,以及用于日程安排的日历服务器。

核心服务器功能

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

工具

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

工具的工作原理

工具是LLM可以调用的模式定义的接口。MCP使用JSON Schema进行验证。每个工具执行一个具有明确定义的输入和输出的单一操作。在执行前工具可能需要用户同意,这有助于确保用户对模型执行的操作保持控制。 协议操作:
方法目的返回
tools/list发现可用工具包含模式(schemas)的工具定义数组
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: "[email protected]", subject: "Out of Office", body: "...")
向同事发送自动设置的离职消息。

用户交互模型

工具由模型控制,意味着AI模型能自动发现并调用它们。但MCP通过若干机制强调人工监督。 出于信任和安全考虑,应用程序可以通过多种机制实现用户控制,例如:
  • 在用户界面中显示可用的工具,使用户能够定义是否应该在特定交互中提供某个工具
  • 单个工具执行时的审批对话框
  • 预批准特定安全操作的权限设置
  • 显示所有工具执行及其结果的活动日志

资源

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

资源工作原理

资源 从文件、API、数据库或任何其他AI需要理解上下文的来源暴露数据。应用程序可以直接访问这些信息,并决定如何使用 - 无论是选择相关部分、通过嵌入进行搜索,还是全部传递给模型。 每个资源都有唯一的URI(例如file:///path/to/document.md),并声明其MIME类型以便进行适当的内容处理。它们声明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监测资源变化订阅确认

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

继续旅行规划的例子,资源为人工智能应用提供了访问相关信息的途径:
  • 日历数据 (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机场时,系统可以建议"巴塞罗那(BCN)"或"巴巴多斯(BGI)"。

参数补全

动态资源支持参数补全。例如:
  • 输入 "Par" 作为 weather://forecast/{city} 的输入可能会建议 "巴黎" 或 "帕克城"
  • 输入"JFK"用于flights://search/{airport}可能会建议"JFK - 约翰·肯尼迪国际机场"
系统帮助发现有效值,无需精确的格式知识。

用户交互模型

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

提示词

提示词提供可复用的模板。它们让MCP服务器作者可以为特定领域提供参数化提示,或展示如何最佳使用MCP服务器。

提示如何工作

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

示例:简化的工作流程

提示为常见任务提供结构化模板。在旅行规划场景中: “规划一次度假”提示:
{
  "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. 基于模板的一致性工作流程执行

用户交互模式

用户控制提示(Prompts),需要显式调用。该协议赋予实现者设计应用程序中感觉自然界面的自由。关键原则包括:
  • 轻松发现可用的提示
  • 清晰描述每个提示词的作用
  • -
  • 带有验证的自然参数输入
  • 提示底层模板的透明展示
应用程序通常通过各种用户界面模式来暴露提示,例如:
  • 斜杠命令(输入“/”查看可用提示,例如 /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首先读取所有选定的资源以收集上下文,包括从日历中识别可用日期、从旅行偏好中学习偏好的航空公司和酒店类型,以及从过去的行程中发现之前喜欢的的地点。 基于此上下文,人工智能随后执行一系列工具:
    • searchFlights() - 查询航空公司从纽约到巴塞罗那的航班
    • checkWeather() - 获取旅行日期的天气预报
    AI随后利用这些信息创建预订及后续步骤,在必要时请求用户批准:
    • bookHotel() - 查找指定预算范围内的酒店
    • createCalendarEvent() - 将行程添加到用户的日历中
    • sendEmail() - 发送包含出行详情的确认邮件
结果: 通过多个MCP服务器,用户根据其日程安排研究并预订了巴塞罗那之旅。"规划度假"提示引导AI结合来自不同服务器的资源(日历可用性和旅行历史)与工具(搜索航班、预订酒店、更新日历)——收集背景信息并执行预订。使用MCP,原本可能需要数小时的任务在几分钟内就完成了。