AI 智能体与 MCP

什么是 MCP?Model Context Protocol 详解

Model Context Protocol(MCP)是用于把 AI 应用连接到工具和数据的开放标准。MCP 如何工作、它的基本构件以及安全性。

译自英文原文。代码、提示词和模型输出保留英文。

Model Context Protocol(MCP)是一个开放标准,定义了 AI 应用如何连接外部工具和数据源。Anthropic 于 2024 年 11 月推出它,此后它已被 AI 助手、编程工具和智能体框架广泛采用。

MCP 解决的问题

语言模型本身只能生成文本。要在真实工作中发挥作用,它需要读取文件、查询数据库、搜索并调用 API。在 MCP 出现之前,每个 AI 应用都定义自己接入这些能力的方式,所以为某个助手构建的工具,到下一个助手那里就得重做。

MCP 用一个协议取代了这一切。工具提供者只需编写一次 MCP 服务器,任何兼容 MCP 的应用都能使用它。常见的比喻是通用接口:一个标准插头,取代为每台设备准备的不同线缆。

MCP 如何工作

MCP 有三种角色。

  • 主机(Host): 用户使用的 AI 应用,例如聊天应用、IDE 或智能体。
  • 客户端(Client): 主机内部的一个组件,负责维持与某一个服务器的连接。
  • 服务器(Server): 向主机暴露能力的程序。
Host application (assistant, IDE, agent)
   |  one MCP client per server
   v
MCP server  --->  files, databases, APIs, or pure computation

消息采用 JSON-RPC 2.0。连接建立时,客户端与服务器交换各自的能力,客户端询问服务器提供什么。主机把这些工具定义传给模型。当模型决定使用某个工具时,客户端把调用发给服务器,并返回结果。

基本构件

服务器可以提供三类能力。

原语 它是什么 由谁决定是否使用
工具(Tools) 模型可以调用的函数,带有名称、描述和输入 schema 模型
资源(Resources) 由 URI 标识的只读数据,例如文件或记录 应用或用户
提示词(Prompts) 服务器提供的可复用提示词模板 用户

工具是使用最广泛的一类。一个工具定义看起来像这样:

{
  "name": "estimate_tokens",
  "description": "Count the tokens in a prompt for a given model.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "prompt": { "type": "string" },
      "model": { "type": "string" }
    },
    "required": ["prompt"]
  }
}

描述和 schema 会被模型读取,所以它们本身就是提示词。清晰的工具描述,是智能体能否正确使用工具的最大因素。参阅面向 AI 智能体的提示词。

传输方式

MCP 定义了消息如何传输。

  • stdio: 主机把服务器作为本地进程启动,通过标准输入和输出通信。简单,且不会在网络上暴露任何东西。
  • 可流式 HTTP(Streamable HTTP): 服务器作为 Web 服务运行,客户端通过 HTTP 访问,适合远程和共享的服务器,同时也引入了认证。

MCP、函数调用与 API

它们是不同的层,而不是竞争关系。

  • API 是软件与服务对话的方式。
  • 函数调用 是模型请求运行某个函数的方式。
  • MCP 把函数如何被描述、被发现并交付给任意 AI 应用标准化。

MCP 服务器通常会封装一个现有的 API。如果你只为自己掌控的一个应用提供服务,普通的函数调用就够了。当你希望一个工具能跨多个客户端使用时,MCP 就体现出价值。

配置服务器

主机通过一个要启动的服务器列表来配置。本地 stdio 服务器需要一条命令及其参数:

{
  "mcpServers": {
    "promptflow": {
      "command": "node",
      "args": ["/absolute/path/to/packages/mcp-server/dist/bin.js"]
    }
  }
}

键名在不同主机之间略有不同,但结构是一样的。

安全注意事项

把模型连接到工具能力很强,同时也扩大了攻击面。

工具结果是不可信输入。 抓取网页或读取工单的服务器,返回的文本可能是攻击者写的。模型可能会遵循其中的指令。参阅提示词注入。

模型信任工具描述。 恶意服务器可以用误导性的方式描述工具,以操纵模型。只从你信任的来源安装服务器,并检查它们声明了什么。

能力叠加会成倍放大风险。 一个会话如果既能读取私有数据、又能读取不可信内容、还能向外发送数据,就可能被变成外泄通道。避免让同一个会话同时拥有这三者。

适用最小权限原则。 优先选择只做一件事的服务器,尽可能使用只读访问,并对有副作用的操作要求确认。

本地服务器以你的权限运行。 stdio 服务器是你机器上的一个程序。把安装它当作安装任何其他软件来对待。

设计一个好的 MCP 服务器

  • 提供少量命名清晰、用途各异的工具。
  • 编写的描述要说明何时使用该工具以及它返回什么。
  • 验证每个参数,并返回模型可以据以行动的错误。
  • 让结果保持精简,因为它们会占用模型的上下文。
  • 把只读的工具标记为只读,以便主机相应地处理。
  • 绝不在结果或日志中返回密钥。

一个例子:通过 MCP 提供提示词工具

PromptFlowEngine MCP 服务器是这些原则的一个小型示例。它把提示词引擎作为工具暴露出来,用于分析、重构、优化、比较和清理提示词,并把规则和模型目录作为资源提供。它使用 stdio 传输,不发起网络调用,也没有文件或 shell 访问权限,因此每个工具都是只读的:只能处理交给它的文本。

连接之后,智能体可以检查自己的工作:

Use promptflow to restructure this before you start:
"fix login issue and make google login work and don't break anything"

智能体调用重构工具,得到一份分节的规格说明,包含要求、边界情况和验收标准,然后据此实现。设置方法见 MCP 客户端文档。

MCP 的定位

MCP 是智能体系统的连接层。决定何时调用工具的推理循环,在 ReAct 提示词中介绍,而约束该循环的指令则在面向 AI 智能体的提示词中介绍。