n8n × Claude で議事録を案件・記事案・ナレッジ・タスクに自動振り分けする実装ガイド

会議で出た「いい話」は、半日経つと書記の頭の中から消える。はてなベースが社内運用する議事録自動振り分けの実装図を全文公開。Google Driveの会議メモをn8nが監視し、Claudeが「記事案/営業フォロー/ナレッジ/タスク」の4系統に分類。10ノード構成・プロンプト設計・2週間運用で見えた落とし穴まで。

n8n × Claude で議事録を 4 系統に振り分けるアーキテクチャイメージ

はてなベースで作ったのは、議事録から対応事項を拾い、業務システムへ登録する処理です。

Google Driveに置いた会議メモをn8nが取得し、AnthropicのClaudeで抽出した項目を4系統に分類します。分類結果は既存の業務システムへ送り、Slackに抽出件数を通知する構成にしました。

抽出と登録の役割分担

Claudeが受け持つのは、議事録の内容を読んでタグと要約を返すところです。n8nはそのタグを使って登録先を選び、各サービスのAPIを呼び出します。

議事録から転記する作業を自動化する

たとえば、顧客から記事の続編を求められた場面です。議事録に発言が残っていても、記事案の管理先へ転記するまでは、執筆候補として扱えません。

そこで自動化の対象にしたのが、議事録を読み、関係者に転送して対応を依頼する作業です。

4系統の分類基準と登録先

記事案と商談はkintoneでも別のアプリに入ります。

タグ判定基準出力先システム出力フィールド例
記事ネタ「これブログにできる」と判断できる視点・実例・データkintone記事案アプリタイトル候補 / カテゴリ / 元議事録リンク
営業フォロー顧客発言で次のアクションが必要なものkintone商談アプリ顧客名 / 要約 / 期限 / 担当
社内ナレッジ業務手順・ツール使い方・運用ルール・失敗事例Notion社内ナレッジDBタイトル / カテゴリ / 要約 / 詳細
アクション担当者が明示的に着手宣言したタスクGoogle Tasks(担当者ごと)タスク名 / 期限 / リスト振り分け

対象外の発言まで4分類に押し込まないよう、5番目に「雑談」を設けました。このタグの項目は登録せず、議事録はDriveに残します。

n8nの主要10ノードと役割

ワークフローJSONのファイル名はscripts/n8n/minutes-routing-workflow.jsonです。Anthropic APIの呼び出しにはHTTP Requestを使い、ヘッダーとリクエスト本文を直接指定する形にしました。

番号ノード名役割
1Google Drive Trigger議事録フォルダを毎分監視。新規ファイルが入ったら起動
2Google Drive Download対象ファイルを取得。Google Docsはテキスト形式に変換してダウンロード
3HTTP RequestでAnthropic APIを呼び出しClaude Sonnet 4.5に5タグの分類を指示
4Code Node / JavaScriptClaudeの応答からJSON配列を抽出し、項目ごとのitemに展開
5Switch Node登録先は4系統。雑談と未知のタグは条件不一致として追加出力へ送る
6HTTP Requestでkintone記事案アプリに登録記事ネタをkintoneのアプリID 1535(仮)にPOST
7HTTP Requestでkintone商談アプリに登録営業フォローをkintone商談アプリにPOST
8Notion API社内ナレッジをNotion DBにページ作成
9Google Tasksアクションを担当者のGoogle Tasksに登録
10Slack抽出件数を社内チャンネル#pr-minutes-routingに投稿

n8nの実行環境

n8nの実行環境にはセルフホスト版とCloud版があります。Render上で動かす構成では、n8nとPostgresを組み合わせます。議事録の分類はAnthropic API、登録はkintoneなどのSaaSが受け持つため、n8nの稼働場所とデータの送信先は分かれます。

Cloud版の費用は月24ドル〜を目安としています。今回のRender構成では、Starterの月7ドルとPostgresの月6ドルを合わせて月13ドルを見込んでいます。

分類用プロンプトとJSON抽出

後段のCode Nodeで応答を取り出すため、プロンプトでは出力形式をJSON配列に指定しました。各要素にtag、summary、detail、speaker、suggested_slug、suggested_categoryを持たせます。tagは振り分け先、summaryとdetailは抽出した内容、speakerは発言者を表す項目です。

顧客起点の具体的な依頼は営業フォロー、担当者本人の着手宣言はアクションです。同じ発言には最も適合するタグを一つだけ付けるよう指示しています。記事ネタにも「社内事情を含めない」という基準を入れました。

plainClaude に渡すシステムプロンプト(抜粋)
あなたは経営コンサル事務所の編集デスクとして、議事録を以下の5タグに分類するアシスタントです。

タグ一覧:
- 記事ネタ: ブログ記事化できる視点・実例・データ
- 営業フォロー: 顧客発言で次のアクションが必要なもの
- 社内ナレッジ: 業務手順・ツール使い方・運用ルール・失敗事例
- アクション: 担当者が明示的に着手宣言したタスク
- 雑談: 上記いずれでもない

出力は必ず以下の JSON 配列形式で返す:
[
  {
    "tag": "記事ネタ",
    "summary": "...",
    "detail": "...",
    "speaker": "...",
    "suggested_slug": "...",
    "suggested_category": "..."
  },
  ...
]

判断基準:
- 同じ発言を複数タグに重複させない(最も適合性が高いタグ 1 つ)
- 「記事ネタ」は読者が知りたがる視点であって、社内事情を含めない
- 「営業フォロー」は具体的な次のアクションが含まれているもの
- 「アクション」と「営業フォロー」の違い: 担当者主観の宣言(アクション)vs 顧客起点の依頼(営業フォロー)

前置き・後書き・補足説明は禁止。JSON 配列のみ返すこと。

このCode NodeはClaudeの応答1件を扱います。contentの先頭にあるtextから正規表現で配列部分を取り出し、JSON.parseで読み込んだ各要素をn8nのitemに展開する処理です。返り値は各要素をjsonキーで包んだ配列で、Switch Nodeには項目ごとに渡ります。

javascriptn8n Code Node: JSON 抽出
// Claude のレスポンスから JSON 配列を取り出す
const body = $input.item.json.content?.[0]?.text || '';
const match = body.match(/\[\s*\{[\s\S]*?\}\s*\]/);
let items = [];
if (match) {
  try {
    items = JSON.parse(match[0]);
  } catch(e) {
    items = [];
  }
}
return items.map(it => ({ json: it }));

Switch Nodeで4系統に振り分ける

Code Nodeが返す各itemは{ tag: '記事ネタ', summary: '...', ... }の形です。

Switch Nodeの分類条件は4つです。Fallback OutputをExtra Outputにすると、条件に一致しないitemが追加の出力へ流れます。「雑談」と未知のタグは、どちらもこの追加出力へ流れます。この経路が拾うのはタグの不一致であり、既知のタグが付いた内容の誤りまでは拾いません。

kintone、Notion、Google Tasksへの登録

記事ネタをkintoneの記事案アプリに登録

記事案はHTTP Requestノードからkintoneのレコード登録APIへ送ります。次のcurlは登録リクエストの例で、アプリIDの1535は仮の値です。この登録例ではarticle_titleにタイトル候補、categoryにカテゴリ、source_urlに議事録URLを入れ、statusを「検討中」としています。

bashkintone 記事案アプリ への POST
curl -X POST https://hatenabase.cybozu.com/k/v1/record.json \
  -H 'X-Cybozu-API-Token: <APP_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "app": 1535,
    "record": {
      "article_title": { "value": "<<Claude が返したタイトル候補>>" },
      "status": { "value": "検討中" },
      "category": { "value": "<<Claude が判定したカテゴリ>>" },
      "source_url": { "value": "<<元議事録 URL>>" }
    }
  }'

営業フォローをkintoneの商談アプリに登録

営業フォローの登録先は既存の商談アプリで、顧客名、要約、期限、担当者を各フィールドに対応づける想定です。期限の既定値はn8nの$now.plus({days:7})で設定する処理日時の7日後です。顧客との合意日を抽出した値ではないため、合意済みの期限がある案件は人が修正します。

社内ナレッジをNotionに登録

業務手順や運用ルールの保管先はNotionのデータベースです。組み込みノードにデータベースIDとプロパティ名を設定し、Integrationに対象へのアクセス権を付けます。タイトル、カテゴリ、要約、詳細を持つページとして登録する構成にしました。

アクションをGoogle Tasksに登録

Google Tasksに送るのは、担当者が着手を宣言したアクションです。「○○さん、月末までに準備しておいて」という他者からの指示とは分けて扱います。書き込みには対象者のタスクリストへアクセスできる認証情報を使います。期限の既定値は3日後とする想定です。

Slackへの抽出件数の通知

抽出件数はSlackの専用チャンネル#pr-minutes-routingに通知します。たとえば「記事ネタ2件、営業フォロー3件、ナレッジ1件、アクション5件」という文面です。

Slackを併用したのは、Google Tasksの通知を無効にしている人にも抽出結果を知らせるためです。自動化する範囲は社内システムへの登録までとし、登録内容の修正・削除と顧客への送信判断は人が担います。

入力・分類・エラー処理で詰める箇所

議事録のファイル形式に合わせて本文を取得する

Google DocsはGoogle Drive DownloadのGoogle File ConversionでText (txt)に変換し、出力されたバイナリからテキストを取り出します。分類APIに渡すのはこの本文です。

発言者を特定できない場合の扱い

speakerは発言者を表し、タスクの担当者を示す項目ではありません。顧客が社員に依頼した発言では、話した人と作業する人が異なるためです。

重要度の低い候補が増える場合

軽い思いつきまで記事案に入ると、検討したい案が埋もれます。

Anthropic APIのレート制限

Anthropic APIの制限には、分単位のリクエスト数と入出力トークン数があります。429応答ではretry-afterに従って待機し、再試行する扱いです。

Error Workflowで失敗を通知する

n8nのSettingsでError Workflowに通知用ワークフローを指定すると、実行失敗をSlackへ送れます。ただ、JSON抽出コードは解析に失敗した場合も正規表現に一致しない場合も空配列を返すので、この通知に届きません。

作業時間の計算例

工数は、議事録1本の読み返しと転送に30分、AI出力の最終確認に3分かかると仮定して計算します。週5本、月4週で20本、年12か月で240本と置いた計算例です。

項目導入前導入後
議事録1本の処理時間30分(読み返し+転送)3分(AI出力の最終確認)
週5本処理150分15分
月20本処理10時間1時間
年間(240本)120時間12時間

この条件では確認作業が月1時間となり、削減見込みは月9時間、年間108時間です。

Anthropic APIの費用は議事録1本あたり0.05〜0.10ドルを目安とし、月20本で月1〜2ドル、予算は上限側の2ドルと見込んでいます。Renderの月13ドルとAPI費用を合わせ、月2,500円程度の概算予算を置いています。

分類基準を日常の管理先に結び付ける

私は登録先に、社内で使っているkintone、Notion、Google Tasksを選びました。

AI エージェントを業務に組み込みたい方へ

はてなベースでは、議事録振り分けのような AI エージェント連携を、業務フロー設計から n8n / Anthropic API 実装、kintone / Notion / Google Workspace との接続まで一気通貫でサポートしています。社内データの整備、セキュリティ要件に応じたオンプレミス AI 導入支援、運用ルール設計まで対応します。お気軽にご相談ください。

無料相談はこちら

使用した技術スタック

2026年5月の構成はn8n version 1.x、Claude Sonnet 4.5、kintone v1 APIです。Notionは組み込みノード経由で接続しています。categoryはkintone側のフィールドコード、tagは分類用JSONのキーとして使っています。