跳到主要内容

MCP

MCP(Model Context Protocol)是连接 AI 应用与外部工具、数据源的开放协议。工具提供方实现 MCP Server 后,多个兼容的应用就能使用同一套接入方式,减少重复编写集成代码。

本文按 2025-11-25 规范,先介绍各角色的职责和能力,再沿一次工具调用解释交互与传输。随后说明错误和断线怎样处理,以及 MCP 与模型接口、业务 API 的分工和安全风险。

1. 面试核心​

先记住这几条,再读正文
  • Host、Client 与 Server。 Host 是 AI 应用,为每个 Server 创建独立的 Client,Client 与 Server 一对一连接。卡 · 角色与能力
  • 消息与传输。 MCP 2025-11-25 用 JSON-RPC 2.0 交换消息,标准传输包括 stdio 与 Streamable HTTP。
  • 服务端能力。 Server 提供 Tools 执行操作、Resources 供应用读取数据、Prompts 供用户选择提示模板。
  • 协议分工。 MCP 负责能力发现和调用,Function Calling 表达模型请求。卡 · Function Calling 与 API 分工
  • 授权边界。 Roots 只声明工作目录,文件访问由进程权限和沙箱限制,工具与数据访问仍需逐次授权。卡 · 安全风险

2. 角色与能力​

MCP 把应用、连接和能力提供方分开,方便一个应用同时接入多个服务。理解消息流程之前,先区分三个角色:

  • Host 是用户使用的 AI 应用,例如 IDE 或桌面客户端。它组织模型请求,管理连接和授权。
  • Client 是 Host 内部的协议客户端。每个 Client 对应一个 Server,负责建立连接和收发消息。
  • Server 是提供工具、数据或提示模板的程序。它可以是本地子进程,也可以是独立部署的服务。
Host(AI 应用)
├─ Client A ↔ Server A(本地 stdio)
└─ Client B ↔ Server B(Streamable HTTP)

Server 提供的能力与 Client 支持的特性各有用途,下表列出它们的分工。

提供方能力用途
ServerTools模型可选择的操作
ServerResources应用读取的 URI 资源
ServerPrompts用户选择的提示模板
ClientSampling接受 Server 的模型采样请求
ClientRoots向 Server 声明工作目录
ClientElicitation接受 Server 的用户信息收集请求

Tools、Resources、Prompts 分别强调模型、应用和用户控制,具体含义如下:

  • Tools 是带参数规则的可执行操作,例如创建 Issue。参数规则使用 JSON Schema,说明字段类型和必填项,模型据此生成调用请求。
  • Resources 是用 URI 标识的数据,例如文件内容或数据库表结构。URI 是资源的地址或标识,应用通过它读取内容,再决定是否交给模型。
  • Prompts 是预定义的提示模板,由用户选择使用。例如,Host 可以把模板显示为斜杠命令,用户选择后再填入参数。

这些控制方式说明谁主导使用,具体界面和授权流程仍由 Host 设计。Client 还可以声明支持 Sampling、Roots 和 Elicitation。Sampling 允许 Server 请求 Host 代为调用模型;Elicitation 允许 Server 请求向用户收集补充信息。双方在初始化时声明能力,之后按协商结果使用。

Roots 用来告诉 Server 当前工作的目录范围。它只是目录声明,无法独立强制文件隔离。真正能读写哪些文件,取决于 Server 进程的权限和沙箱限制。

3. 交互流程​

MCP 使用 JSON-RPC 2.0 组织请求、响应和通知。JSON-RPC 是用 JSON 表达远程调用的消息协议,请求通过方法名指定操作,用 ID 对应响应。

一次工具调用从连接建立到结果返回,经过以下七个环节:

  1. Client 发送 initialize,携带协议版本与客户端能力。
  2. Server 返回支持的版本和服务端能力。
  3. Client 确认版本兼容后,发送 notifications/initialized,表示初始化完成。版本无法兼容时,应结束连接。
  4. Client 调用 tools/list,获取工具名称、描述和 inputSchema,后者定义输入参数的结构。
  5. Host 把选定工具转换成模型 API 的工具定义,加入模型请求。
  6. 模型提出工具调用后,Host 找到对应 Client,由它发送 tools/call,携带工具名和参数。
  7. Server 执行并返回结果,Host 再转换成模型接口要求的工具结果。返回内容可以是文本、图片或资源引用,模型据此继续处理任务。

tools/list 支持分页,Client 需要按游标继续读取,游标用于标记下一页的位置。Server 声明 listChanged 后,可以发送 notifications/tools/list_changed。Client 收到通知后重新拉取列表,才能发现新增、修改或移除的工具。

下面的请求查询订单 SO100,展示 tools/call 的消息结构:

{"jsonrpc":"2.0","id":7,"method":"tools/call",
"params":{"name":"get_order","arguments":{"order_id":"SO100"}}}

响应中的 id=7 表示它对应这次 JSON-RPC 请求。这个 ID 用于 Client 与 Server 的通信,模型接口还有自己的调用 ID。因此,Host 要维护两者的对应关系,才能把结果交回正确的模型调用。

3.1 传输方式​

传输方式决定协议消息怎样到达另一端。MCP 2025-11-25 提供 stdio 和 Streamable HTTP,分别适合本地进程通信和通过 HTTP 连接服务。

stdio 通过 Server 子进程的标准输入和标准输出交换消息。Host 启动子进程后,就可以在本机直接通信,这段传输无需经过网络。stdout 只能写协议消息,日志可写 stderr,否则 Client 会把日志误当成协议内容。子进程能访问哪些文件和服务,仍由启动配置与沙箱决定。

Streamable HTTP 使用单个 MCP 端点,也就是 Client 访问的服务地址。Client 用 POST 发送消息,响应可以是普通 JSON,也可以是 SSE。SSE 是服务端持续向客户端发送事件的数据流。Client 还可用 GET 建立服务端消息流;服务未提供该流时返回 405。

这种方式适合远程或多用户服务,也可以用于本机 HTTP 服务。2024-11-05 的 HTTP+SSE 则使用旧的双端点方案。新版传输仍能使用 SSE,因此看到 SSE 时,要进一步区分使用的是哪种传输方案。

3.2 错误类型与会话恢复​

调用失败时,要先确定失败发生在协议、工具执行还是传输层。这样才能判断应该修正请求、调整业务参数,还是恢复连接。

这三类错误使用不同的处理方式:

  • 协议错误:例如工具名未知或方法不可用,通过 JSON-RPC error 返回,表示请求在协议处理时出了问题。
  • 工具执行错误:例如日期格式错误、业务条件不满足或下游 API 失败,在结果中用 isError: true 表达。它仍是 tools/call 的结果,Host 可以把原因交给模型修正。
  • 传输中断:连接断开只说明消息传输中断。此时工具已经执行到哪一步,需要另外确认,尤其要核对写入是否已完成。

使用 HTTP 会话时,Server 可以在初始化响应中返回 MCP-Session-Id。Client 后续请求携带这个 ID,还要携带协商得到的 MCP-Protocol-Version。带会话 ID 的请求收到 404,表示该会话已失效,Client 应重新初始化。

如果 Server 支持 SSE 消息恢复,Client 重连时可用 Last-Event-ID 提供最后收到的事件 ID。Server 据此重放遗漏的消息。但消息恢复只解决漏收响应的问题,重复写入仍要靠业务幂等处理。

副作用的确认与恢复见Agent 状态与持久化执行。

4. Function Calling 与 API 分工​

一次工具调用可以同时使用 Function Calling、MCP 和业务 API。它们处在不同位置,分别解决模型表达请求、应用接入能力和服务执行操作的问题。

层次职责
Function Calling模型表达工具选择与参数
MCP应用发现并调用外部能力
业务 API服务执行具体业务操作

Function Calling 位于模型 API 层,应用把可调用工具的定义交给模型。MCP 位于 Host 与 Server 之间,工具定义由 Server 在运行时提供。业务 API 则位于服务与调用方之间,通过接口文档或 OpenAPI 描述功能和参数。

比如,Host 先从 MCP Server 获取工具定义,再用 Function Calling 让模型选择工具并填写参数。Host 随后通过 MCP 发起调用,Server 内部调用已有业务 API 完成操作。也就是说,MCP 统一的是发现、描述和调用方式,具体业务逻辑仍由服务实现。

这种统一可以减少 M×N 集成:如果 M 个应用分别接入 N 个服务,就需要维护大量逐对适配。应用和服务各自接入 MCP 后,可以复用共同的协议实现,减少专用代码。工具目录还能在运行时发现和更新。

复用仍要求双方的协议版本、能力和内容类型兼容。接入 MCP 也会增加进程通信或网络往返的开销,并带来第三方 Server 的信任管理成本。因此,设计时要同时考虑复用收益与调用成本。

5. 安全风险​

接入 MCP Server 后,应用既会读取它的描述,也会把参数交给它执行。因此,安全检查要覆盖进入上下文的内容,以及实际的数据访问。

审核接入时,重点检查以下四类风险:

  • 工具描述投毒:恶意 Server 在描述或结果中夹带指令,诱导模型泄露数据或调用其他工具。这些内容会进入上下文,因此要按外部输入处理。
  • 动态变更:审核通过后,Server 又修改了工具定义。可以固定服务版本、记录定义的哈希,也就是用于检测内容变化的摘要值。定义变化时,重新检查访问范围和副作用。
  • 过度权限:本地进程能访问过多目录,或远程令牌允许过多操作,都会扩大错误调用的影响。因此,应按需要限制权限。
  • 数据外泄:模型把一个 Server 返回的敏感数据,放进另一个 Server 的调用参数,就会把数据传给新的接收方。执行前需要检查数据流向。

注入指令怎样影响模型,见提示注入。

采用 HTTP 授权时,MCP 使用 OAuth 2.1 框架,让 Client 用访问令牌证明获得的访问权限。Server 作为资源服务器,校验令牌的目标资源、有效期和权限范围。访问下游服务时,要使用为下游正确签发的凭据;规范禁止把收到的访问令牌直接透传给下游。

本地 HTTP 服务还需校验 Origin 请求头,确认请求来源,并限制监听地址。stdio 进程则应按最小权限启动,通过沙箱限制文件和网络访问。认证解决身份识别,具体工具和数据仍需逐次授权。

Host 应只接入审核过的 Server,按工具配置自动允许、需要确认和禁止,并记录调用。敏感操作按策略要求用户确认。具体授权与隔离方法见工具授权与执行沙箱。

6 · 面试题卡片​

本页题目与参考回答

6.1 MCP 是什么?Agent 通过 MCP 调用工具的流程是什么?​

考察重点

  • 解释 Host、Client 和 Server 分别负责什么。
  • 能沿初始化、发现和调用说明消息如何传递,以及使用什么传输方式。

相关内容:角色与能力、交互流程、传输方式。

参考回答

MCP 是连接 AI 应用与外部工具、数据源的开放协议,通过统一发现和调用方式让多个应用复用服务。

Host 是 AI 应用,为每个 Server 创建独立 Client。Server 提供工具、资源和提示模板。协议消息使用 JSON-RPC 2.0,2025-11-25 的标准传输是 stdio 与 Streamable HTTP。

Client 用 initialize 协商版本和能力,确认兼容后发送 notifications/initialized。随后调用 tools/list 获取工具名称、描述和输入 Schema,Host 将它们转换成模型工具定义。

模型提出调用后,对应 Client 发出 tools/call。Server 执行并返回内容或错误标记,Host 再把结果交给模型。列表支持分页;Server 声明支持列表变化通知后,Client 可在收到通知时重新拉取定义。

6.2 MCP 和普通 API 调用、Function Calling 有什么区别?为什么 Agent 生态广泛采用 MCP?​

考察重点

  • 解释 Function Calling、MCP 和业务 API 各自解决的问题。
  • 能说明 M×N 集成成本为何减少,以及兼容性、通信和信任管理的代价。

相关内容:Function Calling 与 API 分工。

参考回答

Function Calling 让模型表达工具请求,MCP 统一应用接入外部能力的方式,业务 API 则提供具体服务接口。

三者可以配合使用:MCP Server 提供工具定义,Host 交给模型选择并生成参数。Host 再通过 MCP 发起调用,Server 内部调用业务 API 完成操作。普通 API 的功能和参数由接口文档或 OpenAPI 描述,调用方据此编写集成。

M 个应用分别接入 N 个服务时,需要大量逐对适配。使用 MCP 后,应用和服务各自实现共同协议,就能减少重复的集成代码,并在运行时发现工具。这是它被采用的重要原因。

实际复用仍要求版本、能力和内容类型兼容。代价包括进程通信或网络往返,以及第三方 Server 的信任和权限管理。

6.3 Agent 调用 MCP 有哪些风险?MCP Server 应该如何鉴权?​

考察重点

  • 解释工具描述投毒、动态变更、过度权限和数据外泄怎样发生。
  • 说明远程 Server 如何校验令牌,以及本地进程为什么仍需隔离。

相关内容:安全风险、工具授权与执行沙箱。

参考回答

MCP 的风险来自不可信内容、工具动态变更、过度权限和数据外泄,HTTP 授权还需要 Server 正确校验访问令牌。

描述和结果会进入模型上下文,恶意指令可借此影响工具选择。审核后修改工具定义,也会改变原有访问范围。模型若把一个 Server 返回的敏感数据传给另一个 Server,就会发生跨服务外传。因此,Host 要审核服务、记录定义变化,并按工具限制访问与副作用。

采用 HTTP 授权时,Server 按 OAuth 2.1 框架校验令牌的目标资源、有效期和权限范围。访问下游要使用为下游签发的凭据,避免直接透传收到的令牌。认证之后,每次操作仍需检查业务权限。

本地 stdio 进程按最小权限启动,并通过沙箱隔离。Roots 只声明目录范围,实际访问限制由执行环境落实。Host 还应记录调用,按策略对敏感操作要求确认。

6.4 MCP 协议错误、工具执行错误和 HTTP 断线应如何区分?​

考察重点:能区分协议处理失败、工具业务失败与连接中断,并解释恢复消息与避免重复写入的区别。

相关内容:错误类型与会话恢复。

参考回答

协议错误表示请求处理出了问题,工具执行错误表示操作失败,HTTP 断线则只表示传输中断。

协议错误用 JSON-RPC error 返回,例如工具名未知。业务错误在 tools/call 结果中用 isError: true 表达,Host 可把原因交给模型调整参数。

带会话 ID 的 HTTP 请求收到 404 后,Client 应重新初始化。Server 支持 SSE 恢复时,可以根据 Last-Event-ID 重放遗漏消息。断线期间写入是否已经完成,仍要查询业务结果,并用幂等处理防止重复执行。

7. 参考资料​