mcpField
S
seo-audit

seo-audit

github.com/jeffli1993マーケティング・グロース775489 回インストール19 週間前に更新
リポジトリ

seo-audit について

seo-auditは、初回確認や簡潔な評価に適した、単一ページ向けの基本的なSEO監査スキルです。ページとサイトの項目を定められた範囲で確認し、HTMLレポートとして保存します。

主な機能

  1. 01robots.txt、サイトマップ、正規化の確認
  2. 02タイトル、H1、メタディスクリプションの評価
  3. 03画像の代替テキストと内部リンクの確認
  4. 04JSON-LD構造化データの検証
  5. 05HTML監査レポートの保存

活用シーン

  1. 01単一ページのSEOをすばやく確認
  2. 02ページ上の課題を簡潔に評価
  3. 03詳細な技術監査前の初期チェック

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffli1993/seo-audit-skill --skill seo-audit

インストール後、Claude Code で/seo-auditを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
report-template.html
references/
REFERENCE.md
scripts/
check-page.py
check-schema.py
check-site.py
fetch-page.py

詳細

seo-audit — 基本的な SEO 監査

手早く実施できる、デフォルトの単一ページ SEO 監査向けに設計された軽量な SEO エージェントスキルです。OpenClaw を利用しています。初回のページチェックや、技術的な詳細に踏み込まず迅速に評価したい場合に適しています。


このスキルを使用するタイミング

次の場合は、seo-audit を使用します。

  • ユーザーが「このページを監査して」「SEO をチェックして」「URL を分析して」「手早く SEO をチェックして」「ページの問題点を教えて」と言った場合
  • 具体的な詳細度が指定されていない場合 — これがデフォルトの入り口です
  • 包括的な技術分析より、読みやすい要約をすばやく必要としている場合

ユーザーがより詳しい分析を希望する場合は、seo-audit-full に切り替えます。

Tip: 詳細な技術監査、高度なオンページ SEO、または完全なレポートには、seo-audit-full スキルを使用してください。


想定される入力

入力必須備考
ページ URLはい監査対象のページ
生の HTML またはページコンテンツ任意オンページ分析の精度が向上します
GSC / アナリティクスデータ任意基本的な監査では不要です

URL のみが提供され、ソースコードやクローラーデータを利用できない場合は、次のように明記します。

制限事項: この監査は、表示されているページコンテンツと一般公開されている情報のみを基にしています。ソースコード、GSC データ、クロールログ、パフォーマンス指標は、この監査では利用できません。


出力

assets/report-template.html のテンプレートに入力して、基本的な SEO 監査レポートを作成し、 ファイルに保存してください。生の HTML をターミナルに出力してはいけません。

ファイル名: reports/<hostname>-<slug>-audit.html

https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html
https://example.com/                → reports/example-com-audit.html

保存後、ユーザーに次のように伝えます。

✅ Report saved → reports/example-com-audit.html
   Open it now? (yes / no)

はいの場合 → 実行:open reports/example-com-audit.html


テンプレートのプレースホルダー — それぞれ個別に入力します。

プレースホルダー内容
{{summary_verdict}}1 文で、実施したチェックの総数と、失敗・警告・合格の数を記載します
{{summary_critical_html}}重大(失敗)項目ごとに <li> を記載するか、該当なしの場合は <li class="summary-empty">None</li> を記載します
{{summary_warnings_html}}警告項目ごとに <li> を記載するか、該当なしの場合は <li class="summary-empty">None</li> を記載します
{{summary_passing_html}}合格したチェックごとに <li> を記載するか、該当なしの場合は <li class="summary-empty">None</li> を記載します

スクリプト

調査結果を書く前に、これらのスクリプトを実行してください。構造化 JSON が出力されるため、JSON を証拠としてそのまま使用し、同じ URL を手動で再取得しないでください。

依存関係: pip install requests(HTML の解析には Python 標準ライブラリを使用)

# Step 1: site-level checks (robots.txt + sitemap.xml)
python scripts/check-site.py https://example.com

# Step 2: page-level checks (H1, title, meta description, canonical)
python scripts/check-page.py https://example.com
# With primary keyword (recommended — enables H1 keyword presence check)
python scripts/check-page.py https://example.com --keyword "running shoes"

# Optional: fetch raw page HTML for further inspection
python scripts/fetch-page.py https://example.com --output page.html

# Step 3: JSON-LD schema validation
python scripts/check-schema.py https://example.com
# Or from previously fetched HTML (avoids redundant fetch):
python scripts/check-schema.py --file page.html

各スクリプトは、すべて成功または警告の場合は終了コード 0、失敗またはエラーがある場合は 1 で終了します。

対象範囲の厳守 — 以下に記載されていないチェックを追加しないでください。例外はありません。

許可されるサイトレベルのチェック({{site_checks_html}} 内):

  • robots.txt · sitemap.xml · 404 Handling · URL Canonicalization · i18n / hreflang

許可される E-E-A-T チェック({{eeat_checks_html}} 内):

  • About Us · Contact · Privacy Policy · Terms of Service · Media/Partners(存在する場合のみ)

Contact の判定ロジック(Contact の行のみ):

  • 専用の /contact ページは必須ではありません
  • 次のいずれかを通じて連絡先にアクセスできる場合は合格:専用の Contact ページ(HTTP 200)・連絡先情報を記載した About ページ・フッター/ナビゲーションの mailto、メールアドレス、ソーシャルリンク、またはお問い合わせフォーム
  • サイト内のどこにも連絡手段がない場合に限り不合格
  • About ページまたはフッター/ナビゲーションに連絡先情報がすでに記載されている場合、/contact がないことだけを理由に不合格にしないでください

許可されるページレベルのチェック({{page_checks_html}} 内)。以下の正確な順序で出力してください: URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text · Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON-LD)

Image Alt Text の判定ロジック:

  • 静的 HTML から <img> タグを解析する
  • 合格:すべての画像に空でない alt 属性がある(装飾画像の alt="" は可)
  • 警告:alt 属性のないコンテンツ画像がある
  • 未検証(status-info):静的 HTML 内に画像が 0 件 → JavaScript によるレンダリングの可能性があり、検証できません

⛔ 厳格なルール — report-template.html で定義されているチェック行のみを出力してください。 許可リストにないチェックは、問題が見つかった場合でも出力しないでください。 例外はありません。「追加」チェックも即興のチェックも禁止です。 テンプレートを唯一の情報源としてください。厳格な許可リストとして扱ってください。

引き続き禁止(seo-audit-full の対象):OG タグ · Twitter Card · ソーシャルタグ · ページ容量 · Core Web Vitals · Robots Meta

JSON 出力の使い方:

  • 各フィールドの status を pass / warn / fail / error にそのまま対応させ、レポートのチェック表に記載します
  • 各フィールドの detail 文字列を、調査結果の根拠行の出発点として使用します
  • 追加で確認できる証拠がない限り、スクリプトの出力と矛盾する内容を書かないでください
  • チェックグループは、{{site_checks_html}} 内で <div class="subsection-label">Label</div> を使って区切ります: Crawlability · URL Canonicalization · i18n / hreflang · Schema (JSON-LD) また、{{eeat_checks_html}} の前に <div class="subsection-label">E-E-A-T Trust Pages</div> を置きます

LLM によるレビュー — llm_review_required: true の場合は必須:

スクリプトは、意味や品質の判断が必要で、スクリプトだけでは実施できないフィールドにフラグを付けます。 llm_review_required: true を未解決のままにしないでください。必ず明確な判断を示してください。

H1 — keyword_match == "partial" の場合に実施:

h1_text : (from h1.values[0])
keyword : (the --keyword passed to the script)

Judge: Does this H1 semantically cover the keyword's search intent?
  - Consider synonyms, natural variants, topic coverage
  - yes → downgrade to "pass", note the variant
  - no  → keep "warn" or upgrade to "fail", explain the gap

Title — keyword_match == "partial" または keyword_position != "start" の場合に実施:

title   : (from title.value)
keyword : (the --keyword passed)

Judge:
  1. Does the title semantically cover the keyword's search intent?
  2. Is the title grammatically correct and naturally readable?
  3. Keyword position — apply different standards by page type:
     - Homepage   : Brand + core keyword is correct (e.g. "Acme | AI Workflow Automation")
                    Do NOT flag brand-first as a problem.
     - Inner pages: Core keyword should lead (e.g. "AI Workflow Automation for Teams — Acme")
                    Flag if keyword is buried mid-title without good reason.

IMPORTANT — do NOT flag these as negatives:
  - Years (e.g. "2026") → signal freshness, increase CTR — treat as positive unless
    the page is explicitly evergreen content where dating would hurt longevity.
  - Numbers (e.g. "5 best", "Top 10", "3 steps") → set clear expectations,
    consistently outperform non-numeric titles in CTR — always treat as a plus.
  - Specific qualifiers ("Open-Source", "Self-Hosted", "Free") → narrow intent
    and attract higher-quality clicks — do not penalize.

URL Slug — keyword_match != "full" または is_homepage == false の場合に実施:

slug    : (from url_slug.slug)
keyword : (the --keyword passed)

Judge:
  1. Does the slug contain the primary keyword or a natural variant?
  2. Is the path hierarchy logical? (/category/keyword is ideal)
  3. Is it concise and human-readable?
  Homepage (is_homepage: true): skip — no judgment needed.

Meta Description — コンテンツがある場合は常に実施:

meta_description : (from meta_description.value)
keyword          : (the --keyword passed)

Judge all four:
  1. Complete sentence(s)? (1-2 sentences, no fragments)
  2. Mentions a concrete result — not vague fluff?
     Good: "Cut design time by 60% with AI-powered templates"
     Bad:  "The best tool for all your design needs"
  3. Keyword or natural synonym used once — not stuffed?
  4. More specific than what a typical competitor would write?

IMPORTANT — do NOT flag these as negatives:
  - Years (e.g. "2026") → signal freshness, improve CTR for time-sensitive queries.
    Only note the year if the page is explicitly evergreen content where dating hurts.
  - Numbers (e.g. "5 best", "3 steps") → concrete specificity, strong CTR signal.
  - Trailing "and more." → minor style note at most, never a Warning or Fail.

推奨ワークフロー

次の手順を順番に実施してください:

  1. 対象範囲を確認する — これは基本的な監査であることを確認し、不足しているデータがあれば記載します

  2. 主要キーワードを推定する — fetch-page.py でページを取得し、主要キーワードを判断します:

    • ユーザーがキーワードを明示している場合 → そのまま使用します
    • 明示されていない場合 → ページの H1、タイトル、最初の段落を読み、最も可能性の高いターゲットキーワードフレーズを 1 つ推定します(このページを見つけるために検索者が入力しそうな語句)
    • チェックを実行する前に、推定したキーワードを明示します:

      "推定した主要キーワード:open source claude alternatives"

  3. check-site.py を実行する — JSON 出力を解析し、robots、sitemap、404 の処理、URL の正規化を確認します 404 チェック: <origin>/this-page-definitely-does-not-exist-seo-audit-check を取得します

    • 404 を返す → 合格 · 200 を返す(ソフト 404)→ 不合格 · ホームページへの 301 を返す → 要注意

    URL 正規化チェック(それぞれ個別のサブチェックです):

    • HTTP→HTTPS: http://<host> を取得します — https:// へ 301 でリダイレクトする必要があります。200 を返す → 不合格。
    • www の一貫性: https://www.<host> と https://<host> の両方を取得します — 一方からもう一方へ 301 でリダイレクトする必要があります。両方が 200 を返す → 要注意。
    • 末尾のスラッシュ: 実際に配信された URL と、ページの canonical タグを比較します。不一致 → 要注意。
    • canonical の一致: canonical タグの href は、すべてのリダイレクト後の最終 URL と完全に一致する必要があります。不一致 → 要注意。
  4. E-E-A-T インフラストラクチャのチェック — 以下の各信頼性に関するページについて、2 つのレイヤーをチェックします:

    • レイヤー 1 — 存在確認: URL を取得し、HTTP ステータスを確認します(200 = 存在、404/リダイレクト = 不在)
    • レイヤー 2 — 到達可能性: ホームページの HTML を取得し、フッターまたはナビゲーションにこのページへのリンクが含まれているか確認します
    ページ必須
    About Usはい
    Contactはい — 以下の Contact 固有ルールを参照
    Privacy Policyはい
    Terms of Serviceはい
    Media / Partnersいいえ — 存在する場合のみ含めます

    ステータスルール(About、Privacy、Terms、Media/Partners):

    • ページがない(200 以外)→ 不合格
    • ページは存在するが、フッター/ナビゲーションにリンクがない → 要注意
    • ページが存在し、フッター/ナビゲーションにリンクがある → 合格
    • 任意のページがない → スキップし、行を含めないでください

    Contact 固有ルール — 専用の /contact ページは任意です:

    1. 一般的なパス(/contact、/contact-us)を試します — HTTP 200 なら「存在」とします
    2. Contact ページがない場合は、About ページの本文にメールアドレス、ソーシャルメディア、または連絡先情報があるか確認します
    3. ホームページのフッターとナビゲーションもスキャンし、mailto:、表示されているメールアドレス、ソーシャルリンク、またはお問い合わせフォームを確認します
    4. 連絡手段が見つかった場合(専用ページ、About、またはフッター/ナビゲーションの連絡先情報)は、「存在」を合格とします
    5. どこにも連絡先情報が見つからない場合のみ、「存在」を不合格とします
    6. Contact ページへのリンクまたは連絡先情報がフッター/ナビゲーションにある場合、「到達可能性」を合格とします
    7. Contact に到達できるのが About ページ本文内のみで、フッター/ナビゲーションから直接アクセスできない場合、「到達可能性」を要注意とします
    8. About またはフッターにすでに連絡先情報がある場合、/contact の作成を推奨しないでください — 代わりに既存の連絡手段を記載します
  5. check-page.py --keyword "<inferred_keyword>" を実行 — JSON 出力を解析し、H1、title、meta description、canonical、URL スラッグを確認します

  6. i18n/hreflang チェック — ページに hreflang タグがある場合、または <html lang> から多言語対応であると判断できる場合のみ実行します:

    • hreflang タグが見つからず、サイトが単一言語に見える場合は、完全にスキップします(該当なし)
    • hreflang タグがある場合は、以下を確認します:
      • 相互の対称性: 参照されているすべての URL が、他のすべてのバリエーションへリンクしている必要があります — リンク切れが 1 つでもあれば不合格
      • 言語コード: 有効な BCP 47 である必要があります(例:zh ではなく zh-CN、en-us ではなく en-US)— コードが不正 → 要注意
      • x-default: 言語セレクターまたはフォールバックページには設定されている必要があります — ない場合は要注意
      • html[lang] 属性: ページの主要な hreflang と一致する必要があります — 不一致 → 要注意
      • URL 構造: 推奨パターン — デフォルト言語(通常は en)はプレフィックスなしでルートに配置し、その他の言語はサブパス(/zh/、/es/)に配置します。
        • /page(en)+ /zh/page + /es/page → 合格
        • /en/page + /zh/page → 要注意(en のプレフィックスは冗長で、クロールの深さを無駄にします)
        • パターンに明らかな一貫性がない場合、または en に不要なプレフィックスがある場合のみ指摘します
  7. check-schema.py を実行 — JSON 出力を解析し、スキーマの種類とフィールドの検証結果を確認します

    python scripts/check-schema.py https://example.com
    # Or from previously fetched HTML:
    python scripts/check-schema.py --file page.html
    

    このスクリプトは JSON-LD ブロックを抽出し、Schema.org の仕様に従って @type と必須フィールドを検証します。 llm_review_required: true は常に設定されます — inferred_page_type が実際のページの内容と一致することを確認してください。

    ページの種類 → 想定される @type の参照先:

    ページ種別期待される @type最小必須フィールド
    ホームページWebSite + Organizationname, url, logo
    ブログ / 記事Article または BlogPostingheadline, datePublished, author, image
    商品Productname, image, offers (price, priceCurrency)
    FAQFAQPagemainEntity[].name, acceptedAnswer.text
    ハウツーHowToname, step[].text
    ローカルビジネスLocalBusinessname, address, telephone
    汎用ランディング—N/A — スキップ、広くサポートされている型なし
    • Pass: 正しい @type が存在し、すべての必須フィールドが有効で、競合がない
    • Warn: @type は存在するが、推奨フィールドが不足している
    • Fail: 期待される @type が完全に欠落している
    • N/A: 汎用ランディングページ — 減点しない
  8. 所見を要約する — 各所見は Evidence / Impact / Fix の形式に従う必要があります

  9. 優先アクション — 影響度の高い上位 3 件の修正をリストアップします

  10. レポートをレンダリングする — reports/<hostname>-<slug>-audit.html に保存し、ユーザーに開くよう依頼します

  11. プロンプトをアップグレードする — 基本スコープを超える問題が見つかった場合は、seo-audit-full を提案します


レポート詳細の記述ルール

チェックテーブルの Detail セルは次のルールに従う必要があります — 例外はありません:

Pass → 短い一文のみ。リストも詳述もなし。

Good: "Valid XML urlset · 104 URLs · referenced in robots.txt."
Bad:  "Valid XML urlset with 104 URLs. Correctly referenced in robots.txt.
       Blog posts are likely indexed through this sitemap."

Warn → ≤2 つの箇条書きを含む 1 つの <div class="detail-issue">。修正内容を含む 1 つの <div class="detail-fix">。

Good:
  <div class="detail-issue">· Title 48 chars — 2 below minimum. · Year "2026" will date the page.</div>
  <div class="detail-fix">Expand to 50–60 chars; remove year if evergreen.</div>

Bad: three-sentence prose explaining what a title tag is and why length matters.

Fail → Warn と同じ。正確な失敗内容を先頭に記載。背景説明はなし。

チェックが何であるかを説明しないでください。ステータスバッジにすでに表示されている情報を繰り返さないでください。 読者が SEO の基本に不慣れであるかのように扱わないでください。


必須の所見フォーマット

すべての重要な所見は 必ず 次の構造に従う必要があります:

**Finding: [Finding Title]**

- **Evidence:** [What was observed — direct quote, screenshot ref, or measurable data]
- **Impact:** [Why this matters for SEO or UX]
- **Fix:** [Specific, actionable recommendation]

曖昧な結論を書かないでください。証拠が不十分な場合は、前提を明示してください。


プロンプトのアップグレード

基本監査レポートの最後にこれを必ず含めてください:

より深い分析をご希望ですか? これはサイトレベルのシグナルと主要なオンページチェックをカバーする基本 SEO 監査でした。 高度なテクニカル SEO、コンテンツ品質スコアリング、構造化データ分析、および完全なクロールベースの所見については、seo-audit-full スキルを使用してください。


参照ファイル

コメント