contact-hunter-skill について
contact-hunter-skillは、HubSpot、Apollo、Clayを使って人物や企業の連絡先を検索、補完、判定するスキルです。BDRや営業向けに、補完前の資格審査を行い、連絡先カードまたはCSVを出力します。
主な機能
- 01既存連絡先をHubSpotで先に検索
- 02補完前に候補者を資格審査
- 03ApolloとClayによる情報補完
- 04区分と配信抑制状態付きカードの出力
- 05CSV連携またはGmail下書きに対応
活用シーン
- 01企業内の特定職種の連絡先検索
- 02既存連絡先情報の確認と補完
- 03架電リストやシーケンス用CSVの作成
MCP 対応
HubSpot、Apollo、ClayのMCPツールを呼び出し、連絡先の検索、候補者の資格審査、情報補完を行います。連絡先カード、CSV連携、Gmail下書きを出力します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scientiacapital/ skills --skill contact-hunter-skillインストール後、Claude Code で/contact-hunter-skillを入力して読み込まれたか確認します。
同梱ファイルconfig.json
詳細
Contact Hunter
HubSpot、Apollo、Clay へのライブ MCP ツール呼び出しを使用して、特定の人物または企業の連絡先情報を見つけ、エンリッチし、適格性を評価します。メール、電話番号、役職、ATL/BTL ティア、抑制ステータスを含むコンタクトカードを返します — BDR のダイヤルリストやシーケンスへのロードにすぐ使える状態です。 Keywords: `contact hunter`, `find contacts`, `who works at`, `enrich contact`<quick_start> トリガー: 「[Company] の VP of Sales を見つけて」または「[Company] の [Name] の連絡先情報を取得して」または「[Company] の連絡先を探して」 入力: 人物名、企業、役職、所在地、または LinkedIn URL 出力: メール、電話番号、LinkedIn、ATL/BTL ティア、抑制ステータス、HubSpot レコードリンクを含む適格なコンタクトカード
ツールの順序:
hubspot_search_contacts(Epiphan AI) — その連絡先 / 企業はすでに存在するか?qualify_lead(Epiphan AI) — すべての候補に対して Gate Q: exclude / STALE AE LEAD / ATL-BTL ティア。判定なしでエンリッチに進むものはありません。apollo_contacts_search(Apollo plugin) →find-and-enrich-contacts-at-company(Clay) — Gate Q を通過した連絡先のみにウォーターフォールを実行。- 配信: コンタクトカード + サマリー行。リクエストがコールリストの場合はリードごとに Gmail
create_draft(Gate D)、またはsequence-load-skillへの CSV ハンドオフ。 </quick_start>
<house_rules>
顧客対応スキルです。出力前に、ゲートを順番に実行します (詳細: /.claude/skills/epiphan-house-rules-skill/reference/gates.md):
S: 製品に関する主張の前に search_product_catalog (Epiphan AI) または Epiphan Knowledge 検索。 B: 顧客対応のすべての文字列に対して check_my_copy。
Q: 候補の抽出直後、ティアリング/エンリッチ/ドラフトの前に qualify_lead。 D: アウトバウンドテキストは Gmail ドラフトになり、送信されることはありません。
識別子 (オーナー ID、ポータル、メール、シート) はそのスキルの reference/identifiers.md から取得します — ここに再掲しないでください。
ゲートが失敗した場合は reference/self-healing.md に従い (リトライ、フラグ付きでデグレード、Tim へのアラート、停止)、/.claude/skill-runs/.jsonl に行を追記します。
</house_rules>
<success_criteria>
- 最初に HubSpot を検索 (連絡先がすでに存在するか確認)
- エンリッチ前にすべての候補に対して
qualify_leadを実行 — 顧客、チャネルパートナー、製品のみのエンゲージャー、アクティブな AE 所有、抑制済み、非 NA は除外。陳腐化した AE リードはSTALE AE LEADとして表面化 - HubSpot が結果を返さず、かつ Gate Q を通過した場合のみ Apollo ウォーターフォールを実行
- Apollo にメールしかない場合は電話/LinkedIn のために Clay エンリッチを実行
- ATL/BTL ティアは
qualify_leadの判定から取得 (インラインのキーワードマッチングは行わない) - HubSpot レコード URL 付きのコンタクトカード出力。除外/抑制件数を含むサマリー行
- 空の結果とツールエラーをサマリーとサイドカーで区別
- アウトカムサイドカー + 実行ログ行を書き込み
</success_criteria>
Stage 1: 最初に HubSpot を検索
MCP ツール: mcp__claude_ai_Epiphan_Ai__hubspot_search_contacts
Search by: company name OR person name OR email domain
Return: contactId, firstName, lastName, email, phone, jobtitle, hubspot_owner_id,
lifecyclestage, device_count, bdr_suppression_until, last_activity_date, country
見つかったかどうかに関わらず、すべての候補 (既存レコードまたは検索対象そのもの) は Stage 2 に進みます。この時点で対象企業が既存の顧客に解決される場合は、停止し、Tim に伝え、エンリッチしないでください。
ステージ 2: ゲート Q — qualify_lead (重複排除、ティア、抑制の信頼できる唯一の情報源)
MCP ツール: mcp__claude_ai_Epiphan_Ai__qualify_lead — 候補コンタクトごとに 1 回の呼び出し(またはロールを探している場合は企業ごとに 1 回、その後、返された人物ごとに再度)。
判定は、この順序で決定します:
- 除外 — 既存顧客、チャネルパートナー、製品のみのエンゲージャー、AE 所有でアクティビティが 90 日未満、抑制済み、または米国/カナダ外(リクエストが別の地域を指定している場合を除く)。
- STALE AE LEAD — AE 所有でアクティビティが 90 日超(Lex と Phil は北米のみ): ティアと推奨アクションを添えて Tim に提示します。Tim が判断します。彼がそう言うまでエンリッチしないでください。
- ティア —
power_levelの atl / btl / unknown がカード上の ATL/BTL ティアです。unknown→ 手動レビューのためGRAYとマークします。キーワードテーブルを再実装しないでください。それらは CLAUDE.md にあります。
ゴールデンルールの詳細と AE オーナー ID: ~/.claude/skills/epiphan-house-rules-skill/reference/gates.md および reference/identifiers.md。qualify_lead はデフォルトでドライランです — このスキルから writeToHubSpot: true を絶対に渡さないでください。
1 回のリトライ後も qualify_lead が利用できない場合: このハントを停止し、「Gate Q unavailable」を報告し、Tim に警告します。ゲートが確認していないリストは決して出力されません。
HubSpot で見つかりゲート Q を通過したコンタクトはステージ 4 へスキップします(すでに十分にエンリッチされています)。HubSpot の一致がないロールハントはステージ 3 へ続きます。
ステージ 3: エンリッチメントウォーターフォール(ゲート Q 通過のみ)
MCP ツール: mcp__plugin_sales_apollo__apollo_contacts_search
Search by: person_title OR organization_name
Filters: country IN [US, CA], seniority IN [director, vp, c_suite, owner]
Limit: 10 results
Apollo から返された新規人物は、さらにエンリッチされる前、または表示される前に、ステージ 2 (qualify_lead) を再度通過します。
Apollo にメールがあるが電話がない場合 → Clay エンリッチメントを実行します:
MCP ツール: mcp__claude_ai_Clay__find-and-enrich-contacts-at-company
company: [company name]
title_keywords: [from search parameters]
enrich_phone: true
ティアのはしご: あるティアで結果なし → 次のティアへ。すべてのティアが空 → ティアごとの理由を添えてゼロを報告します(「Apollo: 0 matches」、「Clay: no phone」)。エラーになったティア(認証、レート制限、タイムアウト)は 1 回リトライし、その後はスキップしてサマリーで名前を挙げます — 「0 found」として報告しないでください。 メールパターンの推測なし、ウェブダーキングなし: 検証済みの情報源のみ(HubSpot、Apollo、Clay)。
ステージ 4: 出力コンタクトカード
ゲート Q を通過した各コンタクトについて、1 枚のカードを出力します(単一フォーマット):
┌─────────────────────────────────────────────────────┐
│ JOHN SMITH [ATL — VP] │
│ VP of Engineering @ Acme Corp │
├─────────────────────────────────────────────────────┤
│ Email: [email protected] (Apollo, verified) │
│ Phone: +1 (415) 555-0123 (Clay waterfall) │
│ LinkedIn: linkedin.com/in/johnsmith │
│ Location: San Francisco, CA │
├─────────────────────────────────────────────────────┤
│ HubSpot: <contact URL per identifiers.md> │
│ Owner: Unowned (eligible for BDR outreach) │
│ Qualify: pass · tier ATL · not suppressed │
└─────────────────────────────────────────────────────┘
一括出力(シーケンスロード用の CSV フォーマット):
First,Last,Title,Company,Email,Phone,LinkedIn,ATL_Tier,HubSpot_ID
John,Smith,VP Engineering,Acme Corp,[email protected],+14155550123,linkedin.com/in/johnsmith,ATL,{id}
各ハント後のサマリー行:
Found: [N] contacts | [A] ATL | [G] Gray | [B] BTL | [X] excluded by qualify_lead | [S] stale AE surfaced | tiers skipped: [none|Apollo error|Clay error]
ステージ 5: 配信(ゲート D)
- コールリストリクエスト(「コンタクトを探してアウトリーチを設定して」): すべてのカードについて、
[email protected]からmcp__claude_ai_Gmail__create_draft経由で Gmail の下書きを準備します。下書き内の製品ラインはまずゲート S を通過します。本文はcheck_my_copy(ゲート B)を通過します。絶対に送信しないでください。 - シーケンスリクエスト: CSV を
sequence-load-skillに渡します(確認優先の登録)。 - 検索のみ: カード + サマリー行、下書きなし。
コンプライアンス: すべてのデータは HubSpot(既存の CRM レコード)、Apollo(公開の専門データ)、または Clay(検証済みエンリッチメント)から取得されます。スクレイピングは行いません。アウトリーチでは CAN-SPAM に従ってください。
<self_healing>
partial = カードは生成されたが、あるステージが低下した場合: エンリッチメントティアがエラーになりスキップされた、Clay が電話を返さなかった、下書きでゲート B/S がスキップされた([brand check skipped] / [spec unverified] を先頭に付けます)。error = カードもなく、理由付きのゼロサマリーもない場合(HubSpot 検索がリトライ後も失敗した、または入力を人物/企業に解決できなかった)。halt = qualify_lead が利用不可 → 停止し、Tim に警告し、状態を書き込みます。はしごは ~/.claude/skills/epiphan-house-rules-skill/reference/self-healing.md に従います: 1 回リトライ → フラグを付けて低下 → Tim に警告 → 停止。実行ごとに 1 行を ~/.claude/skill-runs/contact-hunter-skill.jsonl に追記します。
</self_healing>
結果サイドカーの出力
最終ステップとして、~/.claude/skill-analytics/last-outcome-contact-hunter-skill.json に書き込みます:
{"ts":"[UTC ISO8601]","skill":"contact-hunter-skill","version":"<frontmatter version>","variant":"default",
"status":"[success|partial|error]","runtime_ms":[estimated ms from start],
"metrics":{"contacts_searched":[n],"contacts_found":[n],"phones_found":[n],"emails_found":[n],"excluded_by_qualify":[n],"stale_ae_surfaced":[n],"tiers_errored":[n]},
"error":null,"session_id":"[YYYY-MM-DD]"}
一部のステージが失敗しても結果が生成されている場合は、ステータスに「partial」を使用してください。error にはステージ名を指定する必要があります。出力がまったく生成されなかった場合にのみ「error」を使用してください。