SEOプレイブック は何をしますか?
このスキルは、SEOを再現可能なエンジニアリングワークフローに変換します。サイトが実際に勝負できるクエリを見つけ、各ページに1つの明確な役割を与え、適切なHTML要素に適切な単語を配置し、Googleが結果をクロール、レンダリング、インデックスできることを確認し、リンクを獲得して、測定と改善を繰り返します。
このスキルは、若いNext.jsツールサイトをロングテールクエリでゼロからページ1位に導く際に有効だった方法(そして暗黙のうちに壊れていた方法)を凝縮したものです。その教訓は、あらゆるスタックに一般化できます。
マインドセット(5文で)
- ランキングは願望ではなく、勝負できるかどうかに従う。 若いドメインは、今年中に「QRコード生成」のようなヘッドタームでトップ5に入ることはできません。「無料サインアップ不要QRコード生成」や「名前付き誕生日ウィッシュリンク」では数週間でランクインできます。まずロングテールをターゲットにし、トピックオーソリティが後でヘッドタームを引き上げるのを待ちましょう。
- 1ページ、1つの検索インテント、1つのプライマリーキーワード。 同じクエリをターゲットにした2つのページはシグナルを分割(カニバリゼーション)します。1つのページが2つのインテントをターゲットにすると、どちらも満たせません。
- Googleはユーザーが見るアプリではなく、受け取ったHTMLをランク付けする。 コンテンツ、H1、FAQの回答、リンクがJavaScriptの実行後にしか表示されない場合、それらは存在しないものと見なしてください。毎回、生のサーバーレスポンスを確認してください。
- インデックス可否のバグはコピーライティングよりも影響が大きい。 ソフト404、誤った正規化URL、レイアウトから継承された
noindexは、エラーを出さずに数ヶ月のコンテンツ作業を無駄にする可能性があります。あなたが触れるすべてのページタイプで、ステータスコード、正規化URL、robotsを確認してください。 - 直感ではなくSearch Consoleで測定する。 8〜20位のインプレッションは最も安価な成果です。50位以上は、オンページの微調整では修正できないオーソリティまたはインテントの問題を示しています。
ユーザーの期待を正直に設定してください。ロングテールページの初回インプレッションは通常2〜6週間で表示されます。ヘッドタームは数ヶ月とバックリンクが必要です。「高速」SEOとは、サイトが勝負できる戦いを選ぶことを意味します。
まず深さを選択する
ほとんどのSEOリクエストは小規模です。何をするにしても、先にモードを選んでください。フルワークフローは、小さな変更に必要な時間とトークンよりも数倍のコストがかかります。
クイックモードは、キーワードが既知または明白な1〜2ページの編集に使用します。ページのタイトル変更、メタディスクリプションの作成、FAQの追加、指摘された問題の修正、またはコピーするSEOパターンがすでにあるプロジェクトへのページ追加などです。クイックモードでは:
- 以下のチェックが失敗したり、本当に判断できない場合を除き、リファレンスファイルを読んだり、ライブSERPを調査したりしないでください。
- プロジェクトの既存のSEOパターン(メタデータヘルパー、コンテンツ設定、スキーマコンポーネント)に従ってください。
- 変更を加え、結果に対して以下のクイックチェックリストを実行してください。構築済みまたは配信済みのHTMLがある場合は、それに対して
scripts/seo_check.pyを1回実行してください。 - 数行で報告してください。気付いたより大きな問題があれば、「こちらも行う価値あり」として1行で言及し、調査はしないでください。
クイックチェックリスト(変更対象のページのみ):
- タイトルが一意で、キーワードで始まり、60文字以下であること。ディスクリプションは120〜160文字で、真実の主張のみを含むこと。
- H1が正確に1つ存在し、メインコピー、H1、FAQの回答がサーバーHTMLに含まれていること(クライアントオンリー、
opacity:0、アンマウントされていないこと)。 - ページが独自の正規化URLを設定し、インデックス可能であり、サイトマップに含まれていること。非表示ページは
noindexを使用し、robots.txtで禁止されていないこと。 - 3〜5つの外部への内部リンクと、少なくとも1つの内部からのリンクがあること。
- 構造化データが表示されているコンテンツと一致し、サイト独自のものではない評価が含まれていないこと。
フルモードは以下のワークフローです。以下の場合に使用します:
- 新しいサイト、ページセット、またはクラスター
- 適切なターゲットが不明な場合のキーワード選択
- 「なぜランクインしないのか」「トラフィックが横ばい」の診断
- ローンチ前またはサイト全体の監査
- オフページ計画
クイックチェックにより、継承された正規化URL、ソフト404パターン、偽造された評価など、サイト全体の問題が明らかになる場合があります。静かにジョブを拡大しないでください。要求された変更を完了し、問題をレポートの先頭に、それが重要である理由を1行添えて記載し、フルパスを提案してください。ユーザーがそれにコストをかけるかどうかを決定します。例外は、要求された変更が修正なしでは機能しない場合です。たとえば、編集中のページにサーバーレンダリングされたH1がない場合などです。その場合は、必要な最小限の修正を行い、その旨を伝えてください。
ワークフロー(フルモード)
新しいサイトまたはページセットの場合は、フェーズを順に実行してください。単一ページの変更の場合は、最低でもフェーズ3、4、6を実行してください。各フェーズに到達したら、リンクされたリファレンスファイルを読んでください。各ファイルには、詳細なチェックリストとテンプレートが含まれています。
作業をリクエストに合わせてスケーリングしてください。 ページレビューはページレビューです。キーワードマップはキーワードマップです。依頼されたジョブを徹底的に行い、隣接する機会(キーワード、オフページのアイデア)は、誰も頼んでいない完全な追加計画を作成するのではなく、「こちらも行う価値あり」の短いリストにまとめてください。追加の成果物は、ユーザーが必要とするものを薄め、時間を消費します。
主張する前に検証してください。 確認できる事実(ライブSERP、ブランド名がすでに使われているかどうか、ページの実際の内容、機能の実際の動作)は確認してください。確認できないこと(URLしか知らないページ、読み込めないサイト、見たことのない機能)については、それは仮定であると述べ、ユーザーに確認するよう指示してください。他人のサイトについての自信過剰な推測は、SEOアドバイスが間違った方向に進む最も一般的な理由です。
スクリプトはあなたのためにあります。 scripts/*.pyは自分で実行してください。ユーザー向けの指示では、チェックを平易な言葉で説明するか、このスキルなしで実行できるコマンド(curl、Search Consoleの手順)を提供してください。スキルのスクリプトパスを参照するのは、ユーザーがスキルをインストールしていることがわかっている場合のみにしてください。
フェーズ1 — 偵察(何も変更する前に)
- スタックとページのレンダリング方法(SSR、SSG、SPA、ハイブリッド)を特定してください。フレームワークのトラップについては、
references/technical-seo.mdの関連セクションを読んでください(Next.js App Routerには独自のセクションがあります)。 - 何が存在するかを棚卸ししてください。メタデータの設定方法、ページコピーの保存場所、サイトマップとrobotsの生成、構造化データコンポーネント、アナリティクスなどです。新しいパターンを追加するのではなく、既存のパターンを再利用してください。
- Googlebotとして各タイプの代表的なページを取得し、ベースラインを記録してください:
python3 <skill-dir>/scripts/seo_check.py <url> [<url> ...]これにより、ステータス、タイトル/ディスクリプションの長さ、正規化URL、robotsメタとX-Robots-Tag、H1数、可視単語数、JSON-LDタイプ、OG画像、および「読み込み中…」のようなメイン要素などのレッドフラグが報告されます。 - Search Consoleデータが利用可能な場合(エクスポート、APIヘルパー、または
seo-googleスキルがインストールされている場合)、90日分のクエリ+ページ行を取得し、scripts/gsc_opportunities.pyを実行してください(フェーズ6参照)。既存のインプレッションは、Googleがすでにサイトと関連付けているものを示します。 - プロジェクトのSEOドキュメントや、以前の監査からのメモを探し、それらを基に構築してください。
フェーズ2 — キーワードリサーチとキーワードマップ
references/keyword-research.mdを読んでください。簡単に言うと:
- 製品からシードを取得します。ページの機能、誰が使うか、ユーザーがまさにそれを欲しいときに入力する単語。
- 無料のシグナルで拡張します。Googleのオートコンプリートと「他の人はこちらも質問」、関連検索、競合のタイトル、GSCクエリ、Reddit/Quoraの表現。有料APIは、プロジェクトにそれらがある場合(例:
seo-dataforseoまたはseo-ahrefsスキルがインストールされている場合)にのみ使用してください。 - インテントを分類し(する / 知る / 行く / 買う)、各候補についてライブSERPを確認してください。1ページ目がすべて大規模ブランドまたは異なるページタイプ(例:ツールなのにリスト記事)の場合、そのキーワードはまだこのページで勝負できません。
- 勝負できる可能性をスコアリングします。1ページ目の弱い競合(薄いインディーページ、フォーラム、GitHubリポジトリ、
*.vercel.appサイト)は最も強力なシグナルです。 - ブランド名を確認してください。そのまま検索し、関連する場合はnpm/PyPI/GitHub/アプリストアでも検索してください。すでに使われている場合は、ドメイン形式(「Brand.app」)を一貫して使用することを推奨してください。
- キーワードマップを作成します。URLごとに1行で、プライマリーキーワード、3〜8のセカンダリー/ロングテール用語、インテント、各用語の配置場所(タイトル、H1、H2、イントロ、FAQ)を記載します。どのプライマリーキーワードも2行に出現してはならず、すべてのテーブルのすべての行にインテントが必要です。
有料ツールなしのボリュームは、方向性のあるティア(非常に高い / 高い / 中 / 低い)としてください。数値をでっち上げるのではなく、出力でそのように述べてください。
フェーズ3 — オンページ実装
完全なチェックリストとページコンテンツモデルについては、references/on-page.mdを読んでください。インデックス可能なすべてのページの必需品:
- タイトル: 一意であり、プライマリーキーワードが最初に来て、理想的にはブランドサフィックスを含めて60文字以下で、クリックを獲得するように書かれていること。
- メタディスクリプション: 一意であり、120〜160文字で、ユーザーが得られるものと差別化要因(「無料、サインアップ不要、ブラウザで動作」)を、それが真実である場合にのみ述べていること。
- サーバーHTML内に正確に1つのH1があり、ページのプライマリーインテントと一致していること(タイトルの近いバリエーションであり、コピーではないこと)。
- 本文: 最初の段落でクエリに回答し、競合ページに欠けている深みを追加します。ハウツーステップ、実際の例、よくある問題とその修正、制限事項、FAQなど。各セクションは、検索者がそれを必要とするから存在するのであり、文字数を稼ぐためではありません。
- FAQがHTML内に表示されていること(折りたたまれたアンマウントされたアコーディオンのみ、JSON-LDのみではない)、実際のクエリとして表現されていること。
- 内部リンク: 関連ページへの3〜5つのコンテキストリンクと、関連するハブまたは記事からページへの少なくとも1つのリンク。孤立ページがないこと。
- 表示されているコンテンツと一致する構造化データ: どのタイプがまだリッチリザルトを獲得しているかについては、
references/structured-data.mdを参照してください。 - 信頼性: 実際の作成者または組織、正確な主張、コンテンツが変更されたときに変更される最終確認日、数値のソース。プレースホルダーのレビューや推薦文を決して公開しないでください。Googleはそれらを不実表示として扱います。
ページSEOコンテンツは、JSXに文字列を散らばらせるのではなく、データ(型付き設定オブジェクトまたはCMSフィールド)として保存してください。これにより、一意性チェック、長さテスト、一括レビューが可能になります。
フェーズ4 — 技術的なゲート(スキップしないでください)
references/technical-seo.mdを読んでください。ページを完了と呼ぶ前に、構築済みまたはデプロイ済みのHTMLで以下を確認してください:
- 実際のページはステータス200、不明なURLは本当の404(「見つかりません」というテキストの200ではない)であること。
- 自己参照の絶対正規化URLであり、親レイアウトから誤って継承された正規化URL/robotsがないこと。
- インデックス可能なページは、正直な
lastmodとともにサイトマップに含まれていること。noindexページは含まれていないこと。 - 隠したいページは
noindex(メタまたはX-Robots-Tag)を使用し、robots.txtでブロックされていないこと。そうしないと、Googleはnoindexを読み取ることができません。 - メインコンテンツ、H1、FAQの回答、内部リンクが生のHTMLに存在すること(
seo_check.pyの単語数とH1チェック)。 - 1つの優先ホスト(https、www、またはapex)があり、他のホストからはシングルホップの301リダイレクトがあること。
- Core Web Vitalsが悪化していないこと(LCP ≤ 2.5秒、INP ≤ 200ミリ秒、CLS ≤ 0.1)。フィールドデータにはPageSpeed Insights / CrUXを使用するか、インストールされていれば
seo-performance/seo-googleスキルを使用してください。
フェーズ5 — オフページと配信
references/off-page.mdを読んでください。オンページ作業はページを適格にします。競争力のあるものについては、リンクとブランド需要がランキングの高さを決定します。ページと並行してリンク獲得を計画し、後回しにしないでください:
- クラスターごとに1つのリンク可能なアセット(無料ツール、テンプレートリポジトリ、データテーブル、オリジナルガイド)を構築してください。
- オーディエンスに合う少数のディレクトリとローンチプラットフォームに、本物の投稿として提出してください。
- ビジュアルニッチにはビジュアルプラットフォーム(Pinterest、YouTube Shorts)を、デベロッパーオーディエンスにはGitHubを使用してください。
- Bing Webmaster ToolsとIndexNowを設定してください(BingのインデックスはChatGPT検索とCopilotにフィードされます)。
- リンクを購入したり、リンクスキームに参加したり、ジャンクディレクトリに大量提出したりしないでください。
自分でオフページ作業ができない場合は、ユーザーがすぐに実行できるキット(ターゲットリスト、下書き投稿、アウトリーチメールの下書き、カレンダー)を作成してください。
フェーズ6 — 検証、リリース、監視
references/measurement.mdを読んでください。
- 構築済みまたはデプロイ済みのページに対して
seo_check.pyを再実行し、フェーズ1のベースラインと差分を確認してください。共有レイアウトまたはコンポーネントへの変更の場合、編集したページだけでなくすべてのページタイプを差分確認してください。サイト全体の変更は、すでにランクインしているページを静かに変更する可能性があります。 - デプロイ後: サイトマップを再送信し、最も重要な新しいURLのごく一部に対してのみインデックスをリクエストし、IndexNowにpingを送信してください。
- 2〜4週間後:
python3 <skill-dir>/scripts/gsc_opportunities.py <gsc-export.json|csv>を実行して、射程距離内のクエリ、低CTRページ、カニバリゼーションをリストアップし、それらのタイトル、セクション、内部リンクを改善してください。
苦労して得たルール
これらは実際の後退から生まれました。それぞれが発見される前に、ランキングまたはインデックスにコストがかかりました。
- クローラーが実際に受け取るものを確認してください。 ルートレベルのローディングスピナー、
ssr: falseの動的インポート、またはopacity: 0から始まるフェードインは、ブラウザでは完全に見えていても、サーバーHTMLに「読み込み中…」だけを残す可能性があります。AIクローラーはJavaScriptをまったく実行しません。 - エントランスアニメーションはヒーローを隠します。 アニメーションライブラリ(framer-motion
initial={{ opacity: 0 }}、AOS、GSAP)は開始状態をサーバーレンダリングするため、H1とイントロはハイドレーションまで不可視で出荷され、LCPを遅延させます。initial={false}を使用するか、アニメーションをCSSのみにし、構築済みHTMLでopacity:0をgrepしてください。 - CMSの本文は2つ目のH1を追加します。 ページレベルのH1の下で
# タイトルで始まるMarkdownは、それを複製します。レンダラーで本文のH1をH2に格下げしてください。 - ストリーミングSSRからのソフト404。 ストリーミングレスポンスが開始されると、後からの
notFound()は200を変更できません。レンダリング前に不明なスラッグを拒否するか(動的パラメータを無効にした静的パラメータ)、メタデータのミスブランチから明示的なnoindexを返してください。 - 継承された正規化URL。 ルートレイアウトの正規化URLは、独自の正規化URLを設定しないすべてのページに漏洩します。それを継承したソフト404は、実際のページのインデックス可能な重複になります。
- 「APIダウン」は「結果なし」ではない。
notFound()またはnoindexを決定するコードは、失敗したフェッチと空の結果を区別しなければなりません。そうしないと、1回の停止で実際のページが非インデックス化されます。 - 隠されたコンテンツ。 閉じたパネルをアンマウントするアコーディオンは、HTMLからFAQの回答を削除します。それらをマウントしたままにし(
hidden="until-found"またはCSS)、クロール可能でページ内検索で見つけられるようにしてください。 - 共有コンポーネントは爆発半径です。 1つのページがうまくランクインした場合、共有SEOコンポーネントをオプトインプロップの背後で変更し、他のページの構築済みHTMLを変更前後で差分確認してください。
- 偽造された社会的証明。 ページにレビュー、星評価、「as seen on」バッジ、またはロゴファームが本物でない形で含まれている場合、それを報告し、削除するか本物のものに置き換えることを提案してください。Googleは不実表示ガイドラインの下でこれらをペナルティの対象とします。
- 本番環境とステージング環境のインデックス。 ステージング環境をインデックスさせないでください。ステージングに
noindexがなく、検索エンジンからアクセス可能な場合、本番環境の代わりにランク付けされる可能性があります。
開発者とAIエージェントのための注記
- このスキルは、ツールによるコード補完以上のものを前提としています。 ここでのワークフローは、
seo_check.pyを実行し、生のサーバーレスポンスを読み、URLの実際のコンテンツを知らない場合は「わからない」と言うエージェントを前提としています。これは、ファイルパスだけを見てタイトルやH1が正しいと想定するだけでは不十分であることを意味します。 - キーワードマップはデータであり、散文ではありません。 JSONまたはテーブルとして生成してください。テキストの段落としてではありません。
- 数値を推定しないでください。 キーワードボリューム、SERPの位置、トラフィックの数値は、実際のデータソース(Search Console、有料SEO API)がある場合にのみ提供してください。アクセス権がない場合は、代わりに方向性を述べてください。
- 誤検知に注意してください。
seo_check.pyは、知っておくべきことを見逃す可能性があります(壊れたリンク、偽のレビュー、hidden="until-found"を尊重しないクローラー)。その出力を信頼しますが、最終的な判断はあなたが行ってください。 - このスキルは有料API(DataForSEO、Ahrefs)と一緒に使用するために設計されています。 これらのスキルがインストールされている場合、それらを呼び出して、調査に深みと数値を追加してください。インストールされていない場合は、無料のシグナルに依存し、その限界を述べてください。
参照
references/keyword-research.md— 完全なキーワードリサーチワークフローと勝負できる可能性のフレームワークreferences/on-page.md— ページコンテンツモデルとタイトル、H1、本文、FAQのテンプレートreferences/technical-seo.md— Next.js App Routerのトラップ、レンダリング、ステータスコード、インデックスチェックを含む技術的なゲートreferences/structured-data.md— どのJSON-LDタイプがまだリッチリザルトを獲得し、どれが無視されるかreferences/off-page.md— リンク獲得、配信、Bing/IndexNowのセットアップreferences/measurement.md— GSCの機会スクリプト、検証、イテレーションscripts/seo_check.py— 1つ以上のURLのサーバーHTMLをチェックするCLIツールscripts/gsc_opportunities.py— Search Consoleのエクスポートから射程距離内のクエリと低CTRページをリストアップする