Google Alerts × Notion × Claude Codeで毎週の記事作成を効率化する方法

目次
- イントロダクション ― なぜAI情報発信を自動化するのか
- 背景 ― 発信できなかった理由と自動化への道のり
- 全体アーキテクチャ ― 3層パイプラインの設計思想
- 詳細解説パート1: minitools ― 情報収集パイプライン
- 詳細解説パート2: social-content-creator ― 記事生成パイプライン
- 実践ケーススタディ ― 週刊AIニュース記事ができるまで
- 今後の展望 ― さらなる自動化と拡張の可能性
- まとめ
イントロダクション ― なぜAI情報発信を自動化するのか
AI業界の情報更新スピードは、他のどのテクノロジー分野よりも速いと言っても過言ではありません。毎日のように新しいモデルがリリースされ、論文が公開され、企業が新サービスを発表しています。この激流のような情報の中から本当に重要なニュースを選び、読者にわかりやすく届けること。それは、AIエンジニアにとって技術力と同じくらい大切なスキルです。 Aidottersでは、AI技術に関するブログ「aidotters.com」で毎週AIニュースのハイライト記事を公開しています。実は、この定期発信が実現できたのは、つい最近のことです。それまでは「情報発信をしたい」と思いながらも、日々の業務に追われて手が回らない状態がずっと続いていました。 本記事では、その状況を一変させた2つの自作ツールとAIの組み合わせによるワークフローを、実際のコードとアーキテクチャとともに詳しく解説します。具体的には以下の3つのコンポーネントで構成されるパイプラインです。- minitools ― Google Alertsなどから情報を自動収集し、Notionに蓄積するPythonパッケージ
- Notion ― 収集した情報のデータベースとして機能するナレッジハブ
- social-content-creator ― Notionからデータを読み出し、Claude Codeのスキル機能で記事を生成・WordPress投稿するツール
背景 ― 発信できなかった理由と自動化への道のり
そもそも発信ができていなかった
「週刊AIニュースの記事作成を効率化した」と言うと、以前は手動で書いていたものを自動化した、という印象を受けるかもしれません。しかし実態は違います。そもそも記事を書けていなかった状況でした。 AIエンジニアとしての日常は、思った以上に忙しいものです。業務でのAIアプリやモデル開発、データ分析に加え、この分野では常に新しい技術やツールをキャッチアップし続ける必要があります。新しいフレームワークを試し、知識をアップデートする。場合によっては論文にも目を通す。それだけで1日の時間はあっという間に過ぎていきます。 「情報発信もしたい」という気持ちはずっとありました。自分のアウトプットを通じて知識を整理したい。また、技術ブログを通じて何らかの貢献をしたい。しかし現実には、情報収集すら十分な時間を確保できない状況でした。 また、週刊AIニュースを手動で作ろうとすると、ざっくり以下のような工数が必要になるかと思いいます。- 情報収集(2〜3時間)― Google検索、RSS、X(Twitter)、arXivなどを巡回してニュースを集める
- 選別・構成(1〜2時間)― 集めた数十件から8〜10件を選び、構成を決める
- 執筆(2〜3時間)― 各ニュースの要約と解説を書き、導入文とまとめを作る
- 投稿(30分〜1時間)― WordPressへの入稿、フォーマット調整、公開
Claude Codeのスキルがきっかけ
転機となったのは、Claude Codeの「スキル」機能との出会いです。AnthropicのCLIツールであるClaude Codeを昨年使い始めたときはコード生成以外に使うことは想定していませんでした。ところが、昨年末に導入されたClaude Codeの「スキル」を今年になって本格的に使い始めた時、「これはコーディングだけでなく、コンテンツ生成のワークフローにも使えるのではないか」と直感しました。 Claude Codeの「スキル」機能 ― 特定のタスクに対する手順書をMarkdownで定義し、スラッシュコマンドで呼び出せる仕組み ― を活用すれば、情報収集から記事生成、WordPress投稿までの一連のフローを定義できます。しかも、人間がレビューして修正する「Human-in-the-Loop」のアプローチを自然に組み込めることもこの「スキル」を利用するメリットです。段階的に構築した自動化パイプライン
「全部を一気に自動化する」のではなく、結果的に、段階的にパイプラインを構築することになりました。第1段階: 情報収集の自動化(minitools)
第2段階: 記事生成の効率化(social-content-creator)
第3段階: 投稿・配信の自動化
/publish-to-x スキルで記事のURLと要約を含むポストを生成・投稿できます。ブログ公開からSNS拡散まで、一連の発信フローがシームレスにつながっています。
こうして、「情報発信がしたくてもできなかった」という状態から、毎週コンスタントに記事を公開できる状態に変わりました。
全体アーキテクチャ ― 3層パイプラインの設計思想
アーキテクチャ概要
本ワークフローは、大きく3つのレイヤーで構成されています。設計: なぜ2つのリポジトリに分離したのか
このワークフローを1つのモノリシックなアプリケーションとして構築することも可能でした。しかし、経緯にも書きましたが、まずは、Slackへの配信やNotionへの保存機能を先に構築したことで、結果的にminitoolsとsocial-content-creatorを別リポジトリに分離しています。分離することで以下の点がメリットになっていると考えています。1. 関心の分離(Separation of Concerns)
2. 実行環境の違い
3. 再利用性
Notionをハブとする理由
2つのツール間のデータ連携にNotionを選んだ理由も整理しておきます。- 構造化データベース: Notionのデータベース機能により、タイトル、URL、要約、日付などを構造化して保存できる
- APIの充実: Notion APIを使って、プログラムから自在にデータを読み書きできる
- 人間も使える: エンジニアでなくても、NotionのUIで直感的にデータを確認・編集できる
- フィルタリング・ソート: 日付範囲やキーワードでのフィルタリングがAPI経由で容易
- 無料枠が充実: 個人利用であれば、無料プランで十分に対応可能
詳細解説パート1: minitools ― 情報収集パイプライン
minitoolsの概要
minitoolsは、コンテンツ収集・処理・配信を自動化するPythonパッケージです。ArXiv論文、Medium記事、Google Alerts、YouTube動画など、複数のソースから情報を収集し、日本語に翻訳・要約してNotionやSlackに配信します。 週刊AIニュースのワークフローでは、特にGoogle Alerts Collectorが中核を担っています。Google Alertsの設定
まず前提として、Google Alertsの設定について説明します。Google Alertsは、Googleが提供する無料の通知サービスで、指定したキーワードに関連する新しいウェブコンテンツが見つかると、メールで通知してくれます。 現在、以下の10個のアラートを設定しています。同じ意味のキーワードが英語・日本語で2つずつあるのは、それぞれの言語圏のニュースを漏れなく拾うためです。| キーワード | 対象言語 |
|---|---|
| AI | 英語 |
| AI | 日本語 |
| AI startup | 英語 |
| AI スタートアップ | 日本語 |
| Deep Learning | 英語 |
| ディープラーニング | 日本語 |
| Generative AI | 英語 |
| 生成AI | 日本語 |
| LLM | 英語 |
| LLM | 日本語 |
minitoolsによるGoogle Alerts処理フロー
minitoolsのGoogle Alerts処理は、以下のステップで動作します。Gmail受信ボックス
│
▼
① Gmail API でアラートメールを取得
│
▼
② メール本文からニュース記事を抽出
(タイトル、URL、スニペット)
│
▼
③ 各記事をOllamaで日本語に翻訳・要約
│
▼
④ Notion APIでデータベースに保存
│
▼
⑤ (オプション) Slack Webhookで通知
ステップ①: Gmail APIによるメール取得
minitoolsはGmail APIを使用して、Google Alertsからの通知メールを取得します。# minitools/collectors/google_alerts.py の概要
class GoogleAlertsCollector:
def collect(self, hours: int = 6):
# Gmail APIで過去N時間のGoogle Alertメールを検索
messages = self.gmail_service.users().messages().list(
userId="me",
q=f"from:googlealerts-noreply@google.com after:{after_date}"
).execute()
# 各メールからニュース記事を抽出
for msg in messages:
articles = self.parse_alert_email(msg)
yield articles
Gmail APIの認証には、Google Cloud PlatformでOAuth 2.0クレデンシャルを取得する必要があります。初回実行時にブラウザ認証を行い、以降は token.pickle ファイルで認証状態を維持します。
ステップ②: メール解析と記事抽出
Google Alertsのメールはhtml形式で、各ニュースがカード形式で並んでいます。minitoolsはこのHTMLを解析して、以下の情報を抽出します。- タイトル: 記事の見出し
- URL: 記事への直接リンク
- スニペット: Google Alertsが付与する概要テキスト
- ソース: 記事の配信元メディア名
ステップ③: Ollamaによる翻訳・要約
抽出した記事は、ローカルで動作するLLM(Ollama)を使って日本語に翻訳・要約されます。# minitools/processors/translator.py の概要
class Translator:
async def translate_with_summary(self, title: str, content: str):
prompt = f"""
以下の英語の記事タイトルと内容を日本語に翻訳し、
3行程度の要約を作成してください。
Title: {title}
Content: {content}
"""
result = await self.llm.generate(prompt)
return {
"japanese_title": result.japanese_title,
"summary": result.summary
}
Ollamaを使うメリットは以下の通りです。
- コスト: ローカル実行のため、API料金が不要
- プライバシー: データが外部に送信されない
- 速度: ネットワーク遅延がなく、並列処理で高速化可能
gemma3:27b モデルをデフォルトで使用しており、日本語の品質とパフォーマンスのバランスが良好です。また、非同期処理により最大10記事を同時処理し、50記事を約60秒で処理できます。
ステップ④: Notionデータベースへの保存
翻訳・要約された記事は、Notion APIを使ってデータベースに保存されます。# minitools/publishers/notion.py の概要
class NotionPublisher:
async def save_article(self, database_id: str, article: dict):
self.client.pages.create(
parent={"database_id": database_id},
properties={
"Title": {"title": [{"text": {"content": article["title"]}}]},
"Japanese Title": {"rich_text": [{"text": {"content": article["japanese_title"]}}]},
"URL": {"url": article["url"]},
"Summary": {"rich_text": [{"text": {"content": article["summary"]}}]},
"Date": {"date": {"start": article["date"]}},
"Source": {"rich_text": [{"text": {"content": article["source"]}}]},
}
)
Notionデータベースには以下のプロパティを設定しています。
| プロパティ | タイプ | 説明 |
|---|---|---|
| Title | Title | 元記事のタイトル(英語) |
| Japanese Title | Rich Text | 日本語翻訳タイトル |
| URL | URL | 記事のURL |
| Summary | Rich Text | 日本語要約 |
| Date | Date | 記事の日付 |
| Source | Rich Text | 配信元メディア名 |
cronによる定期実行
minitoolsはcronジョブとして定期実行することを前提に設計されています。Google Alertsの処理は6時間ごとに実行するのが推奨設定です。# crontab設定例
# 6時間ごとにGoogle Alertsを処理
0 */6 * * * cd /path/to/minitools && /path/to/uv run google-alerts
# 毎週月曜日9時に週次ダイジェストを生成
0 9 * * 1 cd /path/to/minitools && /path/to/uv run google-alert-weekly-digest
この設定により、1日4回、自動的にGoogle Alertsのニュースが処理され、Notionデータベースに蓄積されていきます。1週間で約100〜200件のAI関連ニュースが自動的にストックされることになります。
その他の情報ソース
minitoolsはGoogle Alerts以外にも、複数の情報ソースに対応しています。週刊AIニュースの記事生成で特に活用しているのは以下の2つです。 ArXiv論文収集# ArXiv論文の自動収集(毎日実行)
uv run arxiv --keywords "LLM" "(RAG OR FINETUNING OR AGENT)" --days 1
arXivの論文も日次で収集し、Notionの別データベースに蓄積しています。週刊ニュースでは、特に注目度の高い論文を「学術・研究動向」セクションで取り上げることがあります。
Medium Daily Digest
# Medium Daily Digestの処理
uv run medium --date 2026-03-28 --notion
Medium Daily Digestは、Mediumが毎日配信するキュレーションメールです。AI・ML関連のカテゴリをフォローしておくと、海外エンジニアのリアルな知見やチュートリアル、プロダクト開発の舞台裏などが届きます。
詳細解説パート2: social-content-creator ― 記事生成パイプライン
social-content-creatorの概要
social-content-creatorは、Aidottersの情報発信効率化ツールです。ブログ記事生成・WordPress投稿・Notion連携・情報収集を一貫して行うPythonプロジェクトで、Claude Codeのスキル機能を中心に設計されています。Claude Codeとスキル機能
ここで、このワークフローの鍵となるClaude Codeについて説明します。 Claude Codeは、Anthropicが提供するCLI(コマンドラインインターフェース)ツールで、ターミナル上でClaude AIと対話しながらソフトウェア開発を行えるエージェントです。ファイルの読み書き、コマンド実行、Web検索など、さまざまなツールを使いこなし、複雑なタスクを遂行できます。 Claude Codeのスキル(Skills)は、特定のタスクに対する詳細な手順書をMarkdownファイルとして定義する仕組みです。スキルを定義しておけば、/create-blog-post のようなスラッシュコマンドで呼び出すだけで、Claudeが手順に沿って自律的に作業を進めてくれます。
social-content-creatorでは、以下のスキルを定義しています。
| スキル | 説明 |
|---|---|
/create-blog-post | ブログ記事の生成・レビュー・投稿を一括実行 |
/publish-to-wordpress | ドラフト記事をWordPressに投稿 |
/publish-to-x | 記事の紹介をX(Twitter)に投稿 |
2層アーキテクチャ: スキル層 + ツール層
social-content-creatorは2層アーキテクチャを採用しています。スキル層(Claude Code)
- ・記事構成の判断
- ・ニュースの選定・優先順位付け
- ・本文の執筆
- ・レビュー対応・修正
- ・ユーザーとの対話
呼び出し
▼
ツール層(Python)
- ・Notion APIからのデータ取得
- ・WebSearchによる情報収集
- ・テンプレート管理
- ・Markdown処理
- ・WordPress API投稿
Notion Collectorの仕組み
social-content-creatorには、Notionからデータを取得するための3つのCollectorが実装されています。# src/collectors/notion_news.py
class NotionNewsCollector(NotionBaseCollector):
"""Notion APIでGoogle Alertニュースデータベースを直接クエリするCollector。"""
async def collect(self, query: str, **kwargs) -> list[CollectedData]:
# 日付範囲でフィルタリング
date_from = kwargs.get("date_from")
date_to = kwargs.get("date_to")
# Notion APIのフィルタを構築
filter_params = {
"and": [
{"property": "Date", "date": {"on_or_after": date_from}},
{"property": "Date", "date": {"before": date_to}},
]
}
# データベースをクエリ
results = await self.query_database(self._db_id, filter_params)
return [self._to_collected_data(page) for page in results]
3つのCollectorの使い分けは以下の通りです。
| Collector | 対象 | 主な用途 |
|---|---|---|
NotionNewsCollector | Google Alertsニュース | 週刊AIニュースのメインソース |
NotionPaperCollector | ArXiv論文 | 論文レビュー記事、ニュースの学術背景 |
NotionMediumCollector | Medium記事 | 海外エンジニアの知見、技術トレンド |
CollectorProtocol を実装しており、統一されたインターフェースでデータを取得できます。
テンプレートシステム
social-content-creatorでは、記事のタイプごとにテンプレートを定義しています。テンプレートには以下の情報が含まれます。- セクション構成: 記事の各セクションのタイトルと説明
- 文字数目安: 最小・最大文字数
- 文体ガイド: です・ます調、トーン、読者への配慮
ContentTemplate(
content_type="weekly-ai-news",
name="週刊AIニュースハイライト",
min_words=3000,
max_words=5000,
sections=[
Section(title="今週のハイライト", description="目次的な要約リスト"),
Section(title="主要ニュース", description="8〜10件の詳細解説"),
Section(title="業界動向・トレンド", description="横断的なトレンド分析"),
Section(title="まとめ", description="今週の総括と来週の注目点"),
],
style_guide="です・ます調。各ニュースに参考リンクを付与..."
)
テンプレートはレジストリパターンで管理されており、get_template("weekly-ai-news") のように型名を指定するだけで取得できます。
記事生成フロー(weekly-ai-news)
週刊AIニュース記事の生成は、Claude Codeのスキルとして以下のフローで実行されます。 ① 対象期間の算出 記事作成日を基準に、対象となる週の月曜日〜日曜日を算出します。例えば、2026年3月29日(土)に実行した場合、対象週は3月23日(月)〜3月29日(日)となります。 ② Notion APIからニュースを取得uv run python -c "
import asyncio, json
from src.collectors.notion_news import NotionNewsCollector
c = NotionNewsCollector()
results = asyncio.run(c.collect('', date_from='2026-03-23', date_to='2026-03-30'))
for r in results:
print(json.dumps({
'title': r.title,
'url': r.url,
'published_date': r.published_date,
'content': r.content[:200]
}, ensure_ascii=False))
"
③ WebSearchで補完情報を収集
Notionのデータだけでは最新の速報ニュースをカバーしきれない場合があるため、WebSearchで補完します。グローバルと日本国内の両方を検索します。
④ ニュースの選定と構成
収集した100〜200件のニュースから、Claude AIが8〜10件を選定します。この際、以下のルールが適用されます。
- 主要ニュース8〜10件のうち、最低3割は日本国内のニュースを含める
- 一次情報(公式発表、プレスリリース)を優先する
- 個人ブログは参考リンクとして使用しない
- 対象期間外のニュースは除外する
docs/drafts/ ディレクトリにMarkdownファイルとして保存されます。frontmatterにメタデータ(日付、タイプ、スラグ等)が記録されます。ここで人間によるレビューが入り、必要に応じて修正を指示します。
WordPress投稿
レビュー・修正が完了したら、WordPressに投稿します。uv run python -c "
import asyncio
from pathlib import Path
from src.publishers.wordpress import WordPressPublisher
from src.generators.blog_post import BlogPostGenerator
pub = WordPressPublisher()
gen = BlogPostGenerator()
post = asyncio.run(gen.load_draft(Path('docs/drafts/20260329-weekly-ai-news.md')))
result = asyncio.run(pub.publish(post, status='publish'))
if result.success:
print(f'投稿成功: {result.url}')
"
WordPressPublisherは以下の処理を行います。
- MarkdownをHTMLに変換
- WordPress REST APIを使って記事を作成
- カテゴリ・タグの設定
- 投稿ステータス(下書き/公開)の設定
- 投稿成功後、ファイルを
docs/drafts/からdocs/posts/に移動
実践ケーススタディ ― 週刊AIニュース記事ができるまで
ここでは、実際に2026年3月第4週の週刊AIニュース記事を作成した際のフローを、ステップバイステップで追体験してみましょう。Step 1: 前提 ― Notionにニュースが蓄積されている
記事作成に取りかかる前の段階で、minitoolsのcronジョブによりNotionデータベースには1週間分のAI関連ニュースが蓄積されています。 この週のNotionデータベースには、約150件のGoogle Alertsニュース、30件のArXiv論文、20件のMedium記事がストックされていました。Step 2: Claude Codeでスキルを実行
ターミナルでClaude Codeを起動し、スキルを呼び出します。$ claude
> /create-blog-post --type weekly-ai-news
このコマンドを実行すると、Claude Codeは create-blog-post スキルの定義(SKILL.md)を読み込み、記事生成フローを開始します。
Step 3: 情報収集(自動)
Claude Codeは以下の処理を自動的に実行します。- 対象期間の算出: 2026年3月23日(月)〜3月29日(日)
- NotionNewsCollectorの実行: 150件のGoogle Alertsニュースを取得
- NotionMediumCollectorの実行: 20件のMedium記事を取得
- WebSearchの実行: グローバルと日本国内のAIニュースを検索
- 日本国内ニュースの重点収集: 日本企業名・機関名でフィルタリング
Step 4: 記事生成(自動 + 人間レビュー)
収集した情報をもとに、Claude AIが記事本文を生成します。テンプレートに従い、以下のような構成の記事が出力されます。## 今週のハイライト
> - OpenAI「Sora」終了 ― Disney 10億ドル提携も破談に
> - Anthropic「Claude Mythos」流出 ― 史上最強モデルの存在が明らかに
> - Shopify「Agentic Storefronts」始動
> ...(8〜10件)
## 主要ニュース
### 1. OpenAI「Sora」終了 ― Disney 10億ドル提携も破談に
3月24日、OpenAIは動画生成AI「Sora」の...
生成された記事はそのまま表示され、ユーザーに修正ポイントの確認を求めます。ここがHuman-in-the-Loopの重要なポイントです。
- ニュースの選定は妥当か?
- 解説の正確性に問題はないか?
- グローバル/日本のバランスは適切か?
- 文体やトーンは統一されているか?
Step 5: WordPress投稿
レビューが完了したら、Claude Codeに投稿を指示します。> WordPressに公開ステータスで投稿してください
投稿が成功すると、記事のURLが表示され、ドラフトファイルは自動的に docs/posts/ ディレクトリに移動されます。
所要時間の比較
| フェーズ | 手動の場合(想定) | 自動化後 |
|---|---|---|
| 情報収集 | 2〜3時間 | 0分(cron自動実行) |
| ニュース選定・構成 | 1〜2時間 | 2〜3分(自動) |
| 記事執筆 | 2〜3時間 | 5〜10分(自動生成) |
| レビュー・修正 | ― | 10〜20分(人間) |
| WordPress投稿 | 30分〜1時間 | 1分(自動) |
| 合計 | 6〜8時間 | 約20〜30分 |
今後の展望 ― さらなる自動化と拡張の可能性
現在のワークフローの課題
現在のワークフローは発信の実現という大きな課題を解決してくれましたが、まだ改善の余地があります。 情報ソースの偏り: Google Alertsに依存しているため、Googleのインデックスに載らないニュース(例: 企業の内部発表、コミュニティの議論)は拾えません。 リアルタイム性: cronの実行間隔(6時間)があるため、速報性のあるニュースは反映が遅れることがあります。 画像生成の未対応: 現在、アイキャッチ画像やインフォグラフィックは手動で作成しています。今後の展望
X(Twitter)トレンドの統合 minitoolsには既にX(Twitter)のトレンド収集機能(x-trendコマンド)が実装されています。TwitterAPI.ioを使用して、日本/グローバルのトレンド、キーワード検索、フォロー中アカウントのタイムラインからAI関連情報を収集できます。
この機能を週刊ニュースのパイプラインに統合することで、Xで話題になっているがメディアではまだ報じられていないトレンドも記事に反映できるようになります。
マルチメディア対応
YouTube動画の要約機能もminitoolsに実装済みです。AI関連のカンファレンス動画や技術解説動画の要約を、週刊ニュースの補足コンテンツとして組み込むことも検討できます。
記事品質の自動評価
現在はHuman-in-the-Loopでレビューしていますが、事前にAIによる品質チェック(事実確認、リンク切れ検出、文体統一性チェック)を自動化することで、レビュー負荷をさらに軽減できる可能性があります。
ツールの利用について
minitools と social-content-creator はいずれも GitHub で公開している自作ツールです。同様のワークフローを構築したい方は、これらのツールをフォークして自分のニーズに合わせてカスタマイズできます。 例えば、以下のようなユースケースへの応用が考えられます。- 社内技術ブログ: 自社に関連する技術ニュースを自動収集し、社内ブログを定期更新
- 業界レポート: 特定業界(FinTech、HealthTech等)に特化したニュースレターの自動生成
- 競合分析: 競合企業に関するニュースを自動収集し、週次レポートを生成
- 個人ブログ: 自分の興味分野に関するキュレーション記事を定期発信
まとめ
本記事では、AIニュースブログの自動生成ワークフローを、3つのレイヤー(情報収集・蓄積・記事生成)に分けて解説しました。 全体のポイントを振り返ると:- minitools がGoogle Alertsをはじめとする複数ソースから情報を自動収集し、Ollamaで翻訳・要約してNotionに蓄積する
- Notion がデータハブとして機能し、構造化されたニュースデータベースを提供する
- social-content-creator がNotion APIでデータを取得し、Claude Codeのスキル機能で記事を生成・WordPress投稿する
関連リンク – minitools – GitHub – social-content-creator – GitHub – Aidotters Blog – Claude Code – Anthropic – Notion API Documentation


コメント