
Schema Markup
- 154 installs
- 145 repo stars
- Updated April 2, 2026
- guia-matthieu/clawfu-skills
Add JSON-LD and microdata schema to pages so search engines and AI crawlers understand entities, products, FAQs, and articles before indexing and launch.
About
Guides implementation of schema.org structured markup across marketing and product pages. Covers choosing the right schema types, writing valid JSON-LD, nesting entities, and validating output so search engines and answer engines can parse offerings, authorship, and FAQs reliably.
- JSON-LD templates for common page types
- Entity and breadcrumb markup patterns
- FAQ, product, and article schema guidance
- Validation against Google rich-result rules
- Agent-ready snippets for CMS or static sites
Schema Markup by the numbers
- 154 all-time installs (skills.sh)
- Ranked #1,043 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/guia-matthieu/clawfu-skills --skill schema-markupAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 154 |
|---|---|
| repo stars | ★ 145 |
| Last updated | April 2, 2026 |
| Repository | guia-matthieu/clawfu-skills ↗ |
What it does
Add JSON-LD and microdata schema to pages so search engines and AI crawlers understand entities, products, FAQs, and articles before indexing and launch.
Files
Schema Markup Generator
Generate valid JSON-LD structured data for better search visibility and rich snippets.
What Claude Does vs What You Decide
| Claude Does | You Decide |
|---|---|
| Structures analysis frameworks | Metric definitions |
| Identifies patterns in data | Business interpretation |
| Creates visualization templates | Dashboard design |
| Suggests optimization areas | Action priorities |
| Calculates statistical measures | Decision thresholds |
Dependencies
pip install click pydanticCommands
python scripts/main.py generate --type article --title "..." --author "..."
python scripts/main.py generate --type product --name "..." --price 99
python scripts/main.py validate schema.json
python scripts/main.py templatesSkill Boundaries
What This Skill Does Well
- Structuring data analysis
- Identifying patterns and trends
- Creating visualization frameworks
- Calculating statistical measures
What This Skill Cannot Do
- Access your actual data
- Replace statistical expertise
- Make business decisions
- Guarantee prediction accuracy
Skill Metadata
- Mode: centaur
category: seo-tools
dependencies: [click, pydantic]
difficulty: beginner#!/usr/bin/env python3
"""Schema Markup Generator - Create JSON-LD structured data."""
import click
import json
from datetime import datetime
from pathlib import Path
TEMPLATES = {
'article': {
'@context': 'https://schema.org',
'@type': 'Article',
'headline': '',
'author': {'@type': 'Person', 'name': ''},
'datePublished': '',
'publisher': {'@type': 'Organization', 'name': '', 'logo': {'@type': 'ImageObject', 'url': ''}}
},
'product': {
'@context': 'https://schema.org',
'@type': 'Product',
'name': '',
'description': '',
'offers': {'@type': 'Offer', 'price': '', 'priceCurrency': 'USD', 'availability': 'https://schema.org/InStock'}
},
'organization': {
'@context': 'https://schema.org',
'@type': 'Organization',
'name': '',
'url': '',
'logo': '',
'sameAs': []
},
'faq': {
'@context': 'https://schema.org',
'@type': 'FAQPage',
'mainEntity': []
},
'breadcrumb': {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
'itemListElement': []
}
}
@click.group()
def cli():
"""Schema Markup Generator - JSON-LD for SEO."""
pass
@cli.command()
@click.option('--type', '-t', 'schema_type', required=True,
type=click.Choice(['article', 'product', 'organization', 'faq', 'breadcrumb']))
@click.option('--title', help='Title/headline')
@click.option('--name', help='Name')
@click.option('--author', help='Author name')
@click.option('--price', type=float, help='Price')
@click.option('--url', help='URL')
@click.option('--description', help='Description')
@click.option('--output', '-o', type=click.Path(), help='Output file')
def generate(schema_type: str, title: str, name: str, author: str,
price: float, url: str, description: str, output: str):
"""Generate JSON-LD schema."""
click.echo(f"\n Schema Generator: {schema_type}")
click.echo(" " + "=" * 40)
schema = TEMPLATES[schema_type].copy()
if schema_type == 'article':
schema['headline'] = title or name or 'Article Title'
schema['author']['name'] = author or 'Author Name'
schema['datePublished'] = datetime.now().strftime('%Y-%m-%d')
schema['publisher']['name'] = 'Publisher Name'
elif schema_type == 'product':
schema['name'] = name or title or 'Product Name'
schema['description'] = description or 'Product description'
schema['offers']['price'] = str(price) if price else '0'
elif schema_type == 'organization':
schema['name'] = name or 'Organization Name'
schema['url'] = url or 'https://example.com'
json_output = json.dumps(schema, indent=2)
click.echo("\n Generated Schema:")
click.echo(" " + "-" * 40)
click.echo(json_output)
click.echo("\n HTML Usage:")
click.echo(' <script type="application/ld+json">')
click.echo(f' {json_output}')
click.echo(' </script>')
if output:
Path(output).write_text(json_output)
click.echo(f"\n Saved: {output}")
@cli.command()
@click.argument('file', type=click.Path(exists=True))
def validate(file: str):
"""Validate JSON-LD schema."""
click.echo("\n Schema Validator")
click.echo(" " + "=" * 40)
try:
content = Path(file).read_text()
schema = json.loads(content)
issues = []
if '@context' not in schema:
issues.append('Missing @context')
if '@type' not in schema:
issues.append('Missing @type')
if issues:
click.echo(" ✗ Issues found:")
for issue in issues:
click.echo(f" - {issue}")
else:
click.echo(" ✓ Schema is valid")
click.echo(f" Type: {schema.get('@type')}")
except json.JSONDecodeError as e:
click.echo(f" ✗ Invalid JSON: {e}")
@cli.command()
def templates():
"""Show available schema templates."""
click.echo("\n Available Schema Templates")
click.echo(" " + "=" * 40)
for name, template in TEMPLATES.items():
click.echo(f"\n {name}:")
click.echo(f" Type: {template.get('@type')}")
if __name__ == "__main__":
cli()
click>=8.0.0