MCP Server 是通过标准化的协议接口,向 AI 应用提供特定功能的程序,常见的包括文件系统服务器、GitHub 服务器等。

核心功能主要包含三类

  1. Tools:AI 应用可以根据用户请求主动决定调用这些功能,实现类似于向数据库写数据、调用外部 API、修改文件等操作。
  2. Resources:被动型的数据源,提供只读的访问权限,用来获取文件内容等。
  3. Prompts:预先构建好的指令模板,用来指导 AI 使用特定工具和资源来完成任务(MCP Server 官方说明书)。

MCP 使用 JSON Schema 来进行验证,每个工具只执行一项操作,输入和输出都是明确定义的。

Tools

方法用途返回内容
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"]
  }
}

示例:

searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")

通常 AI 应用可以自主地发现并调用这些工具,不过 MCP 通过多种机制来确保人类可以起到监督的作用,例如:

  • UI 中显示各种可用工具,让用户能够决定在特殊的交互场景中是否使用某项工具。
  • 针对工具执行的确认对话框。
  • 对于涉及权限的操作进行预先审批。
  • 工具调用的过程以及结果的日志记录。

Resources

为 AI 应用提供结构化的方式来获取信息,随后可以用于模型的输入数据或上下文信息。

资源支持两种发现模式:

  • 直接资源:指向特定数据的固定 URI。
  • 资源模板:用带参数的动态 URI 实现灵活的查询。
方法用途返回值
resources/list列出可用的直接资源资源描述列表
resources/templates/list列出可用的资源模板资源模板定义列表
resources/read检索资源内容包含元数据的资源数据
resources/subscribe监控资源变化情况订阅确认

示例:

  • 日历数据(calendar://events/2024):查看用户的可用时间。
  • 证件(file://Documents/Travel/IdCard.pdf):查看身份证复印件。

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"
}

资源模板使查询更加灵活。对于天气数据,AI 应用可以查询任意城市/日期的天气预报组合;对于航班信息,可以查询任意两个城市机场之间的航线,为 AI 应用规划行程提供详细数据。

动态资源支持参数补全,例如输入 Par 作为 weather://forecast/{city} 的参数,很可能是想输入 Paris,系统可以帮助用户在不明确了解格式要求时查到准确的数据。

Prompts

提示词是一种结构化的模板,用来定义所需的输入内容以及交互方式,由用户来控制,需要用户主动触发,还具有情景感知能力,可以利用现有的资源和工具来构建完整的工作流程。与资源类似,提示词也支持参数补全,来帮助用户确定合适的参数。

示例:

{
  "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. 然后结构化输入目的地、时间、预算以及偏好。
  3. 并执行基于模板的标准化工作流的执行方式。

这些提示由用户自行控制,需要用户主动触发才能显示,这常意味着开发者需要设计与其风格相协调的界面,通常包含以下原则:

  • 可以轻松找到可用的 Prompt。
  • 对每个 Prompt 用来做什么进行详细说明。
  • 透明地展示 Prompt 依赖的底层模板。

虽然很多面试题中会有一个常见的“MCP 和 Skill 有什么区别”,但是从我的感觉来看,MCP 中的 Prompt 其实就类似于一个官方的 Skill,类似于一个说明书,给出你“装了这个 MCP Server 之后都可以做什么”的一个最佳实践。MCP官方文档中还有一段关于将多个 MCP Server 组合在一起的内容,我觉得更类似于当前语境下的 Skill。