mcpField
D
dataforseo-serp

dataforseo-serp

github.com/illyismマーケティング・グロース1.2k157 回インストール3 日前に更新
リポジトリ

dataforseo-serp について

Googleのライブ検索結果を基にSEOワークフローを実行するスキルで、キーワード、ツール、コンテンツ、AI検索での可視性を計画するチーム向けです。URL重複によるクラスタリングやAI引用元の分析など、リポジトリに成果物を残す4つのワークフローを定義します。

主な機能

  1. 01ライブ検索結果の確認
  2. 02URL重複に基づくキーワード分類
  3. 03流入価値による無料ツール候補の選別
  4. 04AI引用元の抽出
  5. 05執筆前の検索意図確認

活用シーン

  1. 01共通のランキングURLでキーワードを分類
  2. 02無料ツールの候補テーマを選定
  3. 03AI回答の引用元を特定
  4. 04執筆前に検索意図を確認

MCP 対応

DataForSEOツールが利用できる場合、REST呼び出しと同じペイロードでMCP経由で実行します。言及や引用の追跡にはAI SEO Tracker MCPも記載されています。

インストール

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

$npx skills add https://github.com/illyism/seo-skills --skill dataforseo-serp

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

詳細

DataForSEO SERP ワークフロー

ライブ SERP だけが、あるクエリに対して Google が何を求めているかを示す唯一の信頼できる情報源です。埋め込み、キーワードツール、直感では検索意図を推測するしかありません。それを示すのが Top-10 URL です。以下の各ワークフローは、まず SERP を読み取り、最後にユーザーのリポジトリ内のファイルまたはルートを出力します。

実行時: 初回は接続方法とワークフローを伝えてから実行します。2回目以降は、すぐに出力を提示します。

ステップ 0:接続方法を選ぶ

Are DataForSEO tools in your tool list (serp, keywords_data, ai_optimization)?
├── Yes → use the MCP tools with the same payloads as the REST calls below.
└── No → are $DATAFORSEO_LOGIN and $DATAFORSEO_PASSWORD set?
    ├── Yes → use the `dfs` shell helper below (REST v3, Basic Auth).
    └── No → how many queries?
        ├── < 10 → live web search fallback. Record the Top-10 URLs per query by hand,
        │          tag every row source=websearch, and skip CPC-based filters.
        └── >= 10 → stop and ask for DataForSEO credentials.

クエリ数の上限を 10 件にしている理由:ウェブ検索結果はパーソナライズされ、不安定です。スポットチェックには問題ありませんが、キーワードリストのクラスタリングには適していません。SERP が 1 つでも誤っていると、2 つのクラスタが統合されてしまうためです。

REST ヘルパー
dfs() { # usage: dfs <endpoint> '<json array payload>'
  curl -sS -u "$DATAFORSEO_LOGIN:$DATAFORSEO_PASSWORD" \
    -H 'Content-Type: application/json' -X POST \
    "https://api.dataforseo.com/v3/$1" -d "$2"
}
mkdir -p seo/data/serp
すべての呼び出しでのルール
  • .status_code == 20000 と .tasks[0].status_code == 20000 の両方を確認します。理由:外側の呼び出しが成功していても、内部のタスクが失敗することがあり、空の result は SERP が空であるかのように見えてしまいます。
  • Live 呼び出しごとにタスクを 1 件だけ送信し、キーワードごとに 5〜10 件のリクエストを並列実行します。理由:Live エンドポイントは同じレスポンス内で結果を返すため、バッチ処理に利点はなく、キーワードが 1 つでも不適切だとバッチ全体が失敗します。
  • デフォルトは location_code: 2840(United States)、language_code: "en"、device: "desktop"、depth: 10 です。ユーザーが別の市場で販売している場合にのみ、ロケーションを変更します。
  • 生のレスポンスはすべて seo/data/serp/<slug>.json に保存します。.tasks[0].costを読み取り、累計額を記録します。支出がユーザー指定の予算、または予算が指定されていない場合は$5` を超えたら停止し、報告します。

ワークフロー A:SERP URL の重複によるキーワードクラスタリング(カニバリゼーション対策)

出力: seo/keyword-clusters.json + seo/content-map.md。

意味的クラスタリングがカニバリゼーションを引き起こす理由

LLM や埋め込みモデルは、共通する単語を基準にキーワードをグループ化します。Google は、共通する検索意図を基準にグループ化します。「invoice template」と「invoice generator」は単語が共通しているため、LLM では 1 つにまとめられます。しかし Google は、一方にはダウンロード可能なテンプレートを、もう一方には操作可能なツールを表示します。そのため、統合したページは 2 つの検索意図に対応しようとして、どちらでも成果を上げられません。逆のケースもあります。「invoicing software for freelancers」と「freelance billing app」は共通する単語がなく、別々のページに分けられますが、Google は同じ検索意図として扱うため、どちらも同じ Top-10 を巡って競合します。Google がクエリをどうグループ化するかを反映する唯一のシグナルは、ランキング URL の重複です。

手順
  1. シードキーワードごとに上位10件を取得します:

    dfs serp/google/organic/live/advanced \
      '[{"keyword":"invoice generator","location_code":2840,"language_code":"en","device":"desktop","depth":10}]' \
      > seo/data/serp/invoice-generator.json
    
    jq -r '.tasks[0].result[0].items[] | select(.type=="organic") | .url' seo/data/serp/invoice-generator.json
    
  2. URL を正規化します: ホスト名を小文字にし、www.、クエリ文字列、# フラグメント、末尾の / を削除します。理由:https://www.invoicekit.io/x/ と https://invoicekit.io/x は同じ結果であり、共有 URL としてカウントする必要があります。

  3. キーワードを検索ボリュームの降順で並べ替えます(指定されていない場合は、Workflow B の呼び出しからボリュームを取得します)。

  4. クラスターのヘッドとのみ比較して、貪欲にクラスタリングします。メンバーとは比較しません:

    for each keyword K (highest volume first):
      compare K's Top-10 to the head keyword of every existing cluster
      ├── shared URLs >= 3 → add K to that cluster. One single page targets both.
      ├── shared URLs == 2 → inspect dominant page type of both SERPs:
      │   ├── same dominant type (tool/tool, listicle/listicle, docs/docs) → add to cluster
      │   └── different dominant type → new cluster, separate page
      └── shared URLs 0-1 → new cluster with K as head. Build a separate page.
    

    ヘッドとのみ比較する理由:メンバー同士を比較するとクラスターが連鎖し(A と B が重複し、B と C が重複する一方で、A と C は何も共有しない)、1 つのページが 3 つの検索意図を対象にすることになってしまいます。

  5. 2 URL のタイブレーク用に、URL ごとにページタイプを分類します:

    • tool:URL またはタイトルに generator|calculator|checker|converter|maker|tool|free online が含まれる
    • listicle:タイトルが数字で始まる、または best|top|alternatives が含まれる
    • docs:パスに /docs/|/help/|/support/|/api/ が含まれる
    • forum:ドメインが reddit.com、quora.com、stackoverflow.com
    • product:パスが /、/pricing、または /features/...
    • blog:上記以外
  6. seo/keyword-clusters.json を作成します:

    [
      {
        "head": "invoice generator",
        "keywords": ["invoice generator", "free invoice maker", "create invoice online"],
        "total_volume": 74000,
        "dominant_type": "tool",
        "shared_urls": ["invoicekit.io/tools/invoice-generator", "billstack.io/invoice-generator"],
        "target_url": "/tools/invoice-generator",
        "existing_page": null
      }
    ]
    
  7. クラスターを既存のページに割り当てます。 リポジトリのルートとサイトマップを Grep で検索します。既存の 2 ページが 1 つのクラスター内のキーワードを対象としている場合は、統合としてフラグを立て、評価の低いページから 301 リダイレクトします。1 つの既存ページが 2 つのクラスターのキーワードを対象としている場合は、分割としてフラグを立てます。

  8. seo/content-map.md を作成します: クラスターごとに 1 行とし、ヘッドキーワード、キーワード数、合計ボリューム、優勢なタイプ、ターゲット URL、アクション(create、merge into、split、keep)を記載します。

合格基準: すべてのシードキーワードが必ず 1 つのクラスターに含まれています。複数のクラスターが同じ target_url を指していません。分割または統合のアクションがない限り、既存のページが複数のクラスターに含まれていません。

Workflow B:トラフィック価値に基づく無料ツールの選別

出力: seo/tool-specs.md と、足場を構築した最上位ツールのルート。

検索ボリュームだけでは判断できない理由

16 進数カラーのピッカーや汎用的な文字数カウンターは、月間検索数が 6 桁に達しても登録数はゼロです。検索ユーザーが求めているのは 3 秒で使えるユーティリティであり、予算も、あなたの製品が解決する問題もないためです。CPC は、どのクエリがコンバージョンにつながるかを、広告主が費用を投じて示す指標です。CPC >= $3 のツール系クエリは、その検索ユーザーから利益を得ている人がいることを意味します。最初のステップを解決する無料ツールを提供すれば、その検索ユーザーを登録につなげられます。

手順
  1. 検索ボリュームと CPC を取得します:

    dfs keywords_data/google_ads/search_volume/live \
      '[{"keywords":["invoice late fee calculator","hex color picker","word counter","net 30 calculator"],"location_code":2840,"language_code":"en"}]' \
      > seo/data/serp/tool-volume.json
    
    jq -r '.tasks[0].result[] | [.keyword, .search_volume, .cpc] | @tsv' seo/data/serp/tool-volume.json
    
  2. キーワードごとに traffic_value = cpc × search_volume を計算します。

  3. 絞り込みます:

    tool keyword
    ├── cpc >= 3 and volume >= 300 → BUILD candidate
    ├── cpc < 0.5 → REJECT regardless of volume. Vanity traffic.
    ├── 0.5 <= cpc < 3
    │   ├── the tool's output feeds the product's core action (calculator result → invoice) → BUILD candidate
    │   └── otherwise → REJECT
    └── volume < 300 → REJECT unless cpc >= 15 (high-ticket B2B)
    
  4. 検索結果ページがツールを求めていることを確認します: BUILD 候補ごとに Workflow D を実行します。上位5件のうち、インタラクティブなツールが 3 件未満の場合は、ガイドに格下げします。理由:記事が上位を占める検索結果ページ向けにツールを作ると、Google がその検索結果で評価しない形式に、スプリントを無駄に費やすことになります。

  5. traffic_value の降順で並べ替え、ツールごとに 1 ブロックずつ seo/tool-specs.md に記載します:

    ## Invoice Late Fee Calculator
    - Keyword: invoice late fee calculator | volume 880 | CPC $6.10 | value $5,368/mo
    - Route: /tools/late-fee-calculator
    - Inputs: invoice amount, days overdue, annual rate or flat fee
    - Output: fee owed, total due, copy-ready reminder text
    - Conversion hook: "Add this fee to an invoice" button → signup with amount prefilled
    - SERP format: 4 of Top-5 are calculators, median 350 words below the tool
    
  6. ユーザーのフレームワークで、1 位のツールのルートの足場を構築します:

    • クローラーが JS を実行せずにコンテンツを確認できるよう、H1、導入文、解説テキストをサーバー側でレンダリングします。
    • インタラクティブな部分は、ログイン不要でブラウザー内の計算を行うクライアントコンポーネントとして実装します。
    • CTA で結果を登録フローに引き継ぎます(クエリパラメーターまたはローカルストレージを使用)。これにより、ユーザーは作業内容が保存された状態で登録ページに移動します。
    • サイトマップに追加し、ホームページのフッターまたは /tools ハブから、関連する 2 ページへのリンクを追加します。

合格基準: seo/tool-specs.md に、すべての候補とその価値計算が記載され、除外した候補には理由が示されています。また、最上位のルートがレンダリングされ、ビルドが成功します。

ワークフロー C:AI Overview と LLM 引用元の抽出

出力: seo/citation-gaps.md(引用元ごとにすぐ実行できるアクションを1つ記載)

AI の回答では、少数のサードパーティページが引用されます。ユーザーがそのページに掲載されていなければ、AI の回答で名前が挙がることはありません。AI における可視性を最も手早く高める方法は、新しい記事を公開して期待することではなく、すでに引用されているページに掲載されることです。

  1. Google AI Overview の参照元を取得します(load_async_ai_overview は追加料金がかかり、ページの読み込み後に表示される Overview も取得できます)。

    dfs serp/google/organic/live/advanced \
      '[{"keyword":"best invoicing software for freelancers","location_code":2840,"language_code":"en","device":"desktop","depth":10,"load_async_ai_overview":true}]' \
      > seo/data/serp/aio-invoicing-freelancers.json
    
    jq -r '.tasks[0].result[0].items[] | select(.type=="ai_overview")
      | [.references[]?, (.items[]?.references[]?)] | .[]
      | [.domain, .url, .title] | @tsv' seo/data/serp/aio-invoicing-freelancers.json | sort -u
    

    ai_overview の項目がない場合、その地域でのそのクエリでは Google に Overview が表示されていません。none を記録して次に進みます。

  2. LLM の回答での引用を取得します(ウェブ検索を有効にします)。

    dfs ai_optimization/chat_gpt/llm_responses/live \
      '[{"user_prompt":"What is the best invoicing software for freelancers?","model_name":"gpt-4.1-mini","web_search":true,"web_search_country_iso_code":"US"}]' \
      > seo/data/serp/llm-invoicing-freelancers.json
    
    jq -r '.tasks[0].result[0] | [(.items[]? | select(.type=="message") | .sections[]?.annotations[]?), .search_results[]?] | .[] | select(.url != null) | [.title, .url] | @tsv' \
      seo/data/serp/llm-invoicing-freelancers.json | sort -u
    

    mini モデルで10個のプロンプトをまとめて実行すると、約 $0.10 かかります。製品ごとに購入検討者向けのプロンプトを10~20個実行します。「Y に最適な X」「X の代替製品」「X と Y の比較」「Z のやり方」などです。対応モデルは GET https://api.dataforseo.com/v3/ai_optimization/chat_gpt/llm_responses/models で一覧できます(注意:POST ではなく GET です)。アカウントで利用できるほかのエンジンでも同じ手順を繰り返します。

  3. 引用されたソースを分類し、アクションを割り当てます。

    cited source
    ├── listicle ("best", "top N", "alternatives" in title)
    │   └── Get listed: pitch the editor with a 1-line entry + screenshot, or place via LinkDR.
    ├── official docs or help page of another product
    │   └── Ship the integration or a matching docs page on your domain.
    ├── reddit.com thread
    │   └── Reply with disclosed, specific help. Build a page answering the same question.
    ├── youtube.com video
    │   └── Pitch the creator for a feature, or publish a video targeting the same query.
    ├── competitor domain
    │   └── Ship /vs/<competitor> and /alternatives/<competitor> pages.
    └── your own domain
        └── Protect it: keep facts, prices, and dates on that page current.
    
  4. seo/citation-gaps.md を作成します。

    | Prompt / Query | Engine | Cited URL | Type | You mentioned? | Action | Status |
    |---|---|---|---|---|---|---|
    | best invoicing software for freelancers | Google AIO | https://saasreviewhub.com/best-invoicing-tools | listicle | no | pitch editor / LinkDR | todo |
    

    プロンプト全体での引用数順に並べます。その理由は、10個のプロンプトのうち6個で引用された URL は、1回ずつ引用された6つの URL より価値が高いためです。

合格条件: 引用された URL のすべてにタイプとアクションが設定されています。3つ以上のプロンプトで引用された URL が先頭にあります。

継続的なモニタリング: このワークフローで取得できるのはスナップショットです。AI SEO Tracker(MCP:https://aiseotracker.com/api/agent/mcp)は、スケジュールに従ってプロンプトを再実行し、ChatGPT、Perplexity、Gemini、Copilot、Google AI Overviews での言及と引用を追跡します。リスト記事に掲載されるには: LinkDR は、AI Overviews が「最適な X」のクエリでよく参照するソースタイプである、サードパーティの SaaS リスト記事に製品を掲載します。

ワークフロー D:執筆前の SERP インテント確定

出力: どの草稿よりも先に作成する seo/intent-locks/<slug>.md。

SERP を読む前に草稿を書き始めると、検索結果の10件中8件が計算ツールであるクエリに、2,500語のエッセイを公開することになります。ロックファイルがゲートになります。ロックがなければ、草稿もありません。

  1. Top-10 を取得します(既存の場合はワークフロー A のキャッシュ済みファイルを再利用します)。Top-5 の type、title、url と SERP 機能の項目(featured_snippet、people_also_ask、video、ai_overview)を確認します。

  2. Top-5 の各ページを取得し、DOM シグナルを数えます。

    curl -sL -A "Mozilla/5.0" "$URL" > /tmp/p.html
    grep -oi '<input' /tmp/p.html | wc -l      # tool signal
    grep -oi '<table' /tmp/p.html | wc -l      # comparison signal
    grep -oi '<h2' /tmp/p.html | wc -l         # outline depth
    sed 's/<[^>]*>/ /g' /tmp/p.html | wc -w    # rough word count
    
  3. フォーマットを確定します。

    Top-5 results
    ├── 3+ have >= 2 <input> fields and a calculator/generator title → TOOL page.
    │   Tool above the fold, copy <= the median word count, placed below the tool.
    ├── 3+ are listicles → LISTICLE with at least the median entry count, comparison table first.
    ├── 3+ are docs/help → DOCS page: steps, code blocks, no marketing intro.
    ├── 3+ are product/pricing pages → LANDING page. Do not write a blog post.
    ├── 3+ are forum/video → experience piece with screenshots or a video embed.
    └── mixed → copy the format of positions 1-3.
    
  4. seo/intent-locks/<slug>.md を作成します。

    # Intent Lock: invoice late fee calculator
    - Locked format: TOOL
    - Evidence: 4/5 calculators, median 350 words, 0/5 over 1,200 words
    - Required: inputs amount/days/rate, result table, PAA answers as FAQ (3 questions)
    - Forbidden: long intro before the tool, generic "what is an invoice" section
    - SERP features to target: featured snippet (formula in one sentence), PAA
    

合格条件: キーワードに対応する草稿またはルートが存在するのは、ロックファイルがあり、公開ページが確定したフォーマットに一致している場合に限ります。

公開済み成果物チェックリスト

  • seo/data/serp/*.json 生のレスポンスと累計コスト
  • seo/keyword-clusters.json と seo/content-map.md
  • seo/tool-specs.md と、最上位ツールのルートのスキャフォールド
  • 引用された URL ごとに1つのアクションを記載した seo/citation-gaps.md
  • この PR のすべてのページに対応する seo/intent-locks/<slug>.md

関連項目

コメント