Help us improve
Share bugs, ideas, or general feedback.
From seo-aeo-pro
On-page SEO scoring (0-100), E-E-A-T analysis, title/meta optimization, heading structure, keyword density, SERP preview, content readability, featured snippet optimization, content gap and decay detection, and pre-publish checklists.
npx claudepluginhub mangollc/claude-seo-skill --plugin seo-aeo-proHow this skill is triggered — by the user, by Claude, or both
Slash command
/seo-aeo-pro:seo-contentThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Load client context first. See seo-keywords [rules/client-setup.md](../seo-keywords/rules/client-setup.md).
Analyzes content for SEO quality, E-E-A-T signals, readability, and keyword usage. Scores content and gives actionable recommendations for improvement.
Scores existing content for E-E-A-T, CITE, and AI-search readiness, producing a publish/block verdict with top fixes. Use for content quality audits, citation readiness, or AI search optimization.
Analyzes provided content for SEO quality, E-E-A-T signals, readability, keywords, and structure. Scores and recommends improvements based on best practices.
Share bugs, ideas, or general feedback.
Load client context first. See seo-keywords rules/client-setup.md.
content/
├── page-scores/
│ └── {url-slug}-score.json # Individual page scores
├── content-gaps.json # Gap analysis
├── content-decay.json # Decay detection results
├── cannibalization.json # Pages competing for same keywords
├── pre-publish-checklist.md # Reusable checklist template
└── serp-previews/
└── {url-slug}-preview.md # SERP preview renders
Scrape the target page:
firecrawl scrape {url} --format markdown,links -o .seo/clients/{slug}/content/.firecrawl/page-{slug}.json
firecrawl scrape {url} --html -o .seo/clients/{slug}/content/.firecrawl/page-{slug}.html
| Category | Points | Checks |
|---|---|---|
| Title Tag | 15 | Length 50-60 chars (deduct 5 if outside range), primary keyword in first half (5 pts), unique across site (5 pts), SERP truncation safe (5 pts) |
| Meta Description | 10 | Length 120-155 chars (deduct 5 if outside), contains keyword (3 pts), has CTA/action word (4 pts), unique (3 pts) |
| H1 Tag | 10 | Exactly one H1 (5 pts), contains primary keyword (5 pts) |
| Heading Hierarchy | 10 | Proper H1>H2>H3 nesting with no skipped levels (5 pts), keywords in at least 2 subheadings (3 pts), sufficient subheadings for content length (2 pts) |
| Content Depth | 15 | Word count >= avg of top 5 competitors (8 pts), covers all major subtopics (7 pts) |
| Keyword Usage | 10 | Density 1-2% (4 pts), keyword in first 100 words (3 pts), LSI/semantic variations used (3 pts) |
| Internal Links | 10 | Min 3 internal links (4 pts), relevant anchor text (3 pts), links to pillar/related content (3 pts) |
| Image Optimization | 10 | All images have alt text (4 pts), descriptive filenames (2 pts), modern format WebP/AVIF (2 pts), lazy loading on below-fold (2 pts) |
| URL Structure | 5 | Short slug < 60 chars (2 pts), contains keyword (2 pts), no parameters/IDs (1 pt) |
| Social Meta | 5 | og:title + og:description + og:image present (3 pts), twitter:card present (2 pts) |
Title tag: Extract <title> from HTML. Count characters. Check keyword position.
Meta description: Extract <meta name="description">. Count characters. Look for action words (discover, learn, get, find, try, start, compare).
H1 tag: Count <h1> occurrences. Should be exactly 1. Check keyword presence.
Heading hierarchy: List all headings in order. Verify H2 follows H1, H3 follows H2. Flag skipped levels (H1 → H3).
Content depth: Count words in main content (exclude nav, footer, sidebar). Compare against top 5 competitors for the same keyword:
firecrawl search "{target-keyword}" --scrape --limit 5 -o .seo/clients/{slug}/content/.firecrawl/competitors-{slug}.json --json
Keyword usage: Count occurrences of primary keyword. Calculate density = (count / total words) * 100. Check if keyword appears in first 100 words. Look for semantic variations and LSI terms.
Internal links: From the links data, count links to same domain. Check anchor text diversity.
Images: Parse all <img> tags. Check alt attribute, src filename, loading attribute, image format.
URL: Analyze URL path. Check length, keyword presence, parameter presence.
Social meta: Check for og: and twitter: meta tags in HTML head.
Show how the page will appear in Google search results:
┌─────────────────────────────────────────────────┐
│ {title_tag_truncated_at_60_chars}... │
│ {display_url} │
│ {meta_description_truncated_at_155_chars}... │
│ │
│ Rich Results: [FAQ ✓] [Review Stars ✗] [Video ✗]│
└─────────────────────────────────────────────────┘
Check:
Calculate readability metrics from the page content:
Provide grade: A (grade 6-8), B (grade 9-10), C (grade 11-12), D (grade 13+).
Based on Google's Quality Rater Guidelines, evaluate:
E-E-A-T recommendations should be specific: "Add author bio with credentials" not "improve E-E-A-T."
Analyze target keyword for featured snippet opportunity:
firecrawl search "{keyword}" --scrape --limit 3 -o .seo/clients/{slug}/content/.firecrawl/snippet-{slug}.json --json
Snippet types and how to win them:
| Type | Format Required | Example |
|---|---|---|
| Paragraph | Direct answer in 40-60 words, immediately after an H2 matching the question | "What is [topic]?" → 2-3 sentence definition |
| List | Ordered/unordered list with 5-8 items, preceded by H2 with question | "How to [do thing]" → numbered steps |
| Table | HTML <table> with clear headers, structured comparison data | "Comparison of [X] vs [Y]" → feature comparison |
Optimization steps:
Compare client content against top competitors for a topic cluster:
# Scrape competitor content for the same topic
firecrawl search "{topic} site:{competitor-domain}" --scrape --limit 10 -o .seo/clients/{slug}/content/.firecrawl/comp-gap-{slug}.json --json
Identify:
Output as prioritized content brief suggestions.
Identify content that needs refreshing:
Decay signals (check for each published page):
Detection method:
Output:
{
"url": "/blog/old-post",
"title": "Page Title",
"decay_signals": ["outdated_statistics", "thin_content"],
"published_date": "2023-06-15",
"word_count": 450,
"competitor_avg_word_count": 1800,
"refresh_priority": "high",
"recommended_actions": ["Update statistics to 2026", "Expand content to 1500+ words", "Add FAQ section"]
}
Generate a reusable markdown checklist:
## Pre-Publish SEO Checklist
### Target Keyword: _______________
#### Content
- [ ] Word count >= competitor average (target: ___ words)
- [ ] Primary keyword in first 100 words
- [ ] Keyword density 1-2%
- [ ] LSI/semantic keyword variations used
- [ ] Direct answer to target query in first paragraph (for AEO)
- [ ] Readability grade 7-9 (Flesch-Kincaid)
#### HTML Tags
- [ ] Title tag: 50-60 chars, keyword in first half
- [ ] Meta description: 120-155 chars, includes CTA
- [ ] Exactly one H1 containing primary keyword
- [ ] H2/H3 hierarchy correct, keywords in subheadings
- [ ] URL slug short, contains keyword, no parameters
#### Media
- [ ] All images have descriptive alt text
- [ ] Images in WebP/AVIF format
- [ ] Images have width/height attributes
- [ ] Below-fold images have loading="lazy"
#### Links
- [ ] Min 3 internal links with relevant anchor text
- [ ] Links to pillar/cluster content
- [ ] Min 1 external link to authoritative source
- [ ] No broken links
#### Schema & Social
- [ ] Appropriate JSON-LD schema added
- [ ] Open Graph tags (og:title, og:description, og:image)
- [ ] Twitter Card tags
#### E-E-A-T
- [ ] Author byline with credentials
- [ ] Sources cited for claims/statistics
- [ ] Published date and "last updated" date
#### AEO (AI Search)
- [ ] Direct answer in first 50 words
- [ ] FAQ section with FAQPage schema
- [ ] Content structured with clear headings for AI extraction
Given a target keyword and page content, generate optimized options:
Title tag rules:
| BrandMeta description rules:
Generate 3-5 title options and 3-5 meta description options for the user to choose from.