seo-drift について
seo-driftは、SEO状態のスナップショット取得とページ変更の監視を行うスキルです。サイト更新の影響を確認するチーム向けに、基準データをローカル保存し、差分を重大度別に報告します。
主な機能
- 01ページのSEO基準スナップショット取得
- 02現在のページと保存済み基準の比較
- 03基準データと比較履歴の確認
- 04メタデータ、見出し、スキーマの変更検出
- 05Core Web Vitalsとステータスコードの追跡
- 06重大度別の差分レポート
活用シーン
- 01デプロイ前後のSEO変化の確認
- 02ページのSEO変動の継続監視
- 03トラフィック低下時のページ変更調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill seo-driftインストール後、Claude Code で/seo-driftを入力して読み込まれたか確認します。
同梱ファイルreferences/comparison-rules.md
詳細
SEOドリフトモニター(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 |
| canonical 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 (dict) | parse_html.py |
| Core Web Vitals | cwv (dict) | 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/seo-skills/drift/baselines.db
テーブル
- baselines: すべてのSEO要素を含む、取得済みスナップショット
- comparisons: 適用されたルールと重大度を含む差分結果
URLの正規化により、一貫した照合が行われます。スキームとホストを小文字に変換し、 デフォルトポート(80/443)を削除し、クエリパラメーターを並べ替え、UTMパラメーターを削除し、 末尾のスラッシュを削除します。
コマンド:baseline
ページの現在の状態を取得して保存します。
手順:
- URLを検証します(
google_auth.validate_url()によるSSRF保護) scripts/fetch_page.pyを使用してページを取得しますscripts/parse_html.pyを使用してHTMLを解析します- 必要に応じて
scripts/pagespeed_check.pyを使用してCWVを取得します(スキップするには--skip-cwvを使用します) - HTML本文とスキーマの内容をハッシュ化します(SHA-256)
- スナップショットを SQLite に保存します
実行:
python scripts/drift_baseline.py <url>
python scripts/drift_baseline.py <url> --skip-cwv
出力: ベースラインID、タイムスタンプ、URL、取得した要素の概要を含むJSONです。
コマンド:compare
現在のページの状態を取得し、最新のベースラインとの差分を表示します。
手順:
- URLを検証します
- SQLite から最新のベースラインを読み込みます(または特定の
--baseline-idを指定します) - 現在のページの状態を取得して解析します
- 17 個すべての比較ルールを実行します
- 検出結果を重大度別に分類します
- 比較結果を保存します
- 差分レポートをJSONで出力します
実行:
python scripts/drift_compare.py <url>
python scripts/drift_compare.py <url> --baseline-id 5
python scripts/drift_compare.py <url> --skip-cwv
出力: 適用されたすべてのルール、変更前後の値、重大度、アクションを含むJSONです。
比較後に、HTMLレポートの生成を提案します。
python scripts/drift_report.py <comparison_json_file> --output drift-report.html
コマンド:history
URLに関するすべてのベースラインと比較結果を表示します。
実行:
python scripts/drift_history.py <url>
python scripts/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/見出し構造が変更された | E-E-A-T のレビューを行うため、/seo content <url> を実行します |
| 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 取得は、SSRF 保護(プライベート IP、ループバック、予約済み範囲、GCP メタデータエンドポイントをブロック)を適用する
scripts/fetch_page.pyを経由します - curl および subprocess による 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?