mcpField
M
meet-live-assist

meet-live-assist

ローカル
github.com/krystiangwコミュニケーション210 週間前に更新

meet-live-assist について

Meet Live Assistは、Google MeetやZoomの文字起こしをアシスタントのセッションへ送り、サイドパネルにリアルタイムで助言を表示するChrome拡張機能とローカルブリッジです。MCP対応エージェントを自分のPCで動かし、会議中の支援を受けたい人向けです。

主な機能

  1. 01文字起こしの取得とパネル表示
  2. 02色分けされたコピー可能な助言
  3. 03決定事項とアクション項目のボード
  4. 04アシスタントとの双方向チャット
  5. 05スナップショットと会議後の要約
  6. 06文字起こしとチャットのローカル保存

活用シーン

  1. 01会議中に決定事項と担当者を確認
  2. 02会議で使う言語で発言案を得る
  3. 03リスクやアクション項目を随時追跡
  4. 04会議後に要約を出力

MCP 対応

stdio MCPアダプターが13個のツールを提供し、接続中のアシスタントがローカルブリッジ経由で文字起こし、パネル状態、チャット、会議操作などにアクセスできます。アシスタントは別のクライアントセッションで動作し、MCPサーバー単独ではターンを開始できません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"krystiangw-meet-live-assist": {
"command": "npx",
"args": [
"-y",
"meet-live-assist-server"
],
"env": {
"MLA_URL": "<MLA_URL>",
"TRANSCRIPTS_DIR": "<TRANSCRIPTS_DIR>",
"MLA_TOKEN": "<MLA_TOKEN>"
}
}
}
}
起動コマンドnpx -y meet-live-assist-server
設定が必要な環境変数
MLA_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmmeet-live-assist-server0.7.3

ツール

13

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
forcebooleanいいえ別のアシスタントが参加中でも関連付けます。
sessionstringいいえ会議 ID。省略すると、最後にアクティブだった会議が使用されます。

詳細

Live Assist の紹介

通話に参加する、あなた専用のエージェントセッションです。 Meet や Zoom の文字起こしをリアルタイムで読み取り、通話中にサイドパネルで回答します。何が決まったか、誰が何を担当するか、今合意したリスク、次に口にする一文を、会議で使われている言語で提示します。

リリースレビューで、誰かが8月のカレンダーを共有し、15日だと約束します。通話の横にドッキングしたパネルは、その日付が合意済みのリリース凍結期間内であることを指摘し、反対意見を伝えるための一文を提示して、決定を18日に変更したことを記録します。
リリースレビューの14秒間。パネルは通話の横にドッキングしています。会話は作りもので、ほとんどの業務上の通話と同様、カメラはオフです。インターフェースは実際にリリースされるものです。

Chrome ウェブストアからインストール · サイト · サーバーを起動するコマンドは1つです:npx meet-live-assist-server

ストアのリンクからはワンクリックでインストールでき、自動で更新されます。一方、リポジトリ版はアンパックして読み込めますが、自動更新はされません。どちらを使う場合も、サーバーと以下のスキルは引き続き自分で実行する必要があります。また、エージェントを接続しない場合、アドバイス欄は設計上空のままです。

Google Meet または Zoom の通話中に、文字起こしを取得してサイドパネルに表示し、自分のコンピューター上で動作するアシスタントに渡します。アシスタントは通話中にパネルで回答します。何を言うべきか、何が決まったか、誰が何を担当するか、今同意したものの、本当は同意すべきではなかったことなどを伝えます。

文字起こし、スクリーンショット、チャットはディスク上のフォルダーに書き込まれ、自分だけがアクセスできる 127.0.0.1 上のサーバーから配信されます。アカウントも、テレメトリも、当社のサーバーも一切ありません。

データの行き先を、一度だけ明確に説明します。 頭脳となるのは自分の Claude Code セッションなので、そこに渡すもの、つまり文字起こしのバッチや質問は、他の Claude Code セッションと同じく、自分のアカウントを通じてマシンから Anthropic に送られます。保存された記録、つまりファイル、スクリーンショット、チャット履歴が外部に送信されることはありません。ライブ会議アシスタントが完全にマシン上で動作すると説明しているページがあれば、それはローカルモデルを使っているか、真実を伝えていません。このツールはすでに利用料金を払っている頭脳を借りており、それがトレードオフです。3行で説明したデータフローをご覧ください。

インストール前にお読みください

MCP に対応した AI コーディングエージェントが必要です。テスト済みのエージェントはClaude Codeです。 このソフトウェアには、キャプチャ機能、パネル、ローカルブリッジといった目、耳、手が含まれますが、頭脳は含まれていません。頭脳となるのは、MCP ツールを使って通話内容を読み取る、ご自身のマシン上のエージェントセッションです。エージェントがない場合、文字起こしの記録は動作しますが、アドバイス欄は空のままです。スクリーンショットが約束しているのは、そういう状態ではありません。

アダプターは、ベンダー固有の要素を含まない、stdio を介したプレーンな JSON-RPC です。そのため、ほかの MCP クライアント(Cursor、Cline、Continue、Zed、Codex)からも操作できます。Codex CLI で確認したところ、ブリッジに対するツール呼び出しは完了しました。ただし、ほかの環境では満たすのが本当に難しい要件が 1 つあります。MCP はクライアント側からのポーリング方式であり、サーバー側からターンを開始することは決してできないため、クライアントがバックグラウンドで継続的に実行されるループを維持する必要があります。何を確認すべきか、何が未検証なのかについては、MCP-CLIENTS.mdで説明しています。

会議の会話は、ほかの人たちの会話でもあります。 字幕を有効にしても、会議にバッジが表示される録音とは異なり、ほかの人にはわかりません。そのため、デフォルトではキャプチャの開始時に会議チャットへ 1 行投稿し、アシスタントがローカルで文字起こししていることを知らせます。この文面は編集することも、オプションで無効にすることもできます。地域によっては、会話を録音または文字起こしする前に、全員の同意が必要です。判断はご自身に委ねられており、その旨はPRIVACY.mdに明記されています。

必要条件:Node 20 以降、Chrome 116 以降、Claude Code。通話に向けて発話する機能は macOS 専用です(sayとafplayを使用します)。ほかの環境でもアドバイスはパネルに表示されますが、サーバーは発話できない理由を知らせます。ローカルの音声テキスト変換は、ffmpegとwhisper.cppが動作する環境ならどこでも利用できます。また、パネルのセットアップ欄には、どちらが不足しているかが表示されるため、何も知らせずに失敗することはありません。

インストール(3 ステップ)

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

次に、以下を実行します。

  1. ブリッジサーバーを起動し、実行したままにします。 node server/transcript-server.js --pair
  2. 拡張機能を読み込みます:chrome://extensions → デベロッパーモード → パッケージ化されていない拡張機能を読み込む → このフォルダーを選択します。 ピン留めしてアイコンをクリックします。パネルはペアリングウィンドウからトークンを自動で取得するため、コピーする必要はありません。(ウィンドウの有効期限が切れた場合は、ステップ 1 のコマンドをもう一度実行してください。サーバーの実行中でも動作します。)
  3. Claude Code を開き、会議をサポートするよう依頼します。

./install.shでは、MLA_USER、MLA_LANGUAGE、MLA_DOMAIN、MLA_TRANSCRIPTS_DIRを指定できます。これにより、アシスタントが名前と言語を使って呼びかけ、会議の内容を大まかに把握できるようになります。

プロファイルを選ぶ

MLA_PROFILEでは、アシスタントが対応する会議の種類と、優先して取り上げる内容を指定します。それ以外(マーカー、モード、ボード)はすべて同じです。これらはドメインを問わず使えるとわかったためです。

プロファイル対象優先して取り上げる内容
engineering(デフォルト)スタンドアップ、インシデント、要件の詳細化、QA決定事項、スコープクリープ、リスク、アクションアイテム
second-language第一言語以外で行われるあらゆる会議🟢 SAY - 会議の言語でそのまま話せる文
researchユーザーインタビュー、ユーザビリティセッション沈黙、誘導尋問への警告、ガイドの網羅状況
genericその他すべてリアルタイムで適切に応答すること

これらはskill/profiles/にあるプレーンなファイルで、それぞれ 12 行ほどです。独自のプロファイルを作成して名前を指定してください。インストーラーは見つからないプロファイルを拒否し、デフォルトにフォールバックすることはありません。

保存されるデータと削除方法

すべてのデータは MLA_TRANSCRIPTS_DIR を設定していない限り、1つのフォルダー(./transcripts)に保存されます。

ファイル内容
<date>_<meeting-code>.txt文字起こし
<...>.chat.txt、<...>.summary.mdアシスタントとのチャットと通話後の要約
snapshots/<session>/*.jpg画面共有中に撮影されたスクリーンショット
.state/ライブ会議の状態。サーバーを通話中に再起動しても、データは失われません
.mla-token拡張機能とアシスタントが認証に使用する共有シークレット

ファイルのアクセス権は所有者のみ(0600)、ディレクトリのアクセス権は 0700 です。また、14日を超えたデータは自動的に削除されます(RETENTION_DAYS を 0 にすると、すべてのデータが永久に保持されます)。パネルの 🗑 ボタンを使うと、1件の会議のデータ(文字起こし、チャット、要約、スクリーンショット、状態)をすぐにすべて削除できます。すべて削除するには、そのフォルダーを削除し、~/.claude/skills/meet-live-assist を削除して、claude mcp remove meet-live-assist を実行し、Chrome から拡張機能を削除してください。

データの流れ

データ送信先
文字起こし、スクリーンショット、パネルのチャット、要約お使いのディスク以外には送信されません。 所有者のみがアクセスできるファイルが1つのフォルダーに保存され、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 で指定したもの。何も指定していない場合は通常のメモ)。振り返り用のクイック質問と、双方向のチャット。
  • オートパイロット - 🤖 Auto-create をオンにすると、提案するのをやめて実行を開始します。アクションアイテムが話題に上がると同時に、チケットまたはメモが作成され、アイテムごとの確認は不要です。📣 チャットにリンクを投稿すると、参加者にリンクが共有されます。どちらも、オンにするまでは無効です。
  • スナップショット(画面共有時に自動撮影、または必要に応じて撮影)、通話への 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秒ごとに ping を送信します。さらに、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)を提供します。

アシスタントは HTTP ではなく、MCP 経由でサーバーにアクセスします。 server/mcp-server.js は、同じ API を利用する依存関係ゼロの stdio MCP アダプターで、13 個のツールを提供します。一度登録してください。

claude mcp add meet-live-assist --scope user -- node <repo>/server/mcp-server.js

実行中のサーバーにデータディレクトリの場所を問い合わせ(/health にトークンは不要です)、そこからトークンを読み取るため、環境変数は必要ありません。要となるツールは poll です。1 回の呼び出しで、1 ターン分の文字起こしバッチ、パネルの状態、保留中の結果が返され、読み取り位置はアシスタントごとにサーバー側で保持されます。これにより、1 ターンごとに 4、5 回行っていた curl の呼び出しと、シェル変数に保持していたバイトオフセットが不要になります。また、ファイルシステムにアクセスできない環境でも動作するため、ホスト型のデプロイに適しています。

MCP が行わないのは、アシスタントを起動することです。このプロトコルはクライアントが取得する方式なので、サーバー側からターンを開始することはできません。クライアント側のループで /poll?...&format=text をポーリングし続けることで、起動のきっかけを得ます。このループは、ターン分のバッチ、パネルの状態変更、パネルのチャットに入力されたメッセージ、会議チャットへの配信失敗、またはサーバーにアクセスできない状態など、何かが起きたときだけ出力します。特に重要なのは状態変更です。キャプチャは停止時に終了し、その後キャプションは届かないため、停止ボタンを押したことをアシスタントに伝えられる唯一の方法だからです。

読み取り位置はリーダーごとにサーバー側で保持され、初めて認識されるリーダーはチャンネルの末尾から読み始めます。起動ループが初回の読み取りで会議のここまでの内容を取得するには、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 への権限を持つ別の拡張機能が、2 分間のウィンドウ内で先に取得することまでは防げません。だからこそ、ウィンドウを開いたままにしないのです。手動で貼り付ける方法も引き続き使え、Options にあります。 会議ごとに2つのファイルを作成します。 /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 ウェブストア で非公開掲載されています。このリンクからワンクリックでインストールでき、自動更新されます。ただし、ストア内検索には表示されません。サーバーを実行してエージェントを接続していない人には役に立たないためです。リポジトリを展開して読み込んでも同じように動作しますが、自動更新はされません。Chrome ではそれぞれ異なる拡張機能 ID が割り当てられるため、どちらか一方だけを実行してください。

MCP 側は MCP Server Registry に io.github.krystiangw/meet-live-assist として登録されているため、レジストリ対応クライアントなら、コマンドを伝えなくても追加できます。コマンドを明示する必要があるクライアントの場合は、npx -p meet-live-assist-server meet-live-assist-mcp を使用してください(パッケージには2つのバイナリが含まれており、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 を実行すると、シェルを終了すると使えなくなるシェルごとの shim が指されるためです。また、ffmpeg/whisper-cli 用に Homebrew のプレフィックスを取得するため、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 で、意図的にリポジトリの外部にあります。会議の テキストやスクリーンショットには個人情報が含まれるため、コミットされるリスクを避ける必要があります。
  • ブレインは 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)で、会議が失われることはありません。 定期的に開催されるシリーズでは同じ会議コードが再利用されるため、意図的に復元されないものが 2 つあります。 パネルの停止/一時停止状態と、同意状態(🕹 ドライブ、自動操縦)です。プロセスが停止している間は、 短いキャプチャの中断も発生します。

同じデータディレクトリに書き込めるプロセスは 1 つだけです。同じ TRANSCRIPTS_DIR を使う 2 つ目のサーバーは通常どおり 応答しますが、データを永続化しません(理由はログに記録されます)。そのため、launchd のジョブと並行してサンドボックスで実行しても、 進行中の会議が巻き戻ることはありません。

設定(すべて任意です。plist の EnvironmentVariables または手動実行コマンドで設定してください):

変数デフォルト説明
PORT8848拡張機能には 127.0.0.1:8848 のホスト権限があります。変更する場合はマニフェストの変更が必要です
TRANSCRIPTS_DIR<server-dir>/../transcripts文字起こし、スナップショット、.mla-token の保存場所
RETENTION_DAYS14この日数より古い文字起こしとスナップショットを削除します(0 = 無期限で保持)
WAKE_BASE_MS / WAKE_MAX_MS10000 / 90000ウェイクゲートのバックオフ期間:この値から開始し、空のバッチが続くと最大値まで倍増します
WAKE_FORCE_MS180000ゲートの有無にかかわらず、この時間が経過したらバッファーの内容をすべてフラッシュします
WAKE_MAX_CHARS4000バッチがこの文字数に達したら早めにフラッシュします
WAKE_MIN_GAP_MS80002 回のウェイク間に設ける最小間隔
MLA_URGENT_NAMES(空)アシスタントをすぐにウェイクする名前をカンマ区切りで指定します。キャプションで生じる表記の崩れも含めてください
WAKE_ALL01 にすると、スモールトークがほとんどない通話向けに、ゲートなしですべての行を送信します(ターン数は約 4 倍)
FFMPEG / WHISPER_CLI / WHISPER_MODEL / TTS_VOICEHomebrew のパス / ZosiaTTS と STT の処理基盤

launchd の plist は install-server.sh が実際のマシン上のパスから生成します。編集用のテンプレートはありません。 チェックインされたテンプレートでは他の人の絶対パスが含まれ、自分の環境では動作しないためです。

2 種類のビルドと、それぞれに対応するスキル

./build.sh は、このリポジトリでできることをすべて ZIP にまとめます。./build.sh --public はストア用の ZIP を生成します。このビルドでは、 debugger 権限を除外し、ページに作用する機能(DOM の編集、エージェントによるクリック、 ネットワークやコンソールの読み取り)を削除して、見聞きするだけのアシスタントを残します。ストアの審査では単一の目的が求められますが、フルビルドはリモコンのように見えてしまいます。この切り分けは 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

どちらも、2 種類のビルドとともに、プッシュのたびに CI で実行されます。

テストスイートはレイヤー別ではなく、保護対象別に分かれています。test:panel があるのは、パネルがサーバーテストでは一切触れられない製品の半分だからです。ルート名が変わったりカーソルの進行が止まったりしても、アシスタント側からは問題なく見える一方で、ユーザーには空のパネルが表示されます。test:limits は非 ASCII テキストを使う唯一のテストスイートであり、実際の不具合が 3 件、英語だけのフィクスチャに隠れていました。test:retention ではファイルのタイムスタンプと、間隔を空けた再起動が必要なため、高速パスには適しません。

読み込む(解凍版)

  1. 文字起こしサーバーが実行中であることを確認します。curl -s http://127.0.0.1:8848/health → {"ok":true,...}。 新しい Mac にインストールした場合は、先に ./server/install-server.sh を実行します(上記の Mac でサーバーを起動する を参照)。
  2. chrome://extensions → デベロッパー モードを有効にする → パッケージ化されていない拡張機能を読み込む → このフォルダーを選択します。
  3. 拡張機能をピン留めし、ツールバーのアイコンをクリックしてサイドパネルを開きます。
  4. ペアリングウィンドウが開いていれば(--pair)、パネルはサーバーと自動でペアリングします。開いていない場合は、ステータス表示でそのことが示されますが、トークンを手動で貼り付けることもできます。アイコンを右クリック → オプション → cat <TRANSCRIPTS_DIR>/.mla-token。トークンはマシンごとに異なり、別の Mac のトークンは拒否されます。必要に応じて TTS の音声と名前(メンション通知用)を設定します。パネルの ⚙ からセットアップのチェックリストを確認できます。
  5. 以前に旧版の Tampermonkey ユーザースクリプト (server/legacy-userscript.meet-captions-to-file.user.js)を実行したことがある場合は、無効にしてください。両方で同時にキャプチャすると、すべての行が重複します。

実際に動作しますか?実際の通話で確認してください

自動テストではサーバーをカバーします。こちらでは、実際の会議でしか確認できない残りの部分をテストします。

  • 通話に参加すると、数秒以内にパネルに capturing とリアルタイムの行が表示され、<TRANSCRIPTS_DIR>/<date>_<code>.txt のサイズが増え始めます。
  • server ✓ が緑色で、🧠 ピルに接続中のアシスタント名が表示されます。セッション実行中にもかかわらず、ピルに接続中のアシスタントはいないと表示される場合、スキルが一度も起動していません。ほかはすべて正常に見えるのに、アドバイスが届かないままになるため、見逃さずに確認したい失敗モードです。
  • パネルのチャットでアシスタントに質問し、パネル内で回答を受け取ります。
  • サービスワーカーの終了: SW がアイドル状態になるまで待つ(または chrome://serviceworker-internals で停止する)間も、話し続けます。キャプチャが再開し、再読み込みせずにパネルが状態を再取得します。10 分間の通話でも途切れないことを確認してください。
  • 画面を共有すると、スナップショットの取得が自動で始まり、📷 ピルにアシスタントの表示内容がどれだけ古いかが示されます。
  • 通話を終了すると、パネルに call ended と表示されます。

2 つの部分の連携方法。 ブレインはアドバイスを 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 で自分をミュートしても OS のマイクは停止しないため、mic STT チャネルは、通話中の誰にも聞こえていない会話を録音し続けます。するとブレインは、それを会議中にあなたが話した内容として扱います。削除するのではなく、You (muted): とラベル付けします。これにより、ミュート中の発話をアシスタントに向けた意図的なプライベート音声チャネルとして使えます(操作の許可は引き続き有効ですが、会議室に向けて発言した内容として引用することはできません)。未解決なのは状態の取得方法だけです。ツールバーのボタンはローカライズされているため("Wyłącz wyciszenie" / "Unmute")、テキストとの照合ではなく、状態属性かアイコンクラスを使う必要があります。これは、字幕セレクターですでに問題になったのと同じ不安定さです。

  • 認証の理想像(製品): ユーザーが拡張機能の設定でプロバイダー(Claude、後日 ChatGPT)を認証すれば、「そのまま動作する」ことです。実際には、Agent SDK / API はアカウント OAuth ではなく API キーベースであり、純粋な拡張機能では MCP エージェントのブレインを実行できません(Node が必要です)。そのため、ブレインの全機能を使うにはローカルブリッジまたはホスト型バックエンドが必要です。純粋な拡張機能で使う場合は BYO キーとなり、機能が限定され(MCP なし)、弱くなります。フェーズ 3 で再検討します。

  • フェーズ 2: 字幕のスクレイピングを chrome.tabCapture の音声キャプチャ → ストリーミング STT に置き換えます。スナップショット用の「重要な瞬間」を自動検出し、パネル内チャットを実装します。

  • フェーズ 3(任意): ローカルブリッジ経由の Agent SDK ブレイン(@anthropic-ai/claude-agent-sdk、settingSources:["user"] で CLAUDE.md + MCP を継承)、または共有用のバックエンドプロキシ / BYO キー(パス B)。プライバシーポリシー、Workspace の非公開ストア。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。