协议修订: 2025-03-26
介绍
目的和范围
Model Context Protocol 在传输级别提供授权功能,使MCP客户端能够代表资源所有者向受限的MCP服务器发出请求。本规范定义了基于HTTP传输的授权流程。协议要求
授权对于MCP实现是可选的。当支持时:- 使用基于HTTP传输的实现应该符合此规范。
- 使用STDIO传输的实现不应该遵循此规范,而是从环境中检索凭据。
- 使用替代传输的实现必须遵循其协议的既定安全最佳实践。
标准合规性
此授权机制基于下面列出的既定规范,但实现了其功能的选定子集,以确保安全性和互操作性,同时保持简单性:- OAuth 2.1 IETF DRAFT
- OAuth 2.0 Authorization Server Metadata (RFC8414)
- OAuth 2.0 Dynamic Client Registration Protocol (RFC7591)
授权流程
概述
- MCP认证实现必须使用适当的安全措施为机密客户端和公共客户端实现OAuth 2.1。
- MCP认证实现应该支持OAuth 2.0 Dynamic Client Registration Protocol (RFC7591)。
- MCP服务器应该且MCP客户端必须实现OAuth 2.0 Authorization Server Metadata (RFC8414)。不支持Authorization Server Metadata的服务器必须遵循默认URI模式。
OAuth授权类型
OAuth指定了不同的流程或授权类型,这些是获取访问令牌的不同方式。每种都针对不同的用例和场景。 MCP服务器应该支持最符合预期受众的OAuth授权类型。例如:- 授权码:当客户端代表(人类)最终用户行事时有用。
- 例如,代理调用由SaaS系统实现的MCP工具。
- 客户端凭据:客户端是另一个应用程序(不是人类)
- 例如,代理调用安全的MCP工具来检查特定商店的库存。不需要模拟最终用户。
示例:授权码授权
这演示了用于用户认证的授权码授权类型的OAuth 2.1流程。 注意:以下示例假设MCP服务器也充当授权服务器。但是,授权服务器可以作为自己的独立服务部署。 人类用户通过Web浏览器完成OAuth流程,获取识别他们个人身份并允许客户端代表他们行事的访问令牌。 当需要授权但客户端尚未证明时,服务器必须以_HTTP 401 Unauthorized_响应。 客户端在收到_HTTP 401 Unauthorized_后启动OAuth 2.1 IETF DRAFT授权流程。 以下演示了使用PKCE的公共客户端的基本OAuth 2.1。Server Metadata Discovery
For server capability discovery:- MCP clients MUST follow the OAuth 2.0 Authorization Server Metadata protocol defined in RFC8414.
- MCP server SHOULD follow the OAuth 2.0 Authorization Server Metadata protocol.
- MCP servers that do not support the OAuth 2.0 Authorization Server Metadata protocol, MUST support fallback URLs.
服务器元数据发现标头
MCP客户端_应该_在服务器元数据发现期间包含标头MCP-Protocol-Version: <protocol-version>,以允许MCP服务器根据MCP协议版本进行响应。
例如:MCP-Protocol-Version: 2024-11-05
授权基础URL
授权基础URL必须通过丢弃MCP服务器URL中的任何现有path组件来确定。例如:
如果MCP服务器URL是https://api.example.com/v1/mcp,那么:
- 授权基础URL是
https://api.example.com - 元数据端点必须位于
https://api.example.com/.well-known/oauth-authorization-server
没有元数据发现的服务器的回退
对于未实现OAuth 2.0 Authorization Server Metadata的服务器,客户端必须使用相对于授权基础URL的以下默认端点路径:| 端点 | 默认路径 | 描述 |
|---|---|---|
| 授权端点 | /authorize | 用于授权请求 |
| 令牌端点 | /token | 用于令牌交换和刷新 |
| 注册端点 | /register | 用于动态客户端注册 |
https://api.example.com/v1/mcp的MCP服务器,默认端点将是:
https://api.example.com/authorizehttps://api.example.com/tokenhttps://api.example.com/register
Dynamic Client Registration
MCP客户端和服务器应该支持OAuth 2.0 Dynamic Client Registration Protocol,以允许MCP客户端在没有用户交互的情况下获取OAuth客户端ID。这为客户端提供了一种标准化的方式来自动注册到新服务器,这对MCP至关重要,因为:- 客户端无法提前知道所有可能的服务器
- 手动注册会给用户造成摩擦
- 它实现了与新服务器的无缝连接
- 服务器可以实现自己的注册策略
- 为该MCP服务器专门硬编码客户端ID(以及适用的客户端密钥),或
- 呈现UI给用户,允许他们在自己注册OAuth客户端后输入这些详细信息(例如,通过服务器托管的配置界面)。
授权流程步骤
完整的授权流程如下进行:Decision Flow Overview
访问令牌使用
令牌要求
访问令牌处理必须符合OAuth 2.1 Section 5对资源请求的要求。具体来说:- MCP客户端必须使用Authorization请求头字段Section 5.1.1:
- 访问令牌不能包含在URI查询字符串中
令牌处理
资源服务器必须按照以下描述验证访问令牌: Section 5.2. If validation fails, servers MUST respond according to Section 5.3 错误处理要求。无效或过期的令牌必须收到HTTP 401响应。安全考虑
以下安全要求必须实施:- 客户端必须按照OAuth 2.0最佳实践安全存储令牌
- 服务器应该强制执行令牌过期和轮换
- 所有授权端点必须通过HTTPS提供服务
- 服务器必须验证重定向URI以防止开放重定向漏洞
- 重定向URI必须是localhost URL或HTTPS URL
错误处理
服务器必须为授权错误返回适当的HTTP状态码:| 状态码 | 描述 | 使用 |
|---|---|---|
| 401 | 未授权 | 需要授权或令牌无效 |
| 403 | 禁止 | 无效范围或权限不足 |
| 400 | 错误请求 | 格式错误的授权请求 |
实现要求
- 实现必须遵循OAuth 2.1安全最佳实践
- PKCE对所有客户端是必需的
- 令牌轮换应该实施以增强安全性
- 令牌生命周期应该根据安全要求进行限制
第三方授权流程
概述
MCP服务器可以通过第三方授权服务器支持委托授权。在此流程中,MCP服务器既充当OAuth客户端(对第三方认证服务器),又充当OAuth授权服务器(对MCP客户端)。流程描述
第三方授权流程包括以下步骤:- MCP客户端使用MCP服务器启动标准OAuth流程
- MCP服务器将用户重定向到第三方授权服务器
- 用户在第三方服务器上授权
- 第三方服务器使用授权码重定向回MCP服务器
- MCP服务器交换代码以获取第三方访问令牌
- MCP服务器生成绑定到第三方会话的自己的访问令牌
- MCP服务器使用MCP客户端完成原始OAuth流程
会话绑定要求
实现第三方授权的MCP服务器必须:- 维护第三方令牌和已发行MCP令牌之间的安全映射
- 在兑现MCP令牌之前验证第三方令牌状态
- 实施适当的令牌生命周期管理
- 处理第三方令牌过期和续订
安全考虑
实施第三方授权时,服务器必须:- 验证所有重定向URI
- 安全存储第三方凭据
- 实施适当的会话超时处理
- 考虑令牌链接的安全影响
- 为第三方认证失败实施适当的错误处理
最佳实践
本地客户端作为公共OAuth 2.1客户端
我们强烈建议本地客户端将OAuth 2.1实现为公共客户端:- 利用代码挑战(PKCE)进行授权请求以防止拦截攻击
- 为本地系统实施适当的安全令牌存储
- 遵循令牌刷新最佳实践以维护会话
- 正确处理令牌过期和续订