聊天中继
通过Cloudflare托管的中继器让ChatGPT与本地Windows或macOS机一起工作的远程MCP中继.
盘子 : https://chat-relay.anusorn-hank.works.dev/ 页面存档备份,存于互联网档案馆
学习基线 : 见 范围、写作格式和安全剂环境指导。 。 。 .
学习用法排名 : 见 接收语义、评分和Cloudflare资源成本。 。 。 .
共享学习组 : 见 组设置、作用、核准流程和资源限制。 。 。 .
发布状态 : v1.0 稳定供内部使用。 支持Windows和macOS本地代理;Linux桌面控制目前尚未被实施. 1.0后修复和操作加固作为普通补丁放出.
快开始
有两个部分:
- 连接 ChatGPT 到中继器 .
- 运行您想要查特GPT访问的计算机上的本地代理.
1. 连接ChatGPT
将制作的 MCP 服务器添加到 ChatGPT :
https://chat-relay.anusorn-hank.workers.dev/mcp
当 ChatGPT 打开授权流时完成 OAuth 签名 .
ChatGPT MCP 应连接到平原 /mcp 终点 遗产 /mcp?key=<USER_TOKEN> 流动仅在移徙期间才有,不应用于新的连接.
ChatGPT连接到云继电器. 要实际访问计算机上的文件,终端,处理或桌面控制,该计算机还必须运行下面的本地代理.
2. 运行本地代理 npx
要求:节点20或更新.
从任何目录中 :
npx @anusornneal/chat-relay@latest remote
在第一次运行时,Chat Relay打开了基于浏览器的设备授权. 选择 继续谷歌并授权计算机,然后返回终端。 设备登录需要配置的Google OAuth,不接受本地用户名/密码字.
CLI 在可用时使用 Windows DPAPI 或 macOS 密钥链保存用户配置中的设备证书(带有权限限制的文件倒置), 因此以后您可以重新连接到同一命令 :
npx @anusornneal/chat-relay@latest remote
启用桌面截图、 鼠标和键盘访问 :
npx @anusornneal/chat-relay@latest remote --desktop
限制文件系统访问特定根 :
npx @anusornneal/chat-relay@latest remote --root "C:\Users\you\Projects"
自营的Cloudflare账户
一个Git克隆包含源和部署模板,而不是Cloudflare资源,账户,秘密,或现有数据. 默认 wrangler.jsonc 没有生产 URL 或 Google OAuth 客户端 ID .
- 创建您自己的 Cloudflare 账户和 Google OAuth Web 应用程序 。 登记册
https://YOUR-WORKER.workers.dev/admin/google/callback作为授权重定向 URI . - 复制
wrangler.selfhost.example.jsonc改为wrangler.selfhost.jsonc,并更新PUBLIC_BASE_URL, (中文(简体) ),GOOGLE_CLIENT_ID还有工人的名字. - 使用
npx wrangler secret put SECRET_NAME --config wrangler.selfhost.jsonc页:1ADMIN_TOKEN, (中文(简体) ),AGENT_TOKEN, (中文(简体) ),CALLER_TOKEN,以及GOOGLE_CLIENT_SECRET从不承诺价值观. - 运行
npm run deploy:selfhost。缺失值或原主机生产 URL 被拒绝. - 连接 ChatGPT 到
https://YOUR-WORKER.workers.dev/mcp,然后使用npx @anusornneal/chat-relay@latest remote --relay https://YOUR-WORKER.workers.dev。 。 。 .
CLI的无参数模式仍然与现有用户的主机服务相接. 设置 --relay 明确更改目标(如果不同,则触发登录)。 需要行政脚本 RELAY_URL 要明确配置。 主机生产部署用途 wrangler.production.jsonc 并且只能通过明确的CI部署旗来启用.
npx 命令
| 命令 | 它会做什么 |
|---|---|
npx @anusornneal/chat-relay@latest remote | 将这台计算机连接到 Chat Relay 并保持本地代理运行. 启用此设备所允许的能力, 如文件、 终端和进程 . |
npx @anusornneal/chat-relay@latest remote --desktop | 启用桌面截图/输入支持启动代理 。 桌面权限也必须由中继器授予. |
npx @anusornneal/chat-relay@latest login | 在不启动长期代理的情况下, 签名并注册此计算机 . |
npx @anusornneal/chat-relay@latest login --force | 强制新的签入和装置授权。 当证书被吊销或需要替换时有用. |
npx @anusornneal/chat-relay@latest status | 显示已签名的账户、设备、中继 URL、在线状态、范围、代理版本、协议兼容性、生命周期状态、允许的根和桌面状态. |
npx @anusornneal/chat-relay@latest drain | 停止接受新的长期工作,这样积极的工作就可以在重启前完成. |
npx @anusornneal/chat-relay@latest resume | 取消排水模式并恢复正常工作录取. |
npx @anusornneal/chat-relay@latest restart | 排水完成后恢复本地代理,代理机准备重新启动. |
npx @anusornneal/chat-relay@latest upgrade | 排水完毕后,把当地特工交给 @anusornneal/chat-relay@latest 并重新连接保存的配置. |
npx @anusornneal/chat-relay@latest logout | 撤销此计算机登录并删除其本地证书 . |
npx @anusornneal/chat-relay@latest help | 显示 CLI 使用和可用的选项 . |
有用的选项 :
--root <path> Allowed filesystem root. Use semicolons for multiple roots.
--name <name> Computer display name.
--agent-id <id> Stable agent identifier.
--desktop Enable desktop access.
--no-desktop Disable desktop access.
--no-open Do not open the login browser automatically.
--force Force a new login.
--relay <url> Use another Chat Relay deployment.
ChatGPT 能访问的
Chat Relay可以根据设备的授予和本地配置
- 在已配置的根内进行文件系统操作 .
- 终端命令和持续终端会话 。 短暂的无国籍命令会自动再用一个跨平台的 shell 池;状态命令会回落到孤立的处决.
- 流程检查和终止.
- Windows/macOS截图,鼠标输入,以及当桌面访问被明确启用时键盘输入.
- 多个计算机在一个账户下,每个设备的路由和权限.
- 来自ChatGPT的代理生命周期控制,有流程许可:检查状态,排出/恢复,重新启动,以及安全地交给最新公布的软件包.
- 剪接文件系统、终端和桌面操作以减少远程往返.
桌面访问是选入的 。 Linux 桌面控制目前尚未执行 .
如何运作
ChatGPT
|
| Streamable HTTP MCP + OAuth
v
Cloudflare Worker
|
+-- Registry Durable Object
|
+-- Relay Durable Object
|
| WebSocket
v
Local Agent
- files
- terminal
- processes
- desktop
ChatGPT只和云MCP端口交谈. 本地计算机打开出入口的WebSocket连接到中继器.
安保模式
- ChatGPT MCP认证使用OAuth 2.1授权代码流与PKCE.
- 本地计算机使用浏览器/设备授权;原始代理符号不需要手动复制.
- 文件系统访问被限制于配置允许的根 .
- 访问基于范围:读取,写取,终端,进程,桌面读取,桌面控制可以单独授予.
- 桌面访问默认被禁用 .
- 存储的证书酌情由散列服务器端.
- 本地用户和代理代号保存在外部
config.json;Windows使用用户绑定的DPAPI,而macOS在可用时使用Keychain. - 错误的用法/审计遥测仅为元数据,不包括命令、文件内容、截图、剪贴板内容和证书.
Chat Relay目前用于小型可信任的团队,而不是企业零信任控制平面.
本地配置
默认 CLI 配置位置 :
- 窗口 :
%LOCALAPPDATA%\chat-relay\config.json - macOS/ Linux : (中文(简体) )
$XDG_CONFIG_HOME/chat-relay/config.json或者说~/.config/chat-relay/config.json
设定 CHAT_RELAY_HOME 以覆盖配置目录. config.json 存储非机密设置并加上证书存储类型;认证符被单独存储。 Linux 和 CI 环境使用模式 -0600 secret-file倒置,除非明确选择另一个商店.
单个账户可以拥有多台计算机. 每台计算机都有自己的代理身份和证书.
发展
仅在开发 Chat Relay 本身时将存储器克隆 。 普通用户应使用零检查退出 npx 向上流动.
代理必须只在必要时并在内部创建新的 WIP 备份或 Git 工作树 拥有目标项目 .workspace/ 文件夹( 例如 ). chat-relay/.workspace/worktrees/<id>) (中文(简体) ). 不创建兄弟项目文件夹 。 见 项目工作空间政策 财务报告和审定财务报表 AGENTS.md;现有的遗留文件夹在经过核实的清理之前保持不变.
共同开发命令 :
npm install
npm start
npm run dev
npm run test:hardening
npm run test:soak
npm run verify:publish
默认的浸泡测试运行了2000个定型重联/遥测/TUI迭代而无活云接力. 在地方较长的时间内:
CHAT_RELAY_SOAK_ITERATIONS=100000 npm run test:soak
动力壳:
$env:CHAT_RELAY_SOAK_ITERATIONS=100000; npm run test:soak
npm run verify:publish 检查公布的文件集、CLI入口点、工人干地建筑、审查文物和生产依赖性审计.
行政部门
行政独立于公共MCP接口. 管理工具管理用户、代理、赠款、生命周期、审计数据和业务清理.
运算符命令可通过:
npm run admin -- <command>
保留 ADMIN_TOKEN 以及从客户端配置和源控制中部署其他机密.
可选 Cloudflare 压力断路器配置 USAGE_RECORD_DAILY_BUDGET (在逐个同位素预算之后,按可选用用途记录DO呼叫)和 USAGE_DASHBOARD_PUBLISH_DAILY_BUDGET (封顶可选的仪表板发布来自使用持久对象的呼叫). 两者都默认为已停用,也是保障措施,不准确的Cloudflare计费表. Cloudflare 1027/429/资源出错后,当地TUI健康监测器也自动退后.
平台注释
- 本地代理商:Windows和macOS.
- 桌面控制:Windows和macOS.
- Linux 桌面控制: 未执行 .
- MCP运输:可流取HTTP过HTTP.
- 本地代理运输:出站WebSocket.
- 节点.js:20+.
更多信息
- 公共插件/ 审查器流 :
docs/plugin-review.md - 谷歌登录设置 :
docs/google-login.md - 资料来源: https://github.com/anusornNeal/chat-relay 互联网档案馆的存檔,存档日期2013-12-21
账户范围已学习
Chat Relay可以坚持每个经认证的账户中结构化的小块执行上下文. 学习是 非示范培训 它不会自动捕捉对话或普通工具有效载荷.
MCP表面为:
learn_prepare为目前的任务执行一个明确、具有相关性的准备证。 它可以将全球记忆、项目记忆和代理记忆结合起来,然后将它们排入一个咨询背景包.learn_get在需要目标检查时,阅读选定范围原始记忆.learn_put当Chat决定一个可重复使用的信号值得保存时,创建或更新一个持久的内存.learn_delete删除一个内存.learn_merge_projects支持直接聊天项目合并而无需桌面控制。 打电话action=preview与from财务报告和审定财务报表to第一; 显示计数/ 冲突密钥, 并在此之前获得明确的用户确认action=commit与confirmed=true和一个用途confirmationToken。预览在10分钟后或当源/目标内存元数据发生变化后过期。 合并使用现有的账户范围交易后端,保存ID和反馈,并永久地别名源名. 该工具从不基于类似名称自动合并.learn_feedback记录一个内存的正反反馈.
使用从服务器端选择的专用学习持久对象,通过认证账户对记忆进行分割 user.id。呼叫者不能提供或覆盖账户代号。 支持范围为 global, (中文(简体) ), project,以及 agent;项目和代理记忆需要范围密钥.
故意学习轻量级:没有嵌入式、矢量数据库、当地LLM、记录誊本摄取或每个工具的调取读取/写取。 普通中继工具调用 没有 触摸学习持久对象。 存储更改仅在请求明确学习突变时才会发生. 每个账户被封顶为512个记忆,每个内存内容字段被封顶为4000个字符,而原始读取回封顶为最多100个记录. 不要在"学习"中存储证书,令牌,秘密,原始工具有效载荷,终端输出,文件内容,或截图.
明确一发子弹 学习准备
聊天决定学到的背景是否对任务有用. 当它是,聊天打电话 learn_prepare 一次并重用返回的上下文来完成该任务的其余部分,而不是在每个工具呼叫之前重新准备.
flowchart TD
U[User starts or continues a task] --> D{Would prior learned context materially help?}
D -- No --> R[Use ordinary Relay tools]
D -- Yes --> P[Chat calls learn_prepare once]
P --> G[Read account-global Learn]
G --> K[Resolve explicit or project-root project]
K --> PJ[Read project Learn when available]
PJ --> A[Resolve explicit or preferred agent]
A --> AG[Read agent Learn when available]
AG --> Q[Rank by task query + tool hint + scope]
Q --> C[Compact to bounded advisory context]
C --> R2[Chat reuses prepared context for the task]
R2 --> X[Use ordinary Relay tools without more implicit Learn reads]
裁定边界是故意的:
- 聊天决定语义学习使用 : 是否准备上下文,纠正/偏好/工作流动是否具有足够的耐受性以便学习,以及目标原始内容何时
learn_get这是需要的. - 可重复使用的用户更正是指默认情况下的主动学习信号: 当用户直接更正工作流程、工具使用、编码惯例或响应行为中可重复使用的错误时,Chat应当调用
learn_put在同一回转时,没有等待明确的“学习”。 使用全球范围进行跨项目行为,项目范围进行具体项目行为,并跳过一次性情况细节. - 中继只完成机械准备
learn_prepare明确称为: 账户隔离,项目路径从明确的project-root:<projectKey>记忆或明确projectKey,首选代理的路由,定界读取,关联性排名,和收缩. - 普通工具保持热道清洁:
ping_agent,文件工具,终端工具,桌面工具等MCP调用不自动读取,排序,注入,或写入"学习". - 学到的提示仍然是咨询性的,绝不凌驾于授权、赠款、允许的根基、破坏性工具政策、能力检查、安全或目前的用户请求之上.
项目别名是存储在学习持久对象中的账户范围映射. 使用 我的学习 – 合并项目 以加入工作空间名称(例如) buddy-android → buddy2)一次,同时保留内存ID,回馈和时间戳;源成为未来学习的永久化名并跨机器读取/写入. 从未从类似名称中推断出异名,项目解析只发生在学习请求中,而不是在普通工具呼叫中。 合并以交易方式运行; 与不同内容相冲突的密钥被重新命名而不是丢弃 。\ n\ nout 提示是明确的记忆 。 全球 project_context 带有密钥的内存 project-root:<projectKey> 存储混凝土工程根。 A 类 preferred-agent 内存可能存在于项目范围(首选)或全球范围(倒置). learn_prepare 也可以明确 projectKey 财务报告和审定财务报表 agentId 当查特已经知道时值.
learn_prepare 在工人一级故意一发即发和无国籍。 没有温暖的会话缓存或持久的学习会话状态需要维护 。 这阻止了学习成为隐含的每工具CPU/子请求税,同时仍然允许在实际有用时进行关联感上下文准备.