ChatGPT的MCP OAuth代理
这只是个快速的解决方案,我并不打算维护它,但我发现它很有用。欢迎随意fork(分叉)。
重要提示:安全注意事项(请勿跳过)
如果你使用这款软件并按照这些说明操作,你将使你的本地机器暴露于一个非确定性、不可靠的软件之下 并且 在开放的互联网上,你的存在会被完全暴露给任何恶意的机器人(如果你熟悉黑暗森林理论,我认为这是一个相当贴切的比喻)。
如果发生坏事,你已经提前警告过了。
不过,如果你遵循这些建议:
- 你可以在虚拟机(如VirtualBox、Lima等,无论哪种)中运行它,或者在一台一次性使用的机器(如树莓派)上运行,只需共享大型语言模型(LLM)所需的必要信息
- 你使用了源IP过滤机制
- 当你不用的时候,就放下隧道
- 你对URL进行了混淆处理(通过保密来实现安全虽然常受诟病,但在应对非针对性攻击时非常有效)
我认为如果你决定接手它,你不会完全疯掉的。
引言
它是什么:一款轻量级产品/应用 GitHub OAuth保护的代理 用……建造/构建 FastMCP 将模型上下文协议(MCP)工具安全地暴露给ChatGPT。
解决的问题:
截至今日(2025年10月),ChatGPT在其所谓的“开发者模式”中确实支持MCP,但存在以下限制:
- 仅支持远程端点(HTTPS加密且可访问互联网)。不支持本地(stdio)功能。
- 认证选项包括:
- 无(非受保护的终端) - OAuth 保护 - 值得注意的是:不支持“简单”Bearer API密钥(与GPT Actions中支持的情况不同)
这些限制使得它难以像Claude Desktop那样公开地用于个人需求。
这个脚本允许运行一个代理,该代理支持将GitHub作为OAuth提供商,并将请求转发到本地(stdio)的mcp服务器。只有经过身份验证的GitHub用户才能 并且 在允许用户列表中的用户可使用这些服务。
为了增强安全性,它允许维护一个允许的IP范围列表。这样,只有来自OpenAI的连接才被允许(OpenAI在其https://openai.com/chatgpt-actions.json页面上发布了他们的CIDR范围)。
最后,它允许设置自定义的URI路径,因此不容易被机器人发现。
当代理启动时,它会进行预先的安全审计。日志中会用表情符号评估并报告三项保障措施:
- ✅/⚠️ OAuth 认证(仅在
SKIP_OAUTH是“truthy”的,例如。SKIP_OAUTH=true) - ✅/⚠️ IP白名单(通过
ALLOWED_RANGES_FILE) - ✅/⚠️ 混淆的URL路径(非默认)
OBFUSCATED_PATH(至少包含8个字符)
如果少于两个保护机制处于激活状态,服务器将拒绝启动并抛出错误。请调整您的配置,确保至少通过两项检查后再重试。
仍然存在 有效的HTTPS且可访问互联网 问题,但对此有标准化的解决方案。
如何将有效的HTTPS端点路由到位于NAT后的个人电脑
我所知道的选项有:Tailscale 转换器、Cloudflare 隧道和 ngrok。
我测试过的Tailscale funnel,总体来说,仅需:
- 安装Tailscale
- 运行 \
tailscale funnel\ - 首次运行时,点击接受几次以启用它
就这些。坏消息是,一旦你启用了它,就会开始收到扫描漏洞(暴力破解尝试)的通知,因为证书的创建会表明其存在。也许其他解决方案没有这个问题,我不知道。
如何为GitHub配置OAuth
假设你已经有一个账户。请前往 https://github.com/settings/developers 并创建一个新的应用:
- 客户端ID和客户端密钥由GitHub生成(请安全地记录下来)
- 应用名称(类似“MCP for Laptop”这样的名称即可)
- 主页URL。表单验证后,您将被重定向至此处:https://chatgpt.com/connector_platform_oauth_redirect
- 授权回调URL:使用https://。.ts.net/auth/callback 翻译为中文是:“.ts.net 的认证回调页面”
(此部分由人工智能生成)
安装
先决条件:
- Python 3.10或更高版本
- 一个指向您机器的公共HTTPS URL(通过Tailscale Funnel、Cloudflare Tunnel或ngrok)
- 一个GitHub OAuth应用程序(参见上文部分)
步骤:
- 克隆并进入仓库
- git clone(克隆) - cd(光盘驱动器,或用于命令行中切换目录的命令)
- 创建并激活一个虚拟环境
- 使用 Python 3 创建虚拟环境 .venv - source .venv/bin/activate (Windows:.venv\\Scripts\\activate)
- 安装依赖项
- 使用 pip 安装 requirements.txt 中列出的包
- 创建您的环境文件
- 复制 env.example 文件到 .env - 编辑 .env 文件并填写值(见下文配置)
- 准备您的MCP服务器配置
- 复制或编辑 mcp.json 文件(示例见 mcp.json.example),使其指向您本地的 stdio MCP 服务器。
配置
编辑 .env 文件。重要变量:
- 内部主机 / 内部端口:代理在本地监听的地址(默认为127.0.0.1:8888)
- EXTERNAL_HOSTNAME:客户端将使用的公共主机名(例如:myhost.tail123.ts.net)
- GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET:来自您的GitHub OAuth应用程序
- GITHUB_USERS:允许访问的GitHub用户名,以逗号分隔(留空则允许任何已认证用户访问)
- BASE_URL_SCHEME:通常为“https”
- OAUTH_REDIRECT_PATH:通常为“/auth/callback”;必须与您的GitHub OAuth应用程序设置相匹配
- MCP_JSON_PATH:MCP 服务器配置文件的路径(默认为 ./mcp.json)
- SERVER_NAME:ChatGPT 在 MCP 服务器上看到的服务器名称
- ALLOWED_RANGES_FILE:可选的IPv4 CIDR允许列表文件路径;如果设置,则仅允许这些源IP
- OBFUSCATED_PATH:一个看似随机的路径段,添加到您的公共终端以增加混淆性。为了通过启动检查,它必须与默认路径不同
"shouldberandom"并且长度至少为8个字符。
可选:将源IP限制为OpenAI
- 使用辅助脚本生成一个范围文件:
- 运行 Python 脚本 \generate_allowed_ranges_from_openai.py\,并将输出保存到 \allowed-ranges.txt\ 文件中
- 在 .env 文件中将 ALLOWED_RANGES_FILE 指向该文件。
运行代理
- 确保你的 .env 文件和 mcp.json 文件已准备就绪
- 启动服务器:
- 运行 python server.py
- 启动时,您将看到为每项安全措施标记的表情符号状态行;请确保至少两项为✅,否则进程将退出。
- 代理随后监听INTERNAL_HOST:INTERNAL_PORT,并公开一个HTTP端点路径为/{OBFUSCATED_PATH}。
示例本地URL:http://127.0.0.1:8888/你的长随机路径
为了使ChatGPT能够访问它,请将其部署在公共的HTTPS端点之后(见下一节),并确保EXTERNAL_HOSTNAME指向该主机名。
获取一个公开的HTTPS URL
你可以使用以下任意一种:
- Tailscale Funnel(中文可译为“Tailscale 管道”或根据具体语境译为“Tailscale 流量导向系统”,但“管道”在技术语境下更为常见)
- Tailscale 转换器(或 Tailscale 流量分配器)
- Cloudflare 隧道
- \cloudflared tunnel --url http://127.0.0.1:\ 翻译成中文是:“Cloudflare 的隧道命令,指定 URL 为 http://127.0.0.1:”
- ngrok
- \ngrok http http://127.0.0.1:\ 翻译成中文是:“使用 ngrok 将 http://127.0.0.1:(端口号)暴露到公共互联网”。不过,这里的“http://127.0.0.1:”后面通常会跟上具体的端口号,比如 \http://127.0.0.1:8080\,所以在实际翻译时,可能会根据上下文补充完整。但基于给出的片段,上述翻译是准确的
确保最终的公共URL主机名与您的.env文件中的EXTERNAL_HOSTNAME相匹配,并且已启用HTTPS。
与ChatGPT一起使用(开发者模式MCP)
- 在ChatGPT中,打开设置 → 开发者模式 → 添加MCP服务器
- 选择OAuth作为认证类型
- 终端点URL:https://\/{混淆路径}
- 遵循OAuth流程;授权后,代理将仅允许GITHUB_USERS中的用户访问
- 代理将把MCP流量转发到由您的mcp.json文件描述的本地stdio服务器
更新允许的IP范围
OpenAI 在 https://openai.com/chatgpt-actions.json 发布了 ChatGPT Actions 的 IP 范围
- 定期更新您的允许列表:
- 运行 Python 脚本生成允许的范围(基于 OpenAI):python generate_allowed_ranges_from_openai.py
- 重启代理以应用更改
故障排除
- 403 / 禁止访问:
- 检查GITHUB_USERS是否包含你的GitHub用户名 - 如果设置了ALLOWED_RANGES_FILE,请确认您的请求来自允许的IP地址(请考虑您的隧道提供商的X-Forwarded-For行为)
- OAuth回调不匹配:
- 确保 OAUTH_REDIRECT_PATH 与 GitHub 应用配置相匹配 - 确保EXTERNAL_HOSTNAME正确且可通过HTTPS公开访问
- 无法连接到MCP服务器:
- 验证你的 mcp.json 文件语法,并确保命令可以通过 stdio 在本地运行
- 日志太安静/太详细:
- 在.env文件中设置DEBUGLEVEL(例如,INFO、DEBUG、WARNING)
卸载/清理
- 停用并删除虚拟环境
- 如果存在,请移除隧道配置
- 如果 .env 文件包含敏感信息,请将其删除
