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 → Host | Tools | 模型 | 可执行操作,带 JSON Schema 参数,如创建 Issue |
| Server → Host | Resources | 应用 | 只读数据,用 URI 标识,如文件内容、表结构 |
| Server → Host | Prompts | 用户 | 预定义提示模板,通常以斜杠命令形式出现 |
| Host → Server | Sampling | Server 发起 | Server 请求 Host 代为调用模型 |
| Host → Server | Roots | Host | 告诉 Server 可以访问的目录范围 |
| Host → Server | Elicitation | Server 发起 | Server 请求向用户收集补充信息 |
Server 向 Host 声明自己支持哪些能力,Host 也声明自己支持哪些客户端特性,双方在初始化时协商。
3. 交互流程
- 初始化:Client 发送
initialize,带协议版本和客户端能力;Server 返回版本和服务端能力;Client 发送notifications/initialized。 - 发现:Client 调用
tools/list,拿到每个工具的名称、描述和inputSchema。 - 注入:Host 把这些工具转换为模型 API 的工具定义,放入请求。
- 调用:模型返回工具调用后,Host 找到对应的 Client,发送
tools/call(工具名 + 参数)。 - 返回:Server 执行并返回内容(文本、图片或资源引用)和
isError标记,Host 把结果作为工具结果交给模型。 - 变化通知: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 Calling | MCP | 普通 API |
|---|---|---|---|
| 解决的问题 | 模型如何表达“调用某个工具” | 应用如何发现、连接、调用外部工具 | 服务如何提供功能 |
| 所在位置 | 模型 API | Host 与 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 放在沙箱中;记录全部调用,敏感操作由用户确认。