Given a live page URL (production or test environment), this Skill runs a 12-point automated SEO compliance check and produces a visual HTML report. It verifies that every page meets all hard constraints before going live.
This is the final step of the SEO automation pipeline — after content is written, images generated, and localization applied, run this check as the quality gate before publishing.
MCP Dependency
seo-web-cafe MCP can optionally be used in this Skill to validate keyword difficulty assumptions. If the page's target keyword was analyzed using seo-keyword-difficulty (Step 0), the checker can cross-reference: did the page actually target a 🟢/🟡 keyword, or was it written for a 🔴 keyword that should be pivoted?
MCP endpoint: mcp__seo-web-cafe__estimate_keyword_difficulty
- Not required for the core 12-point audit, but available for keyword validation if needed
- If connected, use it to verify the page's primary keyword KD level matches the original decision report
Trigger
Activate when the user asks to:
- Check SEO compliance of a page
- Run an SEO audit on a URL
- Verify page SEO before publishing
- Generate an SEO report
The user must provide a live URL (http/https) — this Skill checks real published pages, not draft Markdown.
Required Inputs (Collect First)
Before starting the audit, collect the following from the user:
- Page URL — the live page to check (production or test environment)
- Brand Name — the brand name that should appear in the page (needed for Check 1 and Check 12)
Ask in one message:
"To run the SEO audit, I need:
- The page URL to check
- Your brand name (for brand mention verification)
Please provide these before I start."
Once collected, proceed to Phase 0 below.
Phase 0: Identify Target
- URL — the page to check (provided by the user)
- Environment — auto-detect from URL:
- Production: domain matches
your-domain.com, etc. - Test/Staging: domain contains
test,staging,dev,localhost, or non-production subdomains
- Production: domain matches
- Language — auto-detect from URL path prefix (
/ja/,/zh/,/ko/, or default English)
If the URL is unreachable (404/5xx), report the error immediately and stop — there's nothing to check.
Phase 1: 12-Point Automated Audit
For each check point, use WebFetch to read the live page, then verify the specific constraint. Each point produces a Pass ✓ or Fail ✗ result with details.
Check 1: Title Tag
- Requirement: Title exists, contains brand name, 50-60 characters, no banned phrases
- Method: Extract
<title>from page HTML - Verify:
- Title tag exists and is non-empty ✓/✗
- Character count within 50-60 ✓/✗ (report actual count)
- Contains brand name (as specified by user) ✓/✗
- Does NOT contain banned openings: "is an AI-powered tool that..." / "is the ultimate solution..." ✓/✗
- No articles (a/an/the) before tool name in Title ✓/✗
Check 2: Meta Description
- Requirement: Description exists, 150-160 characters, contains core keyword, no banned phrases
- Method: Extract
<meta name="description">from page HTML - Verify:
- Description tag exists and is non-empty ✓/✗
- Character count within 150-160 ✓/✗ (report actual count)
- Contains at least 1 core keyword ✓/✗
- Does NOT contain banned buzzwords ("revolutionize", "game-changer", etc.) ✓/✗
Check 3: Canonical Tag
- Requirement:
<link rel="canonical">exists and points to the correct self-referencing URL - Method: Extract canonical link from page HTML
- Verify:
- Canonical tag exists ✓/✗
- Canonical URL matches the current page URL (ignoring query params/trailing slashes) ✓/✗
- Canonical URL uses HTTPS ✓/✗
Check 4: H-Tag Structure
- Requirement: Proper hierarchy — exactly 1 H1, H2s for each section, no skipped levels
- Method: Extract all
<h1>through<h6>tags from page HTML - Verify:
- Exactly 1 H1 tag on the page ✓/✗ (report count)
- H1 contains brand/product name ✓/✗
- H2 tags present for all 8 sections (S1-S8) ✓/✗
- No H3 used where H2 should be, no H4 used where H3 should be ✓/✗
- H-tag hierarchy is sequential (H1 → H2 → H3, no H1 → H3 skips) ✓/✗
Check 5: Body Content — Character Limits
- Requirement: Each section's content meets the character limits defined in page-writer
- Method: Parse section content by
<!-- S1-S8 -->HTML comments, or by H2 boundaries - Verify:
- S1 What Is: 200-300 chars ✓/✗ (report count)
- S2 Pain Point: P ≤ 200 chars ✓/✗ (report count)
- S3 Feature summary: ≤ 100 chars ✓/✗ (report count)
- S3 Each feature description: ~100 chars ✓/✗ (report count)
- S4 Each user group: ≤ 150 chars ✓/✗ (report count)
- S5 Each step: ~70 chars ✓/✗ (report count)
- S6 CTA: ≤ 150 chars ✓/✗ (report count)
- S7 Each review: ≥ 300 chars ✓/✗ (report count)
- S8 Each FAQ answer: 200-300 chars ✓/✗ (report count)
Check 6: Testimonials — Realism & Variety
- Requirement: 6 reviews with at least 4 different narrative arcs, no banned patterns
- Method: Extract review block content from S7
- Verify:
- At least 6 distinct reviews present ✓/✗ (report count)
- No "I've been using X for Y months and it's amazing!" openings ✓/✗
- At least 4 different narrative arcs identifiable ✓/✗ (list arcs found)
- Each review ≥ 300 chars ✓/✗
Check 7: FAQ — Structure & Banned Patterns
- Requirement: 10 FAQs, Q1 is "What is [Product]", no banned openings
- Method: Extract FAQ block from S8
- Verify:
- At least 10 FAQs present ✓/✗ (report count)
- Q1 asks "What is [Product] and what makes it different?" ✓/✗
- No "Absolutely!" or "Great question!" answer openings ✓/✗
- Each answer 200-300 chars ✓/✗ (report min/max)
Check 8: Image ALT Tags
- Requirement: All
<img>tags have non-empty, descriptive alt text containing keyword - Method: Extract all
<img>tags and theiraltattributes from page HTML - Verify:
- Every
<img>has analtattribute ✓/✗ (report count of missing alt) - Alt text is non-empty (not just "") ✓/✗
- At least 1 image alt contains the core keyword ✓/✗
- Alt text describes content, not just "image" or "photo" ✓/✗
- Every
Check 9: Internal Links
- Requirement: At least 3 internal links to other site pages, using keyword-rich anchor text
- Method: Extract all
<a>tags with href pointing to the same domain - Verify:
- At least 3 internal links present ✓/✗ (report count)
- Anchor text is descriptive (not "click here" or "learn more") ✓/✗
- Links point to other tool/content pages (not just homepage) ✓/✗
Check 10: Schema / Structured Data
- Requirement: FAQ Schema (FAQPage) and/or Product Schema present in JSON-LD
- Method: Extract
<script type="application/ld+json">blocks from page HTML - Verify:
- At least 1 JSON-LD block exists ✓/✗
- If FAQ section exists: FAQPage schema with all 10 Q&A pairs ✓/✗
- Schema is valid JSON (no syntax errors) ✓/✗
- Schema
@typematches content (FAQPage for FAQ, Product/SoftwareApplication for tool pages) ✓/✗
Check 11: Hreflang Tags (if localized page)
- Requirement: If the page is a localized version (ja/zh/ko path), hreflang tags must link back to all language variants including the English original
- Method: Extract all
<link rel="alternate" hreflang="...">tags - Verify:
- Hreflang tags exist ✓/✗ (skip check if English-only page)
- Includes
hreflang="en"pointing to original English page ✓/✗ - Includes
hreflang="x-default"✓/✗ - Includes hreflang for each available language variant ✓/✗
- All hreflang URLs are valid HTTPS ✓/✗
Check 12: Brand Name Count & Zero-Article Compliance
- Requirement: Brand name appears exactly 10 times; no articles before tool names
- Method: Search body content for the brand name (as specified by user) occurrences; also search for
[a/an/the] [tool name]patterns - Verify:
- Brand name count = 10 ✓/✗ (report actual count and per-section distribution)
- No instances of "an AI [tool]", "the AI [tool]", "a [tool name]" where tool name is the site's specific product ✓/✗ (report any violations found)
Phase 2: Score Calculation
Scoring
Each check point is worth points based on its SEO impact:
| # | Check | Points | Weight |
|---|---|---|---|
| 1 | Title Tag | 10 | High — Title is the #1 SEO signal |
| 2 | Meta Description | 8 | High — CTR driver |
| 3 | Canonical | 5 | Medium — Prevents duplication |
| 4 | H-Tag Structure | 8 | High — Content hierarchy signal |
| 5 | Body Content Limits | 10 | High — Readability + quality |
| 6 | Testimonials | 5 | Medium — Trust signals |
| 7 | FAQ | 8 | High — FAQ Schema eligibility |
| 8 | Image ALT | 5 | Medium — Accessibility + image SEO |
| 9 | Internal Links | 5 | Medium — Crawlability + authority flow |
| 10 | Schema | 10 | High — Rich results eligibility |
| 11 | Hreflang | 5 | Medium — International SEO (skip if N/A) |
| 12 | Brand Count & Zero-Article | 5 | Medium — Brand consistency |
| Total | 86 |
- If Check 11 is skipped (English-only page), total becomes 81. Scale score proportionally.
- Pass ≥ 80% = Green (ready to publish)
- Pass 60-79% = Yellow (fix critical items before publishing)
- Pass < 60% = Red (do NOT publish — major issues need fixing first)
Phase 3: Generate HTML Report
Produce a standalone HTML file with the following sections:
Report Structure
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SEO Audit Report — [URL]</title>
<style>
/* Clean, professional styling */
/* Green ✓ / Red ✗ indicators */
/* Collapsible details for each check */
/* Summary score banner at top */
</style>
</head>
<body>
<header>
<h1>SEO Audit Report</h1>
<div class="meta">URL: [url] | Date: [date] | Env: [prod/test] | Lang: [en/ja/zh/ko]</div>
<div class="score-banner">
<span class="score">[X]/[total]</span>
<span class="badge [green/yellow/red]">[Green/Yellow/Red]</span>
</div>
</header>
<section class="checks">
<!-- For each of the 12 checks -->
<div class="check [pass/fail]">
<h3>Check [N]: [Name]</h3>
<span class="result">[✓ Pass / ✗ Fail]</span>
<details>
<summary>Details</summary>
<table>
<tr><td>Sub-check</td><td>Result</td><td>Value</td></tr>
<!-- Each sub-verification item -->
</table>
</details>
<div class="fix-if-fail">[If ✗: specific fix instruction]</div>
</div>
</section>
<section class="summary">
<h2>Summary & Action Items</h2>
<ul>
<!-- List all ✗ items with fix instructions -->
</ul>
<h2>Recommendation</h2>
<p>[Green: Ready to publish / Yellow: Fix [N] items / Red: Do not publish]</p>
</section>
</body>
</html>
Save the report as seo-audit-[domain]-[date].html in the current working directory.
Phase 4: Fix Recommendations
For each ✗ item, provide a specific, actionable fix:
| Check | Typical Fix |
|---|---|
| Title too long/short | "Shorten Title to 50-60 chars: suggested rewrite: [new title]" |
| Missing canonical | "Add <link rel=\"canonical\" href=\"[url]\"> to <head>" |
| H-tag skip | "Change H3 to H2 on [section], or add missing H2 before the H3 block" |
| Missing FAQ schema | "Add JSON-LD block with FAQPage schema containing all 10 Q&A pairs" |
| Brand count off | "Add/remove [N] brand mentions. Suggested positions: [list]" |
| Zero-article violation | "Replace an AI background remover → AI background remover in [location]" |
Do not just say "fix it" — give the exact correction.
Quality Checklist
Before delivering the report, verify:
- All 12 checks executed: None skipped (except Check 11 for English-only pages)
- URL was reachable: Page successfully fetched — if not, report error and stop
- Score calculated correctly: Total points match, percentage correct
- HTML report generated: File saved, visually clean and complete
- Fix recommendations provided: Every ✗ has a specific correction
- Decision category assigned: Green/Yellow/Red with clear publish/don't-publish recommendation
Resources
references/
references/seo-checklist.md— The full SEO checklist with all 12 points, sub-verification items, and expected values. Load this at the start of each audit to ensure completeness.references/report-template.html— Starter HTML template for the audit report. Customize with actual data each run.