seo-schema-structured-data について
seo-schema-structured-data は、Schema.orgの構造化データをJSON-LDで作成・確認するためのリファレンススキルです。一般的なエンティティ、Google対応プロパティ、検証手順を扱い、サイト運営者や開発者向けです。
主な機能
- 01JSON-LDの構造と関連を解説
- 02一般的なSchema.org型を紹介
- 03Google対応プロパティを整理
- 04MCPツールでSchemaを抽出・生成
- 05構造化データの検証手順を説明
活用シーン
- 01記事ページに構造化データを追加
- 02商品や地域の事業者を記述
- 03URL上の既存Schemaを確認
- 04公開前にマークアップを検証
MCP 対応
READMEでは、`extract_schema` と `generate_schema` というMCPツールを紹介しています。URLから構造化データを抽出し、指定した型のマークアップを生成します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ autom8minds/ seo-skills --skill seo-schema-structured-dataインストール後、Claude Code で/seo-schema-structured-dataを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdRICH_RESULTS_GUIDE.mdSCHEMA_TEMPLATES.mdVALIDATION_RULES.md詳細
Schema.org 構造化データと JSON-LD
JSON-LD の基礎
JSON-LD(JavaScript Object Notation for Linked Data)は、Google が推奨する構造化データ形式です。HTML ページの <head> または <body> にある <script> タグを介して挿入します。
基本構文
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "How to Implement Structured Data",
"author": {
"@type": "Person",
"name": "Jane Smith"
}
}
</script>
主なキーワード
| キーワード | 用途 | 例 |
|---|---|---|
@context | 語彙を宣言します(常に https://schema.org) | "@context": "https://schema.org" |
@type | エンティティの型を指定します | "@type": "Article" |
@id | エンティティの一意な識別子です(相互参照が可能になります) | "@id": "https://example.com/#organization" |
@graph | 1 つの JSON-LD ブロックに複数のエンティティを含めます | "@graph": [{ ... }, { ... }] |
エンティティのネスト
エンティティは直接ネストすることも、@id で参照することもできます。
{
"@context": "https://schema.org",
"@type": "Article",
"author": {
"@type": "Person",
"name": "Jane Smith",
"@id": "https://example.com/#jane"
},
"publisher": {
"@id": "https://example.com/#organization"
}
}
配列
プロパティに複数の値がある場合は、配列を使用します。
{
"@type": "Article",
"author": [
{ "@type": "Person", "name": "Jane Smith" },
{ "@type": "Person", "name": "John Doe" }
]
}
@graph パターン(複数エンティティのページ)
1 つのページで複数のエンティティ(例:Organization + WebPage + BreadcrumbList)を記述するには、@graph を使用します。
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Corp",
"url": "https://example.com"
},
{
"@type": "WebPage",
"@id": "https://example.com/about/#webpage",
"url": "https://example.com/about/",
"name": "About Us",
"isPartOf": { "@id": "https://example.com/#website" }
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/" },
{ "@type": "ListItem", "position": 2, "name": "About" }
]
}
]
}
Google がサポートするスキーマの型
次の型は Google に認識され、リッチリザルトを表示する場合があります。各セクションでは、必須(R)および推奨(Rec)プロパティを示します。
Article(NewsArticle、BlogPosting)
表示されるもの:検索結果に見出し、画像、日付を含む記事のリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
headline | R | 最大 110 文字 |
image | R | 幅 696px 以上。複数の画像が推奨されます |
datePublished | R | ISO 8601 形式 |
dateModified | Rec | ISO 8601 形式 |
author | R | name と url を含む Person または Organization |
publisher | Rec | name と logo を含む Organization |
description | Rec | 記事の短い要約 |
mainEntityOfPage | Rec | ページの URL |
MCP ツール: 任意の記事 URL で extract_schema を使用して現在の構造化データを確認し、次に型 Article を指定して generate_schema を使用し、準拠したマークアップを生成します。
Product(Offer、AggregateRating を含む)
表示されるもの:価格、在庫状況、評価の星を含む商品のリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | 商品名 |
image | R | 画像が 1 つ以上 |
description | Rec | 商品の説明 |
sku | Rec | 商品管理単位 |
brand | Rec | ブランド名 |
offers | R | Offer または AggregateOffer |
offers.price | R | 数値の価格 |
offers.priceCurrency | R | ISO 4217 通貨コード |
offers.availability | R | ItemAvailability 列挙値(例:https://schema.org/InStock) |
offers.url | Rec | 購入先 URL |
aggregateRating | Rec | ratingValue と reviewCount を含む AggregateRating |
review | Rec | 個別の Review オブジェクト |
ネストのパターン: AggregateRating と Offer は Product の中にネストします。
{
"@type": "Product",
"name": "Widget",
"offers": {
"@type": "Offer",
"price": "29.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "120"
}
}
FAQPage(Question / Answer を含む)
表示されるもの:検索結果で展開できる FAQ アコーディオン。
| プロパティ | ステータス | 備考 |
|---|---|---|
mainEntity | R | Question オブジェクトの配列 |
Question.name | R | 質問文 |
Question.acceptedAnswer | R | Answer オブジェクト |
Answer.text | R | 回答文(HTML を使用できます) |
ルール:
- 主なコンテンツが質問と回答の一覧であるページにのみ FAQPage を使用してください。
- 各質問と回答はページ上に表示されている必要があります。
- フォーラムや質問が 1 つだけのページには使用しないでください(代わりに QAPage を使用してください)。
HowTo(HowToStep を含む)
トリガー:ステップごとのリッチリザルトまたはカルーセルです。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | ハウツーのタイトル |
step | R | HowToStep オブジェクトの配列 |
step.name | R | ステップのタイトル |
step.text | R | ステップの手順 |
step.image | Rec | 各ステップの画像 |
step.url | Rec | ページ上のステップへの URL アンカー |
totalTime | Rec | ISO 8601 形式の所要時間(例:PT30M) |
estimatedCost | Rec | MonetaryAmount オブジェクト |
supply | Rec | 必要な HowToSupply アイテム |
tool | Rec | 必要な HowToTool アイテム |
LocalBusiness(およびサブタイプ)
トリガー:ローカルナレッジパネル、マップパックの対象データです。
サブタイプ:Restaurant、Dentist、LegalService、RealEstateAgent、MedicalBusiness などです。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | ビジネス名 |
address | R | PostalAddress オブジェクト |
telephone | Rec | 電話番号 |
openingHoursSpecification | Rec | 営業時間の配列 |
geo | Rec | GeoCoordinates(緯度/経度) |
url | Rec | ウェブサイトの URL |
image | Rec | ビジネスの写真 |
priceRange | Rec | 例:$$ または $10-50 |
servesCuisine | Rec | Restaurant サブタイプ用 |
aggregateRating | Rec | AggregateRating |
review | Rec | Review オブジェクト |
Organization
トリガー:ナレッジパネルのデータ、検索結果のロゴです。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | 組織名 |
url | R | ウェブサイトの URL |
logo | R | ImageObject または URL(最小 112x112px、正方形を推奨) |
sameAs | Rec | ソーシャルプロフィール URL の配列 |
contactPoint | Rec | ContactPoint オブジェクト |
address | Rec | PostalAddress |
description | Rec | 短い説明 |
foundingDate | Rec | ISO 8601 形式の日付 |
BreadcrumbList
トリガー:検索結果で URL に代わって表示されるパンくずリストです。
| プロパティ | ステータス | 備考 |
|---|---|---|
itemListElement | R | ListItem オブジェクトの配列 |
ListItem.position | R | 整数(1 から始まるインデックス) |
ListItem.name | R | パンくずリストのラベル |
ListItem.item | R* | URL(*最後の項目では省略) |
WebSite(サイトリンク検索ボックス用の SearchAction を含む)
トリガー:ブランド名で検索した際のサイトリンク検索ボックスです。
| プロパティ | ステータス | 備考 |
|---|---|---|
url | R | ホームページの URL |
name | Rec | サイト名 |
potentialAction | R | SearchAction オブジェクト |
SearchAction.target | R | {search_term_string} を含む URL テンプレート |
SearchAction.query-input | R | "required name=search_term_string" |
{
"@type": "WebSite",
"url": "https://example.com/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
Event
トリガー:日付、場所、チケット情報を含むイベントのリッチリザルトです。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | イベント名 |
startDate | R | ISO 8601 形式の日時 |
location | R | Place または VirtualLocation |
location.name | R | 会場名 |
location.address | R | PostalAddress |
endDate | Rec | ISO 8601 形式の日時 |
description | Rec | イベントの説明 |
image | Rec | イベントの画像 |
offers | Rec | 価格/URL/提供状況を含む Offer |
performer | Rec | Person または Organization |
organizer | Rec | Person または Organization |
eventStatus | Rec | EventScheduled、EventCancelled、EventPostponed など |
eventAttendanceMode | Rec | OfflineEventAttendanceMode、OnlineEventAttendanceMode、MixedEventAttendanceMode |
レシピ
トリガー:画像、評価、調理時間を含むレシピのリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | レシピ名 |
image | R | アスペクト比の異なる複数の画像 |
author | R | 人物または組織 |
datePublished | Rec | ISO 8601 |
description | Rec | 簡単な説明 |
prepTime | Rec | ISO 8601 の所要時間 |
cookTime | Rec | ISO 8601 の所要時間 |
totalTime | Rec | ISO 8601 の所要時間 |
recipeYield | Rec | 例:"4 servings" |
recipeIngredient | Rec | 文字列の配列 |
recipeInstructions | R | HowToStep オブジェクトの配列 |
nutrition | Rec | NutritionInformation(カロリー) |
aggregateRating | Rec | AggregateRating |
video | Rec | VideoObject |
VideoObject
トリガー:サムネイル、再生時間、アップロード日を含む動画のリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | 動画のタイトル |
description | R | 動画の説明 |
thumbnailUrl | R | サムネイル画像の URL |
uploadDate | R | ISO 8601 の日付 |
contentUrl | Rec | 動画ファイルへの直接 URL |
embedUrl | Rec | 埋め込み URL |
duration | Rec | ISO 8601 の所要時間 |
interactionStatistic | Rec | 再生回数 |
Course
トリガー:検索および Google for Education におけるコースのリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | コースのタイトル |
description | R | コースの説明 |
provider | R | コースを提供する組織 |
offers | Rec | 価格を含む Offer |
courseCode | Rec | 識別子 |
hasCourseInstance | Rec | スケジュールを含む CourseInstance |
SoftwareApplication
トリガー:評価、価格、OS を含むソフトウェアのリッチリザルト。
| プロパティ | ステータス | 備考 |
|---|---|---|
name | R | アプリ名 |
operatingSystem | Rec | 例:"Windows 10"、"Android" |
applicationCategory | Rec | 例:"GameApplication"、"BusinessApplication" |
offers | R | 価格を含む Offer(無料の場合は "0" を使用) |
aggregateRating | Rec | AggregateRating |
review | Rec | Review オブジェクト |
Review
トリガー:星評価を含むレビューのスニペット。
| プロパティ | ステータス | 備考 |
|---|---|---|
itemReviewed | R | レビュー対象のエンティティ(Product、LocalBusiness など) |
author | R | レビューを書いた人物 |
reviewRating | R | ratingValue を含む Rating オブジェクト |
reviewRating.bestRating | Rec | 評価の最大値 |
reviewRating.worstRating | Rec | 評価の最小値 |
datePublished | Rec | ISO 8601 の日付 |
reviewBody | Rec | レビューの全文 |
動的なスキーマ生成パターン
プログラムでページを構築する場合は、データモデルからスキーマを生成します。
サーバーサイドレンダリング(Next.js の例)
export default function ProductPage({ product }) {
const schema = {
"@context": "https://schema.org",
"@type": "Product",
"name": product.title,
"image": product.images,
"description": product.description,
"sku": product.sku,
"brand": { "@type": "Brand", "name": product.brand },
"offers": {
"@type": "Offer",
"price": product.price,
"priceCurrency": "USD",
"availability": product.inStock
? "https://schema.org/InStock"
: "https://schema.org/OutOfStock"
}
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
{/* Page content */}
</>
);
}
CMS 統合パターン
WordPress、Shopify、またはヘッドレス CMS の場合:
- テンプレートまたはプラグインで、CMS のフィールドをスキーマのプロパティに対応付けます。
- 価格、在庫状況、評価のデータがライブデータソースから取得されることを確認します。
- 値があるプロパティのみを出力するよう、条件分岐を使用します。
検証方法
ステップ 1:リッチリザルト テスト(Google)
- URL:https://search.google.com/test/rich-results
- マークアップがリッチリザルトの対象となるかテストします。
- スキーマタイプごとにエラーと警告を報告します。
ステップ 2:Schema Markup Validator(Schema.org)
- URL:https://validator.schema.org/
- Schema.org の語彙全体(Google より広範)に照らして検証します。
ステップ 3:Google Search Console
- 構造化データのレポートについて、拡張 セクションを確認します。
- エラー、警告、有効なアイテム数を監視します。
- 構造化データを含むページのインデックス登録状況を確認します。
MCP ツール: 任意の URL で extract_schema を使用すると、すべての JSON-LD、Microdata、RDFa を取得できます。対象タイプを指定して generate_schema を使用すると、ページのコンテンツから有効なマークアップを生成できます。
よくある落とし穴
| 落とし穴 | 問題 | 対処方法 |
|---|---|---|
| 見えないコンテンツ | スキーマでユーザーに表示されないコンテンツを記述している | 構造化データの各プロパティが、ページに表示されるコンテンツと一致するようにします |
| 必須フィールドの不足 | Google が不完全なマークアップを無視する | タイプごとに必要なプロパティをすべて必ず含めます |
誤った @type | リッチリザルトで Google がサポートしていないタイプを使用している | Google がドキュメントで説明しているタイプのみを使用します |
| 偽のレビュー | スキーマに捏造された評価やレビューが含まれている | 実際のユーザーによる本物のレビューのみをマークアップします |
| 古い価格 | 商品スキーマに古い価格が表示されている | 最新のデータからスキーマを動的に生成します |
| 複数の競合するタイプ | 1 つのページに、異なるデータを含む Product スキーマが 2 つある | エンティティごとに正規のスキーマを 1 つ使用します |
| 自己参照の問題 | 参照先が存在しない @id | すべての @id 参照に対応する定義があることを確認します |
| 日付形式の誤り | ISO 8601 ではなく MM/DD/YYYY を使用している | 常に YYYY-MM-DD または YYYY-MM-DDTHH:MM:SS+00:00 を使用します |
| HTTP の画像 URL | HTTPS ではなく HTTP 経由で画像を参照している | すべての画像に HTTPS の URL を使用します |
| スパムポリシー違反 | SEO 操作のみを目的としてコンテンツをマークアップしている | Google の構造化データに関するスパムポリシーに従います |
関連スキル
- seo-on-page-optimization -- コンテンツとメタタグの最適化向け
- seo-technical-audit -- クロール可能性とインデックス登録の問題向け
- seo-mcp-tools-expert -- MCP ツールの詳細な使用方法向け
構造化データに役立つ主な MCP ツール
| ツール | 用途 |
|---|---|
extract_schema | 任意の URL から既存の構造化データを抽出します |
generate_schema | 指定したページとタイプに対応する有効な JSON-LD マークアップを生成します |
すぐに使える JSON-LD テンプレートについては、SCHEMA_TEMPLATES.md を参照してください。 Google の検証要件については、VALIDATION_RULES.md を参照してください。 各タイプがどのリッチリザルトを表示するかについては、RICH_RESULTS_GUIDE.md を参照してください。