链载Ai

标题: 深入解读MCP协议最新版本的4大升级【上】:传输机制与安全授权 [打印本页]

作者: 链载Ai    时间: 昨天 20:47
标题: 深入解读MCP协议最新版本的4大升级【上】:传输机制与安全授权


MCP协议的最新修订版本(2025-03-26)已经在路上,尽管SDK尚未发布,但规范内容已经基本定型,前期的各种解读也在网络上陆续出现。我们将结合官方文档、Github上的PR与社区讨论等,为大家深入解读该版本中的四个较大的升级。

我们将分成两篇进行介绍。

01

Streamable HTTP传输模式

在新版本中,MCP引入了新的Streamable HTTP远程传输机制来代替之前的HTTP+SSE的远程传输模式(stdio的本地模式不变)。

1.背景与动机

当前MCP采用的HTTP+SSE的远程传输模式总结为(图中未涵盖服务端发送请求如Sampling的场景):

这种方式存在问题有:

2.变更说明

最新规范的Streamable HTTP传输机制总结为(图中未涵盖服务端发送请求如Sampling的场景):

这里的主要变化包括:

StreamableHTTP在旧方案的基础上,提升了传输层的灵活性与健壮性:


3.影响与应用

新的应用客户端必须设置 Accept 头支持两种返回类型(application/json 和 text/event-stream),以同时支持服务器返回 JSON 或 SSE 流。如:

POST/mcpHTTP/1.1Host:mcp.example.comAccept:application/json,text/event-streamContent-Type:application/json{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}

如果不要求流式输出,则服务端返回一个 JSON 响应;如果要求流式模式,则响应头为 Content-Type: text/event-stream,并以 SSE 事件方式发送一个或多个 JSON-RPC 消息。

客户端通过以下方式开启SSE的长连接,用来接收服务端的异步的消息推送:

GET/mcpHTTP/1.1Host:mcp.example.comAccept:text/event-stream
此外,为了实现兼容性,你需要小心的控制客户端与服务端应用对连接方式的支持,以兼容旧版本的对端。具体我们将在SDK升级后进行解析。

02

引入基于 OAuth 2.1 的授权框架

MCP 2025-03-26 规范引入了基于 OAuth 2.1 的授权框架,为基于 HTTP 交互的客户端与服务端提供了标准化的安全机制。当然,这种机制仅适用于远程模式,对于通过标准输入输出(stdio)传输的交互则无需考虑此规范。

如果你对OAuth流程毫无概念,参考文后方法获得一个极简的例子代码。

1.背景与动机

目前的大多数 MCP 应用采用基于 stdio 的本地传输模式,部署几乎是一对一的,安全边界清晰。但在基于 SSE 传输模式的远程 MCP 服务端场景中,尤其是随着第三方 MCP 共享服务的迅速增长,缺少统一的授权机制导致无法安全地管理对服务端功能的访问权限。引入 OAuth 2.1 可以使资源所有者通过标准的授权流程安全地控制访问权限。

例如, 在企业环境中,一个MCP服务端可能连接内部数据库或敏感API,通过OAuth2.1授权,可以确保只有经过用户同意的MCP客户端才能访问这些资源。这使构建安全的AI 智能体成为可能:用户可随时撤销授权令牌,终止其对数据的访问。此外,由于使用标准OAuth流程,企业开发者可以方便地将现有企业的身份认证与授权服务整合到MCP服务器中。

2.变更说明

若选择遵循MCP新规范中的OAuth2.1授权流程,MCP客户端在向服务端的受限资源发起请求之前,必须先通过浏览器引导用户授权访问MCP服务端,完成OAuth授权流程以获取访问的安全令牌(Access Token)。随后,客户端需携带此令牌访问MCP服务端;若服务器返回未授权响应,并提示客户端启动授权流程。

此外,规范建议MCP服务端支持OAuth动态客户端注册和授权服务器元数据发现,以便客户端能够自动获取服务器的授权端点信息。

整体授权流程描述如下图:

【角色定义】

【流程描述】

(1)客户端发现授权服务器的元数据

客户端访问标准路径(一般为.well-known/oauth-authorization-server),希望自动发现服务器的授权端点、令牌端点等元数据。这不是一种必须实现的服务端机制,所以有两种可能的返回结果:

(2)动态客户端注册(可选)

在调用授权服务的过程中,需提供一个client_id(比如调用Google的OAuth授权服务,需要在后台创建获得client_id)。若MCP服务端支持动态客户端注册,客户端无需预先注册,即可在运行时直接向MCP服务端进行注册,从而获得一组新的client_id、client_secret以及其他授权配置信息。

如果您的MCP服务可能拥有众多客户端应用,建议实现动态客户端注册机制。


(3)客户端准备授权请求(包含 PKCE 参数)

PKCE(Proof Key for Code Exchange)是 OAuth 2.1 强制要求的保护机制,旨在防范“授权码被拦截盗用”的攻击。它涉及一组PKCE参数,包括:

在授权过程中,客户端会携带code_challenge以获取授权码;在使用授权码交换安全令牌时,客户端再提供code_verifier。授权服务器将验证code_verifier与先前的code_challenge是否匹配,只有在匹配的情况下,才会发放令牌,从而有效防止授权码被劫持。

(4)启动浏览器,进行用户授权

客户端打开系统浏览器,跳转到 MCP 服务端的授权地址。并带上这些信息:client_id、redirect_uri、response_type=code、scope、code_challenge等。此时浏览器界面显示让用户确认授权,比如“授权 MCP xxx访问你的MCP服务资源”。

(5)用户同意授权

用户在浏览器上点击 “允许授权”(也可能需要额外的输入验证信息)。

(6)服务端验证并生成授权码

此时服务端验证用户身份与授权请求是否合法,如果用户同意授权,就生成一个临时的授权码(code)。

(7)授权码回调到客户端

MCP 服务端通过浏览器重定向到MCP客户端前面提供的重定向URI(redirect_uri),并在参数中附带授权码 code=xxx。

(8)客户端接收回调

客户端捕获这个回调请求,拿到授权码;并使用授权码访问MCP服务端的令牌颁发的端点,换取访问令牌(Access Token),一般需要带上code,code_verifier,client_id等信息。MCP服务端验证授权码合法,且code_verifier验证通过,就会下发安全令牌。

(9)客户端使用安全令牌调用 MCP 服务端功能

客户端拿到安全令牌后,正式调用 MCP 服务端的受保护功能。令牌在HTTP的请求头中携带即可:

POST/mcpAuthorization:Bearer{access_token}Content-Type:application/json

接着就可以发起 MCP 调用,比如 tool/call、resource/fetch 等。

3.影响和应用

总体而言,OAuth授权框架的加入对原有功能不造成破坏,但要求在需要安全接入的场景下,客户端和服务器都进行相应升级来配合这一流程。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5