关于 Implementing OAuth for Streamable HTTP Server & Client without PKCE
该项目为开发者提供 Streamable HTTP MCP 服务和无界面客户端示例,使用 GitHub Device Flow OAuth,探索无需 PKCE 的授权流程。
主要功能
- 01Streamable HTTP 服务
- 02GitHub Device Flow OAuth
- 03无界面 OAuth 客户端
- 04会话与令牌处理
适用场景
- 01测试 MCP 服务的设备流授权
- 02探索无界面客户端的 OAuth 连接
MCP 相关
项目包含 Streamable HTTP MCP 服务及无界面客户端,后者通过 Device Flow OAuth 连接服务。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
实现不使用 PKCE 的 Streamable HTTP 服务端和客户端 OAuth
概述
此仓库提供:
- 支持 OAuth(通过设备流)的 Streamable HTTP 服务端
- 支持 OAuth(无头模式)的 Streamable HTTP 客户端
OAuth 支持
撰写本文时,我无法使用 MCP Inspector 测试支持 OAuth 的 Streamable HTTP 服务端。因此,我开始探索通过设备流实现 OAuth。
在典型的基于浏览器的流程中(例如使用 MCP Inspector):
- MCP 客户端请求连接到 MCP 服务端。
- 服务端通过 GitHub AuthProvider 对客户端进行授权(重定向到 GitHub);用户授权范围后,服务端的回调处理程序会: a. 从 GitHub 获取访问令牌,然后获取用户数据 b. 将访问令牌和新的会话令牌存储在其令牌存储中 c. 为客户端生成临时授权码,并将其与新生成的会话令牌一同保存 d. 将客户端重定向回去,并附上临时授权码
- 客户端将临时授权码换取会话令牌,并在后续请求中使用该令牌
我想用基于设备流的 OAuth 替代这种基于浏览器的 OAuth 流程。流程如下:
基于设备流的 OAuth 不需要 PKCE,因为:
- 无需重定向,也无需在客户端处理代码。
- 设备代码流本身更加安全,因为:
- 用户直接打开 URL,并在 GitHub 页面上输入代码
- 所有令牌交换都在服务端之间进行
- 设备代码有效期很短,并且只能由请求它的同一客户端(我们的服务端)使用
- 只有用户代码会从服务端传递给客户端
不过,由于没有浏览器来存储会话,我们可能仍需实现 MCP 的 OAuthServerProvider 当前要求的某些方法(例如 exchangeAuthorizationCode 和 challengeForAuthorizationCode)。
使用方法
- 克隆此仓库并安装依赖项。
npm install
-
在 GitHub 的 Developer Settings(位于 Settings 下)中创建 OAuth 应用。如有需要,请将回调 URL 设置为 "http://localhost。务必选择“Enable Device Flow”。记下 Client ID 和 Client Secret。
-
在本地开发环境中设置 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET 环境变量。
-
启动 MCP 服务端。
npx tsx server/index_streamable.ts
- 在另一个终端中启动 MCP 客户端。
npx tsx client/client.ts
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。