mcpField
G
get-qualified-leads-from-luma

get-qualified-leads-from-luma

github.com/gooseworks-aiマーケティング・グロース1.3k48 回インストール3 日前に更新
リポジトリ

get-qualified-leads-from-luma について

Luma のイベントを検索し、参加者と主催者を集めて ICP に基づき評価するマーケティングスキルです。結果を Google Sheets にまとめ、Slack で有望なリードを通知できます。

主な機能

  1. 01トピックと場所で Luma イベントを検索
  2. 02参加者データを収集して重複を削除
  3. 03ICP に基づきリードを一括評価
  4. 04結果を Google Sheets に記録
  5. 05有望なリードを Slack で通知

活用シーン

  1. 01最近の業界イベントから見込み客を探す
  2. 02既存の ICP プロンプトで参加者を評価
  3. 03有望なリードを共有して営業チームに通知

MCP 対応

Google Sheets への記録と Slack 通知のため、Rube MCP で各サービスのツールを検索して使用します。

インストール

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

$npx skills add https://github.com/gooseworks-ai/goose-skills --skill get-qualified-leads-from-luma

インストール後、Claude Code で/get-qualified-leads-from-lumaを入力して読み込まれたか確認します。

同梱ファイルskill.meta.json

詳細

Luma イベントから有望なリードを獲得する

Luma でトピックと場所を指定してイベントを検索し、参加者と主催者をすべて抽出して、ICP に照らして適格性を評価します。その後、Google スプレッドシートにエクスポートし、有望なリードを Slack で通知します。

これは、luma-event-attendees、lead-qualification、Google Sheets への出力、Slack 通知を連携させた 5 ステップのパイプラインです。

ステップ 0:検索条件を明確にする

何かを始める前に、以下の質問への回答が明確になっていることを確認します。ユーザーのプロンプトですでに回答されている場合は、次に進みます。そうでない場合は、質問します。

  1. 場所 — どの地域のイベントを対象にしますか?(例:「San Francisco」、「New York」、「London」)
  2. トピック/キーワード — どのようなイベントのトピックを対象にしますか?対象を広げるため、キーワードのバリエーションを 3~5 個提案します。たとえば、ユーザーが「growth marketing」と指定した場合は、「GTM」、「demand gen」、「startup growth」、「growth hacking」、「marketing leadership」も提案します。
  3. 期間 — どのくらい最近のイベントを対象にしますか?(例:「過去 2 週間」、「過去 1 か月」、「今四半期」)。ユーザーが指定しない場合は、過去 30 日間をデフォルトにします。Luma の検索では数か月前や数年前のイベントが返されることがあるため、古い結果を避けるために必ず期間を確認します。
  4. 適格性評価プロンプト — ユーザーは skills/lead-qualification/qualification-prompts/ に既存の適格性評価プロンプトを持っていますか?ない場合、ユーザーの ICP の概要を確認します。(lead-qualification のインテークモードを使って作成できます)
  5. Slack チャンネル/Webhook — 通知の送信先はどこですか?Webhook URL または Slack チャンネル名を指定します。
  6. Slack 通知に含める有望なリードの件数はいくつですか?(デフォルト:5)

番号付きリストで提示します。ユーザーは一度にまとめて回答できます。

ステップ 1:Luma を検索して参加者を抽出する

対象を広げるため、複数のキーワードのバリエーションを使って luma-event-attendees スキルを実行します。

検索を並列実行する

ユーザーのトピックと場所を組み合わせたキーワードのバリエーションを 3~5 個作成します。それらをすべて並列で実行します。

# Run each search variation in parallel
python3 skills/luma-event-attendees/scripts/scrape_event.py --search "AI San Francisco" --output /tmp/luma_search_1.csv
python3 skills/luma-event-attendees/scripts/scrape_event.py --search "Growth Marketing San Francisco" --output /tmp/luma_search_2.csv
python3 skills/luma-event-attendees/scripts/scrape_event.py --search "GTM San Francisco" --output /tmp/luma_search_3.csv
期間で絞り込む

結果を収集した後、event_date 列を使って、ユーザーが指定した期間外のイベントを除外します。Luma の検索ではすべての期間のイベントが返されるため、古いリードを避けるにはこの手順が不可欠です。期間が指定されていない場合は、過去 30 日間をデフォルトにします。

重複を除去する

名前を基準に(大文字と小文字を区別せずに)統合し、重複を除去します。None の名前は適切に処理し、名前がないエントリーはスキップします。

重複を除去した結果を CSV として保存します。

/tmp/luma_all_attendees.csv

ユーザーに以下を報告します。

  • 重複除去前の結果の合計件数
  • 重複除去後のユニークな人物の件数
  • LinkedIn プロフィールがある人物の件数
  • 対象となったイベントの件数

ステップ 2:参加者データを CSV に保存する

パイプライン全体を通して CSV を使用します。大規模なデータセットを処理の途中で Sheets に書き込むと時間がかかり、エラーも発生しやすいため、Google Sheets の作成は最後(ステップ 4)にのみ行います。

ステップ 1 の CSV(/tmp/luma_all_attendees.csv)を作業ファイルとして使用します。列には以下を含めます。

nameevent_rolebiotitlecompanylinkedin_urltwitter_urlinstagram_urlwebsite_urlusernameevent_nameevent_dateevent_url

ステップ 3:リードの適格性を評価する

lead-qualification スキル(モード 2:プロンプトを再利用)を使って、すべての参加者の適格性を評価します。

バッチを準備する
  1. ユーザーが指定したファイルから適格性評価プロンプトを読み込みます(例:skills/lead-qualification/qualification-prompts/ai-event-attendees-gtm.md)
  2. 参加者を 1 バッチあたり約 15~20 件のリードに分割します。
  3. 各リードには、id(行番号)、name、event_role、bio、title、company、linkedin_url、event_name を含めます。
適格性評価を並列実行する

sonnet モデルのサブエージェントを使用し、Task ツールで全バッチを同時に起動します。

Task: "Qualify leads batch 1/N"
  - Include the full qualification prompt text
  - Include the batch of leads as JSON
  - Ask for output as JSON array: [{id, name, qualified, confidence, reasoning}]

Task: "Qualify leads batch 2/N"
  ... (launch ALL at once)
結果を統合する
  1. すべてのバッチ結果を収集します
  2. 元の ID を保持したまま、1 つの JSON 配列に統合します
  3. 条件を満たすリードを信頼度の高い順(高、中、低)に並べ替えます
  4. 結果を保存します:
    • /tmp/all_qual_results.json — 全 195 件の結果
    • /tmp/qualified_leads.json — 条件を満たすリードのみ。信頼度順に並べ替え済み

ユーザーに以下を報告します:

  • 処理したリードの合計数
  • 条件を満たすリードの件数と割合
  • 信頼度レベル別の内訳(高/中/低)
  • 主な除外理由

ステップ 4:結果を含む Google スプレッドシートを作成する

すべてのデータ(生の参加者データと判定結果の両方)を含む Google スプレッドシートを作成します。

Google スプレッドシートには Rube MCP を使用する
  1. RUBE_SEARCH_TOOLS を使用して Google スプレッドシートのツールを探します(「google sheet create」で検索)
  2. Luma Leads - [Topic] - [Date] という名前で新しいシートを作成します
  3. シート 1(「All Attendees」): 元の列に加えて、すべての参加者の行を書き込みます:
    • Qualified — Yes/No
    • Confidence — High/Medium/Low
    • Reasoning — 2~3 文の説明
  4. シート 2(「Qualified Leads」): 条件を満たすリードのみを信頼度順に並べて記載します
大規模データセットの書き込み方法

Google スプレッドシート API は大規模なデータセットでは処理が遅くなる場合があります。次の方法を使用します:

  • まずヘッダー行を書き込みます
  • バッチ更新操作を使い、50 行ずつデータを書き込みます
  • チャンクの書き込みに失敗した場合は、次に進む前に一度再試行します
代替手段

Rube/Sheets を利用できない場合は、CSV として保存します:

/tmp/luma_qualified_leads_[date].csv

Google スプレッドシートのリンク(または CSV のパス)をユーザーに提示します。

ステップ 5:Slack アラートを送信する

条件を満たすリードのうち上位 N 件(デフォルト:5 件。ユーザーが指定した場合はその件数)を含む、書式設定済みの Slack メッセージを送信します。

ユーザーが Webhook URL を提供した場合

Python の urllib.request を使って Webhook に POST します:

import json
import urllib.request

message = {
    "blocks": [
        {"type": "header", "text": {"type": "plain_text", "text": "Top N Qualified Leads from [Topic] Events"}},
        {"type": "section", "text": {"type": "mrkdwn", "text": "_From X attendees across Y events, Z qualified (P%). Here are the top N:_"}},
        # For each lead:
        {"type": "section", "text": {"type": "mrkdwn", "text": "*1. Name* [Confidence]\n   LinkedIn: url\n   Bio: ...\n   Why: reasoning"}},
        {"type": "divider"},
        # Link to spreadsheet at the bottom
        {"type": "section", "text": {"type": "mrkdwn", "text": "<sheet_url|View full spreadsheet> (X attendees, Y qualified)"}}
    ]
}

req = urllib.request.Request(webhook_url, data=json.dumps(message).encode(), headers={"Content-Type": "application/json"})
urllib.request.urlopen(req)
ユーザーが Rube MCP 経由での Slack 送信を希望する場合

RUBE_SEARCH_TOOLS を使って Slack ツールを探し、SLACK_SEND_MESSAGE または同等のツールで送信します。

メッセージの形式

Slack アラートには、上位のリードごとに以下を含めます:

  • 名前と信頼度レベル
  • LinkedIn URL(クリック可能)
  • プロフィール — 1 行でまとめた概要
  • 理由 — 判定理由(必要に応じて約 150 文字に短縮)

最後に、Google スプレッドシート全体へのリンクを記載します。

費用の目安

項目費用
Luma スクレイパー(Apify)月額定額サブスクリプション $29
LinkedIn の情報拡充(任意)リード 100 件あたり約 $0.03
Google スプレッドシート無料(Rube/Composio 経由)
LLM による判定1 回あたり約 $0.10~0.30(バッチサイズによって異なります)
Slack Webhook無料

一般的な実行例: 3~5 種類の検索パターンで約 200 人の参加者を処理する場合、実質的な費用は Apify のサブスクリプションと数セント分の LLM トークンのみです。

プロンプトの例

既存のプロンプトを使った簡易実行:

「SF の AI とグロース関連イベントから条件を満たすリードを探してください。ai-event-attendees-gtm の判定プロンプトを使ってください。上位 5 件を Slack Webhook に送信してください:https://hooks.slack.com/...」

詳細な指定:

「ニューヨークのスタートアップ、SaaS、AI 関連イベントを Luma で検索してください。参加者をすべて抽出し、当社のシリーズ A 創業者 ICP に照らして判定してください。すべての情報を Google スプレッドシートにまとめ、上位 10 件を Slack で私に送ってください。」

最小限の指定(確認の質問が行われます):

「SF のテックイベントからリードを探してください」

トラブルシューティング

Apify トークンが設定されていない
export APIFY_API_TOKEN="your_token"
# Or check skills/luma-event-attendees/.env
ゲストが見つからない

Luma のイベントによっては、show_guest_list が無効になっています。Apify スクレイパーで注目ゲストを取得することはできますが、すべてのイベントで参加者全員のリストを取得できるとは限りません。

Google スプレッドシートへの書き込みが遅い

大規模なデータセットでは通常の動作です。このスキルでは 50 行ずつデータを書き込みます。処理が遅すぎる場合や失敗した場合でも、結果は常に /tmp/ 内の CSV から確認できます。

Slack Webhook がエラーを返す

Webhook URL が正しいこと、および Slack アプリがワークスペースにインストールされていることを確認してください。簡単な curl コマンドでテストできます:

curl -X POST -H 'Content-Type: application/json' -d '{"text":"test"}' YOUR_WEBHOOK_URL

コメント