PLAUD書き起こし取得を現行レスポンスとページングに対応させる


PLAUD書き起こし取得を現行レスポンスとページングに対応させる

音声メモをHermes Agentの日次ノートへ入れるには、録音一覧を読むだけでは足りない。録音ごとの書き起こしを安定して取り、長い会議でも途中で切れないようにする必要がある。今回は、PLAUD MCPから返る書き起こしレスポンスについて、旧リスト形式に加えて現行の`segments`形式とページングを扱えるようにし、日次収集の前処理をテストで固定した。

実際に行ったことと確認結果

手元の実装では、PLAUD用の収集モジュールに、Hermes Agentから設定済みMCPサーバーを登録し、`list_files`と`get_transcript`を呼ぶクライアントを置いた。録音一覧は対象日の前後を少し広く検索し、採用時は`start_at`をAsia/Tokyoへ変換して対象日と一致する録音だけに絞る。後日同期された古い録音を当日分へ混ぜないためである。

書き起こし側は、`get_transcript`が旧形式の配列を返す場合と、`block`、`segments`、`next_cursor`を持つオブジェクトを返す場合の両方を受け付けるようにした。本文は`transaction`ブロックから、トピックは`outline`ブロックから別に集める。`next_cursor`がある間は次ページを取得し、同じカーソルが繰り返された場合や上限ページを超えた場合はエラーにする。

確認として、`python -m unittest discover -s tests -p 'test_plaud_daily_context.py' -v`を実行し、8件すべて成功した。テストでは、対象日の録音だけをAsia/Tokyo基準で選ぶこと、録音ゼロなら後続の書き起こし取得を呼ばないこと、署名付きURLを本文へ混ぜないこと、`transaction`と`outline`のページングを順にたどること、現行`segments`レスポンスを整形できること、長文を中央省略できることを確認している。

仕組みの流れ

処理の流れは次のように分けた。

1. Hermes AgentのMCP設定からPLAUDサーバーを読み、必要なツールだけを登録する。
2. 対象日の前日から翌日までを`list_files`で検索する。
3. 各録音の`start_at`をAsia/Tokyoへ変換し、対象日以外を除外する。
4. 採用した録音ごとに`get_transcript`を呼ぶ。
5. 旧配列形式なら`transaction`と`outline`要素を抽出する。
6. 現行オブジェクト形式なら`transaction`本文をページング取得し、別途`outline`トピックもページング取得する。
7. 一録音あたり、全録音合計の文字数上限を超えた部分は中央省略し、省略フラグを残す。
8. 取得件数、警告、除外件数、`wakeAgent`を構造化データとして後段の日次要約へ渡す。

収集モジュールは要約をしない。外部サービスから取った本文を、件数や警告つきのデータとして整え、Hermes Agent本体の要約ステップへ渡すだけにする。

再現手順

公開例では実パスやアカウント情報を伏せている。まずPLAUD MCPをHermes Agentへ登録し、利用ツールを最小限にする。

“`bash
hermes mcp add plaud \
–url https://mcp.plaud.ai/mcp \
–auth oauth
hermes mcp test plaud
“`

次に、日次収集用のモジュールをプロジェクトに置き、対象日を指定して構造化JSONを出すCLIにする。秘密値や録音IDはログへ出さず、公開例ではプレースホルダーにする。

“`bash
python /path/to/project/plaud_daily_context.py –date 2026-08-05 > /tmp/plaud-context.json
“`

実装を変更したら、テストはパッケージ名指定ではなくdiscoverで実行する。`tests/`をPythonパッケージにしていない構成では、`python -m unittest tests.test_…`が失敗するためである。

“`bash
python -m unittest discover -s tests -p 'test_plaud_daily_context.py' -v
“`

失敗しやすい点と安全策

一番の落とし穴は、PLAUD MCPの戻り値を一つの形だけだと思い込むことだ。旧形式のリストに合わせた処理だけでは、現行の`segments`オブジェクトや`next_cursor`を持つページングで取りこぼす。逆に、現行形式だけへ寄せると、互換的に返る旧形式を壊す可能性がある。入力形を明示的に分岐し、未対応の`block`は静かに無視せずエラーにする。

もう一つは、外部レスポンスに含まれる一時URLや録音IDを記事、ログ、日次ノートへ広げることだ。本文として必要なのはタイムスタンプ、話者名、発話内容、トピックであり、署名付きURLや内部IDではない。長文会議は全文を無制限に入れず、上限と省略有無を後段へ渡す。

未完了事項として、PLAUD側の仕様やMCP実装は更新され得る。確認日現在の公式ドキュメントでは`list_files`、`get_transcript`、録音開始時刻`start_at`が説明されているが、レスポンス細部は手元の実装とテストで吸収している。仕様変更を見つけたら、まず失敗例をテストへ追加してから収集コードを直す。

再現チェックリスト

  • [ ] PLAUD MCPをOAuthで接続し、必要なツールだけを公開した。
  • [ ] `start_at`をAsia/Tokyoへ変換して対象日を判定している。
  • [ ] 録音ゼロと取得失敗を区別している。
  • [ ] 旧配列形式と現行`segments`形式の両方を扱える。
  • [ ] `transaction`本文と`outline`トピックをページング取得できる。
  • [ ] 署名付きURL、録音ID、個人パス、秘密値を出力に混ぜていない。
  • [ ] 長文の文字数上限と省略フラグがある。
  • [ ] 単体テストで8件の動作確認が成功している。

公式一次情報

  • [PLAUD MCP公式ドキュメント](https://docs.plaud.ai/plaud-mcp-cli/mcp)
  • [Hermes Agent: MCP Integration](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp)
  • [Python unittest](https://docs.python.org/3/library/unittest.html)
  • [Obsidian Command line interface](https://help.obsidian.md/Obsidian/Command+line+interface)

Back to top