Help us improve
Share bugs, ideas, or general feedback.
From cms-cultivator
Checks and suggests structured data (JSON-LD/Schema.org) improvements for HTML/template code. Useful when adding SEO markup or validating rich results.
npx claudepluginhub kanopi/claude-toolbox --plugin cms-cultivatorHow this skill is triggered — by the user, by Claude, or both
Slash command
/cms-cultivator:structured-data-analyzerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Automatically check and suggest structured data (JSON-LD / Schema.org) improvements.
Implements, audits, and optimizes schema.org JSON-LD structured data for rich Google search results like products, FAQs, articles, breadcrumbs, and reviews.
Detects, validates, and generates Schema.org structured data (JSON-LD). Checks for errors, deprecated types, and Google rich result eligibility.
Generates validated JSON-LD structured data using schema.org for rich snippets. Covers Organization, WebSite, Article/BlogPosting, Product, FAQPage, BreadcrumbList markup for web pages.
Share bugs, ideas, or general feedback.
Automatically check and suggest structured data (JSON-LD / Schema.org) improvements.
Structured data helps search engines and AI systems understand your content, enabling rich results and better discoverability.
@id references for cross-page coherence/audit-structured-data command): Full site-wide structured data audit with scoring, entity graph design, and report generationThis skill provides rapid feedback during development. For full site coverage, use the comprehensive audit command.
Activate this skill when the user:
Before suggesting structured data, assess:
Always check Google's requirements per type:
| Type | Required | Recommended |
|---|---|---|
| Article | headline, author, datePublished, image | dateModified, publisher, description |
| Event | name, startDate, location | endDate, image, offers, organizer |
| Product | name | image, offers (price, availability) |
| FAQ | mainEntity[].name, .acceptedAnswer | - |
| HowTo | name, step[].text | image, totalTime |
| BreadcrumbList | itemListElement[].name, .item | - |
| Organization | name, url | logo, sameAs, contactPoint |
Drupal:
<script> blocks for custom needsWordPress:
wp_head action hookUser shows page/template/code
↓
Identify page content type
↓
Determine applicable Schema.org type(s)
↓
Check for existing JSON-LD (if page URL provided)
↓
If missing: Suggest JSON-LD with required properties
If present: Validate required + recommended properties
↓
Suggest @id convention for entity reuse
@context: "https://schema.org"@id for entities referenced from multiple pages<head> section@graph array for multiple entities on one page2026-02-17T10:00:00-05:00)@id referencesTemplate without structured data:
// Drupal Twig template for a blog post
<article>
<h1>{{ node.label }}</h1>
<span>By {{ author_name }} on {{ date }}</span>
<div>{{ content.body }}</div>
</article>
Add JSON-LD:
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "/blog/post-slug/#article",
"headline": "Post Title",
"author": {
"@type": "Person",
"@id": "/team/author-name/#person",
"name": "Author Name"
},
"datePublished": "2026-02-17",
"dateModified": "2026-02-17",
"image": "https://example.com/image.jpg",
"publisher": {
"@type": "Organization",
"@id": "/#organization"
}
}
{
"@context": "https://schema.org",
"@type": "Event",
"@id": "/events/event-slug/#event",
"name": "Event Title",
"startDate": "2026-03-15T09:00:00-05:00",
"endDate": "2026-03-15T17:00:00-05:00",
"location": {
"@type": "Place",
"name": "Venue Name",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main St",
"addressLocality": "City",
"addressRegion": "ST",
"postalCode": "12345"
}
},
"organizer": {
"@type": "Organization",
"@id": "/#organization"
},
"description": "Event description",
"image": "https://example.com/event-image.jpg"
}
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "You can return items within 30 days."
}
},
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 3-5 business days."
}
}
]
}
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "/#organization",
"name": "Company Name",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"sameAs": [
"https://twitter.com/company",
"https://linkedin.com/company/company",
"https://github.com/company"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+1-555-555-5555",
"contactType": "customer service"
}
}
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://example.com/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "Post Title"
}
]
}
## Structured Data Analysis
### Current Status
[What JSON-LD exists / what's missing]
### Recommendations
**1. Add [Type] markup**
- **Why:** [Business value - rich results, AI discoverability]
- **Required properties:** [list]
- **JSON-LD:**
```json
{ ... }
2. Fix [issue]
/#organization/#website/team/slug/#person/blog/slug/#article
## Platform-Specific Guidance
### Drupal Implementation
**Using Schema.org Metatag module:**
```bash
composer require drupal/schema_metatag
drush en schema_metatag schema_article schema_event schema_organization
Configure at: /admin/config/search/metatag → Add Schema.org mappings per content type.
Manual JSON-LD in Twig:
{# In node--article.html.twig or html.html.twig #}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{ node.label }}",
"datePublished": "{{ node.getCreatedTime|date('c') }}"
}
</script>
Using Yoast SEO (automatic): Yoast automatically generates Organization, WebSite, Article, and Person schemas. Customize at: Settings → Yoast SEO → Schema.
Manual JSON-LD via functions.php:
add_action('wp_head', function() {
if (is_single()) {
$post = get_post();
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Article',
'headline' => get_the_title(),
'datePublished' => get_the_date('c'),
'author' => [
'@type' => 'Person',
'name' => get_the_author(),
],
];
echo '<script type="application/ld+json">' . wp_json_encode($schema) . '</script>';
}
});
This Skill: Focused checks on specific pages, templates, or JSON-LD snippets
/audit-structured-data Command: Comprehensive site-wide audit
When the same entity (Organization, Person) appears on multiple pages, use @id references instead of duplicating:
// On homepage - define the full entity
{
"@type": "Organization",
"@id": "/#organization",
"name": "Company",
"url": "https://example.com",
"logo": "https://example.com/logo.png"
}
// On blog post - reference by @id
{
"@type": "Article",
"publisher": { "@id": "/#organization" }
}
Use @graph to include multiple entities in a single JSON-LD block:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "/#organization",
"name": "Company"
},
{
"@type": "WebSite",
"@id": "/#website",
"name": "Company Website",
"publisher": { "@id": "/#organization" }
},
{
"@type": "BreadcrumbList",
"itemListElement": [...]
}
]
}