seo-cluster について
seo-clusterは、テキストの類似性ではなくGoogle検索上位結果の重なりに基づいてキーワードを分類し、コンテンツ構成を設計するスキルです。ハブ&スポーク案、内部リンク表、ブリーフ、操作可能なクラスターマップを作成します。
主な機能
- 01シードキーワードから候補を拡張
- 02検索上位結果の重なりでキーワードを分類
- 03検索意図を判定してハブ&スポーク構成を設計
- 04内部リンク表とコンテンツブリーフを作成
- 05操作可能なクラスターマップを生成
活用シーン
- 01シードキーワードからサイトのコンテンツ群を計画
- 02検索結果が異なるキーワードを切り分け
- 03ピラー記事とスポーク記事間の内部リンクを設計
- 04執筆予定記事のブリーフを準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill seo-clusterインストール後、Claude Code で/seo-clusterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/execution-workflow.mdhub-spoke-architecture.mdserp-overlap-methodology.md詳細
セマンティックトピッククラスタリング(v1.9.0)
SERP の重複に基づく、コンテンツ設計のためのキーワードクラスタリングです。テキストの類似性ではなく、Google の実際のランキング(トップ 10 の検索結果の共有状況)に基づいてキーワードをグループ化します。ハブ&スポーク型のコンテンツクラスターを設計し、内部リンクマトリックスを作成して、インタラクティブなクラスター マップを生成します。
スクリプト: プラグインのルートにある scripts/ ディレクトリに配置されています。
クイックリファレンス
| コマンド | 機能 |
|---|---|
/seo cluster plan <seed-keyword> | 計画の全ワークフロー:拡張、クラスタリング、設計、可視化 |
/seo cluster plan --from strategy | 既存の /seo plan の出力からインポート |
/seo cluster execute | 計画を実行:claude-blog を使ってコンテンツを作成するか、ブリーフを出力 |
/seo cluster map | インタラクティブなクラスターの可視化を再生成 |
計画ワークフロー
ステップ 1:シードキーワードの拡張
WebSearch を使って、シードキーワードを 30~50 個のバリエーションに拡張します。
- 関連検索 — シードを検索し、「関連検索」と「他のユーザーはこちらも検索」の項目を抽出します
- 他のユーザーはこちらも質問(PAA) — SERP の結果から PAA の質問をすべて抽出します
- ロングテール修飾語 — 一般的な修飾語を追加します:「best」、「how to」、「vs」、「for beginners」、「tools」、「examples」、「guide」、「template」、「mistakes」、「checklist」
- 質問の抽出 — who/what/when/where/why/how のバリエーションを生成します
- 検索意図の修飾語 — 商用の修飾語を追加します:「pricing」、「review」、「alternative」、「comparison」、「free」、「top」
重複排除: バリエーションを正規化し(小文字に変換し、冠詞を削除)、完全一致する重複を削除します。 目標は、重複のないキーワードバリエーションを 30~50 個にすることです。30 個に満たない場合は、上位の PAA の質問をシードとして 2 回目の拡張を実行します。
ステップ 2:SERP の重複によるクラスタリング
ここが、この手法の最大の差別化要因です。アルゴリズムの詳細については、
references/serp-overlap-methodology.md を読み込んでください。
プロセス:
- 最初に推定した検索意図に基づいてキーワードをグループ化します(ペアごとの比較を減らします)
- グループ内の各候補ペアについて、両方のキーワードを WebSearch で検索します
- オーガニック検索結果のトップ 10 に含まれる共有 URL の数を数えます(広告、強調スニペット、PAA は無視します)
- 次のしきい値を適用します。
| 共有する検索結果 | 関係 | 対応 |
|---|---|---|
| 7-10 | 同じ投稿 | 1 つのターゲットページに統合 |
| 4-6 | 同じクラスター | 同じスポーククラスターにグループ化 |
| 2-3 | 相互リンク | 隣接するクラスターに配置し、相互リンクを追加 |
| 0-1 | 別々 | 別のクラスターに割り当てるか、除外 |
最適化: キーワードが 40 個の場合、全ペアを比較すると 780 回になります。代わりに、次のようにします。
- 検索意図ごとに事前にグループ化します(約 10 個のグループを 4 つに分けると、4 x 45 = 180 回になります)
- グループの境界にあるキーワード同士のみを相互に確認します
- 同じヘッドタームのロングテールバリエーション同士のペアはスキップします(同じクラスターになると想定します)
DataForSEO との連携: DataForSEO MCP が利用可能な場合、SERP データの取得には WebSearch の代わりに serp_organic_live_advanced
を使います。各バッチの前に python scripts/dataforseo_costs.py check serp_organic_live_advanced --count N
を実行してください。"status": "needs_approval" の場合は、費用の見積もりを提示してユーザーに確認します。
"status": "blocked" の場合は、WebSearch に切り替えます。
ステップ 3:検索意図の分類
各キーワードを、次の 4 つの検索意図カテゴリのいずれかに分類します。
| 検索意図 | 指標 | クラスターに含めるか |
|---|---|---|
| 情報収集型 | how、what、why、guide、tutorial、learn | はい |
| 商用型 | best、top、review、comparison、vs、alternative | はい |
| 取引型 | buy、price、discount、coupon、order、sign up | はい |
| 指名検索型 | ブランド名、特定の製品名、login | いいえ(除外) |
指名検索のキーワードをクラスタリングから削除します。判断が難しいケースにはフラグを付け、手動レビューの対象にします。キーワードが複数の検索意図を持つこともあります(例:「best CRM software」は商用型と情報収集型の両方です)。最も優勢な検索意図に基づいて分類します。
ステップ 4:ハブ&スポークアーキテクチャ
詳細な仕様については、references/hub-spoke-architecture.md を読み込んでください。
クラスター構造を設計します:
- ピラーキーワードを選択する — 検索ボリュームが最も多く、検索意図が最も幅広く、他のキーワードとの SERP の重複が最も多いキーワードです
- スポークをクラスターにグループ化する — 各クラスターはサブトピックの領域です(ピラーあたり 2〜5 クラスター)
- 投稿をクラスターに割り当てる — 各クラスターに 2〜4 件のスポーク投稿を割り当てます
- 投稿ごとにテンプレートを選択する — 検索意図の分類に基づいて選択します:
| 検索意図のパターン | テンプレートの選択肢 |
|---|---|
| 情報収集型(幅広い) | ultimate-guide |
| 情報収集型(方法) | how-to |
| 情報収集型(リスト) | listicle |
| 情報収集型(概念) | explainer |
| 商用型(比較) | comparison |
| 商用型(評価) | review |
| 商用型(ランキング) | best-of |
| 取引型 | landing-page |
-
目標文字数を設定する:
- ピラーページ:2500〜4000 語
- スポーク投稿:1200〜1800 語
-
カニバリゼーションを確認する — 2 つの投稿で同じプライマリーキーワードを共有しないようにします。SERP の重複が 7 以上の場合は、それらのキーワードを 1 つの投稿に統合し、両方をターゲットにします。
ステップ 5:内部リンクマトリクス
双方向のリンク構造を設計します:
| リンクの種類 | 方向 | 要件 |
|---|---|---|
| スポークからピラー | スポーク -> ピラー | 必須(すべてのスポーク) |
| ピラーからスポーク | ピラー -> スポーク | 必須(すべてのスポーク) |
| スポークからスポーク(クラスター内) | スポーク <-> スポーク | 投稿あたり 2〜3 件のリンク |
| クラスター間 | スポーク -> スポーク(別のクラスター) | 投稿あたり 0〜1 件のリンク |
ルール:
- すべての投稿に、最低 3 件の内部インバウンドリンクを設定する必要があります
- 孤立ページを作らないでください(すべての投稿にピラーから 2 回のクリック以内で到達できること)
- アンカーテキストにはターゲットキーワードまたは近いバリエーションを使用します(「ここをクリック」は不可)
- リンクは本文コンテンツ内に配置します。ナビゲーションやサイドバーだけに配置することはできません
リンクマトリクスを JSON 隣接リストとして生成します:
{
"links": [
{ "from": "pillar", "to": "cluster-0-post-0", "type": "mandatory", "anchor": "keyword" },
{ "from": "cluster-0-post-0", "to": "pillar", "type": "mandatory", "anchor": "keyword" }
]
}
ステップ 6:インタラクティブなクラスターマップ
templates/cluster-map.html のテンプレートを使用して、cluster-map.html を生成します。
- テンプレートファイルを読み込みます
- クラスタープランから
CLUSTER_DATAJSON オブジェクトを作成します:{ pillar: { title, keyword, volume, template, wordCount, url }, clusters: [{ name, color, posts: [{ title, keyword, volume, template, wordCount, url, status }] }], links: [{ from, to, type }], meta: { totalPosts, totalClusters, totalLinks, estimatedWords } } - テンプレート内の
CLUSTER_DATAプレースホルダーを実際の JSON に置き換えます - 完成した HTML ファイルを出力ディレクトリに書き込みます
- ユーザーに「ブラウザーで
cluster-map.htmlを開くと、インタラクティブなクラスターマップを確認できます。」と伝えます。
戦略のインポート
--from strategy を指定して呼び出された場合:
- 現在のディレクトリで最新の
/seo planの出力を探します(*SEO*Plan*、*strategy*、*content-strategy*に一致するファイルを検索します) - Markdown の表から、キーワード、ページの種類、コンテンツピラー、URL 構造を解析します
- 抽出したデータを検証します:重複、欠落したキーワード、不完全な項目を確認します
- SERP データで補完します:抽出したキーワードの SERP 重複分析を実行します
- インポートしたキーワードを開始セットとしてクラスタープランを作成します(ステップ 1 はスキップします)
戦略ファイルが見つからない場合は、ユーザーに次のように促します:「現在のディレクトリに既存の SEO プランが見つかりません。まず /seo plan を実行するか、新しくクラスターを作成するためのシードキーワードを指定してください。」
実行ワークフロー
/seo cluster execute が呼び出された場合:
claude-blog の確認
Test: Does ~/.claude/skills/blog/SKILL.md exist?
claude-blog がインストールされている場合:
references/execution-workflow.mdを読み込み、アルゴリズム全体を確認します- 現在のディレクトリから
cluster-plan.jsonを読み込みます - 再開状態を確認します:出力ディレクトリをスキャンし、すでに書き込まれた記事を確認します
- 優先順位に従って実行します:まずピラー記事、次にボリュームの多いスポーク記事から順に実行します
- 各記事について、クラスタのコンテキストを指定して
blog-writeスキルを呼び出します:- クラスタ内の役割(ピラーまたはスポーク)
- クラスタ内の位置(クラスタのインデックス、記事のインデックス)
- ターゲットキーワードとセカンダリーキーワード
- テンプレートの種類と目標文字数
- 含める内部リンク(アンカーテキスト付き)
- 今後の記事からリンクを受け取る箇所(プレースホルダーマーカー)
- 各記事の執筆後、以前の記事をスキャンしてバックリンク用プレースホルダーを探し、新しい記事の URL を挿入します
- すべての記事の執筆後、クラスタのスコアカードを生成します
claude-blog がインストールされていない場合:
- クラスタプラン内の各記事について、詳細なコンテンツブリーフを生成します
- 各ブリーフには以下を含めます:
- タイトルとメタディスクリプション
- プライマリーキーワードとセカンダリーキーワード
- テンプレートの種類と推奨される構成(H2/H3 のアウトライン)
- 目標文字数
- 含める内部リンク(アンカーテキスト付き)
- 扱うべき重要なポイント
- 差別化すべき競合ページ
- ブリーフを個別の Markdown ファイルとして
cluster-briefs/ディレクトリに書き込みます - ユーザーに次のように伝えます:「コンテンツを自動作成するには、ブログ執筆スキルをインストールしてください。ブリーフは
cluster-briefs/に保存されています。」
クラスタのスコアカード
実行後の品質レポートです。/seo cluster execute の後に自動で実行するか、出力ディレクトリを分析して必要に応じて実行します。
| 指標 | 目標 | 測定方法 |
|---|---|---|
| 網羅率 | 100% | 執筆済み記事数 / 計画記事数 |
| リンク密度 | 1 記事あたり 3 件以上 | 記事ごとの内部リンク数をカウント |
| 孤立ページ | 0 件 | 被リンクが 1 件未満の記事 |
| カニバリゼーション | 競合 0 件 | プライマリーキーワードの重複を確認 |
| 画像数 | 1 記事あたり 1 枚以上 | 画像が 1 枚以上ある記事 |
| ピラーリンク | 100% | すべてのスポーク記事がピラー記事へリンクし、その逆も同様 |
| 相互リンク | 80% 以上 | 推奨されるスポーク間リンクの実装率 |
| コンテンツの不足 | 0 件 | 省略または未完了の計画記事 |
マップの再生成
/seo cluster map を実行した場合:
- 現在のディレクトリから
cluster-plan.jsonを読み込みます - 出力ディレクトリをスキャンし、記事のステータス(計画済みか執筆済みか)を更新します
- 更新されたステータスで
cluster-map.htmlを再生成します - 執筆済み記事数と計画記事数、およびリンク完了率を報告します
出力ファイル
すべての出力は現在の作業ディレクトリに書き込まれます:
| ファイル | 説明 |
|---|---|
cluster-plan.json | 機械可読なクラスタプラン(全データ) |
cluster-plan.md | 人間が読みやすいクラスタプランの概要 |
cluster-map.html | インタラクティブな SVG ビジュアライゼーション |
cluster-briefs/ | コンテンツブリーフ(claude-blog がない場合) |
cluster-scorecard.md | 実行後の品質レポート |
スキル間の連携
| スキル | 関係 |
|---|---|
seo-plan | インポート元:戦略のインポート時に seo-plan の出力を読み込みます |
seo-content | 品質チェック:生成されたコンテンツの E-E-A-T 検証 |
seo-schema | スキーママークアップ:クラスタページ用の Article、BreadcrumbList、ItemList |
seo-dataforseo | データソース:DataForSEO MCP が利用可能な場合の SERP データ |
seo-google | レポート作成:クラスタプランとスコアカードの PDF レポートを生成 |
クラスタの計画または実行が完了した後、次のように提案します:
「PDF レポートを生成しますか?/seo google report を使用してください」
エラー処理
| エラー | 原因 | 解決方法 |
|---|---|---|
| "No seed keyword provided" | 引数が指定されていません | シードキーワードまたは URL をユーザーに尋ねます |
| "Insufficient keyword variants" | 拡張の結果、キーワードが 15 個未満です | PAA の質問を使って 2 回目の拡張を実行します |
| "SERP data unavailable" | WebSearch と DataForSEO の両方が失敗しています | 30 秒後に再試行します。解消しない場合は、警告を添えてインテントのみでクラスタリングします |
| "No strategy file found" | --from strategy が指定されていますが、プランがありません | まず /seo plan を実行するようユーザーに促します |
| "cluster-plan.json not found" | プランニングせずに実行しました | まず /seo cluster plan を実行するようユーザーに促します |
| "claude-blog not installed" | ブログスキルなしで実行しようとしました | 代わりにコンテンツブリーフを生成し、インストールを提案します |
| "DataForSEO budget exceeded" | コストチェックで "blocked" が返されました | WebSearch に切り替え、ユーザーに知らせます |
| "Duplicate primary keywords" | カニバリゼーションが検出されました | 該当する投稿を統合するか、キーワードを再割り当てします |
| "Orphan page detected" | 投稿へのインバウンドリンクがありません | 最も近いクラスタ内の兄弟ページからリンクを追加します |
| "Resume state corrupted" | プランと出力が一致しません | 出力ディレクトリをスキャンして状態を再構築します |
セキュリティ
- すべての URL は
python scripts/fetch_page.py経由で取得されます(validate_url()による SSRF 保護) - 認証情報は保存も送信もされません
- 出力ファイルに個人を特定できる情報や API キーは含まれません
- すべての API 呼び出しの前に DataForSEO のコストチェックを実行します
FLOW フレームワークとの統合
プロンプト主導のキーワード調査とギャップ分析には、/seo flow find [url|topic] を使用します。FLOW の 5 つの find ステージ用プロンプトは、SERP 重複に基づくクラスタリング手法を体系的な探索プロンプトで補完します。