📝

AIエージェントで議事録地獄から解放された話——Mastra + Bedrock + Next.jsで2日で作った

に公開

はじめに

複数プロジェクトを掛け持ちしていると、議事録作業が地味につらい。特にリリース前は各プロジェクトで会議が増え、終わるたびに議事録を書く時間が取られていた。

「これ自動化できるんじゃないか」と思い、AIエージェントを作ってみた。結果、Claude Codeも使いながら実装2日で完成し、今は実務で運用している。


作ったもの

Teamsの録画ファイル(.docx / .vtt)をアップロードするだけで、社内テンプレートのExcel議事録が自動生成されるローカルアプリ。

アップロード画面
アップロード画面

プレビュー画面(AIが生成した内容を確認・編集してExcelダウンロード)
プレビュー画面

技術スタック:

要素 技術
フロント・バック Next.js + TypeScript
AIエージェント Mastra
LLM Amazon Bedrock(Claude Sonnet)
Excel生成 xlsx-populate
ファイル解析 mammoth(DOCX)、独自パーサ(VTT)

なぜMastraを選んだか

LangChainも検討したが、TypeScriptとの親和性でMastraを選んだ。

決め手はZodでワークフローの入出力スキーマを定義できること。MastraはZodのスキーマを渡すことでLLMの出力形式を強制できる。(古いモデルだと素直に従わないこともあるかもしれないが、最新モデルであればスキーマ通りのJSONが返ってきた。)

const MinutesSchema = z.object({
  participants: z.array(z.string()),
  date: z.string(),
  items: z.array(z.object({
    type: z.enum(["A", "B", "C"]),
    content: z.string(),
    response: z.string(),
    severity: z.enum(["A", "B", "C"]),
    reporter: z.string(),
  }))
})

Next.jsとの親和性も高く、ローカルアプリなのでフロントからバックまでNext.jsだけで完結できたのも良かった。


ワークフローの構成

3ステップ:

① .docx / .vtt → プレーンテキストに変換
② Claude(Bedrock)で要約・構造化JSON出力
③ 参加者テキスト・人数を付与してExcel書き込み

各ステップの入出力をZodで定義しているので、型安全にワークフロー全体をつなげられる。


やってみてわかったこと

定型タスクのエージェントは思ったより簡単

「議事録を決まったフォーマットに変換する」という定型タスクなら、実装・運用の難易度は高くない。入力と出力が固定されていて、LLMの出力をZodで強制できるので安定して動く。

ただし、Excelフォーマットが変わるとコード修正が必要

現状、Excelのセルアドレスはコードにハードコードしている(H3にシステム名、G7に進行役など)。社内テンプレートが更新されるたびにコードの修正が必要になる。定型タスクに特化した分の代償とも言える。

自律型エージェントは別物になりそう

今回は定型タスクだったので安定して動いたが、チャットボットのような自律型エージェントはまた話が違うんじゃないかと感じた。入力が毎回異なる上、コードを変えていなくても時間とともに性能が劣化していく可能性があるし、LLMのモデル更新やプロンプトの微妙なズレが積み重なる気がする。普通のアプリと違って「リリースしたら安定」とはならない運用の難しさがあるかもしれない。

自動化したいタスクが明確なら、AIエージェントの導入ハードルは思ったより低いと思う。


まとめ

  • Mastra + Next.js + BedrockでTypeScript統一のAIエージェントが作れる
  • ZodでLLMの出力形式を強制するのが安定運用のカギ
  • 定型タスクなら実装2日・運用コスト低で業務削減できる
  • Excelフォーマット変更はコード修正が必要(定型特化の代償)
  • 自動化したいタスクが明確なら導入ハードルは低い
  • 自律型エージェントはまた別の難しさがありそう
GitHubで編集を提案

Discussion