XでバズってるネタからXとnoteの記事を自動生成する自動運転
trend-to-note-and-x
X (旧 Twitter) のバズ投稿 / トレンドを起点に、note 記事を 1 本自動入稿するサブエージェント。
さらに同じネタから X 投稿案 (主力長文 × 3 案) を生成して Discord に通知し、X UI で手動投稿できる状態に整える。
X への自動投稿はしない (読むだけ)。note も下書き保存までで停止 (公開判断は人間)。
事故防止と運用安全性を優先した「draft 止まり」設計。
何ができるか
[1 エージェント] trend-to-note-and-x
│
├─ Step 1 socialdata-trend-harvester : X からネタ 1 件選定
├─ Step 2 reference-corpus-builder : note + X からお手本収集 (★ 本人 X TL も few-shot 素材として必ず取得)
├─ Step 2.5 X 投稿案 × 3 案を Discord 通知 (手動投稿用ドラフト)
├─ Step 3 note-publishing-toolkit : 競合分析 → 執筆 → ファクトチェック → 画像 → note 入稿
└─ Step 4 振り返り 4 層ログ + Discord 通知
設計の核心:
- 1 エージェント = オーケストレーター、実処理は 3 スキルに分離
- 書き手本人の長文バズ投稿を few-shot として LLM に直接渡す (抽象パターン抽出はしない、表層マッチで本人感は出ないため)
- 競合分析 (勝つための比較) と リファレンス分析 (真似るためのお手本) を別軸で両方走らせる
- 下書き止まり で公開・送信はすべて手動
構成
trend-to-note-and-x-pkg/
├── .claude/
│ ├── agents/
│ │ └── trend-to-note-and-x.md オーケストレーター本体
│ └── skills/
│ ├── socialdata-trend-harvester/ X からネタ仕入れ
│ ├── reference-corpus-builder/ お手本収集 + 本人 TL few-shot
│ └── note-publishing-toolkit/ note 入稿 (Chrome DevTools MCP)
├── knowledge/
│ ├── profile.md ★ 自分の情報に書き換え必須
│ ├── keywords.md ★ 検索クエリ + 監視アカウント、要書き換え
│ ├── reference-sources.md お手本にする note / X 白リスト
│ └── scoring.md スコア重み・閾値・NG ワード
├── data/
│ ├── seen_ids.json 採用済み tweet ID (30 日保持)
│ ├── reference-cache/ Jina 取得キャッシュ (90 日)
│ └── pipeline-log/<timestamp>/ 1 実行 1 ディレクトリ
├── .env.example ★ .env.local にコピーして API キーを入れる
├── .mcp.json chrome-devtools MCP 設定
└── README.md
必要なもの
| カテゴリ | 内容 |
|---|---|
| Python | 3.11+ (標準ライブラリのみで動く、pip 追加不要) |
| Node.js | chrome-devtools MCP のため |
| Claude Code | サブエージェント実行環境 |
| API キー | SocialData / Jina / Gemini / Anthropic (任意) |
| 認証情報 | note.com のメール + パスワード |
セットアップ
# 1. 解凍してプロジェクトディレクトリに配置
unzip trend-to-note-and-x-pkg.zip
mv trend-to-note-and-x-pkg trend-to-note-and-x
cd trend-to-note-and-x
# 2. 環境変数を設定
cp .env.example .env.local
$EDITOR .env.local
# 入れるキー:
# - SOCIALDATA_API_KEY (https://socialdata.tools)
# - JINA_API_KEY (https://jina.ai/api-dashboard/)
# - GEMINI_API_KEY (https://aistudio.google.com/)
# - NOTE_EMAIL / NOTE_PASSWORD (note.com)
# - DISCORD_WEBHOOK_URL (任意、note 進捗通知)
# - DISCORD_WEBHOOK_X_DRAFTS (任意、X 投稿案ドラフト)
# 3. knowledge/ を自分の情報に書き換え (★ 必須)
$EDITOR knowledge/profile.md # 名前・X handle・経歴・キーワード辞書
$EDITOR knowledge/keywords.md # X 検索クエリ + 監視アカウント
$EDITOR knowledge/reference-sources.md # お手本にする note / X 白リスト
# (scoring.md はデフォルトのままで OK、慣れたら調整)
# 4. Claude Code から起動
claude
> /agents
# → trend-to-note-and-x を選択して実行
★ knowledge ファイルの埋め方が一番大事
これが配布版でいちばん重要なステップ。エージェント自体は汎用で書かれているので、knowledge/ をしっかり書かないと「あなたっぽい」記事も投稿案も生成されません。
knowledge/profile.md
書き手の名前・X handle・経歴・拠点・専門・語り口を全部書く。
特に ## キーワード辞書 はスコアリングに直結するので、自分の専門領域から 15〜30 個。
knowledge/keywords.md
X 検索クエリと監視アカウント。
queries: X 検索の実クエリ (例:Claude Code エージェントAI 業務効率化)。狭すぎると候補ゼロになるので、最初は 10〜15 個と広めにしておくのが無難。watch_accounts: 業界キーパーソンの screen_name (@ なし)。タイムラインから直接ネタを拾ってくる。
knowledge/reference-sources.md
お手本素材ソース。自分の X handle を x_whitelist に必ず入れることだけ覚えておけば、あとは空でも動きます。
本人の長文バズが reference-corpus-builder の few-shot 素材として取得され、X 投稿案の温度が本人と揃います。
単体テスト (スクリプト単独動作確認)
エージェント経由じゃなくスクリプト単独でも動作確認できます。
# Step 1 単体
python3 .claude/skills/socialdata-trend-harvester/scripts/fetch.py \
--out data/pipeline-log/test/01-pick.json
# Step 2 単体 (Step 1 の出力を入力に)
python3 .claude/skills/reference-corpus-builder/scripts/build.py \
--in data/pipeline-log/test/01-pick.json \
--out data/pipeline-log/test/02-references.json
# main_kw を直接指定して Step 2 だけ動かす場合
python3 .claude/skills/reference-corpus-builder/scripts/build.py \
--main-kw "Claude Code サブエージェント" \
--out /tmp/refs.json
note 入稿 (Step 3) は Chrome DevTools MCP + Claude Code が必要なので、スクリプト単独では動きません。エージェント経由で実行してください。
環境変数
| キー | 必須 | 用途 |
|---|---|---|
SOCIALDATA_API_KEY | ✅ | X 検索・タイムライン取得 |
JINA_API_KEY | ✅ | note 記事取得 + 競合分析 + ファクトチェック |
GEMINI_API_KEY | ✅ | サムネ画像生成 (gemini-3.1-flash-image-preview) |
NOTE_EMAIL | ✅ | note ログイン |
NOTE_PASSWORD | ✅ | note ログイン |
ANTHROPIC_API_KEY | 任意 | スクリプト単体で --with-llm を使う場合のみ。Claude Code 内ならエージェントが直接判断するので不要 |
DISCORD_WEBHOOK_URL | 任意 | note 進捗・完了通知 |
DISCORD_WEBHOOK_X_DRAFTS | 任意 | X 投稿案 3 案ドラフト通知 (手動投稿用) |
ハードルール (このエージェントが必ず守ること)
- 1 回の実行で投稿するのは最大 1 記事
- X / SocialData API は GET のみ。投稿・DM・引用 RT・いいね・フォロー一切しない
- 公開は手動推奨 (note 下書き保存で停止 → Discord 通知)
- リファレンス記事の本文転載禁止 (構造・パターン抽出のみ)
- リファレンス著者の名前を記事本文に書かない (メタログのみ)
- 競合分析 (note-publishing-toolkit Step 2) は省略不可
- ファクトチェック (note-publishing-toolkit Step 4) は省略不可
- 採用 tweet ID は 30 日間
seen_ids.jsonで重複防止 - 元ツイート著者を批判する角度は採らない (賛同 or 補完のみ)
- 画像モデルは必ず
gemini-3.1-flash-image-preview(旧モデルは日本語が崩れる) - X 投稿案は本人 X タイムラインの長文バズを few-shot として直接プロンプトに入れる (抽象パターン抽出禁止)
トラブルシュート
「全候補が閾値未満」で毎回スキップされる
knowledge/scoring.mdのmin_scoreを下げる (55 → 50)knowledge/keywords.mdの検索クエリが狭すぎないか確認
note 記事が取得できない (reference-corpus-builder)
- Jina Reader の note 対応は不安定なことがある (403 になる)
- X 側のリファレンスだけで synthesis を作って続行する設計なので致命的ではない
- お手本にしたい note 記事 URL を直接
data/reference-cache/note-XXX.mdに置く運用も可能
X 投稿案の温度が違う
knowledge/profile.mdの X handle が正しいか確認knowledge/reference-sources.mdのx_whitelistに自分の handle が入っているか確認- 本人の長文バズが少ない場合は
min_favesの閾値を下げて取得対象を広げる (reference-corpus-builder/scripts/build.py)
Chrome DevTools MCP が動かない
.mcp.jsonの--user-data-dirパスが書き込み可能か確認- 初回は note にログイン状態を作る必要あり (ブラウザで一度 note にログインしておく)
既存の note 自動投稿エージェントとの併用
themes.md ベースで動く vulpix-note-publisher (人が手動でテーマを積む方式) と共存可能。
両者は note-publishing-toolkit スキルを共用するので、片方が更新されれば両方に効きます。
スケジュール例:
- vulpix-note-publisher: 1 日 1 回 (朝、計画的なテーマ)
- trend-to-note-and-x: 4〜6 時間おき (鮮度命、X トレンド駆動)
ただし note の連投スパム判定回避のため、1 日合算で 2 本までに抑える運用を推奨。
ライセンス
MIT License (LICENSE ファイル参照)
クレジット
note-publishing-toolkitの Chrome DevTools MCP 実装ノウハウ (insertHTML 一発方式、隠し input 可視化等) は実走検証から積み上がっている資産- 設計思想 (1 エージェント = 薄いオーケストレーター + スキルが本体、draft 止まりで安全運用) は Claude Code の公式サブエージェント仕様に準拠