mcpField
A
apify-verified-email-finder

apify-verified-email-finder

github.com/apifyマーケティング・グロース283271 回インストール5 週間前に更新
リポジトリ

apify-verified-email-finder について

確認済みのビジネス用メールアドレスを探すスキルです。地域検索、検索キーワード、既存のURLリストに応じてApify actorを選び、同じ実行内でリード情報の補完とメール検証を行います。結果の絞り込み、重複排除、出力にも対応します。

主な機能

  1. 01入力に応じたApify actorの選択
  2. 02リード情報の補完とメール検証
  3. 03検証状態による結果の絞り込み
  4. 04重複排除とCSV・JSON出力

活用シーン

  1. 01地図の掲載情報からビジネス連絡先を探す
  2. 02検索結果のサイトからメールを探す
  3. 03既存URLリストのメールを補完・検証する

MCP 対応

Apify MCP サーバー接続時は、`call-actor`でactorを実行し、`get-dataset-items`で結果を取得します。スクリプトとCLIによる実行方法にも対応します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/apify/awesome-skills --skill apify-verified-email-finder

インストール後、Claude Code で/apify-verified-email-finderを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples/
example-maps-input.md
example-search-input.md
example-url-list-input.md
reference/
apify-actor-usage.md
output-formats.md
troubleshooting.md
reference/scripts/
package.json
run_actor.js

詳細

認証済みメールアドレスの検索

ユーザーの入力に応じて適切な Apify Actor にルーティングし、リードのエンリッチメントとメールアドレス検証のアドオンを有効にして、1 回の実行で認証済みのビジネスメールアドレスのリストを返します。サードパーティの検証サービス(Hunter、NeverBounce、Apollo)は不要です。検証は同じ Actor の実行内で行われます。

前提条件

(事前に確認する必要はありません)

このスキルでは、2 つの実行方法をサポートしています。環境に合った方法を選んでください。ステップ 4 と 5 には、両方の方法のコマンドが記載されています。

MCP の方法(Claude セッションでのデフォルト、推奨)。 Apify MCP サーバーが接続されていれば、セットアップは不要です。認証はユーザーの Apify アカウントを通じて行われます。call-actor と get-dataset-items の MCP ツールを使用してください。

スクリプトの方法(CLI/スケジュール実行/Claude 以外での実行)。 以下が必要です。

  • APIFY_TOKEN を含む .env ファイル
  • Node.js 20.6 以降(ネイティブの --env-file サポート用)

ワークフロー

このチェックリストをコピーし、進捗を記録してください。

Task Progress:
- [ ] Step 1: Collect the six required anchor inputs
- [ ] Step 2: Route to the correct Actor (confirm if ambiguous)
- [ ] Step 3: Build the Actor input (verification always ON)
- [ ] Step 4: Run the Actor and wait
- [ ] Step 5: Apply the result-scope filter, deduplicate, and render
ステップ 1:必須の基点となる 6 つの入力を収集する

Actor を呼び出す前に、6 つすべてをひとまとまりで質問してください。Actor 固有の任意項目(国コード、言語、最大ページ数)はこの質問に含めず、追加質問として確認してください。

  1. 最初に何をお持ちですか? — location query/SERP keyword/URL list。これを基にルーティング先を決定します。
  2. 実際の入力 — 場所を表す文字列、キーワード、または URL そのもの。
  3. 部門フィルター — 次のいずれか 1 つ以上:c_suite、product、engineering_technical、design、education、finance、human_resources、information_technology、legal、marketing、medical_health、operations、sales、consulting。デフォルトは any(配列を空のままにする)ですが、毎回確認してください。
  4. ドメイン/ビジネスあたりの連絡先の最大数 — maximumLeadsEnrichmentRecords として渡します。デフォルトは 3 ですが、毎回確認してください。
  5. 出力形式 — CSV または JSON。毎回確認してください。
  6. 結果の範囲 — 成果物に残すリードを指定します。Actor の実行方法は常に同じです(検証は常に有効)。この項目で制御するのは、実行後のフィルタリングのみです。次のいずれかを選びます。
    • verified-only(デフォルト) — emailVerification.result == "ok" のリードのみ。コールドメールに最も安全です。
    • verified-plus-catchall — ok と catch_all。キャッチオールは配信できる場合が多いものの、検証できません。
    • all-emails — 検証結果にかかわらず、空でない email を持つリード。
    • with-phone — メールアドレスの状態にかかわらず、空でない電話番号を持つリード。電話キャンペーンで使用します。
    • everything — 不完全なものも含め、Actor が返したすべてのリード。
ステップ 2:適切な Actor に振り分ける

アンカー #1 を確認して、Actor を選択します。

ユーザーが最初に指定する内容Actor ID使用する場面
場所 + 業種(「ベルリンの歯科医」)compass/crawler-google-placesMaps の掲載情報から地域の見込み客リストを作成する場合。住所、電話番号、営業時間も必要なときに最適です
キーワード / 検索クエリ(「おすすめの CRM ソフトウェア」)apify/google-search-scraperあるトピックについて、Google が上位に表示するサイトから連絡先を取得する場合
既存の URL リスト(貼り付け、ファイルパス)vdrmota/contact-info-scraperユーザーがすでにドメインを把握している場合。探索ステップが不要なため、最も安価な方法です

3 つの Actor はすべて同じ 3 つの追加フィールドを共有しているため、検証の動作はどのルートでも同じです。

判断例

ユーザーの発言ルート
「ミュンヘンの歯科医」/「プラハの弁護士」Maps
「『AI agent builder』の上位検索結果にあるマーケティング担当者の連絡先」検索
「この 5 つの URL のメールアドレスを探してください:acme-co.example、demo-co.example...」URL リスト
「Fortune 500 企業の人事担当者の連絡先を探してください」質問:「Fortune 500 HR」の SERP を使いますか、それとも URL リストを使いますか?
「ベルリンの SaaS 企業の連絡先を探してください」質問:「ベルリンの SaaS 企業」で Maps を使いますか、それとも「SaaS 企業 Berlin」の SERP を使いますか? Maps は、企業が Google Maps に掲載されている場合に最適です。
(ユーザーが SERP キーワードと URL リストの両方を貼り付ける)**質問:**どちらか一方のルートを実行しますか、両方を別々の成果物として実行しますか?

曖昧さに関するルール:アンカー #1 が不明確な場合は、実行前に一度だけ追加質問します。推測したルートで Actor の計算リソースを決して消費しないでください。

**複数ルートの成果物:**ユーザーが 1 つの成果物に 2 つのルートを明示的に求めている場合は、両方の Actor を実行して結果を連結します。Source 列で各データの出所を明確にし、統合した出力内でメールアドレスを基準に重複を除去します。

ステップ 3:Actor の入力を作成する

選択した Actor にかかわらず、常に次の 3 つのフィールドを設定します。

フィールド値
maximumLeadsEnrichmentRecordsアンカー #4(デフォルトは 3、最小値は 1)
leadsEnrichmentDepartmentsアンカー #3 を配列として指定。「任意」の場合は []
verifyLeadsEnrichmentEmailstrue(常に指定)— セーフガードとして、false は決して設定しないでください

Actor ごとの全入力パラメーターとペイロードの例は、reference/apify-actor-usage.md に記載されています。

URL リストの事前検証:vdrmota/contact-info-scraper に URL を送信する前に、それぞれを解析し、http/https であり、解析可能であることを確認します。スキップしたエントリーは、出力に skipped — invalid URL と記載し、決して黙って除外しないでください。

ステップ 4:Actor を実行する

リードエンリッチメントを含む Maps と SERP の実行は、クエリごとに数分かかる場合があります。大規模なジョブではタイムアウトを延長してください。

MCP 経由(Claude セッションでのデフォルト):

call-actor ツールを呼び出します。

  • actor:3 つの Actor ID のいずれか(compass/crawler-google-places、apify/google-search-scraper、vdrmota/contact-info-scraper)
  • input:ステップ 3 の JSON ペイロード
  • callOptions:十分な上限を設定するには {"timeout": 1800, "memory": 4096}

このツールは runId と datasetId を返します。status がまだ RUNNING の場合は、get-actor-run を呼び出し、waitSecs を最大 45 にして、SUCCEEDED になるまでポーリングします。run_metadata.json サイドカーに記録するため、両方の ID を保存してください。

スクリプト経由(CLI / スケジュール実行):

node --env-file=.env ${CLAUDE_PLUGIN_ROOT}/reference/scripts/run_actor.js \
  --actor "ACTOR_ID" \
  --input 'JSON_INPUT' \
  --output YYYY-MM-DD_verified-emails.csv \
  --format csv \
  --timeout 900

JSON を使用するには --format json を指定します。スクリプトは未加工のデータセットをディスクに書き込みます。ステップ 5 では、その後に誤一致と対象範囲のフィルターを適用します。

ステップ 5:フィルタリング、重複排除、レンダリング

データセットを取得します。

  • MCP 経由: ステップ 4 の datasetId を指定して get-dataset-items を呼び出します。レスポンスを小さく保つため、fields パラメーター(例:title,searchString,countryCode,city,address,phone,website,leadsEnrichment)と clean: true を使用します。それでもレスポンス上限を超えるデータセットは、curl https://api.apify.com/v2/datasets/<id>/items?fields=...&clean=true で直接取得し、jq に渡して処理します。
  • スクリプト経由: 生データセットは、すでにステップ 4 のファイルとしてディスク上にあります。

各レコードには、事業者のフィールドに加えて、leadsEnrichment 配列(Maps、SERP)またはトップレベルのリードフィールド(URL リスト)が含まれます。各リードには departments 配列、companyWebsite、および result(ok / invalid / disposable / catch_all / unknown / error)と quality(good / risky / bad)を含む emailVerification オブジェクトがあります。

  • 誤マッチのフィルター(必須、常に有効)。 ほかのフィルターより先に必ず適用します。リードエンリッチメントサービスは、該当する地域のマッチがない場合に、グローバルなフォールバックリードを返すことがあります(実際に確認されたケース:米国の動物園 1 件の CFO の companyWebsite=zoo.org が、マッチャーが zoo の部分文字列に反応したため、無関係なポーランドの動物園 8 件に紐付けられました)。companyWebsite のホスト名がソース URL のホスト名と一致しないリードはすべて除外します(https?://、先頭の www.、および / 以降を取り除き、小文字にします)。除外件数を run_metadata.json に記録し、0 件でない場合は納品物のヘッダーにも明記します。

  • 結果スコープによるフィルター(アンカー #6)。2 番目に適用します。

    スコープ行を保持する条件
    verified-onlyemailVerification.result == "ok"
    verified-plus-catchallemailVerification.result in {"ok", "catch_all"}
    all-emailsemail が空でない(検証結果を問わず、未検証も含む)
    with-phonephone(または会社の電話番号)が空でない(メールの有無を問わない)
    everythingすべてのリードを保持し、フィルターを適用しない
  • 重複排除: 小文字にしたメールアドレスでグループ化し、最初の出現を保持します。同じメールアドレスが複数のソースから見つかった場合は、Source Query or URL を統合します。メールアドレスがない with-phone の行は、小文字にした電話番号で重複排除します。

  • 結果が空の場合の表示: 部門フィルター(アンカー #3)によって特定のドメインのリードが 0 件になった場合、そのドメインの行を Email = ""、Email Verification Status = "no leads matched filter" として含めます。黙って除外してはいけません。これは上記の結果スコープフィルターとは別の処理です。結果が空のドメインの行は、スコープフィルターを適用する前に挿入し、常に表示します。

出力行のスキーマ(Departments を含む 16 列)と形式ごとのレンダリング方法については、reference/output-formats.md を参照してください。

作業例

品質ルール(常に適用)

  • ガードレール: verifyLeadsEnrichmentEmails: false を指定して実行してはいけません。
  • 出所と追跡可能性: すべての行の Source 列に値を入力し、Apify の runId と datasetId を run_metadata.json に記録します。
  • 捏造の禁止: データセットにないフィールドは空欄のままにします。
  • 納品物ヘッダーの透明性: 適用中の結果スコープと誤マッチの除外件数を明記し、別のスコープでの再レンダリングを提案します。
  • 曖昧さの確認: アンカー #1 が不明確な場合は、実行前に確認します。

費用と料金

メール検証で料金が発生するのは、判定が確定した結果(ok / invalid / disposable)のみです。catch_all / unknown / error は無料です。リードエンリッチメントは、抽出に成功したリードごとに課金されます。最新の料金は Apify コンソールで確認してください(料金はサブスクリプションのティアによって異なり、随時変更されます)。

エラー処理

reference/troubleshooting.md を参照してください。

コメント