auto-research-public について
Claude Code 向けのスキルで、ターゲット企業のドメインと顧客プロフィールから、パーソナライズした Smartlead キャンペーンを作成します。企業調査、リード獲得、メール検証、文面作成、配信設定を連携し、状態はローカルの JSON ファイルに保存します。
主な機能
- 01企業サイトのスクレイピング
- 02Prospeo によるリード検索
- 03メールの補完と検証
- 04A/B/C の 3 種類の文面
- 05リードごとのパーソナライズ
- 06Smartlead キャンペーンの登録と開始
活用シーン
- 01ターゲット企業の見込み顧客へのアウトリーチ
- 02リードリストで複数のメール文面をテスト
- 03ローカルファイルでキャンペーン実験を記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ growthenginenowoslawski/ coldoutboundskills --skill auto-research-publicインストール後、Claude Code で/auto-research-publicを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/phase-enrich.tsphase-prospeo.tsphase-scrape.tsphase-upload.ts詳細
Auto Research(Public)
エンドツーエンドのキャンペーンを自動で開始します。ターゲット企業のドメインを1つ入力すると、リードごとにパーソナライズされた稼働中のSmartleadキャンペーンが約20分で作成されます。
GEXの社内用auto-research-v2を初心者向けにしたバージョンです。すべての状態はローカルのJSONファイルに保存され、SupabaseもTrigger.devも使用しません。
得られるもの
- 入力: ターゲット企業のドメイン1つ +
client-profile.yaml - 出力: 稼働中のSmartleadキャンペーン。内容は次のとおりです。
- 200〜1,000件のリード(ターゲティングの絞り込み具合によって異なります)
- リードごとのパーソナライズ:カスタム変数9個(状況、価値、CTA × 3種類のバリエーション)
- A/B/Cの件名と本文のバリエーションを並行してテスト
- 利用可能な受信トレイにキャンペーンを割り当て
- 配信スケジュール:お使いのタイムゾーンで月〜金の午前8時〜午後5時
前提条件
実行する前に、以下を確認してください。
-
client-profile.yamlが存在する(ない場合は/icp-onboardingを実行) - 環境変数に
SMARTLEAD_API_KEYが設定されている - 環境変数に
PROSPEO_API_KEYが設定されている - 環境変数に
MILLIONVERIFIER_API_KEYが設定されている(メールアドレスの検証用) - 「active」とタグ付けされたSmartleadの受信トレイが20個以上ある(先に
/smartlead-inbox-managerを実行) - Smartleadにキャンペーンテンプレートが1つ以上ある(ない場合、スクリプトが新規作成します)
オーケストレーション(Claude Codeが実行します)
他のスキルとは異なり、このスキルはClaude Codeの会話自体を通じてオーケストレーションを行います。Claudeが推論(ICPの生成、コピーの作成、パーソナライズ)を担当し、各フェーズのスクリプトがAPIとの重い処理を行います。これはGEX v2の社内版で採用されているパターンです。
フェーズ1:ターゲット企業をスクレイピングする
npx tsx scripts/phase-scrape.ts --domain=<target.com> --out=/tmp/auto/scrape.json
出力:domainと、ホームページ、/about、/product、/pricing、/customersのテキストコンテンツを含むJSON。
Claudeは出力を読み取り、短い分析を/tmp/auto/company-analysis.mdに書き込みます。
- その企業が何をしているか
- 主な顧客として考えられるのは誰か
- 社会的証明となる要素
- アウトリーチに使える可能性のある切り口
フェーズ2:ClaudeがICPフィルターを生成する
/tmp/auto/scrape.jsonと~/cold-email-ai-skills/profiles/<slug>/client-profile.yamlを読み取り、ClaudeがProspeoのフィルターを/tmp/auto/filters.jsonに書き込みます。
{
"job_titles": ["VP Marketing", "Head of Marketing", ...],
"seniorities": ["Vice President", "Head", "Director"],
"industries": ["Software Development", "Financial Services"],
"company_size_min": 50,
"company_size_max": 500,
"countries": ["US"],
"excluded_industries": ["Religious Institutions", "Government Administration"]
}
Claudeは、~/cold-email-ai-skills/skills/icp-onboarding/references/prospeo-industries.mdに記載されている正確なProspeoの業種名を必ず使用してください。
フェーズ3:Prospeoで検索する
npx tsx scripts/phase-prospeo.ts --filters-file=/tmp/auto/filters.json --max-leads=1000 --out=/tmp/auto/leads.json
出力:leads配列を含むJSON。各リードには、first_name、last_name、email(空の場合があります)、linkedin_url、job_title、company_name、company_domain、company_industry、company_headcount、company_descriptionが含まれます。
フェーズ4:メールアドレスのウォーターフォール検索と会社概要の補完
npx tsx scripts/phase-enrich.ts --leads-file=/tmp/auto/leads.json --out=/tmp/auto/enriched.json
スクリプトは次の処理を行います。
- 各リードのメールアドレスを確認し、見つからない場合はProspeoの
enrich-personエンドポイントを呼び出します company_descriptionが短い場合(50文字未満)、company_domainのホームページをスクレイピングします- 候補となるメールアドレスをすべてMillionVerifierで検証します
- 補完済みリードのうち、有効なメールアドレスがあるものだけを出力先に書き込みます
想定されるヒット率:
- 小売/SMB:約99%でメールアドレスが見つかります
- B2Bテック:約65〜80%
- 医療/公共部門:約25〜40%
- MVによる却下:見つかったメールアドレスの約20〜30%
フェーズ5:コピーの作成(Claude)
Claudeは3種類のコピー(A、B、C)を生成し、/tmp/auto/variants.jsonに書き込みます。
[
{
"variant": "A",
"subject": "<concrete, specific, <60 chars>",
"angle": "<pain observation>",
"body_template": "Hi {{first_name}},\n\n{{situation_line_a}}\n\n{{value_line_a}}\n\n{{cta_line_a}}\n\n%signature%\n\nP.S. If this isn't relevant, just let me know and I won't reach out again."
},
{
"variant": "B",
"subject": "<different angle>",
"angle": "<compliment + transition>",
"body_template": "..."
},
{
"variant": "C",
"subject": "<third angle>",
"angle": "<question>",
"body_template": "..."
}
]
Claudeが必ず守るルール(出力に対して /spam-word-checker を実行してください)。
- emダッシュ(—)は使用しません。コンマまたはピリオドを使用してください。
- 「leverage」、「synergy」、「solutions」、「world-class」、「cutting-edge」は使用しません。
- 本文は最大50〜90語です。
- 件名は60文字未満で、具体的にし、クリックベイトは避けます。
- 最後に
%signature%を単独の行に記載します。
フェーズ6:Taskサブエージェントによるパーソナライズ
Claudeは並列のTaskサブエージェント(バリエーションごとに1つ、20〜30件のリードを1バッチとして処理)に処理を振り分けます。詳しいパターンについては /personalization-subagent-pattern を参照してください。
各サブエージェントは、リードごとに次のファイルへ書き込みます:/tmp/auto/personalization-<batch>-variant-<X>.json
[
{
"lead_id": "...",
"situation_line": "One sentence about the company.",
"value_line": "One sentence connecting to our offer.",
"cta_soft": "One soft ask sentence."
}
]
すべてのサブエージェントが完了した後、Claudeはlead_idをキーにデータを統合し、/tmp/auto/personalized.jsonに書き込みます。各リードには、9つのパーソナライズ項目が設定されます。
フェーズ 7:Smartlead へのアップロード
npx tsx scripts/phase-upload.ts \
--leads-file=/tmp/auto/personalized.json \
--variants-file=/tmp/auto/variants.json \
--domain=<target.com> \
--inboxes-tag=active \
--inbox-count=10 \
--activate
このスクリプトは次の処理を行います。
[AUTO] <date> <target> Autoという名前で新しい Smartlead キャンペーンを作成します- キャンペーン ID にスコープされたカスタム変数(
{{situation_line_a_{campaign_id}}})を使用して、3 バリエーションのシーケンスを保存します - Smartlead から「active」タグが付いた N 個の受信トレイを選択します(LRU — 最終使用時刻が最も古いものを優先)
- パーソナライズ用のカスタムフィールドを割り当てて、リードを 100 件ずつアップロードします
- スケジュール(月曜〜金曜、EST の午前 8 時〜午後 5 時)と設定(トラッキングをオフにし、返信時に停止)を行います
- キャンペーンを有効化します
出力:{ campaignId, inboxCount, leadsUploaded } を標準出力に書き込みます。
フェーズ 8:実験状態を保存(ローカル JSON)
~/cold-email-ai-skills/profiles/<slug>/experiments/<YYYY-MM-DD>-<target>.json に書き込みます。
{
"date": "2026-04-17",
"target_domain": "example.com",
"smartlead_campaign_id": 123456,
"inboxes_assigned": [...],
"icp_filters": {...},
"variants": [...],
"lead_count_uploaded": 347,
"launched_at": "2026-04-17T14:23:00Z",
"status": "launched"
}
これは実験ログです。/experiment-design はここからデータを読み込み、実行結果を比較します。/positive-reply-scoring は 21 日後に結果をこのファイルへ書き戻します。
全フェーズを実行する
Claude に調整させて、8 つのフェーズをすべて 1 つのコマンドで実行します。
/auto-research-public --domain=<target.com>
Claude Code は各フェーズを順番に実行し、フェーズ 5(コピー)とフェーズ 7(アップロード)の前に一時停止するので、確認できます。
毎日/スケジュール実行
慣れてきたら、cron で実行するか、Claude Code の /loop スキルを使って毎日実行します。
/loop 1d /auto-research-public --domain=$(cat /tmp/auto/next-target.txt)
毎日次のターゲットを選ぶ方法が必要です。選択肢:
targets.txtリストを管理し、毎日 1 件ずつ取り出す- TAM 調査に基づいて Claude に選ばせる(
/list-builderと/list-expanderを参照) - 競合他社/類似企業のリストをローテーションする
状態ファイル(ローカル JSON、データベースなし)
スキルに必要なものはすべて ~/cold-email-ai-skills/profiles/<slug>/ に保存されます。
profiles/
<business-slug>/
client-profile.yaml # from /icp-onboarding
lead-magnets.md # from /lead-magnet-brainstorm
experiments/
2026-04-16-targetco.json # per-campaign experiment log
2026-04-17-othertarget.json
scores/
123456-2026-05-07.json # from /positive-reply-scoring
受信トレイの割り当て(Supabase なし)
GEX v2 は Supabase テーブル auto_research_inbox_assignments を使用して、各受信トレイがどのキャンペーンに割り当てられているかを追跡し、負荷を分散します。この公開バージョンでは、次の処理を行います。
- Smartlead に問い合わせて、「active」タグが付いた受信トレイを取得します
- 各受信トレイの
daily_sent_countを取得し、「最終使用時期」の代用とします - 昇順に並べ替え、先頭の N 件(本日の送信数が最少=最終使用時期が最も古いもの)を選択します
- 割り当てをローカルの実験 JSON に記録します(データベースではありません)
受信トレイが 1000 件未満の場合に適しています。それを超えて規模を拡大する場合は、実際の DB に移行してください。
よくある問題
- Prospeo INVALID_FILTERS — 通常、「業種名が 256 件のリストにありません」という意味です。正確な一致を確認するには、
/icp-onboardingの references/prospeo-industries.md を確認してください。 - メールアドレスの取得率が低い — 30%未満の場合、見つけにくい人(ニッチな役職、小規模企業)をターゲットにしています。ICP の範囲を広げるか、コストを許容してください。
- サブエージェントのパーソナライズが単調 — リード間で同じ表現が使われている場合は、多様性を促すプロンプトを使ってそのバッチを再実行してください。
/personalization-subagent-patternの references/failure-modes.md を参照してください。 - アップロード時に Smartlead で「inbox not allowed」と表示される — 受信トレイにフラグが付いているか、ブロックされています。スクリプトはその受信トレイをスキップして続行します。
- キャンペーンの送信数が 0 のまま — キャンペーンのスケジュール、受信トレイのウォームアップ状態(
/smartlead-inbox-manager list-healthで確認)、およびリードが実際にアップロードされていることを確認してください。
1 回あたりのコスト
一般的な実行(ターゲット 1 件、取得するリード 1000 件):
- Prospeo 検索:検索 1 ページあたり約 40 ページ × 検索 = 約 $0.20
- Prospeo enrich-person(メールアドレスが不足しているリード約 500 件のメール検索):約 $5
- MillionVerifier 検証:約 $0.50
- Smartlead 送信コスト:時間の経過とともに送信メール 1 件あたり約 $0.001
- Claude Code Task サブエージェント:(Claude Code プランを使用するため、追加の API 費用はありません)
合計:有効なメールアドレス 300〜500 件に到達するまで、キャンペーン 1 件あたり約 $6〜10。
スクリプト
scripts/phase-scrape.ts— ウェブサイトのスクレイピングscripts/phase-prospeo.ts— Prospeo のページネーション付き検索scripts/phase-enrich.ts— メールアドレスの段階的取得+説明の補完+MillionVerifierscripts/phase-upload.ts— Smartlead キャンペーンの作成+アップロード
参考資料
references/orchestration-checklist.md— ループを手動で実行するための全手順references/icp-to-prospeo.md— client-profile.yaml を Prospeo のフィルター JSON に変換する方法references/copy-variant-guide.md— 互いに異なる A/B/C の 3 バリエーションを作成する方法
次に行うこと
21 日間待ちます。キャンペーンに返信データが蓄積したら、配信済みのキャンペーンで /positive-reply-scoring を実行します。
その間に: /cold-email-weekly-rhythm を使って、毎週のリズムを続けます。毎週月曜日に、新しいキャンペーンで /email-deliverability-audit を実行し、インフラストラクチャの問題を早期に検出します。
または、待ちます: このスキルは自動化ループそのものです。次のアクションは「明日、別のターゲットドメインで再実行する」ことや、/schedule スキルと連携して毎日実行することです。
関連スキル
/icp-onboarding— client-profile.yaml を生成します(必須の入力)/lead-magnet-brainstorm— このキャンペーンで尋ねるオファー/CTA を生成します/personalization-subagent-pattern— フェーズ 6 で使用するファンアウトパターンです/smartlead-inbox-manager— 受信トレイにタグを付け、ウォームアップするため、事前に実行する必要があります/positive-reply-scoring— キャンペーンのスコアリングのため、21 日後に実行します/experiment-design— 次に試すターゲットの計画方法