关于 cursor-chat-bridge
cursor-chat-bridge 将 Cursor Agent 接入 Telegram、Discord 或 GitHub,让开发者通过手机回复 Agent 的问题并继续对话。它按 Cursor 会话隔离消息,并可借助钩子自动等待回复和续接任务。
主要功能
- 01通过 Telegram、Discord 和 GitHub 交互
- 02按 Cursor 会话分配独立线程
- 03收到回复后自动续接 Agent
- 04支持图片附件和语音转文字
- 05提供可扩展的传输适配器
适用场景
- 01离开电脑时通过手机回复 Cursor Agent
- 02从聊天线程发送图片供 Agent 查看
- 03用语音消息向 Agent 提供文字指令
- 04在多个 Cursor 会话间保持消息隔离
MCP 相关
其 MCP 服务提供 bridge_start、bridge_send、bridge_await、bridge_send_and_await、bridge_stop 和 bridge_status 工具。完整自动续接还需安装 Cursor 钩子;MCP-only 模式支持手动操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
6收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | string | 否 | 为线程命名——用简洁的(≤6 个单词)摘要概括本次对话主题,使其类似于 Cursor 聊天列表中的显示方式(例如 "GitHub Actions autopublish")。默认使用文件夹名称;当多个对话共享一个工作区时,这个名称不够明确。 |
| adapter | enum | 否 | 此会话使用的聊天频道;覆盖已配置的默认值。github | telegram | discord |
| session | string | 否 | 先前 bridge_start 返回的句柄;用于重新启用现有会话,而非开启第二个线程。若要全新开始,请省略此参数。 |
详细介绍
🌉 cursor-chat-bridge (Telegram、Discord、GitHub)
通过 Telegram、Discord 或 GitHub,从手机操控 Cursor Agent。
用任意语言说出 “start remote chat mode”,Cursor 就会在每轮结束时,将摘要和问题发送到专属的会话线程中,等待你的回复,并自动继续——如此循环,直到你将它停止。离开键盘,也能用手机持续推进工作。
![]() 每个会话各有一个频道 — 每个 Cursor 对话一个频道 |
![]() 用手机回复 — Agent 会从中断处继续 |
▶ 观看演示(YouTube)
目录
- 为什么
- 功能
- 各频道一览
- 快速开始
- 工作原理
- 图片附件
- 语音消息(语音转文字)
- 已读回执(确认)
- 配置
- 环境变量覆盖
- 等待循环
- 推送通知(ntfy)
- 各平台设置
- 编写新适配器
- 安全
- 验证状态
- 参与贡献
- 许可证
原因
你在 Cursor 中启动一项任务,然后需要离开办公桌。通常,Agent 一需要你做决定就会停滞不前。cursor-chat-bridge 可将任意聊天应用变成远程控制端:Agent 会在线程中汇报进度并提出问题,你可以用手机回复;你一回复,它就会自动继续——无需使用笔记本电脑。
- 每个对话对应一个线程。 每个 Cursor 聊天都会映射到各自的 issue / 频道 / 主题——即使同一工作区中有多个聊天,也会彼此分开。
- 免操作循环。 回复会自动重新注入;你无需操作 Cursor 即可继续。
- 可插拔频道。 目前支持 Telegram、Discord 和 GitHub Issues——约 100 行代码即可添加自定义频道。
- 默认安全。 远程回复会被视为不可信内容;执行破坏性操作前,必须在线程中明确确认。
- 兼容代理。 GitHub 和 Discord 可通过 TLS 拦截型企业代理进行隧道连接。
功能
| 能力 | 说明 |
|---|---|
| 手机优先 | 通过 GitHub / Discord / Telegram 移动应用回复 Agent,并接收原生推送通知。 |
| 自动恢复 | stop hook 会等待你的回复,并将其重新注入为 followup_message。 |
| 按会话隔离 | 以 Cursor 的 conversation_id 为键;不同聊天之间不会互相干扰。 |
| 长时间、低成本等待 | 每次重新启用后都会进入一个约 60 分钟的阻塞等待窗口 ⇒ 空闲时只产生极少的付费轮次。 |
| 输入时关闭 | beforeSubmitPrompt hook 会在你于 Cursor 中输入内容时立即停用循环(设为 stopRemoteChatOnLocalMessage: false 可保持启用)。 |
| 令牌认证的本地 API | 守护进程的控制 API 仅限环回连接,并受令牌保护。 |
| 可选 ntfy 推送 | 即使使用 GitHub,也能收到手机提醒(GitHub 不会提醒你自己发布的内容)。 |
| 图像附件 | 从手机发送照片;照片会保存在本地,Agent 会使用其 Read 工具打开。 |
| 语音 → 文本 | 可选语音转文本(OpenAI 或本地):语音备忘录会以转录后的文本形式发送给 Agent。 |
| 适配器 SDK | 实现一个 TransportAdapter 接口即可支持任意频道。 |
| 感知更新 | 激活时会检查 npm,并在有较新版本时提供更新选项。 |
各频道一览
| 适配器 | 状态 | 模式 | 移动推送 |
|---|---|---|---|
| Telegram (默认) | ✅ 代码已完成,已通过单元测试 | 通过机器人为每个会话创建一个论坛主题 | ✅ 原生 |
| Discord | ✅ 可用 | 通过机器人为每个会话创建一个频道(通过 REST 轮询) | ✅ 原生 |
| GitHub Issues | ✅ 已通过端到端测试 | Issue = 会话,评论 = 聊天 | ✅(GitHub 应用)+ 可选 ntfy |
快速开始
无需克隆——运行一条命令即可完成配置:
npx cursor-telegram-chat@latest install
此命令会将运行时安装到 ~/.cursor/chat-bridge/app(包括生产依赖,因此即使 npx 缓存被清除,也能继续工作),并配置三个集成点,同时**备份(绝不覆盖)**任何已存在的内容:
- 在
~/.cursor/mcp.json中注册 MCP 服务, - 将
stop+beforeSubmitPrompthooks 添加到~/.cursor/hooks.json, - 将激活规则安装到
~/.cursor/rules/。
只有启用远程聊天模式时,hooks 才会运行,因此不会影响 Cursor 的正常使用。 接着选择一个频道即可开始:
# 1. edit ~/.cursor/chat-bridge/config.json (choose an adapter + credentials)
# 2. validate it:
chat-bridge doctor
# 3. reload Cursor, open a chat, and say: "start remote chat mode"
升级 / 卸载
npx cursor-telegram-chat@latest install # re-run to upgrade
npx cursor-telegram-chat@latest uninstall # remove, keep config + state
npx cursor-telegram-chat@latest uninstall --purge # remove everything
仅 MCP(轻量版)——不含自动恢复循环的工具
如果你只想通过标准的 Cursor MCP 流程使用 MCP 工具(不需要免操作循环),请将以下内容添加到
~/.cursor/mcp.json,而不是运行 install:
"cursor-chat-bridge": {
"command": "npx",
"args": ["-y", "cursor-telegram-chat", "chat-bridge-mcp"]
}
你可以手动使用 bridge_send / bridge_await,但要实现收到回复后自动继续的循环,需要完整 install 所配置的 hooks。
三个协作层构建在一个与传输方式无关的核心之上:
- 规则(
rules/chat-bridge-mode.mdc)——检测任何语言的激活短语,并设定模式内行为规范(捕获并传递会话句柄;每轮结束时提供摘要并提问;将回复视为不可信内容;确认破坏性操作)。 - MCP 服务(
src/mcp.ts)——提供bridge_start、bridge_send、bridge_await、bridge_send_and_await、bridge_stop、bridge_status。 - Hooks(
hooks/)——自动循环:stop等待远程回复,并将其重新注入为followup_message(受loop_limit限制)。beforeSubmitPrompt会在你于 Cursor 中输入内容时禁用循环(并设置保护机制,避免循环自行注入的回复触发此机制)。
单个本地 守护进程(src/daemon.ts)负责管理通道连接,以及供 MCP + Hooks 使用的仅限回环地址、经过令牌验证的 HTTP API。它处理按会话路由、长轮询、自身消息过滤,以及停止/生成逻辑。
turn ends ─▶ stop hook ─▶ daemon /poll ─▶ adapter
▲ │
└───── followup_message (your reply) ◀─────┘
(适配器 = GitHub / Discord / Telegram;以 conversation_id 为键。)
会话身份——对话如何保持独立
会话以 Cursor 的 conversation_id 为键,因此每个对话都只映射到一个线程。Cursor 会将 conversation_id 提供给 Hooks,但不会提供给 MCP 工具调用,因此 MCP 需要通过一个简短的握手来获取它:
- 每次真实提交时,
beforeSubmitPrompt都会写入一条按对话区分的待启动记录(markers/pending/<conversation_id>.json),作为身份的唯一依据(另外还有一个旧版last-submit/ws指针,仅用于诊断和版本升级导致的不一致)。 bridge_start会认领唯一一条新鲜的待处理记录,并以其真实的conversation_id作为会话键,然后返回一个会话句柄。它绝不会生成随机 ID,也不会理会自身(可能路由错误的)BRIDGE_WORKSPACE——以认领记录中的工作区为准。- 如果没有新鲜的握手、握手已过期,或者多个聊天同时提交,
bridge_start会安全失败,而不是猜测;它会返回指引,而不会绑定到可能错误的线程。 - Agent 在之后的每次
bridge_*调用中都会传入session=<handle>——现在这是必需项(不再回退到最近记录/缓存),因此同一工作区中的两个对话绝不会串到不同线程。
Hooks 严格使用各自的 conversation_id 作为键(不进行全局回退),因此一个对话中的轮次绝不会轮询或注入到另一个对话中。通过 handshakeFreshMs(配置项或 BRIDGE_HANDSHAKE_FRESH_MS,默认 600000ms)调整有效时长;chat-bridge doctor 会报告 MCP 进程的工作区绑定、待处理/认领状态以及版本不一致情况。
故障排查:会话在几分钟后停止
免手动等待(默认 60 min)由 stop Hook 的重新布防循环实现,不是由 bridge_await 实现(后者每次调用只轮询约 50s)。除非 ~/.cursor/hooks.json 中设置了较大的 timeout,否则 Cursor 会在短时间后终止 stop Hook,但具体上限未公开——安装程序会设置 timeout: 3660。如果会话在几分钟后停止:
- 使用的是仅 MCP(精简版)安装方式? 它不包含 Hooks,因此无法自动恢复。运行完整安装命令
npx cursor-telegram-chat@latest install。 - 安装后完全退出并重新打开 Cursor——重新加载不一定会重新加载
hooks.json。 - 确认
~/.cursor/hooks.json中有一个timeout: 3660的stopHook(重新运行最新版install可修复旧配置)。 - 如果你使用的 Cursor 版本仍会过早终止 Hook,可缩短每次等待时长,让它更快重新布防:在
~/.cursor/chat-bridge/config.json中设置"stopWindowMin": 5(60 分钟的总时长由stopBudgetMin控制)。
在聊天线程中发送照片(或图像文件),Agent 就能看到:
- 适配器会捕获消息中的附件(Discord 的
attachments、Telegram 的photo/ 图像document)。 - 守护进程会将字节下载到
~/.cursor/chat-bridge/media/<session>/,并在消息文本中附加一条包含本地路径的说明。 - Agent 会使用其 Read 工具打开该路径——这样图像就会作为视觉输入传给模型。
使用企业 TLS 代理时: Discord 的
cdn.discordapp.com通常会被拦截,而media.discordapp.net则可以访问。Discord 适配器会自动将附件 URL 改写为media主机,因此在这类网络中也能正常下载。
语音消息(语音转文字)
发送一条语音消息(Telegram)或一个音频附件(Discord),Agent 就会收到转录文本,就像你输入的文字一样——默认关闭。在配置中的 stt 下启用:
"stt": {
"enabled": true,
"provider": "openai", // "openai" (OpenAI-compatible via baseUrl) or "local"
"tryLocalSttFirst": false,// true = force the local transcriber even if a cloud provider is set
"apiKeyCommand": "…", // or "apiKey", or env BRIDGE_STT_API_KEY
"language": "auto", // auto-detect, or force "he" / "en"
"keepAudio": true // false = delete the audio after transcribing
}
local提供方(离线,适合敏感音频):将localBin/localArgs设置为一个会将转录文本输出到 stdout 的命令行工具(例如whisper.cpp)。始终遵循配置的provider——Bridge 不会悄悄回退到local。若要在已设置云端提供方时强制使用本地转录器,请使用"tryLocalSttFirst": true(或BRIDGE_STT_TRY_LOCAL_FIRST=1)。- 转录会在守护进程中异步运行(绝不会阻塞轮询窗口);转录文本会在下一次回复周期中送达。完整设计请参阅
docs/stt-plan.md。
已读回执(确认消息)
如果不启用,从手机发送消息后,在 Agent 完成整个轮次之前都不会有任何反馈——你无法判断消息是否已送达。启用后,守护进程会在消息到达时立即回复,早于任何耗时操作(下载附件、转录)。默认关闭:
"ack": {
"enabled": true,
"language": "auto", // "auto" matches you; force with "en" or "he"
"adapters": ["discord", "telegram"], // bot-identity channels only (see below)
"echoTranscript": true, // repeat back what a voice note said
"maxTranscriptChars": 200
}
不同消息类型对应的回复:
| 你发送的内容 | Bridge 的回复 |
|---|---|
| 文本 | 收到,马上处理… |
| 图片 | 收到图片,我来看看… |
| 语音消息 | 收到你的语音消息,正在转录… 转录完成后再回复 收到你的请求:“…” |
stop | 远程聊天会话已停止。 |
回执由守护进程发送,而不是 Agent——在下一轮开始之前,Agent 甚至看不到你的消息,因此由 Agent 发送回执不仅会消耗一个大模型轮次,还会延迟送达。
设为 "auto" 时,回复会匹配你所用的语言:你发送希伯来语文本,就会收到希伯来语回复;对于语音消息,则由转录器检测出的语言决定。对于没有可供判断内容的消息(未附说明文字的图片、单独的 stop),会沿用你在该会话中上次使用的语言;默认使用英语。
时间安排: 守护进程只会在轮询进行时读取频道——也就是 Agent 正在等待回复,或
stop钩子正在等待时。Agent 正在处理中途发送的消息不会立即被看到(因此也不会立即收到回执),要等到 Agent 完成后才会处理。这些消息绝不会丢失,只会延迟处理。
为何不支持 GitHub: Agent 会以你自己的账户发表评论,因此回执看起来就像是你在回复自己。你仍可以通过在
adapters中添加"github"来选择启用。
配置
~/.cursor/chat-bridge/config.json(此文件的更改会在下一次轮询时自动生效,无需重启守护进程;只有 mcp.json 中的环境变量更改和适配器凭据需要重启):
{
"activeAdapter": "telegram",
"pollIntervalMs": 10000, // check for replies every N ms (lower = snappier, more API calls)
"minPollIntervalMs": 2000, // floor for the above; lower it if you set pollIntervalMs < 10000
"stopBudgetMin": 60, // wait budget (mins); resets on every reply
"stopWindowMin": 60, // mins per window (keep < hooks.json timeout)
"caCertPath": "", // corporate CA bundle (PEM) if behind a TLS proxy
"requireConfirmForDestructive": true,
"stopRemoteChatOnLocalMessage": true, // typing in Cursor turns remote mode off (set false to keep it on)
"adapters": {
"github": {
"owner": "you",
"repo": "cursor-bridge-inbox",
"tokenCommand": "gh auth token --user you"
},
"discord": { "botToken": "", "channelId": "", "allowedUserIds": [] },
"telegram": { "botToken": "", "chatId": "", "allowedUserIds": [] }
},
"ack": { "enabled": false, "language": "auto" } // read receipts; see above
}
caCertPath通常留空——除非遇到问题,否则无需设置。某些企业网络会使用自己的根证书拦截 HTTPS,而 Node 不信任该证书,因此请求会报错TypeError: fetch failed,但curl可以正常工作。如果遇到这种情况,请将caCertPath(或BRIDGE_CA_CERT)指向计算机上的 CA 证书包(PEM);doctor、守护进程和更新检查都会遵循此设置。ntfy 推送默认关闭,也不属于此文件的一部分——只能通过
BRIDGE_NTFY_*环境变量启用(见下文)。
环境覆盖项
在 ~/.cursor/mcp.json 中 cursor-chat-bridge 条目的 env 块(或 shell)里设置这些变量,即可覆盖 config.json,无需编辑该文件。所有变量都使用 BRIDGE_* 命名空间。要使更改对正在运行的守护进程生效,需要重启守护进程(chat-bridge shutdown)。
| 环境变量 | 覆盖项 | 示例 |
|---|---|---|
BRIDGE_PLATFORM | activeAdapter | github | telegram | discord |
BRIDGE_POLL_INTERVAL | 轮询间隔(秒) | 30 |
BRIDGE_STOP_BUDGET_MIN | 等待时限,分钟;收到回复时重置 ¹ | 60 |
BRIDGE_STOP_WINDOW_MIN | 每个阻塞窗口的时长,分钟 ² | 60 |
BRIDGE_CA_CERT | caCertPath | /path/to/ca.pem |
BRIDGE_GITHUB_REPO | github owner/repo | you/inbox |
BRIDGE_GITHUB_TOKEN | github 令牌 | gho_… |
BRIDGE_TELEGRAM_BOT_TOKEN | telegram 机器人令牌 | — |
BRIDGE_TELEGRAM_CHAT_ID | telegram 论坛群组 ID | — |
BRIDGE_TELEGRAM_ALLOWED_USER_IDS | 白名单(csv) | 123,456 |
BRIDGE_DISCORD_BOT_TOKEN | discord 机器人令牌 | — |
BRIDGE_DISCORD_CHANNEL_ID | discord 频道 ID ³ | — |
BRIDGE_DISCORD_ALLOWED_USER_IDS | 白名单(csv) | 123,456 |
BRIDGE_WORKSPACE | 每个窗口的会话键 | ${workspaceFolder} |
BRIDGE_NTFY_TOPIC | 启用 ntfy 并设置主题 | cursor-bridge-… |
BRIDGE_NTFY_PRIORITY | 推送优先级 0–5(0 = 关闭) | 2 |
BRIDGE_NTFY_SERVER | ntfy 服务器基础 URL | https://ntfy.sh |
¹ 也可以在 config.json 中设置 stopBudgetMin——这是可靠的控制项,因为钩子不会继承 MCP 条目的环境变量。
² 也可以在 config.json 中设置 stopWindowMin。请确保其值低于 ~/.cursor/hooks.json 中 stop 钩子的 timeout。
³ 可以使用服务器中任何现有的文本频道;此频道用于定位服务器和分类目录——每个会话都会在其旁边创建一个新频道(例如 #General)。
也可以在运行时为单次对话选择平台:说 "start remote chat in Telegram",Agent 就会为该对话调用 bridge_start(adapter: "telegram")。
等待循环(stop 钩子)
远程模式处于活动状态时,stop 钩子会在每轮结束时阻塞,等待你的回复。两个参数控制此行为:
stopWindowMin(默认值为 60)——单次钩子调用阻塞的时长;到时后会返回一条静默的保活消息并重新布防。Cursor 会将stop钩子的运行时长限制在~/.cursor/hooks.json中的timeout(默认 3660s / 61 min);测试表明不存在更低的隐藏上限,因此每个约 60 分钟的窗口意味着你离开期间每小时只会产生一次付费保活轮次。stopBudgetMin(默认值为 60)——跨多次重新布防的总等待时长。每次收到回复时都会重置,所以它实际上表示“从你上次发送消息起,最多继续等待 N 分钟”。
收到回复、在 Cursor 中输入内容、在话题中发送 stop,或调用 bridge_stop 时,循环会结束。
推送通知(ntfy)
GitHub 不会就你自己的活动向你发送通知——而 Agent 是以_你的身份_发帖(提及自己和将自己分配给任务也不会触发通知)。因此,如果你想在 GitHub 渠道之外收到手机提醒,又不想使用第二个账号,cursor-chat-bridge 可以在每次生成摘要时通过 ntfy 发送带外推送通知。它免费、无需账号、开源、可自托管,并且可以深度链接到对应议题。
默认关闭。在 MCP 条目的环境变量中启用:
- 安装 ntfy 应用(iOS/Android),或使用 Web 应用。
- 选一个足够长、难以猜测的主题(主题是公开的,但靠冷僻程度提供保护),然后订阅该主题。
- 在
~/.cursor/mcp.json中cursor-chat-bridge条目的env块里设置BRIDGE_NTFY_TOPIC=cursor-bridge-<random>。
BRIDGE_NTFY_PRIORITY 用于控制开关:0 = 关闭(默认),1 = 最低,5 = 最高。只有在优先级 ≥ 1 且已设置主题时才会发送推送通知。对于 Telegram 和 Discord,不会发送推送通知,因为它们本身就支持通知。
各平台设置
Telegram — 默认选项,聊天体验最佳
- 使用 @BotFather 创建机器人 → 获取机器人令牌。
- 创建群组,启用 Topics,并将机器人添加为管理员,授予_管理主题_权限。
- 在配置中填写群组的
chatId和你的数字格式allowedUserIds(允许列表); 设置activeAdapter: "telegram"。
通过 getUpdates 配对获取 chatId / 用户 ID(在群组中发送一条消息,然后读取更新)。
要求守护进程能够访问 api.telegram.org——如果网络阻止了访问,请在能够访问该地址的主机上运行守护进程,或改用 Discord/GitHub。
Discord — 优先适配手机,在代理环境下也能使用
- 创建一个 Discord 服务器(使用你拥有的服务器)——机器人会在其中为每个会话创建一个频道。
- 在 https://discord.com/developers/applications 创建应用和 Bot。在 Bot 页面中,点击 Reset Token,然后点击 Copy 复制显示的机器人令牌。
- 在 Bot 页面中,启用 Message Content Intent。
- 邀请机器人:打开 OAuth2 → URL Generator,选择
bot作用域,并授予 Manage Channels + View Channels + Send Messages + Read Message History 权限(必须授予 Manage Channels——机器人需要为每个会话创建并删除频道)。复制 Generated URL,在新的浏览器标签页中打开,然后选择你在第 1 步创建的服务器。 - 获取一个频道 ID(
channelId)——可以是该服务器中的任意现有文本频道(例如#general);机器人会用它查找服务器和分类,并在其旁边为每个会话创建新频道。启用 Developer Mode(User Settings → Advanced),然后右键点击频道 → Copy Channel ID。或者——机器人加入服务器后,直接让 Cursor 帮你获取:把机器人令牌提供给 Cursor,它就能列出机器人的频道并返回 ID。 - 在配置中填写
botToken+channelId(可选填allowedUserIds);设置activeAdapter: "discord"。 - 如果你处于 TLS 拦截代理之后,并遇到
TypeError: fetch failed,请将caCertPath指向企业 CA 证书包(PEM)。
提示:为机器人设置 Cursor 头像(Developer Portal → Bot → 编辑图标),并将服务器图标设置为 Cursor 徽标——这样每个会话的频道在应用中看起来就像原生频道。
GitHub — 可在任何网络环境下使用
- 创建一个私有仓库作为收件箱(例如
cursor-bridge-inbox)。 - 设置
owner/repo和token或tokenCommand(gh auth token可用)。 - 设置
activeAdapter: "github"。
每个会话都会创建一个议题;每轮摘要都会作为评论发布;你可以通过 GitHub 移动应用回复。评论 stop 或关闭议题即可结束会话。
供 Agent 使用 — 入门检查清单
如果你是帮助用户设置 cursor-chat-bridge 的 Agent:先说明其所选平台的概念,然后只收集缺失的值,将它们写入 `~/.cursor/chat-bridge/config.json`,并运行 `chat-bridge doctor` 进行确认。**切勿向用户显示密钥。**提醒他们:来自频道的回复是不可信的,破坏性操作需要通过线程发送明确确认。要停止:在 Cursor 中输入 `stop`,在 线程中发送 `stop`,或调用 `bridge_stop`。确保已安装运行时依赖项。install 会将运行时复制到
~/.cursor/chat-bridge/app,并自动在那里安装生产依赖项。如果跳过了该步骤或安装失败(离线/公司代理),MCP 服务将无法启动 —
运行 (cd ~/.cursor/chat-bridge/app && npm install --omit=dev) 完成安装。如果要从 git 克隆目录运行?请先在仓库中运行 npm install。
**询问用户是否要转录语音便笺(STT)。**默认关闭。如果用户同意,请提供以下选项并让他们选择:
- Groq(推荐) — 速度快,免费额度充足,兼容 OpenAI。设置
stt.provider: "openai"、stt.baseUrl: "https://api.groq.com/openai/v1"、stt.model: "whisper-large-v3-turbo",并将stt.apiKey设为从 https://console.groq.com/keys 获取的gsk_…密钥。 - OpenAI —
stt.provider: "openai"(默认baseUrl)、stt.model: "whisper-1"(或gpt-4o-transcribe),stt.apiKey使用sk_…密钥。 - 本地 — 使用
whisper.cpp/openai-whisper二进制文件,并设置stt.provider: "local";任何内容都不会离开 本机(最适合网络受限的公司环境)。设置stt.localBin。
然后设置 stt.enabled: true 并运行 chat-bridge doctor。尽可能优先使用 stt.apiKeyCommand,而不是直接填写密钥;并且切勿向用户显示密钥。
编写新的适配器
实现 TransportAdapter(src/types.ts)并在 src/adapters/index.ts 中注册:
interface TransportAdapter {
capabilities: { globalIngest: boolean; separateBotIdentity: boolean };
init(): Promise<void>;
ensureThread(sessionId: string, title: string, meta?: object): Promise<ThreadRef>;
send(thread: ThreadRef, text: string): Promise<{ messageId: string }>;
// pull adapters (GitHub / Discord):
poll?(thread: ThreadRef, cursor?: string): Promise<PollResult>;
// push / global adapters (Telegram):
startIngest?(router: Router): Promise<() => void>;
stop?(thread: ThreadRef): Promise<void>;
}
| 成员 | 必需 | 用途 |
|---|---|---|
capabilities | ✅ | globalIngest:所有会话共用一个流(Telegram),还是按线程轮询。separateBotIdentity:消息以机器人身份发布,而不是以你的身份发布。 |
init() | ✅ | 验证凭据和连接。 |
ensureThread() | ✅ | 创建/查找每个会话对应的线程/频道;返回一个 ThreadRef。 |
send() | ✅ | 发布消息(处理平台的长度限制/分块)。 |
poll() | 拉取式适配器 | 返回 cursor 之后的新消息,并筛选出获准用户的消息。 |
startIngest() | 推送式适配器 | 启动一个全局流并路由更新;返回一个停止函数。 |
stop() | 可选 | 执行清理(例如 Discord 会删除其每个会话对应的频道)。 |
安全性
- 回环控制 API 经过令牌身份验证 — 只有持有令牌的本地进程(MCP 和钩子)才能控制守护进程。
- 入站消息会通过
allowedUserIds白名单进行筛选(Telegram/Discord)。 - 每条远程回复都会被包装并标记为不可信;规则禁止在未通过线程发送明确确认的情况下执行破坏性操作。
- 令牌存储在
~/.cursor/chat-bridge/config.json(chmod 600)中,绝不会提交。尽可能优先使用tokenCommand,而不是存储令牌。
权限——守护进程需要什么(以及扫描器为何会标记它)
通过聊天应用驱动 Agent,必然需要一些强大的功能。此软件包会使用:
- 子进程——用于启动守护进程、运行你的
tokenCommand(例如gh auth token)、本地whisper二进制文件(仅当你选择本地 STT 时)以及安装程序中的npm install。 - 网络访问——仅限 loopback 的控制服务器,以及向你选择的渠道(Telegram/Discord/GitHub)发起的出站调用、语音转文本上传(如果已启用)和 npm 更新检查。
- 文件系统访问——读写
~/.cursor/chat-bridge/,用于存储配置、媒体文件和日志。
因此,供应链扫描器(Socket、Snyk 等)给出的供应链安全评分会低于纯逻辑库——尽管没有已知漏洞。该评分反映的是功能能力 + 软件包年龄(此项目是新项目,由单人维护),并不代表检测到了漏洞利用。
说明一下:项目没有 postinstall/install 脚本——唯一的生命周期脚本是 prepublishOnly(在发布者的机器上运行的构建脚本,不会在你安装时运行)。只有在你运行守护进程时,才会发生网络、文件系统和进程操作;控制 API 仅限 loopback,并受令牌保护。源码采用 MIT 许可证,可在此代码库中审查。
验证状态
已在本机完成端到端验证(无需重启 Cursor):
- GitHub 适配器——创建 issue、发送、轮询、过滤自己的消息、
stop关键字、检测关闭状态。 - 守护进程——令牌认证、长轮询、停止/生成、持久化。
- MCP 服务——通过真实的 stdio JSON-RPC 握手调用所有工具。
- Hooks——注入 stop-loop
followup_message、before-submit 关闭开关 + 注入防护、未激活时立即空操作。 - 按对话路由(
node scripts/e2e-conv.mjs)——不同对话会打开不同 issue;同一工作区中的两个对话仍保持独立;重新激活已停止的会话会开启新线程;未配置的渠道会返回引导说明。 - 单元测试——
npm test(路由、存储语义、消息过滤)。
贡献
欢迎提交 issue 和 PR。本地开发:
npm install
npm run build # tsc → dist/
npm run typecheck
npm test # node --test
npm run dev:daemon # run the daemon from source (tsx)
新增渠道是最容易参与的贡献方式——实现一个 TransportAdapter(见上文)。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。

