seo-ready について
seo-readyは、Webサイト開発者向けのSEO・AEO監査と修正を行うスキルです。フレームワークを特定してページを検査し、承認後にファイルを変更して結果を再確認します。
主な機能
- 01フレームワークとページルートの特定
- 0215種類のSEO・AEO項目の検査
- 03採点と監査レポートの作成
- 04フレームワークに応じたファイル修正
- 05変更したページの再検査
活用シーン
- 01サイトの検索・AI検索への対応状況の評価
- 02メタデータや構造化データの不足箇所の特定
- 03サイトマップとrobotsルールの追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tushaarmehtaa/ tushar-skills --skill seo-readyインストール後、Claude Code で/seo-readyを入力して読み込まれたか確認します。
詳細
コードベースを読み込み、すべてのシグナルをスコアリングして修正を適用する、完全な SEO および AEO 監査です。レポートを作成するだけではなく、ファイルを変更します。
フェーズ 1:スタックの検出
最初に、フレームワークとルーティングパターンを特定します。
次の項目を順に確認します:
next.config.*→ Next.js(package.json でバージョンを確認します。v13 以降は App Router とgenerateMetadataを使用し、それより前のバージョンは_documentとnext/headを使用します)astro.config.*→ Astro(レイアウト内でフロントマターと<head>を使用します)nuxt.config.*→ Nuxt(useHeadまたはuseSeoMetaを使用します)svelte.config.*→ SvelteKit(<svelte:head>を使用します)- ルートに
index.html→ 静的 HTML/Vite SPA gatsby-config.*→ Gatsby(gatsby-plugin-react-helmetを使用します)
すべてのページ/ルートを検索します:
- Next.js App Router:
app/**/page.tsxまたはpage.jsx - Next.js Pages Router:
pages/**/*.tsx - Astro:
src/pages/**/*.astro - 静的サイト:すべての
.htmlファイル
ユーザーに次のように伝えます:「[framework] プロジェクトで [N] ページが見つかりました。SEO/AEO の完全な監査を実行します。」
フェーズ 2:すべてのシグナルを監査
すべてのページを対象に、次の項目を確認します。それぞれを PASS/WARN/FAIL で評価します。
2.1 タイトルタグ
- すべてのページに固有の
<title>または同等のメタデータが必要です - 長さ:30~60 文字(PASS)、20~70 文字(WARN)、範囲外(FAIL)
- ページの主要キーワード/トピックを含める必要があります
- Next.js:
metadata.titleまたはgenerateMetadata()の戻り値を確認します - ルートレイアウトにタイトルテンプレート(例:
%s | Brand Name)があるか確認します
2.2 メタディスクリプション
- すべてのページにメタディスクリプションが必要です
- 長さ:70~160 文字(PASS)、50~180 文字(WARN)、範囲外または未設定(FAIL)
- ページの直接的な回答または中心的な訴求内容を含める必要があります
- Next.js:
metadata.descriptionを確認します
2.3 見出し階層
- 各ページの
<h1>は必ず 1 つ(PASS)、0 個または複数(FAIL) - 大見出しには H2 を使用します
- レベルの飛ばし(h1 → h2 なしで h3)を確認します
- AEO:H2 のいずれかが質問形式か(how/what/why/when/who/which/can/does/should)を確認します
- 質問形式の見出しが 2 つ以上 = PASS、1 つ = WARN、0 個 = FAIL
- 質問形式の見出しは、音声検索や LLM へのプロンプトに直接合致します
2.4 Open Graph タグ
og:title、og:description、og:type、og:url、og:imageのすべてが必要ですog:imageは重要です。設定されていないと、ソーシャルメディアで共有した際にカードが空白になります- Next.js:
metadata.openGraphオブジェクトを確認します - Twitter カードタグ(
twitter:card、twitter:title、twitter:description)も確認します - 視認性を最大限に高めるには、
twitter:cardをsummary_large_imageに設定します
2.5 canonical URL
- すべてのページに canonical URL が必要です
- Next.js:
metadata.alternates.canonicalを確認します - HTML:
<link rel="canonical">を確認します - 相対 URL ではなく、絶対 URL である必要があります
2.6 構造化データ(JSON-LD)
<script type="application/ld+json">ブロックがあるか確認します- 次の価値の高いスキーマタイプを確認します:
FAQPage— AI の回答で、ロングテールの質問を獲得します(影響大)HowTo— 「方法」に関する強調スニペットの獲得に役立ちますArticle/BlogPosting— コンテンツページ向けWebApplication— SaaS 製品向けProduct+Review— EC 向けOrganization— ブランドの識別情報BreadcrumbList— ナビゲーションのコンテキスト
- Next.js:スキーマはページコンポーネント内の
<script>タグまたはメタデータに含まれている場合があります - 関連するスキーマタイプがあれば PASS、なければ FAIL
2.7 サイトマップ
sitemap.xml、sitemap.ts(Next.js)、またはsitemap-index.xmlがあるか確認します- 適切な
lastmod、changefreq、priorityを含め、すべての公開ページを網羅する必要があります - 動的ページ(例:すべての
/blog/[slug]ページ)も含める必要があります - 存在し、すべてのページを網羅していれば PASS、存在するが不完全なら WARN、なければ FAIL
2.8 Robots.txt
robots.txtまたはrobots.ts(Next.js)があるか確認します- 公開ページのクロールを許可する必要があります
- 非公開ルート(
/api/、/admin/、/auth/、/dashboard/)をブロックする必要があります - サイトマップ URL を参照する必要があります
- 完全に欠落している場合は FAIL
2.9 AI クローラーのルール(AEO 固有)
robots.txtで、AI クローラーに対する明示的なルールを確認します。GPTBot(OpenAI / ChatGPT)ChatGPT-User(ChatGPT のブラウジング)Claude-Web(Anthropic)PerplexityBot(Perplexity)Applebot-Extended(Apple Intelligence)Google-Extended(Gemini)
- 公開コンテンツページでは、これらを明示的に許可する必要があります。
- 言及がない場合は警告(デフォルトの動作は異なります)、明示的にブロックされている場合は不合格とします。
2.10 llms.txt
- 公開ディレクトリに
llms.txtがあるか確認します。 - このファイルは、AI ツールが製品/サイトの構造を理解するのに役立ちます。
- 次の内容を含める必要があります:製品名、説明、主な機能、料金、重要な URL
- 存在し、内容があれば合格、ない場合は不合格とします。
2.11 冒頭の要約/回答ブロック(AEO 固有)
- コンテンツページでは、最初の段落が簡潔な要約(35~90 語)になっているか確認します。
- これは、回答エンジンが回答ボックスに引用する内容です。
- 「回答を先に示す」書き方のパターンになっているか確認します。重要な情報は埋もれさせず、ページ上部に配置する必要があります。
- 見つかった場合は合格、長すぎる/短すぎる場合は警告、明確な要約がない場合は不合格とします。
2.12 内部リンク
- ページごとの内部リンク数を数えます。
- 内部リンクが6件以上なら合格、2~5件なら警告、0~1件なら不合格とします。
- 内部リンクは、検索エンジンや LLM のリトリーバーがトピックの深さを把握するのに役立ちます。
2.13 FAQ セクション
- FAQ の見出し、または FAQ のような Q&A コンテンツがあるか確認します。
- これらは、AI 検索におけるロングテールのプロンプトを捉えるのに役立ちます。
- FAQ コンテンツがある場合は、構造化データ(FAQPage スキーマ)を設定する必要があります。
- FAQ セクションとスキーマの両方があれば合格、FAQ はあるがスキーマがない場合は警告、どちらもない場合は不合格とします。
2.14 画像の代替テキスト
- すべての
<img>タグと Next.js の<Image>コンポーネントに代替テキストが設定されているか確認します。 - すべての画像に説明的な代替テキストを設定する必要があります。
- すべてに設定されていれば合格、一部にない場合は警告、大半にない場合は不合格とします。
2.15 パフォーマンスの指標
- Next.js プロジェクトで、(生の
<img>ではなく)next/imageが使われているか確認します。 - フォントの最適化(next/font、font-display: swap)を確認します。
- 過剰なクライアントサイド JavaScript(サーバーでレンダリング可能なページでの
"use client")がないか確認します。
フェーズ3:スコアを算出してレポートする
総合スコアを算出します。
- 各チェックの重みは同じです。
- 合格=1ポイント、警告=0.5ポイント、不合格=0ポイント
- スコア=(合計ポイント数 / チェック総数)* 100
レポートを表示します。
SEO/AEO Readiness: [SCORE]/100 ([VERDICT])
Framework: [detected framework]
Pages scanned: [N]
On-site checks:
[PASS] Title tags All pages have titles (30-60 chars)
[WARN] Meta descriptions 2/5 pages missing descriptions
[FAIL] Structured data No JSON-LD schema detected
[PASS] Sitemap sitemap.ts found, covers all pages
...
AEO checks:
[FAIL] AI crawler rules No AI bot rules in robots.txt
[FAIL] llms.txt Not found
[WARN] Question headings 1 question heading found (need 2+)
[FAIL] FAQ schema No FAQPage schema
...
Top issues to fix (by impact):
1. (HIGH) Add FAQPage JSON-LD schema — captures AI answer citations
2. (HIGH) Create llms.txt — makes your site readable by AI tools
3. (HIGH) Add AI crawler allow rules — GPTBot, Claude-Web, PerplexityBot
4. (MEDIUM) Add meta descriptions to 2 pages
5. (LOW) Add alt text to 3 images
次に、**「[N]件の問題をすべて修正しますか、それとも特定の問題を選びますか?」**と尋ねます。
フェーズ4:すべて修正する
検出されたフレームワークに応じて修正を適用します。変更を加える前に確認してください。
修正:メタタグの不足/不備
Next.js App Router:
- ページファイルに
metadataエクスポートを追加または更新するか、動的ページ用にgenerateMetadata()を追加します。 - ルートの
layout.tsxでタイトルテンプレートを設定します:title: { template: '%s | Brand', default: 'Brand — tagline' } - 説明、キーワード、作成者、クリエイターを追加します。
静的 HTML:
<head>セクションに<meta>タグを追加します。
修正:Open Graph/Twitter Cards の不足
Next.js:
openGraph: {
title: 'Page Title',
description: 'Page description',
type: 'website', // or 'article' for content pages
url: 'https://yoursite.com/page',
siteName: 'Brand Name',
locale: 'en_US',
},
twitter: {
card: 'summary_large_image',
title: 'Page Title',
description: 'Page description',
}
修正:OG 画像の不足
Next.js App Router:
アプリディレクトリにopengraph-image.tsx(または.jsx)を作成し、OG 画像を自動生成します。
import { ImageResponse } from 'next/og'
export const runtime = 'edge'
export const alt = 'Page Title'
export const size = { width: 1200, height: 630 }
export const contentType = 'image/png'
export default async function Image() {
return new ImageResponse(
(
<div style={{
fontSize: 64,
background: '#000',
color: '#fff',
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}>
Page Title
</div>
),
{ ...size }
)
}
静的サイトの場合は、1200x630 の画像を作成して参照するようユーザーに案内します。
修正:サイトマップの不足
Next.js App Router — app/sitemap.tsを作成します。
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://yoursite.com'
return [
{ url: baseUrl, lastModified: new Date(), changeFrequency: 'daily', priority: 1 },
// Add all public pages here
]
}
プロジェクトのページ/ルートを読み取り、適切な優先度を設定してすべてのエントリーを自動生成します。
- ホームページ:優先度1、毎日
- 主要な機能ページ:優先度0.8、毎週
- コンテンツ/ブログページ:優先度0.7、毎週
- 法務/会社概要ページ:優先度0.3、毎月
動的ルートの場合は、利用可能であればgenerateStaticParamsのデータを使用して、すべてのスラッグを含めます。
修正:robots.txt の不足/不備
Next.js App Router — app/robots.tsを作成します。
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
const baseUrl = 'https://yoursite.com'
return {
rules: [
{
userAgent: '*',
allow: '/',
disallow: ['/api/', '/admin/', '/auth/', '/dashboard/'],
},
{
userAgent: 'GPTBot',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'ChatGPT-User',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'Claude-Web',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'PerplexityBot',
allow: ['/', '/docs/', '/blog/'],
},
{
userAgent: 'Applebot-Extended',
allow: ['/', '/docs/', '/blog/'],
},
],
sitemap: `${baseUrl}/sitemap.xml`,
}
}
プロジェクトの実際の公開ルートに合わせて許可するパスを調整します。
修正:llms.txt の不足
次の内容でpublic/llms.txtを作成します。
# [Product Name]
## What is [Product Name]?
[One paragraph description — what it does, who it's for]
## Key Features
- [Feature 1]
- [Feature 2]
- [Feature 3]
## Pricing
[Pricing model — free, freemium, paid, per-credit, etc.]
## Links
- Website: [URL]
- Documentation: [URL]
- GitHub: [URL if open source]
プロジェクトの README、ランディングページのコピー、package.json を読み取り、自動で内容を補完します。
修正:構造化データの不足
FAQ コンテンツがある場所に FAQPage スキーマを追加します。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Question text here?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Answer text here."
}
}
]
}
</script>
SaaS 製品に WebApplication スキーマを追加します。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Product Name",
"description": "Description",
"url": "https://yoursite.com",
"applicationCategory": "Category",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
コンテンツ/ブログページに Article スキーマを追加します。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article Title",
"description": "Description",
"author": { "@type": "Organization", "name": "Brand" },
"publisher": { "@type": "Organization", "name": "Brand" },
"mainEntityOfPage": { "@type": "WebPage", "@id": "https://yoursite.com/page" }
}
</script>
修正:正規 URL の欠落
Next.js:
alternates: {
canonical: 'https://yoursite.com/this-page',
}
修正:見出し階層の問題
- H1 が複数ある場合:最も関連性の高いものを残し、ほかは H2 に下げます
- H1 がない場合:最も目立つ見出しを H1 にします
- AEO に適している場合は、H2 を疑問形に言い換えることを提案します
修正:代替テキストの欠落
- 代替テキストがない画像をすべて見つけます
- 画像ファイル名と周囲の文脈に基づいて、内容が伝わる代替テキストを作成します
- Next.js では、すべての
<Image>コンポーネントにaltプロパティが設定されていることを確認します
フェーズ 5:検証
修正を適用した後、変更したファイルのみを対象に監査を再実行します。修正前と修正後のスコアを表示します。
SEO/AEO Readiness: 34/100 -> 89/100
Fixed:
+ Added meta descriptions to 3 pages
+ Created sitemap.ts with 8 pages
+ Created robots.ts with AI crawler rules
+ Created llms.txt
+ Added FAQPage schema to /guides page
+ Added OG image generator
+ Fixed heading hierarchy on 2 pages
Remaining (manual):
- Add real OG image assets (currently using generated fallback)
- Write FAQ content for /pricing page
- Add alt text to 2 product screenshots (need human description)
モード修飾子
ユーザーはモードを指定して、ドメイン固有のチェックを追加できます。
モード:b2b — 次のチェックを追加します。
- サブドメインではなく、サブディレクトリにドキュメント/ヘルプセンターがあること
- 技術コンテンツの充実度(コード例、API リファレンス)
- 比較/代替製品のページ
- インテグレーションのページ
モード:commerce — 次のチェックを追加します。
- 価格、在庫状況、レビューを含む商品スキーマ
- レビュー/評価の構造化データ
- カテゴリページの最適化
- 商品写真の画像最適化
モード:local — 次のチェックを追加します。
- LocalBusiness スキーマ
- NAP(名称、住所、電話番号)の一貫性
- Google ビジネス プロフィールへのリンク
- 地域固有のコンテンツ
モード:saas — 次のチェックを追加します。
- WebApplication スキーマ
- 価格ページの構造化データ
- 機能比較表
- 鮮度を示すシグナルとなる変更履歴/更新ページ