Agent SkillsAgent Skills
NeverSight

seo-content

@NeverSight/seo-content
NeverSight
124
27 forks
Updated 5/5/2026
View on GitHub

Content optimization for SEO: on-page 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, pre-publish checklists. USE FOR: - "optimize this page", "content score", "on-page SEO", "page score" - "title tag", "meta description", "heading structure" - "E-E-A-T", "content quality", "content audit" - "pre-publish checklist", "before I publish" - "content gap", "what content should I create" - "keyword density", "content optimization" - "SERP preview", "how does this look in Google" - "featured snippet", "position zero" - "content decay", "stale content", "refresh content" - "readability", "Flesch-Kincaid" Uses firecrawl to scrape pages for analysis. Multi-client: stores results in .seo/clients/{client}/content/

Installation

$npx agent-skills-cli install @NeverSight/seo-content
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Pathdata/skills-md/mangollc/claude-seo-skill/seo-content/SKILL.md
Branchmain
Scoped Name@NeverSight/seo-content

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

npx agent-skills-cli list

Skill Instructions


name: seo-content description: | Content optimization for SEO: on-page 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, pre-publish checklists.

USE FOR:

  • "optimize this page", "content score", "on-page SEO", "page score"
  • "title tag", "meta description", "heading structure"
  • "E-E-A-T", "content quality", "content audit"
  • "pre-publish checklist", "before I publish"
  • "content gap", "what content should I create"
  • "keyword density", "content optimization"
  • "SERP preview", "how does this look in Google"
  • "featured snippet", "position zero"
  • "content decay", "stale content", "refresh content"
  • "readability", "Flesch-Kincaid"

Uses firecrawl to scrape pages for analysis. Multi-client: stores results in .seo/clients/{client}/content/

Content Optimization

Load client context first. See seo-keywords rules/client-setup.md.

File Organization

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

On-Page SEO Scoring (0-100)

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

Scoring Rubric

CategoryPointsChecks
Title Tag15Length 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 Description10Length 120-155 chars (deduct 5 if outside), contains keyword (3 pts), has CTA/action word (4 pts), unique (3 pts)
H1 Tag10Exactly one H1 (5 pts), contains primary keyword (5 pts)
Heading Hierarchy10Proper 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 Depth15Word count >= avg of top 5 competitors (8 pts), covers all major subtopics (7 pts)
Keyword Usage10Density 1-2% (4 pts), keyword in first 100 words (3 pts), LSI/semantic variations used (3 pts)
Internal Links10Min 3 internal links (4 pts), relevant anchor text (3 pts), links to pillar/related content (3 pts)
Image Optimization10All images have alt text (4 pts), descriptive filenames (2 pts), modern format WebP/AVIF (2 pts), lazy loading on below-fold (2 pts)
URL Structure5Short slug < 60 chars (2 pts), contains keyword (2 pts), no parameters/IDs (1 pt)
Social Meta5og:title + og:description + og:image present (3 pts), twitter:card present (2 pts)

How to Check Each

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.

SERP Preview Generator

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:

  • Title truncation: will Google cut it off? (> 60 chars or > 580px pixel width)
  • Description truncation: > 155 chars gets cut
  • URL display: clean and readable?
  • Rich result eligibility: based on schema markup present

Content Readability Analysis

Calculate readability metrics from the page content:

  • Flesch-Kincaid Grade Level: target 7-9 for most web content
    • Formula: 0.39 * (words/sentences) + 11.8 * (syllables/words) - 15.59
  • Average sentence length: target 15-20 words
  • Paragraph length: target 2-4 sentences per paragraph
  • Passive voice usage: flag if > 10% of sentences
  • Transition word usage: should appear in 30%+ of sentences

Provide grade: A (grade 6-8), B (grade 9-10), C (grade 11-12), D (grade 13+).

E-E-A-T Analysis

Based on Google's Quality Rater Guidelines, evaluate:

Experience (E1)

  • Does the content show first-hand experience?
  • Look for: personal anecdotes, original photos, specific details only someone with experience would know
  • Score: Strong / Moderate / Weak / Missing

Expertise (E2)

  • Does the author demonstrate subject expertise?
  • Check for: author byline, credentials, author page, depth of knowledge in content
  • Score: Strong / Moderate / Weak / Missing

Authoritativeness (A)

  • Is this source/author recognized as an authority?
  • Check for: brand mentions in other sources, citations, industry recognition, domain age
  • Score: Strong / Moderate / Weak / Missing

Trustworthiness (T)

  • Can users trust this content and site?
  • Check for: HTTPS, contact information, privacy policy, terms of service, sources cited in content, factual accuracy indicators
  • Score: Strong / Moderate / Weak / Missing

E-E-A-T recommendations should be specific: "Add author bio with credentials" not "improve E-E-A-T."

Featured Snippet Optimization

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:

TypeFormat RequiredExample
ParagraphDirect answer in 40-60 words, immediately after an H2 matching the question"What is [topic]?" β†’ 2-3 sentence definition
ListOrdered/unordered list with 5-8 items, preceded by H2 with question"How to [do thing]" β†’ numbered steps
TableHTML <table> with clear headers, structured comparison data"Comparison of [X] vs [Y]" β†’ feature comparison

Optimization steps:

  1. Check if a featured snippet currently exists for the target keyword
  2. Identify the snippet type (paragraph, list, table)
  3. Recommend content format changes to match
  4. Provide a draft snippet-optimized content block

Content Gap Analysis

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:

  • Subtopics competitors cover that client does not
  • Content formats competitors use (video, infographic, interactive, calculator)
  • Questions competitors answer that client doesn't address
  • Depth differences (word count, number of examples, data points)

Output as prioritized content brief suggestions.

Content Decay Detection

Identify content that needs refreshing:

Decay signals (check for each published page):

  1. Outdated statistics: years mentioned in content that are 2+ years old
  2. Broken external links: links to pages that now 404
  3. Stale references: mentions of deprecated tools, old versions, discontinued products
  4. Competitor improvement: competitors have published newer, more comprehensive content on the same topic
  5. Thin content: pages with < 500 words that once ranked but may have been surpassed
  6. Missing current year: "best X" or "guide to X" content without current year reference

Detection method:

  1. Scrape the page content with firecrawl
  2. Look for year mentions older than 2024
  3. Check for "updated" or "published" dates > 12 months old
  4. Compare word count against current top 5 for the same keyword
  5. Check if competitors have fresher content via search dates

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"]
}

Pre-Publish Checklist

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

Title/Meta Description Generator

Given a target keyword and page content, generate optimized options:

Title tag rules:

  • 50-60 characters
  • Primary keyword in the first half
  • Include power word (Best, Guide, How to, Complete, Free, Proven)
  • Include current year for time-sensitive content
  • Brand name at end if space allows: | Brand

Meta description rules:

  • 120-155 characters
  • Include primary keyword naturally
  • Include a CTA (Learn, Discover, Find out, Get started, Compare)
  • Create urgency or curiosity when appropriate
  • Unique per page β€” never duplicate

Generate 3-5 title options and 3-5 meta description options for the user to choose from.