skills/google-structured-data/SKILL.md
Google Search structured data implementation - Schema.org markup for rich results, JSON-LD templates, JavaScript generation, and SEO best practices
npx skillsauth add enuno/claude-command-and-control google-structured-dataInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Implement Schema.org structured data markup for Google Search rich results. This skill provides JSON-LD templates, required/recommended properties, and best practices for all major structured data types.
Trigger this skill when:
<script type="application/ld+json">Use for: News articles, blog posts, sports articles
Required: None (all recommended)
Recommended Properties:
headline - Article title (keep concise)image - Representative images (16x9, 4x3, 1x1 ratios; min 50K pixels)datePublished - ISO 8601 with timezonedateModified - Last modification dateauthor - Person or Organization with name and URL{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "Article Title Here",
"image": [
"https://example.com/photos/1x1/photo.jpg",
"https://example.com/photos/4x3/photo.jpg",
"https://example.com/photos/16x9/photo.jpg"
],
"datePublished": "2024-01-05T08:00:00+08:00",
"dateModified": "2024-02-05T09:20:00+08:00",
"author": [{
"@type": "Person",
"name": "Jane Doe",
"url": "https://example.com/profile/janedoe123"
}]
}
Use for: E-commerce product pages, product reviews
Required Properties:
name - Product nameRecommended Properties:
image - Product imagesdescription - Product descriptionbrand - Brand nameoffers - Price, availability, currencyaggregateRating - Average ratingreview - Individual reviews{
"@context": "https://schema.org",
"@type": "Product",
"name": "Executive Anvil",
"image": "https://example.com/anvil.jpg",
"description": "Sleek and deadly executive anvil.",
"brand": {
"@type": "Brand",
"name": "ACME"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/anvil",
"priceCurrency": "USD",
"price": 119.99,
"availability": "https://schema.org/InStock",
"priceValidUntil": "2025-12-31"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.4,
"reviewCount": 89
}
}
Use for: Physical business locations, restaurants, stores
Required Properties:
name - Business nameaddress - Full postal addressRecommended Properties:
telephone - With country codeopeningHoursSpecification - Business hoursgeo - Latitude/longitude (min 5 decimal places)url - Location-specific URLpriceRange - "$" to "$$$$" or price rangeservesCuisine - For restaurantsmenu - Menu URL for food establishments{
"@context": "https://schema.org",
"@type": "Restaurant",
"name": "Dave's Steak House",
"address": {
"@type": "PostalAddress",
"streetAddress": "148 W 51st St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10019",
"addressCountry": "US"
},
"telephone": "+12122459600",
"url": "https://www.example.com/restaurant-locations/manhattan",
"servesCuisine": "American",
"priceRange": "$$$",
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.761293,
"longitude": -73.982294
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "11:30",
"closes": "22:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "16:00",
"closes": "23:00"
}
],
"menu": "https://www.example.com/menu"
}
Use for: FAQ pages on authoritative sites (government, health)
Required Properties:
mainEntity - Array of Question objectsQuestion Required Properties:
name - Full question textacceptedAnswer - Answer object with text property{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is the return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>You can return items within 30 days of purchase.</p>"
}
},
{
"@type": "Question",
"name": "How do I track my order?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Use the tracking link in your confirmation email.</p>"
}
}
]
}
Allowed HTML in answers: <h1>-<h6>, <br>, <ol>, <ul>, <li>, <a>, <p>, <div>, <b>, <strong>, <i>, <em>
Use for: Concerts, conferences, festivals, sports events
Required Properties:
name - Event title (no venue names or promotions)startDate - ISO 8601 with timezone offsetlocation - Place with name and full addressRecommended Properties:
description - Event detailsendDate - When event concludeseventStatus - EventScheduled, EventCancelled, EventPostponed, EventRescheduledimage - High-res images (1920px width, 16x9/4x3/1x1)offers - Ticket info with price, currency, availability, URLorganizer - Hosting organizationperformer - Artists or participants{
"@context": "https://schema.org",
"@type": "Event",
"name": "The Adventures of Kira and Morrison",
"startDate": "2025-07-21T19:00-05:00",
"endDate": "2025-07-21T23:00-05:00",
"eventStatus": "https://schema.org/EventScheduled",
"location": {
"@type": "Place",
"name": "Snickerpark Stadium",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 West Snickerpark Dr",
"addressLocality": "Snickertown",
"postalCode": "19019",
"addressRegion": "PA",
"addressCountry": "US"
}
},
"image": [
"https://example.com/photos/1x1/photo.jpg",
"https://example.com/photos/4x3/photo.jpg",
"https://example.com/photos/16x9/photo.jpg"
],
"description": "The Adventures of Kira and Morrison is coming to Snickertown.",
"offers": {
"@type": "Offer",
"url": "https://www.example.com/event_offer/12345",
"price": 30,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"validFrom": "2024-05-21T12:00"
},
"performer": {
"@type": "PerformingGroup",
"name": "Kira and Morrison"
},
"organizer": {
"@type": "Organization",
"name": "Kira and Morrison Music",
"url": "https://kiraandmorrisonmusic.com"
}
}
Use for: Site navigation hierarchy
Required Properties:
itemListElement - Array of ListItem objectsListItem Required Properties:
position - Sequential number starting at 1name - Breadcrumb titleitem - URL (optional for final item){
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Books",
"item": "https://example.com/books"
},
{
"@type": "ListItem",
"position": 2,
"name": "Science Fiction",
"item": "https://example.com/books/sciencefiction"
},
{
"@type": "ListItem",
"position": 3,
"name": "Award Winners"
}
]
}
Use for: Video content, livestreams, tutorials
Required Properties:
name - Unique video titlethumbnailUrl - Multiple thumbnail URLsuploadDate - ISO 8601 with timezoneRecommended Properties:
contentUrl - Direct video file URLdescription - Unique descriptionduration - ISO 8601 (e.g., PT1M54S)embedUrl - Video player URLhasPart - Clip objects for key momentspublication - BroadcastEvent for LIVE badge{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "How to Make Banana Bread",
"description": "Learn to bake delicious banana bread in 30 minutes.",
"thumbnailUrl": [
"https://example.com/photos/1x1/photo.jpg",
"https://example.com/photos/4x3/photo.jpg"
],
"uploadDate": "2024-03-31T08:00:00+08:00",
"duration": "PT15M30S",
"contentUrl": "https://example.com/video/banana-bread.mp4",
"embedUrl": "https://example.com/embed/banana-bread",
"hasPart": [
{
"@type": "Clip",
"name": "Mixing Ingredients",
"startOffset": 30,
"endOffset": 120,
"url": "https://example.com/video?t=30"
},
{
"@type": "Clip",
"name": "Baking Process",
"startOffset": 120,
"endOffset": 600,
"url": "https://example.com/video?t=120"
}
]
}
Use for: Cooking recipes, food preparation guides
Required Properties:
name - Dish nameimage - Multiple images (16x9, 4x3, 1x1; min 50K pixels)Recommended Properties:
author - Recipe creatoraggregateRating - Average ratingprepTime, cookTime, totalTime - ISO 8601 durationsrecipeYield - Servings (required if nutrition specified)recipeCategory - Meal type (dinner, dessert)recipeCuisine - Regional originrecipeIngredient - Array of ingredientsrecipeInstructions - HowToStep arraynutrition.calories - Calorie count{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Non-Alcoholic Pina Colada",
"image": [
"https://example.com/photos/1x1/photo.jpg",
"https://example.com/photos/4x3/photo.jpg",
"https://example.com/photos/16x9/photo.jpg"
],
"author": {
"@type": "Person",
"name": "Mary Stone"
},
"datePublished": "2024-03-10",
"description": "This non-alcoholic pina colada is everyone's favorite!",
"recipeCuisine": "American",
"prepTime": "PT1M",
"cookTime": "PT2M",
"totalTime": "PT3M",
"keywords": "non-alcoholic, tropical, summer",
"recipeYield": "4 servings",
"recipeCategory": "Drink",
"nutrition": {
"@type": "NutritionInformation",
"calories": "120 calories"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 5,
"ratingCount": 18
},
"recipeIngredient": [
"400ml of pineapple juice",
"100ml cream of coconut",
"ice"
],
"recipeInstructions": [
{
"@type": "HowToStep",
"name": "Blend",
"text": "Blend 400ml of pineapple juice and 100ml cream of coconut until smooth.",
"url": "https://example.com/recipe#step1",
"image": "https://example.com/photos/step1.jpg"
},
{
"@type": "HowToStep",
"name": "Fill",
"text": "Fill a glass with ice.",
"url": "https://example.com/recipe#step2"
},
{
"@type": "HowToStep",
"name": "Pour",
"text": "Pour the pineapple juice and coconut mixture over ice.",
"url": "https://example.com/recipe#step3"
}
],
"video": {
"@type": "VideoObject",
"name": "How to Make Pina Colada",
"description": "Watch how to make this refreshing drink.",
"thumbnailUrl": "https://example.com/video-thumb.jpg",
"contentUrl": "https://example.com/video.mp4",
"uploadDate": "2024-03-10T08:00:00+00:00",
"duration": "PT3M"
}
}
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Banana Bread",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.7,
"ratingCount": 123
},
"video": {
"@type": "VideoObject",
"name": "How To Make Banana Bread"
}
}
[
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Banana Bread"
},
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [...]
}
]
For SPAs, dynamic content, or CMS integrations, structured data can be generated client-side using JavaScript.
Best for: Sites already using GTM, marketing teams managing structured data
Setup:
GTM Example with Variables:
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "{{recipe_name}}",
"image": ["{{recipe_image}}"],
"author": {
"@type": "Person",
"name": "{{recipe_author}}"
},
"datePublished": "{{recipe_date}}",
"description": "{{recipe_description}}"
}
</script>
GTM Variable Setup:
Best for: SPAs, API-driven content, custom implementations
Basic DOM Injection:
// Create and inject structured data
function injectStructuredData(data) {
const script = document.createElement('script');
script.setAttribute('type', 'application/ld+json');
script.textContent = JSON.stringify(data);
document.head.appendChild(script);
}
// Example: Article structured data
const articleData = {
"@context": "https://schema.org",
"@type": "Article",
"headline": document.querySelector('h1').textContent,
"image": document.querySelector('article img')?.src,
"datePublished": document.querySelector('time')?.getAttribute('datetime'),
"author": {
"@type": "Person",
"name": document.querySelector('.author-name')?.textContent
}
};
injectStructuredData(articleData);
API-Driven Generation:
// Fetch data from API and inject structured data
fetch('https://api.example.com/recipes/123')
.then(response => response.json())
.then(recipe => {
const structuredData = {
"@context": "https://schema.org/",
"@type": "Recipe",
"name": recipe.title,
"image": recipe.images,
"author": {
"@type": "Person",
"name": recipe.author.name
},
"datePublished": recipe.publishedAt,
"description": recipe.summary,
"recipeIngredient": recipe.ingredients,
"recipeInstructions": recipe.steps.map((step, i) => ({
"@type": "HowToStep",
"position": i + 1,
"text": step.instruction
}))
};
const script = document.createElement('script');
script.setAttribute('type', 'application/ld+json');
script.textContent = JSON.stringify(structuredData);
document.head.appendChild(script);
});
React/Next.js Example:
import Head from 'next/head';
function ProductPage({ product }) {
const structuredData = {
"@context": "https://schema.org",
"@type": "Product",
"name": product.name,
"image": product.images,
"description": product.description,
"brand": {
"@type": "Brand",
"name": product.brand
},
"offers": {
"@type": "Offer",
"url": `https://example.com/products/${product.slug}`,
"priceCurrency": "USD",
"price": product.price,
"availability": product.inStock
? "https://schema.org/InStock"
: "https://schema.org/OutOfStock"
}
};
return (
<>
<Head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
/>
</Head>
{/* Page content */}
</>
);
}
For frameworks supporting SSR (Next.js, Nuxt, etc.), include structured data in the rendered HTML output for best reliability.
// Next.js getServerSideProps example
export async function getServerSideProps({ params }) {
const product = await fetchProduct(params.id);
return {
props: {
product,
structuredData: {
"@context": "https://schema.org",
"@type": "Product",
"name": product.name,
// ... complete structured data
}
}
};
}
Testing Requirements:
Product Markup Warning: Dynamically-generated Product markup can:
Best Practices:
Source: Google Search Central Documentation Last Updated: January 2026 Version: 1.1
tools
MemPalace local-first AI memory system. Use when setting up persistent memory for Claude Code sessions, mining project files or conversation transcripts, querying past context, configuring MCP tools, managing the knowledge graph, or troubleshooting palace operations.
tools
LangSmith Python SDK — trace, evaluate, and monitor LLM applications. Covers @traceable decorator, trace context manager, Client API, evaluate() / aevaluate(), comparative evaluation, custom evaluators, dataset management, prompt caching, ASGI middleware, and pytest plugin.
development
LangGraph (Python) — build stateful, controllable agent graphs with checkpointing, streaming, persistence, interrupts, fault tolerance, and durable execution. Covers both Graph API (StateGraph) and Functional API (@entrypoint/@task).
development
LangGraph Graph API (Python) — build explicit DAG agent workflows with StateGraph, typed state, nodes, edges, Command routing, Send fan-out, checkpointers, interrupts, and streaming. Use when you need explicit control flow and graph topology.