跳到主要内容

MCP

MCP(Model Context Protocol)是连接 AI 应用与外部工具、数据源的开放协议。工具提供方实现一次 MCP Server,就可以被任何支持 MCP 的应用接入,不必为每个应用单独写集成代码。本文讲 MCP 的角色、能力、交互流程、传输方式,以及它和 Function Calling、普通 API 的关系与安全风险。

1. 面试核心​

先记住这几条,再读正文
  • 三个角色:Host 是 AI 应用(如 IDE、桌面客户端),内部为每个服务器创建一个 Client,Server 对外提供能力。Client 与 Server 一对一连接。卡 · 角色与能力
  • 消息格式是 JSON-RPC 2.0;标准传输有 stdio(本地子进程)和 Streamable HTTP(远程服务)。
  • Server 提供三类能力:Tools(模型决定调用的操作)、Resources(应用读取的数据)、Prompts(用户选择的提示模板)。
  • MCP 不替代 Function Calling:模型仍通过工具调用提出请求,MCP 规范的是 Host 如何发现和调用外部工具。它解决的是 M 个应用 × N 个工具的集成问题。卡 · 与 Function Calling、普通 API 的关系
  • 风险来自第三方 Server:工具描述投毒、过度权限、数据外泄、远程服务鉴权缺失。接入前审核,执行时按工具授权。卡 · 安全风险

2. 角色与能力​

┌──────────── Host(AI 应用)────────────┐
│ 模型 ←→ Client A ←→ Server: GitHub │ (Streamable HTTP,远程)
│ ←→ Client B ←→ Server: 文件系统 │ (stdio,本地子进程)
└────────────────────────────────────────┘
方向能力由谁控制说明
Server → HostTools模型可执行操作,带 JSON Schema 参数,如创建 Issue
Server → HostResources应用只读数据,用 URI 标识,如文件内容、表结构
Server → HostPrompts用户预定义提示模板,通常以斜杠命令形式出现
Host → ServerSamplingServer 发起Server 请求 Host 代为调用模型
Host → ServerRootsHost告诉 Server 可以访问的目录范围
Host → ServerElicitationServer 发起Server 请求向用户收集补充信息

Server 向 Host 声明自己支持哪些能力,Host 也声明自己支持哪些客户端特性,双方在初始化时协商。

3. 交互流程​

  1. 初始化:Client 发送 initialize,带协议版本和客户端能力;Server 返回版本和服务端能力;Client 发送 notifications/initialized。
  2. 发现:Client 调用 tools/list,拿到每个工具的名称、描述和 inputSchema。
  3. 注入:Host 把这些工具转换为模型 API 的工具定义,放入请求。
  4. 调用:模型返回工具调用后,Host 找到对应的 Client,发送 tools/call(工具名 + 参数)。
  5. 返回:Server 执行并返回内容(文本、图片或资源引用)和 isError 标记,Host 把结果作为工具结果交给模型。
  6. 变化通知:Server 的工具列表变化时发送 notifications/tools/list_changed,Client 重新拉取。
{"jsonrpc": "2.0", "id": 7, "method": "tools/call",
"params": {"name": "create_issue", "arguments": {"repo": "acme/web", "title": "登录页 500"}}}

3.1 传输方式​

  • stdio:Host 启动 Server 作为子进程,通过标准输入输出交换消息。适合本地工具,不经过网络,权限等同本地进程。
  • Streamable HTTP:Server 是独立的 HTTP 服务,Client 用 POST 发送消息,Server 可以用普通响应或 SSE 流返回。适合远程和多用户服务,需要鉴权。规范中更早的 HTTP+SSE 双端点方式已被它取代。

4. 与 Function Calling、普通 API 的关系​

对比Function CallingMCP普通 API
解决的问题模型如何表达“调用某个工具”应用如何发现、连接、调用外部工具服务如何提供功能
所在位置模型 APIHost 与 Server 之间服务与调用方之间
工具定义开发者写在代码中Server 运行时提供,可动态变化文档或 OpenAPI,供开发者阅读
复用每个应用各写一遍一个 Server 可被多个 Host 使用每个应用各写集成代码

一次完整调用中,两者同时出现:MCP 提供工具定义和执行通道,Function Calling 让模型选择工具并生成参数。MCP Server 内部通常仍然调用普通 API,它增加的是统一的发现、描述和调用协议。

MCP 被广泛采用的原因是降低集成成本:没有统一协议时,M 个应用接 N 个工具需要 M×N 份集成;有了协议,各自实现一次。代价是多了一层进程或网络调用,以及第三方 Server 的信任问题。

5. 安全风险​

  • 工具描述投毒:恶意 Server 在工具描述中写入指令,诱导模型泄露数据或调用其他工具。描述本身会进入上下文,属于不可信内容。
  • 动态变更:Server 在审核后修改工具定义。可以固定版本、记录定义的哈希,变化时重新确认。
  • 过度权限:本地 stdio Server 拥有启动它的用户的全部权限;远程 Server 拿到的令牌范围过大。
  • 数据外泄:一个 Server 的结果被模型传给另一个 Server 的参数。
  • 鉴权:远程 Server 应作为 OAuth 2.1 资源服务器校验访问令牌,令牌要绑定目标 Server,不能把用户令牌原样转发给下游。

缓解措施:只接入审核过的 Server;按工具配置自动允许、需要确认和禁止;本地 Server 放在沙箱中运行;记录所有调用;敏感操作要求用户确认。

6 · 面试题卡片​

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

出现公司:字节跳动、拼多多、快手、阿里云、凌脉、Deloitte、Accenture

考察重点

  • Host、Client、Server 的职责。
  • 初始化、发现、调用的消息流程与传输方式。

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

参考回答

MCP 是连接 AI 应用和外部工具、数据源的开放协议。Host 是 AI 应用,为每个 Server 创建一个 Client;Server 提供 Tools、Resources、Prompts。消息使用 JSON-RPC 2.0,本地 Server 通过 stdio 子进程通信,远程 Server 使用 Streamable HTTP。

流程:Client 发送 initialize 协商版本和能力;调用 tools/list 获取工具名称、描述和输入 Schema;Host 把它们转换成模型的工具定义;模型返回工具调用后,Host 通过对应 Client 发送 tools/call;Server 执行并返回结果和错误标记;Host 把结果作为工具结果交给模型继续推理。Server 的工具变化时会发送列表变更通知。

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

出现公司:百度、深信服、快手、阿里云

考察重点

  • 三者所处的层次和解决的问题。
  • M×N 集成问题与引入协议的代价。

相关内容:与 Function Calling、普通 API 的关系。

参考回答

Function Calling 是模型 API 的能力,让模型输出要调用的工具和参数。MCP 是应用和工具服务之间的协议,规定如何发现工具、获取描述、发起调用和返回结果。普通 API 是服务本身的接口,面向开发者,调用方要自己写集成代码。

一次调用中三者配合:MCP Server 提供工具定义,Host 用 Function Calling 让模型选择,Host 再通过 MCP 发起调用,Server 内部调用普通 API。

MCP 被广泛采用,是因为它把 M 个应用对接 N 个工具的 M×N 集成变成各自实现一次,工具定义可以在运行时发现和更新。代价是多一层进程或网络调用,以及需要处理第三方 Server 的信任和权限。

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

出现公司:拼多多、凌脉、字节跳动、快手

考察重点

  • 工具描述投毒、动态变更、过度权限与数据外泄。
  • 远程 Server 的 OAuth 鉴权和本地 Server 的隔离。

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

参考回答

风险有:工具描述和返回内容会进入模型上下文,恶意 Server 可以借此注入指令;Server 在接入后修改工具定义;本地 stdio Server 拥有当前用户的全部权限;模型可能把一个 Server 返回的敏感数据作为参数传给另一个 Server;远程 Server 没有鉴权或令牌范围过大。

鉴权方面,远程 Server 作为 OAuth 2.1 资源服务器校验访问令牌,令牌按用户和权限范围签发,并绑定到该 Server,Server 访问下游服务时使用自己的凭据而不是转发用户令牌。其他措施:只接入审核过的 Server 并固定版本,定义变化时重新确认;按工具配置允许、确认或禁止;本地 Server 放在沙箱中;记录全部调用,敏感操作由用户确认。

7. 参考资料​