mcpField
C
cursor-chat-bridge

cursor-chat-bridge

本地服务
github.com/udah1通信协作212 周前更新

关于 cursor-chat-bridge

cursor-chat-bridge 将 Cursor Agent 接入 Telegram、Discord 或 GitHub,让开发者通过手机回复 Agent 的问题并继续对话。它按 Cursor 会话隔离消息,并可借助钩子自动等待回复和续接任务。

主要功能

  1. 01通过 Telegram、Discord 和 GitHub 交互
  2. 02按 Cursor 会话分配独立线程
  3. 03收到回复后自动续接 Agent
  4. 04支持图片附件和语音转文字
  5. 05提供可扩展的传输适配器

适用场景

  1. 01离开电脑时通过手机回复 Cursor Agent
  2. 02从聊天线程发送图片供 Agent 查看
  3. 03用语音消息向 Agent 提供文字指令
  4. 04在多个 Cursor 会话间保持消息隔离

MCP 相关

其 MCP 服务提供 bridge_start、bridge_send、bridge_await、bridge_send_and_await、bridge_stop 和 bridge_status 工具。完整自动续接还需安装 Cursor 钩子;MCP-only 模式支持手动操作。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"udah1-cursor-chat-bridge": {
"command": "npx",
"args": [
"-y",
"cursor-telegram-chat"
],
"env": {
"BRIDGE_PLATFORM": "<BRIDGE_PLATFORM>"
}
}
}
}
启动命令npx -y cursor-telegram-chat
需要配置的环境变量
BRIDGE_PLATFORMWhich chat adapter to use: telegram | discord | github. Optional — defaults to activeAdapter in ~/.cursor/chat-bridge/config.json.

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

安装包
npmcursor-telegram-chat0.1.23

工具

6

收录的工具列表 · 更新于 2 周前

参数类型必填说明
titlestring否为线程命名——用简洁的(≤6 个单词)摘要概括本次对话主题,使其类似于 Cursor 聊天列表中的显示方式(例如 "GitHub Actions autopublish")。默认使用文件夹名称;当多个对话共享一个工作区时,这个名称不够明确。
adapterenum否此会话使用的聊天频道;覆盖已配置的默认值。github | telegram | discord
sessionstring否先前 bridge_start 返回的句柄;用于重新启用现有会话,而非开启第二个线程。若要全新开始,请省略此参数。

详细介绍

🌉 cursor-chat-bridge (Telegram、Discord、GitHub)

通过 Telegram、Discord 或 GitHub,从手机操控 Cursor Agent。

用任意语言说出 “start remote chat mode”,Cursor 就会在每轮结束时,将摘要和问题发送到专属的会话线程中,等待你的回复,并自动继续——如此循环,直到你将它停止。离开键盘,也能用手机持续推进工作。

npm version GitHub stars license Made for Cursor

npm downloads node TypeScript CI Glama MCP server

cursor-chat-bridge 往返流程
聊天应用中每个会话各有一个频道
每个会话各有一个频道 — 每个 Cursor 对话一个频道
Agent 会发布摘要,你可以用手机回复
用手机回复 — Agent 会从中断处继续

在 YouTube 上观看 cursor-chat-bridge 演示
▶ 观看演示(YouTube)

目录


原因

你在 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 + beforeSubmitPrompt hooks 添加到 ~/.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 需要通过一个简短的握手来获取它:

  1. 每次真实提交时,beforeSubmitPrompt 都会写入一条按对话区分的待启动记录(markers/pending/<conversation_id>.json),作为身份的唯一依据(另外还有一个旧版 last-submit/ws 指针,仅用于诊断和版本升级导致的不一致)。
  2. bridge_start 会认领唯一一条新鲜的待处理记录,并以其真实的 conversation_id 作为会话键,然后返回一个会话句柄。它绝不会生成随机 ID,也不会理会自身(可能路由错误的)BRIDGE_WORKSPACE——以认领记录中的工作区为准。
  3. 如果没有新鲜的握手、握手已过期,或者多个聊天同时提交,bridge_start 会安全失败,而不是猜测;它会返回指引,而不会绑定到可能错误的线程。
  4. 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。如果会话在几分钟后停止:

  1. 使用的是仅 MCP(精简版)安装方式? 它不包含 Hooks,因此无法自动恢复。运行完整安装命令 npx cursor-telegram-chat@latest install。
  2. 安装后完全退出并重新打开 Cursor——重新加载不一定会重新加载 hooks.json。
  3. 确认 ~/.cursor/hooks.json 中有一个 timeout: 3660 的 stop Hook(重新运行最新版 install 可修复旧配置)。
  4. 如果你使用的 Cursor 版本仍会过早终止 Hook,可缩短每次等待时长,让它更快重新布防:在 ~/.cursor/chat-bridge/config.json 中设置 "stopWindowMin": 5(60 分钟的总时长由 stopBudgetMin 控制)。
## 图片附件

在聊天线程中发送照片(或图像文件),Agent 就能看到:

  1. 适配器会捕获消息中的附件(Discord 的 attachments、Telegram 的 photo / 图像 document)。
  2. 守护进程会将字节下载到 ~/.cursor/chat-bridge/media/<session>/,并在消息文本中附加一条包含本地路径的说明。
  3. 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_PLATFORMactiveAdaptergithub | telegram | discord
BRIDGE_POLL_INTERVAL轮询间隔(秒)30
BRIDGE_STOP_BUDGET_MIN等待时限,分钟;收到回复时重置 ¹60
BRIDGE_STOP_WINDOW_MIN每个阻塞窗口的时长,分钟 ²60
BRIDGE_CA_CERTcaCertPath/path/to/ca.pem
BRIDGE_GITHUB_REPOgithub owner/repoyou/inbox
BRIDGE_GITHUB_TOKENgithub 令牌gho_…
BRIDGE_TELEGRAM_BOT_TOKENtelegram 机器人令牌—
BRIDGE_TELEGRAM_CHAT_IDtelegram 论坛群组 ID—
BRIDGE_TELEGRAM_ALLOWED_USER_IDS白名单(csv)123,456
BRIDGE_DISCORD_BOT_TOKENdiscord 机器人令牌—
BRIDGE_DISCORD_CHANNEL_IDdiscord 频道 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_SERVERntfy 服务器基础 URLhttps://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 条目的环境变量中启用:

  1. 安装 ntfy 应用(iOS/Android),或使用 Web 应用。
  2. 选一个足够长、难以猜测的主题(主题是公开的,但靠冷僻程度提供保护),然后订阅该主题。
  3. 在 ~/.cursor/mcp.json 中 cursor-chat-bridge 条目的 env 块里设置 BRIDGE_NTFY_TOPIC=cursor-bridge-<random>。

BRIDGE_NTFY_PRIORITY 用于控制开关:0 = 关闭(默认),1 = 最低,5 = 最高。只有在优先级 ≥ 1 且已设置主题时才会发送推送通知。对于 Telegram 和 Discord,不会发送推送通知,因为它们本身就支持通知。

各平台设置

Telegram — 默认选项,聊天体验最佳
  1. 使用 @BotFather 创建机器人 → 获取机器人令牌。
  2. 创建群组,启用 Topics,并将机器人添加为管理员,授予_管理主题_权限。
  3. 在配置中填写群组的 chatId 和你的数字格式 allowedUserIds(允许列表); 设置 activeAdapter: "telegram"。

通过 getUpdates 配对获取 chatId / 用户 ID(在群组中发送一条消息,然后读取更新)。 要求守护进程能够访问 api.telegram.org——如果网络阻止了访问,请在能够访问该地址的主机上运行守护进程,或改用 Discord/GitHub。

Discord — 优先适配手机,在代理环境下也能使用
  1. 创建一个 Discord 服务器(使用你拥有的服务器)——机器人会在其中为每个会话创建一个频道。
  2. 在 https://discord.com/developers/applications 创建应用和 Bot。在 Bot 页面中,点击 Reset Token,然后点击 Copy 复制显示的机器人令牌。
  3. 在 Bot 页面中,启用 Message Content Intent。
  4. 邀请机器人:打开 OAuth2 → URL Generator,选择 bot 作用域,并授予 Manage Channels + View Channels + Send Messages + Read Message History 权限(必须授予 Manage Channels——机器人需要为每个会话创建并删除频道)。复制 Generated URL,在新的浏览器标签页中打开,然后选择你在第 1 步创建的服务器。
  5. 获取一个频道 ID(channelId)——可以是该服务器中的任意现有文本频道(例如 #general);机器人会用它查找服务器和分类,并在其旁边为每个会话创建新频道。启用 Developer Mode(User Settings → Advanced),然后右键点击频道 → Copy Channel ID。或者——机器人加入服务器后,直接让 Cursor 帮你获取:把机器人令牌提供给 Cursor,它就能列出机器人的频道并返回 ID。
  6. 在配置中填写 botToken + channelId(可选填 allowedUserIds);设置 activeAdapter: "discord"。
  7. 如果你处于 TLS 拦截代理之后,并遇到 TypeError: fetch failed,请将 caCertPath 指向企业 CA 证书包(PEM)。

提示:为机器人设置 Cursor 头像(Developer Portal → Bot → 编辑图标),并将服务器图标设置为 Cursor 徽标——这样每个会话的频道在应用中看起来就像原生频道。

GitHub — 可在任何网络环境下使用
  1. 创建一个私有仓库作为收件箱(例如 cursor-bridge-inbox)。
  2. 设置 owner/repo 和 token 或 tokenCommand(gh auth token 可用)。
  3. 设置 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(见上文)。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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