page-seo-checker · git:20260723.1c17b05 · 2026-07-23 · sha256 ace5966924df9686

page-seo-checker git:20260723.1c17b05B

Immutable. This exact content never changes and is served at /api/v1/blob/ace5966924df9686.

---
name: page-seo-checker
description: Check SEO compliance of any domain page based on internal SEO standards and page launch checklist, generating a visual HTML report. Automatically extracts domain from URL, supports production and test environments. Trigger keywords: check SEO, SEO check, check page SEO, page SEO compliance, SEO report. Activate when user provides a page URL and requests SEO compliance check.
agent_created: true
---

# Page SEO Checker — 12-Point Automated Audit

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:

1. **Page URL** — the live page to check (production or test environment)
2. **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:
> 1. The page URL to check
> 2. Your brand name (for brand mention verification)
>
> Please provide these before I start."

Once collected, proceed to Phase 0 below.

---

## Phase 0: Identify Target

1. **URL** — the page to check (provided by the user)
2. **Environment** — auto-detect from URL:
   - Production: domain matches `your-domain.com`, etc.
   - Test/Staging: domain contains `test`, `staging`, `dev`, `localhost`, or non-production subdomains
3. **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**:
  1. Title tag exists and is non-empty ✓/✗
  2. Character count within 50-60 ✓/✗ (report actual count)
  3. Contains brand name (as specified by user) ✓/✗
  4. Does NOT contain banned openings: "is an AI-powered tool that..." / "is the ultimate solution..." ✓/✗
  5. 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**:
  1. Description tag exists and is non-empty ✓/✗
  2. Character count within 150-160 ✓/✗ (report actual count)
  3. Contains at least 1 core keyword ✓/✗
  4. 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**:
  1. Canonical tag exists ✓/✗
  2. Canonical URL matches the current page URL (ignoring query params/trailing slashes) ✓/✗
  3. 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**:
  1. Exactly 1 H1 tag on the page ✓/✗ (report count)
  2. H1 contains brand/product name ✓/✗
  3. H2 tags present for all 8 sections (S1-S8) ✓/✗
  4. No H3 used where H2 should be, no H4 used where H3 should be ✓/✗
  5. 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**:
  1. S1 What Is: 200-300 chars ✓/✗ (report count)
  2. S2 Pain Point: P ≤ 200 chars ✓/✗ (report count)
  3. S3 Feature summary: ≤ 100 chars ✓/✗ (report count)
  4. S3 Each feature description: ~100 chars ✓/✗ (report count)
  5. S4 Each user group: ≤ 150 chars ✓/✗ (report count)
  6. S5 Each step: ~70 chars ✓/✗ (report count)
  7. S6 CTA: ≤ 150 chars ✓/✗ (report count)
  8. S7 Each review: ≥ 300 chars ✓/✗ (report count)
  9. 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**:
  1. At least 6 distinct reviews present ✓/✗ (report count)
  2. No "I've been using X for Y months and it's amazing!" openings ✓/✗
  3. At least 4 different narrative arcs identifiable ✓/✗ (list arcs found)
  4. 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**:
  1. At least 10 FAQs present ✓/✗ (report count)
  2. Q1 asks "What is [Product] and what makes it different?" ✓/✗
  3. No "Absolutely!" or "Great question!" answer openings ✓/✗
  4. 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 their `alt` attributes from page HTML
- **Verify**:
  1. Every `<img>` has an `alt` attribute ✓/✗ (report count of missing alt)
  2. Alt text is non-empty (not just "") ✓/✗
  3. At least 1 image alt contains the core keyword ✓/✗
  4. Alt text describes content, not just "image" or "photo" ✓/✗

### 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**:
  1. At least 3 internal links present ✓/✗ (report count)
  2. Anchor text is descriptive (not "click here" or "learn more") ✓/✗
  3. 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**:
  1. At least 1 JSON-LD block exists ✓/✗
  2. If FAQ section exists: FAQPage schema with all 10 Q&A pairs ✓/✗
  3. Schema is valid JSON (no syntax errors) ✓/✗
  4. Schema `@type` matches 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**:
  1. Hreflang tags exist ✓/✗ (skip check if English-only page)
  2. Includes `hreflang="en"` pointing to original English page ✓/✗
  3. Includes `hreflang="x-default"` ✓/✗
  4. Includes hreflang for each available language variant ✓/✗
  5. 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**:
  1. Brand name count = 10 ✓/✗ (report actual count and per-section distribution)
  2. 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

```html
<!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:

1. **All 12 checks executed**: None skipped (except Check 11 for English-only pages)
2. **URL was reachable**: Page successfully fetched — if not, report error and stop
3. **Score calculated correctly**: Total points match, percentage correct
4. **HTML report generated**: File saved, visually clean and complete
5. **Fix recommendations provided**: Every ✗ has a specific correction
6. **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.