SEO ドリフト監視
SEOにおける重要な要素の基準値を記録し、変更を検知して時間経過による悪化を追跡することで、SEO対策のズレを監視し、問題発生を早期発見するSkill。
📜 元の英語説明(参考)
SEO drift monitoring: capture baselines of SEO-critical elements, detect changes, and track regressions over time. Git for SEO — baseline, diff, and track changes to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes", "did anything break", "SEO regression", "compare SEO", "before and after", "monitor SEO changes", or "deployment check".
🇯🇵 日本人クリエイター向け解説
SEOにおける重要な要素の基準値を記録し、変更を検知して時間経過による悪化を追跡することで、SEO対策のズレを監視し、問題発生を早期発見するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o seo-drift.zip https://jpskill.com/download/10568.zip && unzip -o seo-drift.zip && rm seo-drift.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10568.zip -OutFile "$d\seo-drift.zip"; Expand-Archive "$d\seo-drift.zip" -DestinationPath $d -Force; ri "$d\seo-drift.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
seo-drift.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
seo-driftフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
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 |
| カノニカル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 |
| コアウェブバイタル | 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/claude-seo/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>を実行 |
| カノニカルが変更または削除された | インデックス可能性のチェックのために/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保護を強制する
scripts/fetch_page.pyを通過します (プライベートIP、ループバック、予約済み範囲、GCPメタデータエンドポイントをブロックします) - curl、サブプロセスHTTP呼び出しはありません -- プロジェクトの検証済みのフェッチパイプラインのみ
- すべてのSQLiteクエリは、文字列補間ではなく、パラメータ化されたプレースホルダー(
?)を使用します - TLSは常に検証されます -- パイプラインのどこにも
verify=Falseはありません
典型的なワークフロー
デプロイ前/後のチェック
/seo drift baseline https://example.com # デプロイ前
# ... デプロイが発生 ...
/seo drift compare https://example.com # デプロイ後
継続的な監視
/seo drift baselin 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
SEO Drift Monitor (April 2026)
Git for your SEO. Capture baselines, detect regressions, track changes over time.
Commands
| Command | Purpose |
|---|---|
/seo drift baseline <url> |
Capture current SEO state as a "known good" snapshot |
/seo drift compare <url> |
Compare current page state to stored baseline |
/seo drift history <url> |
Show change history and past comparisons |
What It Captures
Every baseline records these SEO-critical elements:
| Element | Field | Source |
|---|---|---|
| Title tag | title |
parse_html.py |
| Meta description | meta_description |
parse_html.py |
| Canonical URL | canonical |
parse_html.py |
| Robots directives | meta_robots |
parse_html.py |
| H1 headings | h1 (array) |
parse_html.py |
| H2 headings | h2 (array) |
parse_html.py |
| H3 headings | h3 (array) |
parse_html.py |
| JSON-LD schema | schema (array) |
parse_html.py |
| Open Graph tags | open_graph (dict) |
parse_html.py |
| Core Web Vitals | cwv (dict) |
pagespeed_check.py |
| HTTP status code | status_code |
fetch_page.py |
| HTML content hash | html_hash (SHA-256) |
Computed |
| Schema content hash | schema_hash (SHA-256) |
Computed |
How Comparison Works
The comparison engine applies 17 rules across 3 severity levels. Load
references/comparison-rules.md for the full rule set with thresholds,
recommended actions, and cross-skill references.
Severity Levels
| Level | Meaning | Response Time |
|---|---|---|
| CRITICAL | SEO-breaking change, likely traffic loss | Immediate |
| WARNING | Potential impact, needs investigation | Within 1 week |
| INFO | Awareness only, may be intentional | Review at convenience |
Storage
All data is stored locally in SQLite:
~/.cache/claude-seo/drift/baselines.db
Tables
- baselines: Captured snapshots with all SEO elements
- comparisons: Diff results with triggered rules and severities
URL normalization ensures consistent matching: lowercase scheme/host, strip default ports (80/443), sort query parameters, remove UTM parameters, strip trailing slashes.
Command: baseline
Captures the current state of a page and stores it.
Steps:
- Validate URL (SSRF protection via
google_auth.validate_url()) - Fetch page via
scripts/fetch_page.py - Parse HTML via
scripts/parse_html.py - Optionally fetch CWV via
scripts/pagespeed_check.py(use--skip-cwvto skip) - Hash HTML body and schema content (SHA-256)
- Store snapshot in SQLite
Execution:
python scripts/drift_baseline.py <url>
python scripts/drift_baseline.py <url> --skip-cwv
Output: JSON with baseline ID, timestamp, URL, and summary of captured elements.
Command: compare
Fetches the current page state and diffs it against the most recent baseline.
Steps:
- Validate URL
- Load most recent baseline from SQLite (or specific
--baseline-id) - Fetch and parse current page state
- Run all 17 comparison rules
- Classify findings by severity
- Store comparison result
- Output JSON diff report
Execution:
python scripts/drift_compare.py <url>
python scripts/drift_compare.py <url> --baseline-id 5
python scripts/drift_compare.py <url> --skip-cwv
Output: JSON with all triggered rules, old/new values, severity, and actions.
After comparison, offer to generate an HTML report:
python scripts/drift_report.py <comparison_json_file> --output drift-report.html
Command: history
Shows all baselines and comparisons for a URL.
Execution:
python scripts/drift_history.py <url>
python scripts/drift_history.py <url> --limit 10
Output: JSON array of baselines (newest first) with timestamps and comparison summaries.
Cross-Skill Integration
When drift is detected, recommend the appropriate specialized skill:
| Finding | Recommendation |
|---|---|
| Schema removed or modified | Run /seo schema <url> for full validation |
| CWV regression | Run /seo technical <url> for performance audit |
| Title or meta description changed | Run /seo page <url> for content analysis |
| Canonical changed or removed | Run /seo technical <url> for indexability check |
| Noindex added | Run /seo technical <url> for crawlability audit |
| H1/heading structure changed | Run /seo content <url> for E-E-A-T review |
| OG tags removed | Run /seo page <url> for social sharing analysis |
| Status code changed to error | Run /seo technical <url> for full diagnostics |
Error Handling
| Scenario | Action |
|---|---|
| URL unreachable | Report error from fetch_page.py. Do not guess state. Suggest user verify URL. |
| No baseline exists for URL | Inform user and suggest running baseline first. |
| SSRF blocked (private IP) | Report validate_url() rejection. Never bypass. |
| SQLite database missing | Auto-create on first use. No error. |
| CWV fetch fails (no API key) | Store null for CWV fields. Skip CWV rules during comparison. |
| Page returns 4xx/5xx | Still capture as baseline (status code IS a tracked field). |
| Multiple baselines exist | Use most recent unless --baseline-id specified. |
Security
- All URL fetching goes through
scripts/fetch_page.pywhich enforces SSRF protection (blocks private IPs, loopback, reserved ranges, GCP metadata endpoints) - No curl, no subprocess HTTP calls -- only the project's validated fetch pipeline
- All SQLite queries use parameterized placeholders (
?), never string interpolation - TLS always verified -- no
verify=Falseanywhere in the pipeline
Typical Workflows
Pre/Post Deployment Check
/seo drift baseline https://example.com # Before deploy
# ... deploy happens ...
/seo drift compare https://example.com # After deploy
Ongoing Monitoring
/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
Investigating a Traffic Drop
/seo drift compare https://example.com # What changed?
/seo drift history https://example.com # When did it change?