关于 meet-live-assist
Meet Live Assist 是 Chrome 扩展和本地桥接服务,可将 Google Meet 或 Zoom 的实时转录传给助手会话,并在侧栏显示建议。它面向希望通过本机运行的 MCP Agent 获取会议支持的人士。
主要功能
- 01实时捕获转录并显示在侧栏
- 02提供可复制的分类建议
- 03决策与行动项看板
- 04与助手双向聊天
- 05截图及会后摘要
- 06在本地保存转录和聊天
适用场景
- 01会议期间查看决策和负责人
- 02获取会议语言的建议发言
- 03跟踪实时出现的风险与行动项
- 04会后导出会议摘要
MCP 相关
stdio MCP 适配器提供 13 个工具,供已连接的助手通过本地桥接服务访问实时转录、侧栏状态、聊天、会议操作及相关数据。助手运行于单独的客户端会话中;MCP 服务不能自行发起回合。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y meet-live-assist-serverMLA_URLBase URL of the bridge server on this machine. Defaults to http://127.0.0.1:8848, which is right unless you moved the port.TRANSCRIPTS_DIRWhere the bridge server writes. The adapter reads the access token from <dir>/.mla-token, and asks the running server for this path when it can, so it is normally unnecessary.MLA_TOKEN密钥Access token for the bridge server. Only needed when the token file cannot be read; the adapter finds it by itself in the normal case.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
13收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| force | boolean | 否 | 即使另一个助手正在参与,也进行关联。 |
| session | string | 否 | 会议 ID。省略此项以使用最近活跃的会议。 |
详细介绍
认识 Live Assist
你自己的 Agent 会话,陪你一起开会。 它会实时读取 Meet 或 Zoom 的转录内容,并在会议仍在进行时通过侧边栏回答:决定了什么、谁负责什么、你刚刚同意承担的风险,以及接下来该说的那句话,且会使用会议所用的语言。
一次发布评审,十四秒,面板停靠在通话旁。对话是虚构的,摄像头也都关着,正如大多数工作通话一样。界面就是正式发布的版本。
从 Chrome 网上应用店安装 · 网站 ·
一条命令即可启动服务:npx meet-live-assist-server
商店版本只需点击一次即可安装,并会自动更新;仓库版本可以通过加载未打包的扩展程序使用,但不会自动更新。无论使用哪种方式,服务器和下方的技能仍由你自行运行;如果没有连接 Agent,建议面板会按设计保持空白。
在 Google Meet 或 Zoom 通话期间,本工具会捕获转录内容,在侧边栏中显示,并将其交给你自己电脑上运行的助手。助手会在会议仍在进行时通过面板回复:该说什么、决定了什么、谁负责什么,以及你刚刚答应了哪些本不该答应的事。
转录内容、屏幕截图和聊天记录会写入你磁盘上的一个文件夹,并由一个只能通过 127.0.0.1 访问的服务提供。没有账户、没有遥测,也没有任何属于我们的服务器。
这些内容究竟会传到哪里,简单明了地说一次。 核心是你自己的 Claude Code 会话,所以你交给它的任何内容——转录批次、你的问题——都会离开你的设备并发送给 Anthropic,使用的是你的账户,和任何其他 Claude Code 会话完全一样。永远不会离开你设备的是存储的记录:文件、屏幕截图和聊天记录。如果某个页面告诉你,实时会议助手完全在你的设备上运行,那它要么使用的是本地模型,要么就是没有说实话;这个工具借用的是你已经付费使用的大脑,这就是你需要接受的取舍。三行版说明请参阅数据流。
安装前请阅读
你需要一个支持 MCP 的 AI 编码 Agent——本项目经过测试的是 Claude Code。 本项目提供了眼睛、耳朵和双手——捕获、面板和本地桥接——但没有大脑。大脑是你自己电脑上的 Agent 会话,它通过 MCP 工具读取通话内容。没有它,你得到的只会是一个能正常工作的转录记录器和一个空白的建议面板,这可不是截图所展示的效果。
适配器采用纯 JSON-RPC over stdio,不包含任何特定供应商的内容,因此其他 MCP 客户端(Cursor、Cline、Continue、Zed、Codex)也能驱动它——已检查过 Codex CLI,它可以通过桥接完成工具调用。还有一项要求,在其他客户端上确实更难满足:客户端必须保持一个持久的后台循环,因为 MCP 采用客户端拉取模式,服务端无法主动发起一轮交互。MCP-CLIENTS.md 说明了需要检查的内容,以及尚未验证的部分。
你的会议也涉及其他人的对话。 开启字幕不会被其他人察觉,而录制会在 Meet 中显示标记。因此,默认情况下,开始捕获时会在会议聊天中发送一行消息,告知大家有助手正在本地转录。你可以在 Options 中编辑这行消息或将其关闭。有些司法管辖区要求在录制或转录对话前获得所有人的同意;这由你自行判断,PRIVACY.md 中对此有明确说明。
要求:Node 20+、Chrome 116+、Claude Code。只有 macOS 支持在通话中发言(使用 say 和 afplay);在其他系统上,建议仍会显示在面板中,服务端也会说明无法发言的原因。只要 ffmpeg 和 whisper.cpp 能运行,本地语音转文字就能在对应环境中工作;面板的设置栏会指出缺少哪一个,而不是悄无声息地失败。
安装(三步)
git clone https://github.com/krystiangw/meet-live-assist-extension.git
cd meet-live-assist-extension
./install.sh # installs the skill, registers the MCP tools, prepares the data dir
然后:
- 启动桥接服务,并保持运行:
node server/transcript-server.js --pair - 加载扩展程序:打开
chrome://extensions→ 开启开发者模式 → 加载已解压的扩展程序 → 选择此文件夹。 将它固定,然后点击图标。面板会自动从配对窗口获取令牌;无需复制。(窗口过期了?重新运行第 1 步中的命令——即使服务已经在运行,也能正常使用。) - 打开 Claude Code,请它协助你的会议。
./install.sh 接受 MLA_USER、MLA_LANGUAGE、MLA_DOMAIN 和 MLA_TRANSCRIPTS_DIR,这样助手就会称呼你的名字、使用你的语言,并大致了解你的会议主题。
选择配置文件
MLA_PROFILE 决定助手了解哪些会议类型,以及它会优先关注什么。其他一切——标记、模式、面板——都相同,因为事实证明这些与领域无关。
| 配置文件 | 适用场景 | 优先关注 |
|---|---|---|
engineering(默认) | 每日站会、事故、需求细化、QA | 决策、范围蔓延、风险、行动项 |
second-language | 任何使用你第一语言以外语言的会议 | 🟢 SAY - 可直接发言的句子,使用会议所用的语言 |
research | 用户访谈、可用性测试 | 沉默、诱导性问题警告、访谈指南覆盖情况 |
generic | 其他任何会议 | 在实时交流中恰当回应 |
这些配置文件都是 skill/profiles/ 中的普通文件,每个约十几行。你可以自行编写一个并传入其名称;如果找不到指定的配置文件,安装程序会拒绝安装,绝不会回退到默认配置。
它会存储什么,以及如何清除
所有内容都存放在一个文件夹中:./transcripts,除非你设置了 MLA_TRANSCRIPTS_DIR:
| 文件 | 内容 |
|---|---|
<date>_<meeting-code>.txt | 转录文本 |
<...>.chat.txt、<...>.summary.md | 你与助手的聊天记录,以及通话后的摘要 |
snapshots/<session>/*.jpg | 屏幕共享期间截取的屏幕截图 |
.state/ | 实时会议状态,因此通话期间重启服务也不会丢失任何内容 |
.mla-token | 扩展程序和助手用于验证身份的共享密钥 |
文件仅所有者可访问(0600),目录权限为 0700,超过 14 天的内容会自动清除(RETENTION_DAYS,设为 0 则永久保留所有内容)。面板中的 🗑 按钮会立即清除单场会议的所有内容,包括转录文本、聊天记录、摘要、屏幕截图和状态。若要全部清除:删除该文件夹,删除 ~/.claude/skills/meet-live-assist,运行 claude mcp remove meet-live-assist,然后从 Chrome 中移除扩展程序。
数据流
| 内容 | 去向 |
|---|---|
| 转录文本、屏幕截图、面板聊天记录、摘要 | 只保存在你的磁盘上,不会发送到其他地方。 文件仅所有者可访问,全部存放在一个文件夹中,由绑定到 127.0.0.1 的进程提供服务。 |
| 你转发给助手的通话内容,以及你的问题 | 通过你自己的 Claude Code 会话发送给 Anthropic——与您在 Claude Code 中进行的其他操作走相同的路径,适用你的账户和条款。 |
| 其他任何内容 | 什么也没有。这里没有第三方。 |
对于 Free / Pro / Max,是否使用你的会话来改进模型由你设置;该设置也会改变数据保留期限。Anthropic 的消费者条款涵盖了这一点,并明确说明其中包括 Claude Code。Work 和 API 账户适用不同的条款。如果要将此工具用于并非只与你有关的对话,建议先了解这些内容。
通话期间的功能
- 实时转录 - 抓取字幕并立即流式传输到面板,去重 + 独白在写入文件/大脑前强制刷新,并使用保守的 ASR 词汇表。
- 大脑提供颜色编码的建议(🟢SAY/🔵INFO/🟡SUMMARY/🟣EXPLAIN/🔴RISK/🟠ACTION),支持丰富内容(链接/图片/图表/列表),每条都可复制;RISK 会触发声音提示和通知。
- 大脑存活状态提示(Claude 会话是否确实已连接?)、捕获监控(字幕中断时发出警告)。
- 决策和行动项看板,带有一键式起草<你的跟踪工具>(使用你在 Options 中填写的名称;若未填写,则创建普通备注);快速询问以回顾;双向聊天。
- 自动驾驶 - 开启 🤖 自动创建后,它将不再提出建议,而是开始执行:待办事项一出现,就会创建工单或备注,无需逐项确认。📣 将链接发布到聊天会与会议室内的所有人分享链接。这两项功能默认关闭,需由你开启。
- 快照(共享屏幕时自动拍摄,也可按需拍摄)、在通话中使用 TTS、本地 STT(whisper)、会议模式 + 类型感知、实时演示文稿编辑 + 对共享标签页进行调试。
- 发言时长、麦克风静音 + 个人提及提醒;通话后摘要导出。
开启自动驾驶的冲刺规划。没有人向面板输入任何内容:会议继续进行时,纠正内容、决策、工单和备注都会陆续生成。
关于信任的说明。 助手是你自己的 Claude Code 会话,使用你自己的工具,并读取实时且不可信的音频流。它收到的指示是:只有你输入的内容才能授权执行操作——任何人说的任何话都不能让它采取行动——但这只是模型遵循其技能的结果,并非坚不可摧的防护。如果你已将具有破坏性的工具连接到 Claude Code,请相应设置其信任级别。PRIVACY.md 中也对此作了明确说明。
落地页: docs/index.html,也托管于
**https://meet-live-assist.github.io/**。
由 Krystian Gwizdała 开发。
Meet Live Assist 是一个独立项目,与 Google 或 Zoom 无关,也未获其认可或赞助;“Google Meet”和“Zoom”是其所有者的商标,在此仅用于说明本项目支持哪些产品。
许可证,简明说明
PolyForm Internal Use 1.0.0。免费,是的,你可以在工作中使用——“你和你公司的内部业务运营”属于允许的用途,无论你的公司是否以营利为目的。你可以为自己使用而修改它。
你不得重新分发、公开分叉或出售它——无论是作为产品、托管服务,还是其中的一部分。这是源代码可用,而非开源;这种区别是有意为之:它可以免费使用,且所有权保持不变。
如果你想做许可证不允许的事,可以提出请求。这是一次协商,而非拒绝。
架构(为何如此设计)
- 流式传输和状态保存在侧边栏中,而非服务工作线程中。 SW 由事件驱动,并会被终止(空闲约 30 秒 / 最长 5 分钟);持久状态保存在
chrome.storage.session中,面板会在(重新)连接时通过restore消息重新载入状态。 - **保持运行:**侧边栏会持有一个
runtime.connect端口,并每 20 秒发送一次心跳;chrome.alarms心跳(30 秒)即使在 SW 被卸载后也会唤醒它。 - 服务器 POST 在 SW 中执行(拥有
127.0.0.1:8848主机权限),而非在内容脚本中执行。
桥接服务
该扩展会与一个小型本地 Node 服务器(127.0.0.1:8848)通信,作为「大脑」桥接层:
转录内容接收端(/append)、建议(/advice)、看板(/items)、聊天(/chat)、快照
(/snapshot、/snapshot-request)、TTS(/speak、/voices)、STT(/stt)、会议模式(/mode)、
演示文稿编辑(/edit、/dom*)、调试(/debug*)、大脑心跳(/brain-ping)、摘要
(/summary)、单场会议清除(/clear)和健康检查(/health)。
助手通过 MCP 访问它,而非 HTTP。 server/mcp-server.js 是一个零依赖的 stdio MCP
适配器,封装了同一套 API,提供 13 个工具。注册一次即可:
claude mcp add meet-live-assist --scope user -- node <repo>/server/mcp-server.js
它会向运行中的服务器查询数据目录的位置(/health 无需令牌),并从该目录读取令牌,
因此无需环境变量。核心工具是 poll:一次调用即可返回足以处理一个回合的转录批次、面板状态
以及任何待处理结果;读取偏移量由服务器按助手保存。这样每个回合就不必调用四五次 curl,
也不必把字节偏移量保存在 shell 变量中;而且即使无法访问文件系统也能运行,这是托管部署所需的。
MCP 无法唤醒助手:该协议采用客户端拉取模式,因此服务器无法自行启动一个回合。客户端循环轮询
/poll?...&format=text 才是唤醒来源;只有在发生事件时,它才会打印内容——足以处理一个回合的批次、
面板状态变化、在面板聊天中输入的消息、会议聊天投递失败,或自身无法连接到服务器。状态变化最为重要:
只有通过它,按下 Stop 才能通知助手,因为采集会在此时结束,之后不会再有字幕传来。
读取位置按读取方区分,由服务器保存;服务器从未见过的读取方会从频道的末尾开始读取——唤醒循环
通过 backlog=1 请求首次读取时获取截至目前的会议内容。循环和 poll 工具刻意作为独立的读取方:
读取会消耗内容,因此如果共享读取位置,回合中途的工具调用就可能取走循环仍需处理的唤醒信号。每场会议的
读取位置数量都有上限,并按最近最少使用原则淘汰;这不会影响正在轮询的循环。
多租户分界层。 状态以 (user, session) 为键;参见 server/scope.js。在本地安装中,单个用户会映射到
数据目录本身,因此目录结构不会改变。设置这一分界层,是为了让托管配置文件能够为用户划分命名空间,
而无需另走一套代码路径;也为了将「一个用户无法访问其他用户的会议」这一保证集中到一处,并直接进行测试。
身份验证: 除 /health 外,每个路由都需要 X-MLA-Token 标头。服务器首次启动时会将令牌写入
<transcripts>/.mla-token;大脑会读取该文件,扩展则会自动配对,因此人类始终无需接触令牌副本。
没有令牌时,你访问的任何网站都可能连接到 localhost 服务器。
配对。 GET /pair 只会返回一次令牌,且仅在配对窗口打开时可用——服务器首次启动时,或使用 --pair
运行时;如果服务器已在运行,该选项只会重新打开配对窗口。配对请求必须携带 X-MLA-Pair: 1,网页无法
在不发送会泄露来源的预检请求的情况下发送此标头;任何存在的 Origin 都必须是 chrome-extension://。
首次领取会关闭窗口,并记录领取令牌的扩展 ID。这无法阻止你的另一个已经持有 127.0.0.1 权限的扩展在
这两分钟内与你竞争;这也正是配对窗口不会一直保持打开的原因。手动粘贴仍然可用,Options 中也仍保留此选项。
每场会议使用两个文件。 /append 会将每条字幕写入 <session>.txt——完整记录,不遗漏任何内容——并且仅当一批内容值得唤醒大脑时(决策、阻塞事项、你的名字、真正的问题、累积的实质内容),才会将其追加到 <session>.wake。助手读取唤醒通道(通过 poll),而非原始转录:这能避免一次 40 分钟的通话消耗数百轮大脑调用。暂缓的一批内容绝不会丢失——它会随下一次唤醒一起发送;无论如何,经过 WAKE_FORCE_MS 后都会强制刷新。poll 会读取该通道,但有意不强制刷新:每 2 秒轮询一次就刷新,会把门控暂存的所有内容都返回,这样门控也就形同虚设。
启动服务
该服务以独立的 meet-live-assist-server 形式提供(零依赖),因此只想运行它的人既不需要这个仓库,也不需要克隆仓库:
npx meet-live-assist-server
从克隆的仓库启动时:
node server/transcript-server.js --pair
此扩展已上架 Chrome 网上应用店,但未列出:通过链接即可一键安装,并且会自动更新;但在商店搜索中不会显示,因为如果没有同时运行服务并连接 Agent,它对任何人都毫无用处。以未打包方式加载仓库也完全一样,但不会自动更新——二选一即可,不要同时使用,因为 Chrome 会为它们分配不同的扩展程序 ID。
MCP 部分已列入 MCP Server Registry,名称为 io.github.krystiangw/meet-live-assist,因此兼容注册表的客户端无需获知命令即可添加它。仍需手动指定的客户端可使用:npx -p meet-live-assist-server meet-live-assist-mcp(该包提供两个可执行文件;npx meet-live-assist-server 启动的是桥接程序,而不是适配器)。
除非通过 TRANSCRIPTS_DIR 指定其他位置,否则文件会写入 ~/meet-live-assist/transcripts。唯一的硬性要求是 Node 20+;ffmpeg 和 whisper-cli 均为可选项,只有本地 STT 依赖它们。二进制文件路径会依次从 Homebrew、/usr/local、/usr/bin 和 PATH 中解析,因此 Linux 和两种 Mac 架构都能运行。文本转语音仅支持 macOS(say + afplay);在其他平台上,建议仍会以文本形式显示在面板中,只是没有语音输出。详情请参阅 server/README.md。
发布新版本时,运行 cd server && npm publish。请先运行 npm pack --dry-run 并检查文件列表:应该有 8 个文件,约 61 kB——服务、MCP 适配器、会话名称清理器、状态存储、唤醒通道截断辅助程序、README、许可证和清单。列表中的其他内容都不是你打算发布的。
在 Mac 上设置自动启动(launchd)
从克隆的仓库启动;如果希望重启后服务自动恢复运行:
git clone https://github.com/krystiangw/meet-live-assist-extension.git
cd meet-live-assist-extension
MLA_DRY_RUN=1 ./server/install-server.sh # optional: see the plan + generated plist, change nothing
./server/install-server.sh # install as a launchd agent + start it
它会自行解析机器专属的信息(通过 process.execPath 获取 node 二进制文件——在 fnm/nvm 下,单独运行 which node 会指向按 Shell 配置的 shim,Shell 退出后该 shim 就会失效;使用 Homebrew 前缀查找 ffmpeg/whisper-cli,因此 Intel 和 Apple Silicon 都能运行),写入 ~/Library/LaunchAgents/com.mla.meet-transcript-server.plist,等待 /health,然后告知你令牌的位置。若要将扩展与刚安装的任务配对:运行 node server/transcript-server.js --pair。
- 只需要 Node 20+。
ffmpeg和whisper-cli是可选的(brew install ffmpeg whisper-cpp); 没有它们,服务仍可运行——通话内 TTS 和本地 STT 功能将不可用。 - 执行
git pull后请重新运行——该脚本具备幂等性,并会使用新代码重启服务。 - 使用环境变量覆盖默认值:
TRANSCRIPTS_DIR=~/mla PORT=8849 ./server/install-server.sh。 转录内容的默认目录为~/meet-live-assist/transcripts,特意设在仓库之外——会议文本和屏幕截图属于个人身份信息(PII),不得冒险将它们提交到仓库。 - 大脑通过 MCP 适配器连接服务,适配器会询问大脑数据所在的位置,因此更改
TRANSCRIPTS_DIR无需修改助手端。只需确保 launchd plist 和扩展程序的令牌一致。
不使用 launchd,改为手动运行(便于调试——日志会输出到终端,按 Ctrl-C 可真正停止进程):
PORT=8899 TRANSCRIPTS_DIR=/tmp/mla node server/transcript-server.js
curl -s http://127.0.0.1:8899/health
运行
| 健康状态 | curl -s http://127.0.0.1:8848/health |
| 面板向大脑请求的内容 | curl -s -H "X-MLA-Token: $(cat <transcripts>/.mla-token)" "http://127.0.0.1:8848/status?session=<session>" |
| 日志 | ~/Library/Logs/meet-live-assist-server.log |
| 重启 | launchctl kickstart -k gui/$UID/com.mla.meet-transcript-server |
| 真正停止 | launchctl unload -w ~/Library/LaunchAgents/com.mla.meet-transcript-server.plist |
KeepAlive 处于启用状态,因此 kill/pkill 无法停止服务——launchd 会在几秒内重启它。
通话期间重启也能恢复。 建议、决策面板、聊天、总结、唤醒缓冲区,以及每个助手的读取位置,都会快照保存到 <transcripts>/.state/,并在启动时重新加载,因此服务短暂重启最多损失最后几秒的数据(STATE_SNAPSHOT_MS,默认值为 2000),不会丢失整场会议。有两项内容会刻意保持重启前的状态,因为它们是针对单次通话的设置,而周期性会议会重复使用会议代码:面板的停止/暂停状态,以及同意状态(🕹 驾驶、自动驾驶)。进程停止期间仍会出现短暂的采集空档。
同一个数据目录只能由一个进程写入。在同一 TRANSCRIPTS_DIR 上运行的第二个服务仍可正常提供服务,但不会持久化数据(会记录原因),因此,在 launchd 任务旁运行沙盒实例不会回退正在进行的会议。
配置(全部可选,可在 plist 的 EnvironmentVariables 中设置,或在手动运行命令中设置):
| 变量 | 默认值 | 作用 |
|---|---|---|
PORT | 8848 | 扩展程序具有对 127.0.0.1:8848 的主机权限——更改端口需要修改清单 |
TRANSCRIPTS_DIR | <server-dir>/../transcripts | 转录内容、快照和 .mla-token 的存放位置 |
RETENTION_DAYS | 14 | 清理超过此天数的转录内容和快照(0 = 永久保留) |
WAKE_BASE_MS / WAKE_MAX_MS | 10000 / 90000 | 唤醒门控的退避时间窗口:从此处开始,每遇到一个空批次就加倍,直到达到上限 |
WAKE_FORCE_MS | 180000 | 无论是否启用门控,超过此时长后都会刷新所有缓冲内容 |
WAKE_MAX_CHARS | 4000 | 批次达到此大小后立即刷新 |
WAKE_MIN_GAP_MS | 8000 | 两次唤醒之间的最短间隔 |
MLA_URGENT_NAMES | (空) | 以逗号分隔的名称,这些名称会立即唤醒助手——请包含字幕中可能出现的变体拼写 |
WAKE_ALL | 0 | 1 表示不进行门控并发送每一行,适用于没有闲聊的通话(轮次数约增加 4 倍) |
FFMPEG / WHISPER_CLI / WHISPER_MODEL / TTS_VOICE | Homebrew 路径 / Zosia | TTS 和 STT 管线 |
launchd plist 由 install-server.sh 根据你机器上的实际路径生成——无需编辑模板,因为将别人的绝对路径提交到仓库后,在你的机器上会无法运行。
两种构建方式,以及与之匹配的技能
./build.sh 会将此仓库的全部功能打包成 zip。./build.sh --public 会生成商店 zip:移除
debugger 权限,并剥离可操作页面的功能(编辑 DOM、由 Agent 驱动的点击、读取网络/控制台数据),只保留能看能听的助手。商店审核针对的是单一用途,而完整构建看起来像一个遥控器。这些删减由 src/ 中的 mla:pro-start / mla:pro-end
标记控制;构建会拒绝打包任何指向已移除内容的悬空引用。
打包的技能也采用同样的删减方式;更重要的是,它是一个模板——它会称呼用户的名字、使用用户的语言作答,并根据用户的领域提前准备,这些都无法为其他人硬编码。install.sh 会填充模板:
MLA_USER="Ada Lovelace" MLA_LANGUAGE=Polish MLA_DOMAIN="backend eng, payments" ./install.sh
MLA_PRO=1 ./install.sh # keep the page-control sections (pairs with the full build)
如果作者在自己的机器上运行,除非设置 MLA_FORCE=1,否则脚本会拒绝执行,因为此时目标位置存放的是规范的个人技能,而不是模板副本。
检查
npm run lint # node --check over src/ and server/
npm test # all five suites below, ~296 checks
npm run test:scope # the (user, session) rules in isolation
npm run test:server # auth gate, session guard, round-trips, restart survival
npm run test:panel # every request sidepanel.js makes, replayed without a browser
npm run test:mcp # the MCP adapter over stdio JSON-RPC
npm run test:limits # the size caps, with non-ASCII text
npm run test:retention # the retention sweep, and content not leaking between meetings
每次推送时,CI 都会运行这两项检查以及两种构建。
这些测试套件按保护对象划分,而非按层划分。test:panel 的存在是因为面板是产品中服务器测试完全不会触及的部分——路由名称变更或光标停止前进,从助手一侧看起来都正常,却会让用户面对空面板。test:limits 是唯一使用非 ASCII 文本的测试套件,三个实际缺陷都隐藏在仅含英文的测试样例背后。test:retention 需要文件时间戳,并在间隔一段时间后重启,因此不适合纳入快速测试流程。
加载扩展(未打包)
- 确保转录服务器正在运行——
curl -s http://127.0.0.1:8848/health→{"ok":true,...}。 在全新安装的 Mac 上,先运行:./server/install-server.sh(参见上文 在 Mac 上启动服务器)。 - 打开
chrome://extensions→ 启用开发者模式 → 加载已解压的扩展程序 → 选择此文件夹。 - 固定扩展程序;点击工具栏图标以打开侧边栏。
- 如果配对窗口已打开(
--pair),面板会自动与服务器配对。如果没有,状态提示会说明这一点,你也可以手动粘贴令牌:右键点击图标 → 选项 →cat <TRANSCRIPTS_DIR>/.mla-token。令牌按机器区分;来自另一台 Mac 的令牌会被拒绝。你还可以选择设置 TTS 语音和姓名(用于提及提醒)。面板中的 ⚙ 会显示设置检查清单。 - 如果你曾运行过旧版 Tampermonkey 用户脚本
(
server/legacy-userscript.meet-captions-to-file.user.js),请将其停用——同时捕获会导致每行重复。
真的能用吗?通过真实通话进行检查
自动化测试覆盖了服务端;以下测试覆盖只有真实会议才能检验的另一半。
- 加入通话 → 几秒内,面板显示
capturing和实时字幕行,且<TRANSCRIPTS_DIR>/<date>_<code>.txt开始增长。 -
server ✓显示为绿色,🧠 标记显示已连接的助手名称。如果会话正在运行,但标记显示无人连接, 就说明技能从未启动——这是值得发现的故障模式,因为其他一切看起来都正常,却永远不会收到建议。 - 在面板聊天中向助手提问,并在面板中收到回复。
- **服务工作线程终止:**让 SW 进入空闲状态(或在
chrome://serviceworker-internals中将其停止),并 继续交谈。采集会恢复,面板会重新加载状态,无需重新加载页面。10 分钟的通话不应出现任何间断。 - 共享屏幕 → 自动开始截取快照;📷 标记会显示助手看到的内容有多陈旧。
- 离开通话 → 面板显示
call ended。
两部分如何通信。 大脑通过 POST 发送建议(POST /advice {session, marker, text}),面板则
轮询 GET /advice?session=&since=,并为每条建议显示对应的颜色标记。快照会保存到
<TRANSCRIPTS_DIR>/snapshots/<session>/(保留约 40 张),供助手按需读取。助手在面板之外执行的操作——例如创建工单、
发送消息——遵循技能中的分级机制,而面板本身仅用于显示。
权限
<all_urls> 主机权限为可选,会在用户执行操作时请求(启动副驾驶、开启
🐞 Debug,或点击设置清单中的 Grant 按钮),因此主机权限提示仅限于 Meet + Zoom +
localhost。debugger 仍是必需权限——Chrome 不允许将其列为可选权限——因此会出现在
安装提示中(审核要求较严格;公开版可以移除,代码也能优雅降级)。令牌认证
堵住了“任何网站都能控制 localhost 服务”的漏洞。使用 ./build.sh
构建商店 zip(→ dist/,仅包含扩展文件)。完整权限清单及理由:STORE.md。
重新加载已安装的副本会移除现在可选的
<all_urls>权限授权——在面板中重新授权一次即可(副驾驶 / 🐞 / ⚙ 设置 → Grant)。
路线图
-
感知静音状态的麦克风采集(延期至 2026-07-28——值得保留的想法)。在 Zoom 中将自己静音不会关闭 操作系统麦克风,因此
micSTT 通道会继续录下通话中无人听到的私下发言,而大脑 会把它们当成你在会议中说的话。不要丢弃这些内容——给它们加上You (muted):标签,让静音变成一个专门对助手开放的私密语音通道(仍可授权执行操作;绝不能把这些内容当作 对房间里的人说过的话引用)。唯一尚待解决的问题是如何读取静音状态:工具栏按钮经过本地化("Wyłącz wyciszenie" / "Unmute"),因此需要使用状态属性或图标类,而不能匹配文本——这正是字幕选择器此前已经遇到的脆弱性。 -
**认证的最终目标(产品):**用户在扩展程序的设置中授权服务提供商(Claude,之后支持 ChatGPT),然后一切“自动可用”。现实情况是:Agent SDK / API 基于 API 密钥,而非账户 OAuth,纯扩展程序也无法运行 MCP Agent 大脑(需要 Node)。因此,完整大脑方案需要本地桥接程序或托管后端;纯扩展程序方案则需要用户自备密钥(能力较弱,不支持 MCP)。在第 3 阶段重新评估。
-
**第 2 阶段:**将字幕抓取替换为
chrome.tabCapture音频 → 流式 STT;自动检测用于截取快照的“关键时刻”;支持面板内聊天。 -
**第 3 阶段(可选):**通过本地桥接程序运行 Agent SDK 大脑(
@anthropic-ai/claude-agent-sdk,使用settingSources:["user"]继承 CLAUDE.md + MCP),或使用后端代理 / 用户自备密钥(路径 B)以便分享;隐私政策;Workspace 私有商店。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。