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

核心服务器能力

服务器通过三个构建块提供功能:
能力说明示例由谁控制
ToolsLLM 可以主动调用的函数,并根据用户请求决定何时使用。Tool 可以写入数据库、调用外部 API、修改文件或触发其他逻辑。搜索航班
发送消息
创建日历事件
模型
Resources被动数据源,为上下文提供只读信息访问,例如文件内容、数据库 schema 或 API 文档。检索文档
访问知识库
读取日历
应用
Prompts预构建的指令模板,用来告诉模型如何配合特定 tools 和 resources 工作。规划假期
总结会议
起草邮件
用户
下面使用一个假设场景说明这些能力各自的作用,以及它们如何协同工作。

Tools

Tools 让 AI 模型能够执行动作。每个 tool 都定义一个具体操作,并带有类型化输入和输出。模型会根据上下文请求执行 tool。

Tools 如何工作

Tools 是由 schema 定义、可供 LLM 调用的接口。MCP 使用 JSON Schema 进行校验。每个 tool 执行一个单一操作,并具有清晰定义的输入和输出。Tool 执行前可能需要用户同意,这有助于确保用户仍然控制模型采取的动作。 协议操作:
方法用途返回值
tools/list发现可用工具带 schema 的工具定义数组
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"]
  }
}

示例:旅行预订

Tools 让 AI 应用能够代表用户执行动作。在旅行规划场景中,AI 应用可能使用多个 tools 来帮助预订假期: 航班搜索
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: "...")
向同事发送自动外出通知。

用户交互模型

Tools 由模型控制,这意味着 AI 模型可以自动发现并调用它们。不过,MCP 通过多种机制强调人工监督。 出于信任和安全考虑,应用可以通过多种机制实现用户控制,例如:
  • 在 UI 中展示可用 tools,让用户定义某个 tool 是否应在特定交互中可用。
  • 针对单次 tool 执行显示审批对话框。
  • 针对某些安全操作设置预批准权限。
  • 活动日志展示所有 tool 执行及其结果。

Resources

Resources 为信息提供结构化访问,AI 应用可以检索这些信息并作为上下文提供给模型。

Resources 如何工作

Resources 暴露来自文件、API、数据库或任何其他来源的数据,供 AI 理解上下文。应用可以直接访问这些信息,并决定如何使用它们,例如选择相关片段、使用 embeddings 搜索,或将全部数据传给模型。 每个 resource 都有唯一 URI(例如 file:///path/to/document.md),并声明其 MIME type,以便进行适当的内容处理。 Resources 支持两种发现模式:
  • Direct Resources - 指向特定数据的固定 URI。示例:calendar://events/2024 - 返回 2024 年的日历可用性。
  • Resource Templates - 带参数的动态 URI,用于灵活查询。示例:
    • travel://activities/{city}/{category} - 按城市和类别返回活动。
    • travel://activities/barcelona/museums - 返回巴塞罗那的所有博物馆。
Resource Templates 包含 title、description 和预期 MIME type 等元数据,使其可发现且具备自描述性。 协议操作:
方法用途返回值
resources/list列出可用 direct resourcesresource 描述符数组
resources/templates/list发现 resource templatesresource template 定义数组
resources/read检索 resource 内容带元数据的 resource 数据
resources/subscribe监控 resource 变化订阅确认

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

继续旅行规划示例,resources 为 AI 应用提供对相关信息的访问:
  • 日历数据calendar://events/2024)- 检查用户是否有空。
  • 旅行文档file:///Documents/Travel/passport.pdf)- 访问重要文档。
  • 历史行程trips://history/barcelona-2023)- 参考过去的旅行和偏好。
AI 应用会检索这些 resources,并决定如何处理它们:可以使用 embeddings 或关键词搜索选择部分数据,也可以将原始数据直接传给模型。 在这个例子中,应用会向模型提供日历数据、天气信息和旅行偏好,使其能够检查可用日期、查询天气模式,并参考过去的旅行偏好。 Resource Template 示例:
{
  "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"
}
这些 templates 支持灵活查询。对于天气数据,用户可以访问任意城市/日期组合的预报。对于航班,用户可以搜索任意两个机场之间的路线。当用户把 origin 机场输入为 "NYC",并开始在 destination 机场输入 "Bar" 时,系统可以建议 "Barcelona (BCN)""Barbados (BGI)"

参数补全

动态 resources 支持参数补全。例如:
  • weather://forecast/{city} 输入 "Par" 时,可能建议 "Paris""Park City"
  • flights://search/{airport} 输入 "JFK" 时,可能建议 "JFK - John F. Kennedy International"
系统可以帮助发现有效值,而不要求用户知道精确格式。

用户交互模型

Resources 由应用驱动,因此应用在检索、处理和展示可用上下文时有很高灵活性。常见交互模式包括:
  • 使用树形或列表视图,以类似文件夹的结构浏览 resources。
  • 使用搜索和过滤界面查找特定 resources。
  • 基于启发式规则或 AI 选择自动包含上下文,或提供智能建议。
  • 使用手动或批量选择界面包含一个或多个 resources。
应用可以自由选择适合自身需求的界面模式来实现 resource 发现。协议不强制特定 UI 模式,因此可以实现带预览能力的 resource 选择器、基于当前对话上下文的智能建议、用于包含多个 resources 的批量选择,或与现有文件浏览器和数据浏览器集成。

Prompts

Prompts 提供可复用模板。它们允许 MCP server 作者为某个领域提供参数化 prompt,或展示如何最好地使用这个 MCP server。

Prompts 如何工作

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

示例:简化工作流

Prompts 为常见任务提供结构化模板。在旅行规划上下文中: “Plan a vacation” prompt:
{
  "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" } }
  ]
}
相比非结构化自然语言输入,prompt 系统支持:
  1. 选择 "Plan a vacation" 模板。
  2. 输入结构化参数:Barcelona、7 days、$3000、[“beaches”, “architecture”, “food”]。
  3. 基于模板一致地执行工作流。

用户交互模型

Prompts 由用户控制,需要显式调用。协议允许实现者自由设计适合自身应用的自然交互界面。关键原则包括:
  • 易于发现可用 prompts。
  • 清晰描述每个 prompt 做什么。
  • 自然地输入参数,并进行校验。
  • 透明展示 prompt 底层模板。
应用通常通过多种 UI 模式暴露 prompts,例如:
  • Slash commands(输入 "/" 查看 /plan-vacation 等可用 prompts)。
  • 命令面板,支持搜索访问。
  • 针对常用 prompts 的专用 UI 按钮。
  • 根据上下文建议相关 prompts 的菜单。

组合多个服务器

当多个服务器通过统一接口协同工作、组合各自的专门能力时,MCP 的真正价值会体现出来。

示例:多服务器旅行规划

设想一个个性化 AI 旅行规划应用,它连接了三个服务器:
  • Travel Server - 处理航班、酒店和行程。
  • Weather Server - 提供气候数据和天气预报。
  • Calendar/Email Server - 管理日程和沟通。

完整流程

  1. 用户使用参数调用 prompt:
    {
      "prompt": "plan-vacation",
      "arguments": {
        "destination": "Barcelona",
        "departure_date": "2024-06-15",
        "return_date": "2024-06-22",
        "budget": 3000,
        "travelers": 2
      }
    }
    
  2. 用户选择要包含的 resources:
    • calendar://my-calendar/June-2024 (from Calendar Server)
    • travel://preferences/europe (from Travel Server)
    • travel://past-trips/Spain-2023 (from Travel Server)
  3. AI 使用 tools 处理请求: AI 首先读取所有已选择 resources 来收集上下文:从日历中识别可用日期,从旅行偏好中了解首选航空公司和酒店类型,并从历史旅行中发现用户过去喜欢的地点。 利用这些上下文,AI 随后执行一系列 tools:
    • searchFlights() - 查询从 NYC 到 Barcelona 的航班。
    • checkWeather() - 检索旅行日期的天气预报。
    然后 AI 使用这些信息创建预订并执行后续步骤,在必要时请求用户批准:
    • bookHotel() - 查找指定预算内的酒店。
    • createCalendarEvent() - 将行程添加到用户日历。
    • sendEmail() - 发送包含行程详情的确认邮件。
结果: 通过多个 MCP server,用户完成了针对自己日程定制的巴塞罗那旅行调研和预订。“Plan a Vacation” prompt 指导 AI 跨不同服务器组合 Resources(日历可用性和旅行历史)与 Tools(搜索航班、预订酒店、更新日历),从而收集上下文并执行预订。原本可能需要数小时的任务,通过 MCP 在几分钟内完成。