seo-drift について
seo-driftは、SEOチーム向けにページの検索関連状態をスナップショットとして保存し、基準との差分を検出するスキルです。履歴はSQLiteにローカル保存され、検出内容は重大度別に報告されます。
主な機能
- 01SEOベースラインの取得
- 02ページと保存済みスナップショットの比較
- 03ベースラインと比較履歴の追跡
- 04メタデータ、見出し、Schema、CWVの監視
- 05変更を重大度別に分類
活用シーン
- 01デプロイ前後のサイト状態を確認
- 02SEOの経時変化を確認
- 03トラフィック減少の原因を調査
- 04ページメタデータやSchemaの退行を検出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agricidaniel/ claude-seo --skill seo-driftインストール後、Claude Code で/seo-driftを入力して読み込まれたか確認します。
同梱ファイルreferences/comparison-rules.md
詳細
SEO Drift Monitor(2026年4月)
SEO のための Git です。ベースラインを取得し、リグレッションを検出し、時間の経過に伴う変更を追跡します。
コマンド
| コマンド | 目的 |
|---|---|
/seo drift baseline <url> | 現在の SEO 状態を「正常」と確認されたスナップショットとして記録します |
/seo drift compare <url> | 現在のページの状態を保存済みのベースラインと比較します |
/seo drift history <url> | 変更履歴と過去の比較結果を表示します |
取得する情報
各ベースラインには、SEO で重要な以下の要素が記録されます。
| 要素 | フィールド | ソース |
|---|---|---|
| タイトルタグ | title | parse_html.py |
| メタディスクリプション | meta_description | parse_html.py |
| 正規 URL | canonical | parse_html.py |
| robots ディレクティブ | meta_robots | parse_html.py |
| H1 見出し | h1(配列) | parse_html.py |
| H2 見出し | h2(配列) | parse_html.py |
| H3 見出し | h3(配列) | parse_html.py |
| JSON-LD スキーマ | schema(配列) | parse_html.py |
| Open Graph タグ | open_graph(辞書) | parse_html.py |
| Core Web Vitals | cwv(辞書) | pagespeed_check.py |
| HTTP ステータスコード | status_code | fetch_page.py |
| HTML コンテンツハッシュ | html_hash(SHA-256) | 算出 |
| スキーマコンテンツハッシュ | schema_hash(SHA-256) | 算出 |
比較の仕組み
比較エンジンは、3 つの重大度レベルにわたる 17 個のルールを適用します。しきい値、推奨アクション、関連スキルへの参照を含むルールセット全体は、references/comparison-rules.md を読み込んでください。
重大度レベル
| レベル | 意味 | 対応時間 |
|---|---|---|
| CRITICAL | SEO に深刻な影響を与える変更で、トラフィックの減少が予想されます | 直ちに |
| WARNING | 影響の可能性があり、調査が必要です | 1 週間以内 |
| INFO | 情報提供のみで、意図的な変更の可能性があります | 都合のよいときに確認 |
保存
すべてのデータはローカルの SQLite に保存されます。
~/.cache/claude-seo/drift/baselines.db
テーブル
- baselines:すべての SEO 要素を含む取得済みスナップショット
- comparisons:該当したルールと重大度を含む差分結果
URL の正規化により、一貫した照合が行われます。スキームとホストを小文字に変換し、デフォルトポート(80/443)を削除し、クエリパラメーターを並べ替え、UTM パラメーターと末尾のスラッシュを削除します。
コマンド:baseline
ページの現在の状態を取得して保存します。
手順:
- URL を検証します(
google_auth.validate_url()による SSRF 対策) "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run fetch_page.py <URL>でページを取得します"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run parse_html.py <URL>で HTML を解析します- 必要に応じて
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run pagespeed_check.py <URL>で CWV を取得します(スキップするには--skip-cwvを使用します) - HTML 本文とスキーマのコンテンツをハッシュ化します(SHA-256)
- スナップショットを SQLite に保存します
実行:
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url> --skip-cwv
出力: ベースライン ID、タイムスタンプ、URL、取得した要素の概要を含む JSON。
コマンド:compare
ページの現在の状態を取得し、直近のベースラインとの差分を表示します。
手順:
- URL を検証します
- SQLite から直近のベースラインを読み込みます(または特定の
--baseline-idを指定します) - 現在のページの状態を取得して解析します
- 17 個すべての比較ルールを実行します
- 検出結果を重大度別に分類します
- 比較結果を保存します
- JSON 差分レポートを出力します
実行:
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --baseline-id 5
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --skip-cwv
出力: 該当したすべてのルール、新旧の値、重大度、アクションを含む JSON。
比較後、HTML レポートの生成を提案します。
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_report.py <comparison_json_file> --output drift-report.html
コマンド:history
URL に対するすべてのベースラインと比較結果を表示します。
実行:
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url> --limit 10
出力: タイムスタンプと比較の概要を含むベースラインの JSON 配列(新しいものから順に表示)。
スキル間の連携
ドリフトを検出した場合は、適切な専門スキルを推奨してください。
| 検出内容 | 推奨事項 |
|---|---|
| スキーマが削除または変更された | /seo schema <url> を実行して完全な検証を行います |
| CWV が悪化した | /seo technical <url> を実行してパフォーマンス監査を行います |
| タイトルまたはメタディスクリプションが変更された | /seo page <url> を実行してコンテンツ分析を行います |
| canonical が変更または削除された | /seo technical <url> を実行してインデックス登録可能性を確認します |
| noindex が追加された | /seo technical <url> を実行してクロール可能性を監査します |
| H1/見出し構造が変更された | /seo content <url> を実行して E-E-A-T のレビューを行います |
| OG タグが削除された | /seo page <url> を実行してソーシャル共有の分析を行います |
| ステータスコードがエラーに変更された | /seo technical <url> を実行して完全な診断を行います |
エラー処理
| 状況 | 対応 |
|---|---|
| URL にアクセスできない | fetch_page.py のエラーを報告します。状態を推測しないでください。ユーザーに URL の確認を促します。 |
| URL のベースラインが存在しない | ユーザーにその旨を伝え、最初に baseline を実行するよう促します。 |
| SSRF によりブロックされた(プライベート IP) | validate_url() による拒否を報告します。決して回避しないでください。 |
| SQLite データベースが見つからない | 初回使用時に自動作成します。エラーにはなりません。 |
| CWV の取得に失敗した(API キーなし) | CWV フィールドに null を保存します。比較時は CWV ルールをスキップします。 |
| ページが 4xx/5xx を返す | ベースラインとして取得します(ステータスコードは追跡対象のフィールドです)。 |
| 複数のベースラインが存在する | --baseline-id が指定されていない場合は、最新のものを使用します。 |
セキュリティ
- すべての URL の取得は
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run fetch_page.py経由で行い、SSRF 対策を適用します (プライベート IP、ループバック、予約済み範囲、GCP メタデータエンドポイントをブロックします) - curl やサブプロセスによる HTTP 呼び出しは禁止です。プロジェクトで検証済みの取得パイプラインのみを使用します
- すべての SQLite クエリではパラメーター化プレースホルダー(
?)を使用し、文字列補間は決して使用しません - TLS は常に検証されます。パイプライン内で
verify=Falseは一切使用しません
典型的なワークフロー
デプロイ前/デプロイ後の確認
/seo drift baseline https://example.com # Before deploy
# ... deploy happens ...
/seo drift compare https://example.com # After deploy
継続的なモニタリング
/seo drift baseline https://example.com # Initial capture
# ... weeks later ...
/seo drift compare https://example.com # Check for drift
/seo drift history https://example.com # Review all changes
トラフィック減少の調査
/seo drift compare https://example.com # What changed?
/seo drift history https://example.com # When did it change?