Analyzes HTML files for SEO issues using static analysis with cheerio. Checks meta tags, Open Graph, Twitter Cards, heading structure, and JSON-LD structured data. Use when user mentions "SEO check", "meta tags", "og tags", "structured data validation", "SEO audit", or wants to analyze HTML/JSX for SEO compliance.
This skill inherits all available tools. When active, it can use any tool Claude has access to.
dist/index.d.tsdist/index.jspackage-lock.jsonpackage.jsonsrc/cli.tssrc/index.tssrc/keyword-analyzer.tssrc/reporter.tssrc/seo-analyzer.tssrc/types.tstsconfig.jsonStatic SEO analysis for HTML files using cheerio-based parsing. Validates meta tags, social media tags, heading structure, and structured data. Also includes keyword analysis for content optimization.
cd ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer
npm install
npm run build
# SEO analysis (default)
npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/src/index.ts path/to/file.html
# SEO analysis with JSON output
npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/src/index.ts path/to/file.html --json
# Keyword analysis
npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/src/index.ts path/to/file.html --keywords
# Both SEO and Keyword analysis
npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/src/index.ts path/to/file.html --both
# Combined with JSON output
npx tsx ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/src/index.ts path/to/file.html --both --json
# After npm run build
node ${CLAUDE_PLUGIN_ROOT}/skills/seo-analyzer/dist/index.js path/to/file.html
| Check | Validation | Impact |
|---|---|---|
| Title | Exists, 30-60 chars | Search display |
| Description | Exists, 70-160 chars | Click-through rate |
| H1 | Exactly one | Content hierarchy |
| Canonical | Exists, valid URL | Duplicate content |
| Check | Validation | Impact |
|---|---|---|
| Robots | No unintended noindex | Indexing |
| Viewport | Exists | Mobile SEO |
| Heading order | h1→h2→h3 sequence | Structure |
| Lang | Exists on html | i18n SEO |
| Check | Validation | Impact |
|---|---|---|
| og:title | Exists, ≤95 chars | Social sharing |
| og:description | Exists | Social sharing |
| og:image | Exists, valid URL | Social sharing |
| twitter:card | Exists | Twitter display |
| JSON-LD | Valid schema | Rich results |
# SEO Analysis Report: index.html
## Summary
- Critical: 1
- Important: 2
- Recommended: 3
- Passed: 8
## Critical Issues (P0)
### 1. Missing Meta Description
**Check**: meta-description
**Fix**: Add <meta name="description" content="Your description here">
## Important Issues (P1)
...
{
"file": "index.html",
"timestamp": "2024-01-15T10:00:00Z",
"confidence": 100,
"summary": {
"critical": 1,
"important": 2,
"recommended": 3,
"passed": 8
},
"issues": [
{
"severity": "critical",
"check": "meta-description",
"message": "Missing meta description",
"fix": "Add <meta name=\"description\" content=\"...\">"
}
],
"passed": [
{
"check": "title",
"value": "Page Title - Brand",
"length": 18
}
],
"warnings": []
}
The analyzer detects client-side rendered applications and adjusts confidence:
#root or #app containerWhen detected, a warning is added that static analysis may not reflect the rendered page.
The keyword analyzer extracts and scores keywords:
npx tsx src/index.ts file.html --keywords
Outputs:
# Keyword Analysis: index.html
## Stats
- Total words: 1245
- Unique words: 342
## Primary Keywords (by score)
| Keyword | Score | Freq | Title | H1 | Description |
|---------|-------|------|-------|----|-----------:|
| product | 28 | 15 | Y | Y | Y |
| service | 21 | 12 | Y | | Y |
...
## Recommendations
- Consider adding "product management" to your title tag
For detailed guidance on any issue, reference the seo-lookup skill:
# Look up og:image requirements
cat ${CLAUDE_PLUGIN_ROOT}/skills/seo-lookup/seo-index.json | jq '.["og-tags"]["og:image"]'
# Look up Article schema
cat ${CLAUDE_PLUGIN_ROOT}/skills/seo-lookup/structured-data-index.json | jq '.schemas.Article'
After fixing issues, validate with: