n8n × GitHub × OpenAIで「レポジトリ横断キャッチアップBot」を作った話
はじめに
この記事は『カンリー Advent Calendar 2025』、12月6日分の記事として執筆しています。
9月にマルチプロダクトを扱うCanlyに転職してから、「他チームはどんなコードを書いてるんだろう?」「どんな変更が日々入っているんだろう?」と気になることが増えました。
ただ、関係するすべてのリポジトリを毎週手動で巡回するのは現実的ではありません。
情報量が多すぎて、見に行くハードルも結構高く、諦めていました。。。
そんな時、同僚が n8n を勧めてくれたのが今回の自動化のきっかけです。
💡 何を実現したかったのか
欲しかったのは、こんな "ウィークリー PR ダイジェスト" でした:
- 1週間分の PR 情報を自動取得したい
- 内容をまとめて要約して、キャッチアップを時短したい
- bot PR と人間の PR を分けて把握したい
- Slack からすぐ PR に飛べるようにしたい
つまり 他チームの動きを自然にキャッチできる状態を作りたかった んです。
まずは要約を読み、気になった PR やコードは深掘りできるような“入り口”を作りたかった。
🏗️ どうやって解決したか
全体のフローは n8n を中心に組んでいます。

ざっくり書くとこんな流れです:
- n8n が週次で起動
- GitHub GraphQL API で必要な PR 情報をまとめて取得
- OpenAI で PR 内容を"2段階要約"
- Slack に読みやすく整形して通知
これだけで 「関連リポジトリの1週間分の情報」を気軽に把握できる環境を作れました。
🔧 技術的工夫
① GitHub GraphQL を採用した理由
最初は n8n 標準の GitHub
ノードを使っていましたが、以下の課題がありました:
- クローズ済みの PR を自前で弾く必要がある
- 対象期間(1週間)でフィルタリングするのも自前
- 結果的に余分な件数を取得しがち
ChatGPT に相談したところ、
「GraphQL の search API を使えば "期間+状態+必要プロパティ" を一発で取れるよ」
と教えてもらい、方針を変更しました。
実際に使っているクエリはこちら:
{
"query": "{ search(query: \"repo:owner_name/{{ $json.repo_name }} is:pr is:merged merged:>={{ $one_week_ago }} sort:updated-desc\", type: ISSUE, first: 30) { nodes { ... on PullRequest { number title body mergedAt author { login __typename } url } } } }"
}
is:merged + merged:>=
により、欲しい期間だけを厳密に指定できてめちゃくちゃ便利。
② OpenAI 要約は"2段階"にするのが安定した
理由は2つあります:
- コスト最適化:GPT-5-nano を使いたい
- 1回で「技術要約+Slack整形」すると精度が落ちる
そのため、
- PR 本文の技術的要約
- Slack 投稿向けの最終整形
と分けることで、「読みやすい × 安い」アウトプットに落ち着きました。
③ Bot PR と人間の PR を分けて扱う
Renovate などの bot PR と、人間が書いた PR が混ざると
要約がごちゃついて読みにくくなります。
そこで author.__typename を使って bot を判別し、
- Bot → バージョンアップ系としてまとめる
- 人間 → 開発内容として扱う
という分離を行いました。
結果として「本当に読むべき PR」だけに集中できるようになりました。
📝 実際に OpenAI に投げている Prompt
この prompt により、Bot PR と Developer PR が自動でグルーピングされ、いい感じに要約された内容にまとまります。
以下の PR データは、すべて 1 つのリポジトリに関するものです。
これらの技術的な変更内容を要約してください。
## 出力形式(JSON)
{
"repo": "{repo_name}", // n8n 側で渡しているレポジトリ名
"user_groups": [
{
"user_type": "Bot or Developer",
"summary": [
"実装内容: ...",
"使用技術・ライブラリ: ...",
"今後の影響・参考ポイント: ..."
],
"prs": ["#123", "#130"]
}
]
}
## 要約ルール
- 対象レポジトリは 1 つのみ(複数 PR を含む)
- PR 群を技術的重要度順に 3〜4 行で要約
- user_type ごとにグループ化(Bot / Developer)
- 技術実装、設計変更、新技術導入、ライブラリ更新を中心にまとめる
- 推測は禁止。不明点は「不明」と明記
- user_type は昇順(Bot → Developer)
## 対象データ
{{ PR_DATA }}
※ {{ PR_DATA }} は n8n 側で成形した PR 情報(JSON)をそのまま渡しています。
📈 Before / After(効果)
Before
- そもそも「見に行く」という行為をやっていませんでした笑
After
- 毎朝 Slack を 1 分読むだけ
- 気になった PR だけリンクから深掘り
- 開発部内の技術のアンテナをローコストで張れるようになりました
🔚 まとめ
n8n は最初ちょっとハードル高そうに見えましたが、実際に触ってみると
"痒いところに手が届く自動化ツール" でした。
今回の仕組みも、一部を差し替えるだけで
- Notion の更新履歴
- Backlog の課題状況
- Google Calendar のイベント
- Datadog のエラー
など、いろんな情報源に応用できると思います。
今後は、PR に関連するドメイン知識と組み合わせて、キャッチアップ出来るような仕組みを作っていきたいです。
株式会社カンリーは「店舗経営を支える、世界的なインフラを創る」をミッションに、店舗アカウントの一括管理・分析SaaS「カンリー店舗集客」の開発・提供、他複数のサービスを提供しております。 技術系以外のnoteはこちらから note.com/canly
Discussion