Skip to content

MCP OAuth Authorization Design:MCP 授权怎么设计 ​

这篇文章解决什么问题 ​

MCP Server 接入越多,授权问题越复杂:Agent 代表谁调用?MCP Server 如何验证客户端?用户如何授权范围?工具调用凭证如何过期?高风险工具如何绑定审批?

MCP OAuth Authorization Design 的目标是把 MCP 授权从“配置一个 API Key”提升为可审计的授权链路。

授权参与方 ​

参与方职责
User授权某个 Agent / Client 访问能力
MCP Client代表 Agent 发现和调用 MCP Server
Authorization Server颁发和校验访问令牌
MCP Server暴露 Tools / Resources / Prompts
Policy Engine判断 scope、risk、tenant、approval

Scope 设计 ​

Scope说明
docs:read读取文档资源
tickets:read读取工单
tickets:write创建或更新工单
email:send发送邮件
database:query查询数据库
admin:manage管理配置,高风险

Scope 要细,不要一个 mcp:all 解决所有问题。

授权链路 ​

mermaid
sequenceDiagram
  participant User
  participant Client as MCP Client
  participant Auth as Authorization Server
  participant Server as MCP Server
  User->>Client: start agent task
  Client->>Auth: request scopes
  Auth->>User: consent / policy check
  Auth-->>Client: access token
  Client->>Server: call tool with token
  Server->>Auth: validate token
  Server-->>Client: tool result

Tool 调用还需要二次策略 ​

OAuth token 只能证明“有某些 scope”,不代表每次工具调用都安全。执行前还要校验:

  • tenant 是否匹配。
  • resource 是否在用户权限范围内。
  • action 风险等级。
  • args_hash 是否和审批一致。
  • token 是否过期。
  • 当前 run 是否超过预算。

Token 最小化 ​

设计好处
短期 access token降低泄漏影响
refresh token 不暴露给 Agent避免长期凭证泄漏
token 绑定 run_id方便审计和撤销
token 绑定 scope最小权限
token 绑定 audience防止拿去调用其它服务

常见错误 ​

错误风险
所有 MCP Server 共用一个 API Key无法区分用户和租户
Scope 太粗工具越权
Token 长期有效泄漏后难以止血
MCP Server 不校验 audiencetoken 被重放到其它服务
审批只在前端做后端可被绕过

面试表达 ​

可以这样讲:

> MCP 授权不能只靠一个全局 API Key。我会把 MCP Client、Authorization Server、MCP Server 和 Policy Engine 分开:用户授权细粒度 scope,Client 获取短期 access token,Server 校验 token、audience、tenant 和 resource,高风险工具还要绑定 approval_id 和 args_hash。这样 MCP 工具调用才有最小权限和审计边界。

落地检查清单 ​

  • [ ] Scope 是否细粒度?
  • [ ] Token 是否短期并绑定 audience?
  • [ ] MCP Server 是否校验 tenant/resource?
  • [ ] 高风险工具是否仍走 approval?
  • [ ] 是否禁止全局 API Key 代表所有用户?
  • [ ] 是否能按 run_id 撤销或审计 token?