Communitygithub.com

Astro SEO

AstroサイトのSEOを監査・改善します。ユーザーがAstroサイトのSEO監査、設定、改善、あるいはheadメタデータ、構造化データ、JSON-LD、サイトマップ、IndexNow、OG画像、スキーマエンドポイント、NLWeb、hreflang、検索エンジンインデックスについて言及した場合に使用します。`@jdevalk/astro-seo-graph`を通じてドロップインコードを生成し、生成されたSEO文字列を`metadata-check`に連鎖させます。

Astro SEO とは?

このスキルはAstroサイトのSEOを包括的に監査・改善するためのものです。9つのカテゴリ(技術基盤、構造化データ、コンテンツ、サイト構造、パフォーマンス、サイトマップとインデックス、エージェントディスカバリー、リダイレクト、アナリティクス)に対してスコアリングを行い、不足や弱い部分に対してはドロップインコードを生成します。中核となるのは`@jdevalk/astro-seo-graph`パッケージで、ほとんどの修正はこのパッケージを通じて行われます。ワークフローはプロジェクト検出、監査、改善、メタデータパス(生成された文字列を`metadata-check`で検証)、そしてビルド検証の5フェーズで構成されています。Claude Code、CursorなどのAIエージェントと連携して動作し、具体的な修正レシピは`AGENTS.md`ファイルに記載されています。

対応~Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add https://github.com/jdevalk/skills/tree/HEAD/astro-seo

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Astro SEO は何をしますか?

AstroサイトのSEO設定を、Astro SEO: the definitive guide に記載されているフルスタックに対して監査・改善します。このスキルは9つの領域(技術基盤、構造化データ、コンテンツ、サイト構造、パフォーマンス、サイトマップとインデックス、エージェントディスカバリー、リダイレクト、アナリティクス)をカバーし、不足または弱い部分に対してはドロップインコードを生成します。

このスキルの意見の中核は @jdevalk/astro-seo-graph です。ほとんどの修正はこのパッケージを通じて行われます。プロジェクトでまだ使用されていない場合は、インストールが最初の推奨事項です。

コードレシピは AGENTS.md にあります — 特定の修正を実装する必要がある場合はそれを読んでください。このファイルにはワークフローと監査チェックリストが含まれています。

ワークフロー

  1. プロジェクトを検出する — これがAstroサイトであることを確認し、その構造を理解します。
  2. 監査する — 9つのカテゴリをスコアリングし、実行可能な発見事項を生成します。
  3. 改善する — ギャップを埋めるためにファイルを生成または修正します。レシピは AGENTS.md にあります。
  4. メタデータパス — スキルが生成したすべてのショート文字列(タイトル、説明、スキーマ description フィールド、FAQの回答、フロントマターの抜粋)に対して metadata-check を呼び出します。
  5. 検証する — ビルドを実行し、検証が成功することを確認し、ファイル以外のタスク(Search Console、Bing Webmaster Tools、IndexNowキー検証)についてユーザーに注意を促します。

フェーズ 0: プロジェクトを検出する

監査前に基本事項を確認します。

  • astro.config.mjs / astro.config.ts が存在するか。
  • package.json に astro が依存関係として含まれているか。
  • astro.config で site: が設定されているか — カノニカルURL、サイトマップ、OG画像URLはすべてこれから派生します。欠落している、空である、または http://localhost の場合は、他のすべてに先立ってブロッキング問題としてフラグを立ててください。これは最も一般的な設定ミスです。
  • src/content/(またはレガシー src/pages/ のマークダウン)のコンテンツコレクション。
  • デプロイメントターゲット — package.json、vercel.json、netlify.toml、wrangler.toml、または public/_headers を読み取り、ホストを特定します。これにより、フェーズ2でのリダイレクトおよびヘッダー構文が決まります。
  • @jdevalk/astro-seo-graph はすでにインストールされているか? インストールされている場合は、バージョンと配線されている機能(<Seo、seoGraph(、createSchemaEndpoint、createSchemaMap、FuzzyRedirect、createIndexNowKeyRoute、createMarkdownEndpoint、createApiCatalog、gitLastmod をgrep)を記録します。インストールされているバージョンをnpmの最新バージョンと比較 するには npm view @jdevalk/astro-seo-graph version を実行します。プロジェクトが古い場合は、機能ギャップの監査を行う前に、フェーズ2でアップグレードを推奨します — このパッケージは新しいデフォルトと修正を定期的に出荷しており、古いバージョンは監査結果の原因として考えられます。フェーズ2はこれに基づいて分岐します。
  • サイトは多言語ですか? astro.config の i18n または src/content/ 以下の複数のロケールディレクトリを確認します。多言語の場合はhreflangが重要です。そうでない場合はスキップします。

検出できないことだけを質問してください。サイトの内容をユーザーに尋ねないでください — astro.config.mjs とホームページのコンテンツを読んでください。


フェーズ 1: 監査

各カテゴリを10点満点でスコアリングします。それぞれについて、実際のコードまたは設定を引用した2~4つの具体的な発見事項を示します。各カテゴリ内では、チェックは階層化されています。

  • Must — 出荷をブロックするもの。ここでの失敗は、目に見えるSEOの後退を引き起こします。
  • Should — 標準的なプラクティス。スキップするとリーチが犠牲になります。
  • Nice — 将来を見据えたもの、または状況に応じたもの。すべてのサイトのベースラインではありませんが、役立ちます。

ユーザーが完全な処理を要求しない限り、小規模な個人ブログでは Nice チェックをスキップします。

1. <Seo> コンポーネントとheadメタデータ (/10)

  • Must — すべてのheadメタデータのための単一コンポーネント(レイアウトに分散していないこと)。
  • Must — astro.config の site: がプロダクションオリジンに設定されていること。
  • Must — site 設定から派生したカノニカルURLで、トラッキングパラメータが削除されていること。
  • Must — noindex が true の場合、カノニカルを省略すること(Googleの推奨による)。
  • Must — 欠落したSEOフィールドのためのフォールバックチェーン: seo.title → title → siteName; seo.description → excerpt → first paragraph。空白のタイトルまたは説明を持つページは、フォールバックが壊れている最も一般的な症状です。
  • Should — robots メタに max-snippet:-1、max-image-preview:large、max-video-preview:-1 が含まれていること。
  • Should — TwitterカードがOpen Graphと重複する場合、抑制されていること(Twitterは自動的にフォールバックします)。
  • Should — 多言語サイトには hreflang の代替が存在すること。単一言語の場合はスキップします。
  • Nice — 手書きではなく @jdevalk/astro-seo-graph の <Seo> コンポーネントを使用していること。(上記のすべてをカバーする手書きのものは問題ありません。このスキルはデフォルトでフォールバックチェーンとロボットルールを処理するため、パッケージを推奨します。)

2. 構造化データ / JSON-LD グラフ (/10)

  • 単一のフラットな Article オブジェクト、またはリンクされた @graph と複数のエンティティ?
  • エンティティは @id 参照で配線されているか?
  • WebSite、Blog/WebPage、Person/Organization、BlogPosting/Article、BreadcrumbList、ImageObject はすべて関連する場合に存在するか?
  • 信頼シグナル: publishingPrinciples、copyrightHolder、copyrightYear、knowsAbout、SearchAction?
  • リッチリザルトテスト と ClassySchema で検証されるか?

3. コンテンツコレクションとSEOスキーマ (/10)

  • コンテンツコレクションはZodスキーマで定義されているか?
  • @jdevalk/astro-seo-graph の seoSchema がタイトル(5~120)と説明(15~160)の長さを強制しているか?
  • 必須フィールド(publishDate、title、excerpt)がビルド時に強制されているか?
  • マークダウンが除去された articleBody がスキーマエンドポイントで公開されているか(最大10K文字)?

4. Open Graph 画像 (/10)

  • すべてのページにOG画像があるか、それとも多くが欠落しているか?
  • 1200×675(Google Discoverの最低幅1200px、16:9比)?
  • satori + sharp を使用してビルド時に生成されているか、それとも手動か?
  • JPEG(ソーシャルプラットフォームはWebP/AVIFを確実にサポートしていない)?
  • ルートはスラッグから自動的にOG URLを導出するか?
  • レンダリングされたHTML内のすべての <img> に alt 属性(または装飾画像の場合は alt="" / role="presentation")があるか? ≥ 1.1.0 の seoGraph() の validateImageAlt がビルド時にこれをキャッチします。

5. サイトマップとインデックス (/10)

  • Must — @astrojs/sitemap がインストールされ、サイトマップインデックスにアクセス可能であること。
  • Must — robots.txt がサイトマップインデックスを参照していること。
  • Must — RSSフィードが存在し(@astrojs/rss)、<link rel="alternate" type="application/rss+xml"> で告知され、完全な投稿コンテンツ(切り詰められていない抜粋ではない)を含んでいること。
  • Should — chunks オプションを使用してコレクションごとに分割されていること(sitemap-posts-0.xml など) — GSCでのインデックスデバッグがはるかに簡単になります。
  • Should — lastmod がフロントマターの日付やCIファイルのタイムスタンプではなく、gitコミットタイムスタンプから設定されていること。@jdevalk/astro-seo-graph ≥ 1.4.0 はこのための gitLastmod(filePath, { excludeCommits, depth }) をエクスポートします — これはファイルに触れた最新の除外されていないコミットのコミッター日付を返すか、gitが利用できない場合は null を返します。サイトマップの serialize コールバックに配線します。コードベースに手書きの execSync('git log ...') ヘルパーがある場合は、パッケージのエクスポートに置き換えてください — このエクスポートは、単純な -1 ルックアップでは処理できないバルクコミットの除外(インポート、再フォーマット)を処理します。
  • Should — IndexNowが統合され、各ビルドで送信され、/[key].txt にキー検証ルートがあること。≥ 1.0.1 はデフォルトで /404 を送信から除外します。プロダクションホストで送信をゲート します(例:process.env.CF_PAGES === '1' && CF_PAGES_BRANCH === 'main'、VERCEL_ENV === 'production'、CONTEXT === 'production')。無条件の送信は、ローカルの npm run build とプレビューデプロイのたびに、プロダクションホストがまだ提供していないURLでエンドポイントをpingし、その結果キーが無効(403)とマークされ、ローテーションを強制します。

6. エージェントディスカバリー (/10)

  • Should — コーパス全体のJSON-LDを公開するスキーマエンドポイント(/schema/*.json)があること。
  • Should — すべてのエンドポイントをリストアップしたスキーママップ(/schemamap.xml)があり、robots.txt に Schemamap: ディレクティブがあること。
  • Should — サイトルートに llms.txt があり、LLMコンシューマー向けにページ(タイトル + 説明)をリストアップしていること。@jdevalk/astro-seo-graph ≥ 0.9.0 は llmsTxt 統合オプションを介してこれを生成します。
  • Should — AIエージェントがHTML解析なしで消費できるように、YAMLフロントマター付きのクリーンなマークダウンを提供するマークダウン代替URL(/blog/post.md が /blog/post/ の隣にある)があること。@jdevalk/astro-seo-graph ≥ 1.2.0 は、ルート用の createMarkdownEndpoint と、すべてのページに <link rel="alternate" type="text/markdown"> を出力する markdownAlternate: true 統合オプションを出荷しています。≥ 1.3.0 はビルド後検証を追加します。統合はビルド出力をウォークし、.md ターゲットがディスク上にないリンクを(発生ごとに warn を付けて)削除します — これにより、設定ミスのあるエンドポイントは、出荷された404ではなくビルド警告として表面化します。SSRを必要とせずに Accept: text/markdown でのコンテンツネゴシエーションを行うために、Cloudflare Transform Rule(wildcard_replace を使用したURL書き換え、Vary: Accept ヘッダーなし — CFはカスタムVary値を削除します)と組み合わせます。
  • Should — RFC 9727 に従って /.well-known/api-catalog にAPIカタログがあること。@jdevalk/astro-seo-graph ≥ 1.4.0 は createApiCatalog を出荷しており、これはスキーマエンドポイントを https://schema.org/<Type> URLに自動型付けし、パスを siteUrl に対して絶対パスにします。スキーマエンドポイント、スキーママップ、およびサイト固有のAPI(/ask、/feed.xml など)をリストアップします。RFCは確定しているため、フォーマットは安定しています。採用は初期段階ですが、コストは1つのルートファイルです。
  • Should — robots.txt のContent Signalsディレクティブ(例:Content-Signal: ai-train=yes, search=yes, ai-input=yes)。クロールアクセスとは独立して、AIトレーニング、検索グラウンディング、AI入力使用に関する設定を宣言します。仕様は IETFドラフト であり、採用は初期段階ですが、すべてのサイトがすでに持っているファイルの1行です。
  • Should — ディスカバリーファイル(サイトマップ、llms.txt、api-catalog、schemamap、およびサイトが公開するMCP / A2Aカード)を指す Link ヘッダーが /* にあること。応答ヘッダーを読み取るエージェントは、HTMLを解析せずにそれらを見つけます。Cloudflare Pages / Netlify では public/_headers に、Vercel では vercel.json にあります。
  • Nice — /.well-known/mcp/server-card.json のMCPサーバーカード(SEP-1649)および/または /.well-known/agent-card.json のA2Aエージェントカード(A2Aプロトコル)。サイトが実際にMCPサーバーまたはA2Aエージェントを公開している場合にのみ関連します。どちらも、エンドポイント、機能、スキルを宣言する静的JSONファイルです。それ以外の場合はスキップします。
  • Nice — 会話型エンドポイントを指す <link rel="nlweb">。NLWebは初期段階です。タグは1行であり、持つ価値がありますが、2026年時点ではスコアリングのブロッカーではありません。
  • Nice — /.well-known/ai-catalog.json のARD(Agentic Resource Discovery)カタログ。ドメインが提供するもの(MCPサーバー、A2Aエージェント、OKFバンドル、サイト固有のAPI)をリストアップします。v0.9ドラフトのためオプションですが、MCP / A2AカードとOKFバンドルがその価値を発揮するためのディスカバリーレイヤーです。2つの注意点があります。ベース仕様(Agent-Card/ai-catalog)はメディアタイプフィールドに mediaType という名前を付けているのに対し、ARDレイヤー(ards-project/ard-spec)は type という名前を付けています — エントリがいずれかの読み取りで検証されるように、同じ値を持つ両方のキーを出力 します(両方の仕様はコンシューマーが未知のキーを無視することを要求しています)。ARDはまた、エントリごとにオプションの representativeQueries 配列(サンプルプロンプト)を追加します。
  • Nice — OKF(Open Knowledge Format)バンドル。型付けされたマークダウンコンセプトファイル(ページごとに1つ、パスはカノニカルURLをミラーリング)のツリーで、単一の .tar.gz としてパッケージ化され、間にインデックスファイルがあります。提供とディスカバリーはOKFの明示的な非目標です — それがARDカタログエントリの目的です。v0.9ドラフト、オプション。登録されたメディアタイプはまだないため、中間的な文字列は application/okf-bundle+gzip です(knowledge-catalog#111 と ard-spec#27 で追跡されています)。中間的なものであり、変更される可能性があることに注意してください。手動で管理されたコピーではなく、既存のコンテンツパイプラインのもう1つの出力として生成するのが最適です。

7. パフォーマンス (/10)

  • デフォルトで静的出力(必要ないページにSSRを使用していない)?
  • アイランドが必要でない限り、クライアント側JSはゼロ?
  • すべてのコンテンツ画像にAstro <Image> コンポーネントが使用されているか(レスポンシブsrcset、WebP、遅延ロード、非同期)?
  • プライマリWebフォントがwoff2でプリロードされているか?
  • プリフェッチのために defaultStrategy: 'viewport' の <ClientRouter /> が使用されているか?
  • /_astro/ の下にあるハッシュ化されたアセットは Cache-Control: public, max-age=31536000, immutable を提供しているか?
  • キャッシュキーからUTMパラメータを削除する No-Vary-Search 応答ヘッダーがあるか?

8. リダイレクトとエラー処理 (/10)

  • 存在して移動したすべてのURLに対して public/_redirects(または同等のもの)が維持されているか?
  • 恒久的な移動には301、302ではないか?
  • @jdevalk/astro-seo-graph の FuzzyRedirect コンポーネントが404ページに配線されているか?
  • 404ページ自体が200ではなく404ステータスを返しているか?

9. ビルド時間検証とコンテンツ品質 (/10)

  • Must — seoGraph() 統合が各ビルドで実行され、validateH1 と validateUniqueMetadata が有効になっていること。JSON-LD検証のために、seo-graph-core の assembleGraph() に warnOnDanglingReferences: true を渡します — これは統合オプションではなく、アセンブリ時のチェックです。
  • Should — seoGraph() で validateImageAlt、validateMetadataLength、および validateInternalLinks が有効になっていること(すべて ≥ 1.1.0 でデフォルト true)。これらは、altテキストの欠落、SERP境界外のタイトルまたは説明(デフォルト: タイトル30~65、説明70~200)、および404になるか末尾スラッシュの不一致に当たる内部リンクをキャッチします。プロジェクトが1.1.0の場合、≥ 1.1.1 にアップグレードしてください — そのパッチリリースは2つのバリデーターバグを修正します。validateInternalLinks は public/ アセットを有効なターゲットとして認識するようになりました(/images/* や /fonts/* での誤検出はもうありません)。また、validateMetadataLength は、特定の文字(絵文字、アクセント付き文字、スマート引用符など)を含む説明を切り詰めなくなりました。代わりにそれらを適切にカウントします。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

jdevalk/skills

Sets up GitHub Actions CI/CD workflows for Astro sites — `astro check` (TypeScript + content schema), ESLint, Prettier, build verification, Vitest testing, Lighthouse CI, link checking, npm audit, and automated deployment to GitHub Pages, Cloudflare Pages, Netlify, or Vercel. ALWAYS use this skill when a user wants to create, add, set up, or configure GitHub Actions, CI/CD, automated checks, or deployment workflows for an Astro site — even if they don't use the exact phrase "GitHub Actions". This includes any request to: add automated type-checking or linting to an Astro repo; set up `astro check` in CI; add Lighthouse or accessibility checks to PRs; configure Vitest in CI for an Astro project; auto-deploy an Astro site to GitHub Pages, Cloudflare Pages, Netlify, or Vercel from GitHub; add link checking or broken-link detection; add security scanning to an Astro pipeline; or generally "add CI", "add automated checks", "set up workflows", or "automate" anything related to an Astro site's GitHub repository. ...

jdevalk/skills

Audits a blog post draft or page copy for content-level SEO: search intent fit, focus keyphrase placement, E-E-A-T signals (experience, expertise, authoritativeness, trustworthiness), helpfulness and originality, content freshness, and internal linking. Use when the user asks "will this rank", "SEO check this post", "content SEO audit", or "optimize this post for search" — or proactively after a readability pass on a post that's meant to rank. For how the prose reads, use the `readability-check` skill; for titles and meta descriptions, use `metadata-check`; for site-wide technical SEO (sitemaps, structured data, canonicals), use `astro-seo` or `static-seo`.

jdevalk/skills

Audits and improves SEO for static HTML sites. Use when the user asks to audit, set up, or improve SEO on a static site (Hugo, Jekyll, 11ty, Gatsby, Next.js static export, hand-rolled HTML, or `wp-static-clone` output), or mentions head metadata, structured data, JSON-LD, sitemaps, IndexNow, Open Graph images, schema endpoints, NLWeb, hreflang, or search engine indexing for a static site. For Astro projects, use `astro-seo` instead — its recipes produce less hand-rolled boilerplate by routing through `@jdevalk/astro-seo-graph`.

関連スキル