Model Context Protocol(MCP) 把 LLM 应用连接外部工具和数据的标准化——Host 跑模型,Client 连 Server,Server 暴露 tools、resources、prompts。从安全视角,MCP 解决的是工具供应链问题:谁认证 Server、谁授权 tool 调用、transport 上 secret 如何走。
本文以 MCP Specification(截至 2026-06 的公开版本 2025-03-26,A 级)为准,标注与 OAuth 2.1 草案 的衔接点。旧版 HTTP+SSE transport(2024-11-05)已被 Streamable HTTP 取代——部署时需核对 Server 协议版本。
一、Host / Client / Server 三角
flowchart TD
HOST["MCP Host<br/>IDE / Agent 运行时"]
LLM["LLM"]
CLIENT["MCP Client"]
S1["Server: Git"]
S2["Server: Postgres"]
HOST --> LLM
HOST --> CLIENT
CLIENT -->|"stdio 或 Streamable HTTP"| S1
CLIENT -->|"stdio 或 Streamable HTTP"| S2
| 角色 | 职责 | 信任假设 |
|---|---|---|
| Host | UI、模型推理、聚合多个 Client | 用户直接交互;Host 策略是最后防线 |
| Client | 协议会话、capability 协商、JSON-RPC | Host 内嵌;须受 Host 策略约束 |
| Server | tools / resources / prompts | 默认不可信第三方 |
MCP 基于 JSON-RPC 2.0
消息(UTF-8)。生命周期:initialize →
initialized → 能力交换 →
tools/list、tools/call 等。
关键架构事实:一个 Host 可连多个 Server。每个 Server 的 OAuth token、API key 必须隔离——Client 不得把 Server A 的 credential 泄漏给 Server B(第 07 篇 展开供应链)。
二、Transport:stdio vs Streamable HTTP
MCP spec 2025-03-26 定义两种标准 transport(A 级):
2.1 stdio
| 属性 | 规范要求 |
|---|---|
| 启动方式 | Client 以子进程启动 Server |
| 消息通道 | stdin / stdout,newline 分隔 JSON-RPC |
| stderr | Server 可写日志;Client 可忽略 |
| stdout 约束 | 仅合法 MCP 消息——禁止 printf 调试污染 |
sequenceDiagram
participant Client
participant Server as Server Process
Client->>+Server: Launch subprocess
loop Message Exchange
Client->>Server: Write JSON-RPC to stdin
Server->>Client: Write JSON-RPC to stdout
Server--)Client: Optional logs on stderr
end
Client->>Server: Close stdin, terminate
deactivate Server
安全含义:
- 无网络暴露——攻击面从远程变为本地进程。
- 恶意 Server 二进制 = 本地代码执行(RCE)——与安装未签名 npm 包同级。
- 缓解:签名验证、最小文件系统权限、容器隔离(联动 零信任供应链)。
2.2 Streamable HTTP(取代 HTTP+SSE)
2025-03-26 spec 用 Streamable HTTP 替代 2024-11-05 的 HTTP+SSE transport。
| 属性 | 要求 |
|---|---|
| 端点 | 单一 MCP endpoint,支持 POST + GET |
| POST | 每个 JSON-RPC 消息一次 POST;可返回 JSON 或 SSE stream |
| GET | 可选 SSE stream,Server 主动推送 |
| Session | Mcp-Session-Id header(初始化后) |
Security Warning(spec 原文意图,A 级):
- Server 必须验证
Originheader——防 DNS rebinding。 - 本地 Server 应只 bind
127.0.0.1,非0.0.0.0。 - Server 应对所有连接做认证。
无上述保护时,远程网页可通过 DNS rebinding 调用用户本机 MCP Server——与 CSRF 变体同类。
2.3 Transport 对比表
| 维度 | stdio | Streamable HTTP |
|---|---|---|
| 部署 | 本地子进程 | 独立 HTTP 服务 |
| 认证 | 进程边界 + OS 用户 | OAuth / mTLS / API Key |
| 多租户 | 单用户机器 | 团队共享 Server |
| 主要威胁 | 恶意二进制、本地提权 | 网络攻击、Origin 绕过、会话劫持 |
| TLS | 不适用 | 必须 HTTPS |
stdio 不是”更安全”——只是攻击面不同。企业远程 MCP 服务必须用 Streamable HTTP + 完整认证栈。
2.4 向后兼容
Spec 定义:新 Client 应对 Server URL POST
InitializeRequest;若 4xx 则 fallback 旧
HTTP+SSE。生产环境应显式配置 transport
版本,避免静默降级到旧协议。
三、MCP 能力与攻击面
3.1 Tools
tools/list 返回 tool 名 + JSON Schema
description。tools/call 执行 tool。
| 方法 | 数据流 | 风险 |
|---|---|---|
tools/list |
Server → Client → 可能进入 LLM context | 恶意 description = indirect prompt injection 入口 |
tools/call |
LLM → Client → Server → 外部系统 | 越权调用、参数注入 |
3.2 Resources
resources/read
返回只读数据——内容可能含隐藏指令(安全侧见 第 07
篇)。credential 角度:resource URI
不得嵌入 token。
3.3 Prompts
Server 提供的 prompt 模板——同样进入模型 context,需 Host 侧 allowlist。
四、认证:OAuth 2.1 for MCP
MCP Authorization 扩展(截至 2026-06 仍为草案演进中,以 modelcontextprotocol.io 当前 spec 为准)描述:
- MCP Server 作为 OAuth 2.0 Resource Server
- Host/Client 作为 Public Client,走授权码 + PKCE
- 与 IAM OAuth 2.1 + PKCE 一致
4.1 推荐 token 模型
| 反模式 | 推荐 |
|---|---|
| 用户主 session token 注入 MCP Server | per-Server scoped token |
| 全 scope access token 共享给所有 Server | 每 Server 独立 resource /
audience |
| refresh token 存 MCP Server | refresh 仅存 Host/Gateway;Server 拿短期 access token |
与 Token
Exchange 衔接:Host 经 Gateway 用 RFC 8693 换
audience=git-mcp-server 的 delegated
token。
4.2 授权序列
sequenceDiagram
participant User
participant Host as MCP Host
participant IdP as Authorization Server
participant MCPS as MCP Server
User->>Host: 连接 Git MCP Server
Host->>IdP: PKCE authorize scope=mcp:tools:git
IdP->>User: consent UI
User->>IdP: 批准
IdP->>Host: authorization code
Host->>IdP: code + PKCE verifier
IdP->>Host: access_token aud=git-mcp
Host->>MCPS: Initialize + Bearer token
MCPS->>MCPS: 验证 aud + scope + exp
Host->>MCPS: tools/list, tools/call
4.3 Session 与 MCP HTTP Session
Streamable HTTP 的 Mcp-Session-Id:
- 初始化响应 header 返回
- 后续 POST/GET 必须携带
- Server 可随时 404 终止 session
安全:Session ID 应密码学随机(spec 建议 UUID/JWT/hash)。泄露 Session ID = 劫持 MCP 会话——须与 Bearer token 绑定或短期轮换。
五、Tool 暴露面 = 攻击面
| 风险 | 说明 | 缓解 |
|---|---|---|
| Tool poisoning | 恶意 description 诱导模型越权 | Host 展示 tool 列表供用户批准;策略引擎过滤 |
| Over-privileged tool | run_sql 无 WHERE 限制 |
OPA/Cedar 在 Host 层 |
| Indirect injection | Resource 含隐藏指令 | 清洗 resource;本文只谈 credential 与授权 |
| Cross-server leak | Server A 的 token 出现在 Server B 请求 | 凭据隔离清单 §六 |
Host 应在 tools/call
发出前做策略检查——不能假设 LLM
输出参数安全。
六、Secret 隔离清单
七、JSON-RPC 与错误处理
MCP 错误通过 JSON-RPC error 对象返回。Host
应区分:
| 错误类 | 安全动作 |
|---|---|
| 401 / 认证失败 | 不自动重试 user password;走 OAuth refresh |
| 403 / scope 不足 | 提示用户 re-consent 或缩小 tool |
| Server 内部错误 | 不将 stack trace 注入 LLM context |
八、多 Server 拓扑
flowchart LR
subgraph Host Process
C1[Client A]
C2[Client B]
POL[Policy Engine]
end
C1 -->|token_A| SA[Server A]
C2 -->|token_B| SB[Server B]
POL --> C1
POL --> C2
Policy Engine 统一拦截所有 tools/call——与 零信任策略引擎
同构:默认拒绝、显式允许。
九、与 llm-infra 系列边界
llm-infra/ 讲框架选型、网关、部署。本系列讲
identity + policy + audit。MCP 工程实现见
llm-infra;安全基线以本文与 spec 为准。
十、部署检查表(Streamable HTTP)
| 检查项 | 通过标准 |
|---|---|
| HTTPS | 生产强制 |
| Origin 验证 | 实现 spec Security Warning |
| OAuth PKCE | Public Client 无 secret |
| Token audience | 每 Server 独立 |
| Session ID 熵 | ≥ 128 bit |
| Rate limit | 防 brute force / DoS |
| 日志 | 不含 Bearer token 明文 |
十一、边界
- 不预测 MCP spec 最终 IETF RFC 号
- 不复现 prompt injection 攻击全文
- Multi-Agent(A2A)不在本系列首批范围
- OAuth 2.1 for MCP 截至 2026-06 为草案演进——以 spec 发布日期为准
十二、MCP Initialize 与安全
Initialize 前 HTTP 层须已完成 OAuth。Capability 协商应 disable 不需要的能力减攻击面。
十三、stdio 沙箱
专用低权用户、seccomp、网络 egress allowlist——恶意 Server 等同本地 RCE。
十四、DNS Rebinding
Spec Security Warning:验证 Origin、localhost bind、认证——缺任一项可被远程网页调用本地 MCP。
十五、OAuth Scope 命名
mcp:server:<id>:tools:invoke
per-server——与 Token
Exchange 组合。
十六、安全检查总表
| # | 项 | stdio | HTTP |
|---|---|---|---|
| 1 | 来源可信 | ✓ | ✓ |
| 2 | per-server 凭据 | ✓ | ✓ |
| 3 | TLS | N/A | ✓ |
| 4 | Origin | N/A | ✓ |
| 5 | Policy on tools/call | ✓ | ✓ |
二十六.1 MCP 运维:Initialize 安全
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,Initialize 安全 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 Initialize 安全 场景下仍保持 JSON-RPC 语义。
| Transport | Initialize 安全 注意点 |
|---|---|
| stdio | 子进程 Initialize 安全 隔离 |
| HTTP | TLS + OAuth + Initialize 安全 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——Initialize 安全 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (Initialize 安全)
Server->>Host: response / error
二十六.2 MCP 运维:SSE 重连
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,SSE 重连 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 SSE 重连 场景下仍保持 JSON-RPC 语义。
| Transport | SSE 重连 注意点 |
|---|---|
| stdio | 子进程 SSE 重连 隔离 |
| HTTP | TLS + OAuth + SSE 重连 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——SSE 重连 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (SSE 重连)
Server->>Host: response / error
二十六.3 MCP 运维:session 固定
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,session 固定 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 session 固定 场景下仍保持 JSON-RPC 语义。
| Transport | session 固定 注意点 |
|---|---|
| stdio | 子进程 session 固定 隔离 |
| HTTP | TLS + OAuth + session 固定 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——session 固定 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (session 固定)
Server->>Host: response / error
二十六.4 MCP 运维:CORS
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,CORS 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 CORS 场景下仍保持 JSON-RPC 语义。
| Transport | CORS 注意点 |
|---|---|
| stdio | 子进程 CORS 隔离 |
| HTTP | TLS + OAuth + CORS header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——CORS 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (CORS)
Server->>Host: response / error
二十六.5 MCP 运维:mTLS
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,mTLS 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 mTLS 场景下仍保持 JSON-RPC 语义。
| Transport | mTLS 注意点 |
|---|---|
| stdio | 子进程 mTLS 隔离 |
| HTTP | TLS + OAuth + mTLS header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——mTLS 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (mTLS)
Server->>Host: response / error
二十六.6 MCP 运维:rate limit
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,rate limit 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 rate limit 场景下仍保持 JSON-RPC 语义。
| Transport | rate limit 注意点 |
|---|---|
| stdio | 子进程 rate limit 隔离 |
| HTTP | TLS + OAuth + rate limit header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——rate limit 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (rate limit)
Server->>Host: response / error
二十六.7 MCP 运维:WAF
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,WAF 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 WAF 场景下仍保持 JSON-RPC 语义。
| Transport | WAF 注意点 |
|---|---|
| stdio | 子进程 WAF 隔离 |
| HTTP | TLS + OAuth + WAF header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——WAF 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (WAF)
Server->>Host: response / error
二十六.8 MCP 运维:content-type
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,content-type 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 content-type 场景下仍保持 JSON-RPC 语义。
| Transport | content-type 注意点 |
|---|---|
| stdio | 子进程 content-type 隔离 |
| HTTP | TLS + OAuth + content-type header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——content-type 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (content-type)
Server->>Host: response / error
二十六.9 MCP 运维:batch JSON-RPC
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,batch JSON-RPC 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 batch JSON-RPC 场景下仍保持 JSON-RPC 语义。
| Transport | batch JSON-RPC 注意点 |
|---|---|
| stdio | 子进程 batch JSON-RPC 隔离 |
| HTTP | TLS + OAuth + batch JSON-RPC header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——batch JSON-RPC 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (batch JSON-RPC)
Server->>Host: response / error
二十六.10 MCP 运维:progress notification
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,progress notification 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 progress notification 场景下仍保持 JSON-RPC 语义。
| Transport | progress notification 注意点 |
|---|---|
| stdio | 子进程 progress notification 隔离 |
| HTTP | TLS + OAuth + progress notification header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——progress notification 不能替代
authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (progress notification)
Server->>Host: response / error
二十六.11 MCP 运维:resource 订阅
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,resource 订阅 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 resource 订阅 场景下仍保持 JSON-RPC 语义。
| Transport | resource 订阅 注意点 |
|---|---|
| stdio | 子进程 resource 订阅 隔离 |
| HTTP | TLS + OAuth + resource 订阅 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——resource 订阅 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (resource 订阅)
Server->>Host: response / error
二十六.12 MCP 运维:prompt 模板
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,prompt 模板 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 prompt 模板 场景下仍保持 JSON-RPC 语义。
| Transport | prompt 模板 注意点 |
|---|---|
| stdio | 子进程 prompt 模板 隔离 |
| HTTP | TLS + OAuth + prompt 模板 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——prompt 模板 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (prompt 模板)
Server->>Host: response / error
二十六.13 MCP 运维:version 协商
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,version 协商 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 version 协商 场景下仍保持 JSON-RPC 语义。
| Transport | version 协商 注意点 |
|---|---|
| stdio | 子进程 version 协商 隔离 |
| HTTP | TLS + OAuth + version 协商 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——version 协商 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (version 协商)
Server->>Host: response / error
二十六.14 MCP 运维:error code
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,error code 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 error code 场景下仍保持 JSON-RPC 语义。
| Transport | error code 注意点 |
|---|---|
| stdio | 子进程 error code 隔离 |
| HTTP | TLS + OAuth + error code header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——error code 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (error code)
Server->>Host: response / error
二十六.15 MCP 运维:stdio 生命周期
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,stdio 生命周期 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 stdio 生命周期 场景下仍保持 JSON-RPC 语义。
| Transport | stdio 生命周期 注意点 |
|---|---|
| stdio | 子进程 stdio 生命周期 隔离 |
| HTTP | TLS + OAuth + stdio 生命周期 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——stdio 生命周期 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (stdio 生命周期)
Server->>Host: response / error
二十六.16 MCP 运维:remote 部署
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,remote 部署 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 remote 部署 场景下仍保持 JSON-RPC 语义。
| Transport | remote 部署 注意点 |
|---|---|
| stdio | 子进程 remote 部署 隔离 |
| HTTP | TLS + OAuth + remote 部署 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——remote 部署 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (remote 部署)
Server->>Host: response / error
二十六.17 MCP 运维:Initialize 安全
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,Initialize 安全 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 Initialize 安全 场景下仍保持 JSON-RPC 语义。
| Transport | Initialize 安全 注意点 |
|---|---|
| stdio | 子进程 Initialize 安全 隔离 |
| HTTP | TLS + OAuth + Initialize 安全 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——Initialize 安全 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (Initialize 安全)
Server->>Host: response / error
二十六.18 MCP 运维:SSE 重连
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,SSE 重连 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 SSE 重连 场景下仍保持 JSON-RPC 语义。
| Transport | SSE 重连 注意点 |
|---|---|
| stdio | 子进程 SSE 重连 隔离 |
| HTTP | TLS + OAuth + SSE 重连 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——SSE 重连 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (SSE 重连)
Server->>Host: response / error
二十六.19 MCP 运维:session 固定
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,session 固定 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 session 固定 场景下仍保持 JSON-RPC 语义。
| Transport | session 固定 注意点 |
|---|---|
| stdio | 子进程 session 固定 隔离 |
| HTTP | TLS + OAuth + session 固定 header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——session 固定 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (session 固定)
Server->>Host: response / error
二十六.20 MCP 运维:CORS
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,CORS 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 CORS 场景下仍保持 JSON-RPC 语义。
| Transport | CORS 注意点 |
|---|---|
| stdio | 子进程 CORS 隔离 |
| HTTP | TLS + OAuth + CORS header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——CORS 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (CORS)
Server->>Host: response / error
二十六.21 MCP 运维:mTLS
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,mTLS 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 mTLS 场景下仍保持 JSON-RPC 语义。
| Transport | mTLS 注意点 |
|---|---|
| stdio | 子进程 mTLS 隔离 |
| HTTP | TLS + OAuth + mTLS header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——mTLS 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (mTLS)
Server->>Host: response / error
二十六.22 MCP 运维:rate limit
MCP Host 在 Streamable HTTP 与 stdio 混合部署时,rate limit 决定可用性与安全窗口。Spec(2025-03-26,截至 2026-06)要求 Client 在 rate limit 场景下仍保持 JSON-RPC 语义。
| Transport | rate limit 注意点 |
|---|---|
| stdio | 子进程 rate limit 隔离 |
| HTTP | TLS + OAuth + rate limit header 验证 |
Host 层 Function
Calling 策略 应在 tools/call
发出前执行——rate limit 不能替代 authorization。
sequenceDiagram
participant Host
participant Server
Host->>Server: MCP request (rate limit)
Server->>Host: response / error
附录 A、MCP 架构 场景演练
A.1 邮件摘要 Agent
| 步骤 | 动作 |
|---|---|
| 1 | 用户 consent read:mail |
| 2 | Exchange scope=read:mail:inbox |
| 3 | OPA 限 folder |
| 4 | audit 含 act |
flowchart LR
S1["用户 consent read:mail"] --> S2["Exchange scope=read:mail:inbox"]
S2 --> S3["OPA 限 folder"]
S3 --> S4["audit 含 act"]
A.2 SQL 分析 Agent
| 步骤 | 动作 |
|---|---|
| 1 | read:warehouse |
| 2 | 只读 DB role |
| 3 | Rego deny DDL |
| 4 | HITL 导出 CSV >10k rows |
flowchart LR
S1["read:warehouse"] --> S2["只读 DB role"]
S2 --> S3["Rego deny DDL"]
S3 --> S4["HITL 导出 CSV >10k rows"]
A.3 MCP Git Agent
| 步骤 | 动作 |
|---|---|
| 1 | per-server OAuth |
| 2 | stdio pin version |
| 3 | tool allowlist |
| 4 | supply chain SBOM |
flowchart LR
S1["per-server OAuth"] --> S2["stdio pin version"]
S2 --> S3["tool allowlist"]
S3 --> S4["supply chain SBOM"]
A.4 跨 API 编排
| 步骤 | 动作 |
|---|---|
| 1 | 多 resource Exchange |
| 2 | 每 API 独立 token |
| 3 | Gateway 聚合 |
| 4 | trace 串联 |
flowchart LR
S1["多 resource Exchange"] --> S2["每 API 独立 token"]
S2 --> S3["Gateway 聚合"]
S3 --> S4["trace 串联"]
A.5 offboarding
| 步骤 | 动作 |
|---|---|
| 1 | SCIM deactivate |
| 2 | CAEP or TTL |
| 3 | cache flush |
| 4 | audit retention |
flowchart LR
S1["SCIM deactivate"] --> S2["CAEP or TTL"]
S2 --> S3["cache flush"]
S3 --> S4["audit retention"]
A.6 供应链攻击响应
| 步骤 | 动作 |
|---|---|
| 1 | disconnect MCP Server |
| 2 | rotate per-server token |
| 3 | SBOM diff |
| 4 | post-incident audit |
flowchart LR
S1["disconnect MCP Server"] --> S2["rotate per-server token"]
S2 --> S3["SBOM diff"]
S3 --> S4["post-incident audit"]
A.7 HITL 超时
| 步骤 | 动作 |
|---|---|
| 1 | pending transfer |
| 2 | 7200s expire |
| 3 | Agent Cancelled |
| 4 | audit expired |
flowchart LR
S1["pending transfer"] --> S2["7200s expire"]
S2 --> S3["Agent Cancelled"]
S3 --> S4["audit expired"]
A.8 跨云 OBO
| 步骤 | 动作 |
|---|---|
| 1 | Entra user token |
| 2 | Gateway normalize act |
| 3 | RS 统一 audit schema |
| 4 | policy 同构 |
flowchart LR
S1["Entra user token"] --> S2["Gateway normalize act"]
S2 --> S3["RS 统一 audit schema"]
S3 --> S4["policy 同构"]
附录 B、MCP 架构 常见问题
Q:能否省略 Agent Gateway?
A:仅当 Agent 永不持 user refresh 且 RS 支持 Token Exchange
直联——多数企业仍要 Gateway 聚 policy、HITL、audit。
Q:MCP 是否替代 OAuth?
A:否。MCP 管 tool 协议;OAuth 管身份。
Q:CAEP 未支持怎么办?
A:短 TTL(≤15min)为基线;heartbeat 补 Gateway 层
revoke。
Q:如何证明 Agent 未越权?
A:deny 日志 + policy_version + 定期 access
review(IGA)。
Q:Gen2 到 Gen4 最小步骤?
A:Gateway 托管 refresh → 启用 Exchange → RS 解析 act → 下线
Agent 侧 refresh。
下一篇:MCP 供应链
参考资料
- Model Context Protocol, Specification 2025-03-26, Transports / Authorization(阅读日期 2026-06)
- IETF OAuth 2.1 Draft, The OAuth 2.1 Authorization Framework(截至 2026-06 draft 状态)
- Token Exchange — 本系列第 02 篇
- 零信任供应链
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Agent 身份与安全】AI Agent 的身份、委托与审计
IAM 系列(人)与零信任系列(边界)的自然延伸:当 LLM Agent 代表用户调用 API、执行 SQL、读写邮件时,传统 OAuth 模型如何扩展?拆解 Token Exchange、MCP 安全模型、工具级授权、持续验证与审计归因。
【Agent 身份与安全】Agent 身份谱系:从 API Key 到委托 Token
四代 Agent 身份模型:API Key、OAuth 用户 token、Service Account、RFC 8693 Token Exchange 委托链。拆解 subject_token、actor_token、act claim,以及与 JWT/JWKS 系列的交叉引用。
【Agent 身份与安全】细粒度 Scope 与 UMA 2.0 启示
从 coarse scope 到 resource-specific consent:UMA 2.0 Permission Ticket 模型、Google incremental auth 对照,以及 Agent 场景下的动态授权边界。
【Agent 身份与安全】MCP Server 隔离与供应链
多 MCP Server 并存时的 secret 隔离、恶意 tool description 注入、SBOM 与签名验证,以及与零信任软件供应链的联动。