mcpField
I
Implementing OAuth for Streamable HTTP Server & Client without PKCE

Implementing OAuth for Streamable HTTP Server & Client without PKCE

本地服务
github.com/asibyl开发工具179 周前更新

关于 Implementing OAuth for Streamable HTTP Server & Client without PKCE

该项目为开发者提供 Streamable HTTP MCP 服务和无界面客户端示例,使用 GitHub Device Flow OAuth,探索无需 PKCE 的授权流程。

主要功能

  1. 01Streamable HTTP 服务
  2. 02GitHub Device Flow OAuth
  3. 03无界面 OAuth 客户端
  4. 04会话与令牌处理

适用场景

  1. 01测试 MCP 服务的设备流授权
  2. 02探索无界面客户端的 OAuth 连接

MCP 相关

项目包含 Streamable HTTP MCP 服务及无界面客户端,后者通过 Device Flow OAuth 连接服务。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mcp_oauth_server": {
"command": "npx",
"args": [
"-y",
"tsx"
],
"env": {
"GITHUB_CLIENT_ID": "<GITHUB_CLIENT_ID>",
"GITHUB_CLIENT_SECRET": "<GITHUB_CLIENT_SECRET>"
}
}
}
}
启动命令npx -y tsx
需要配置的环境变量
GITHUB_CLIENT_ID
GITHUB_CLIENT_SECRET密钥

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmtsx

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

实现不使用 PKCE 的 Streamable HTTP 服务端和客户端 OAuth

概述

此仓库提供:

  1. 支持 OAuth(通过设备流)的 Streamable HTTP 服务端
  2. 支持 OAuth(无头模式)的 Streamable HTTP 客户端

OAuth 支持

撰写本文时,我无法使用 MCP Inspector 测试支持 OAuth 的 Streamable HTTP 服务端。因此,我开始探索通过设备流实现 OAuth。

在典型的基于浏览器的流程中(例如使用 MCP Inspector):

  1. MCP 客户端请求连接到 MCP 服务端。
  2. 服务端通过 GitHub AuthProvider 对客户端进行授权(重定向到 GitHub);用户授权范围后,服务端的回调处理程序会: a. 从 GitHub 获取访问令牌,然后获取用户数据 b. 将访问令牌和新的会话令牌存储在其令牌存储中 c. 为客户端生成临时授权码,并将其与新生成的会话令牌一同保存 d. 将客户端重定向回去,并附上临时授权码
  3. 客户端将临时授权码换取会话令牌,并在后续请求中使用该令牌

我想用基于设备流的 OAuth 替代这种基于浏览器的 OAuth 流程。流程如下:

图像

基于设备流的 OAuth 不需要 PKCE,因为:

  1. 无需重定向,也无需在客户端处理代码。
  2. 设备代码流本身更加安全,因为:
    • 用户直接打开 URL,并在 GitHub 页面上输入代码
    • 所有令牌交换都在服务端之间进行
    • 设备代码有效期很短,并且只能由请求它的同一客户端(我们的服务端)使用
    • 只有用户代码会从服务端传递给客户端

不过,由于没有浏览器来存储会话,我们可能仍需实现 MCP 的 OAuthServerProvider 当前要求的某些方法(例如 exchangeAuthorizationCode 和 challengeForAuthorizationCode)。

使用方法

  1. 克隆此仓库并安装依赖项。
npm install
  1. 在 GitHub 的 Developer Settings(位于 Settings 下)中创建 OAuth 应用。如有需要,请将回调 URL 设置为 "http://localhost。务必选择“Enable Device Flow”。记下 Client ID 和 Client Secret。

  2. 在本地开发环境中设置 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET 环境变量。

  3. 启动 MCP 服务端。

npx tsx server/index_streamable.ts
  1. 在另一个终端中启动 MCP 客户端。
npx tsx client/client.ts

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。