Claude-seo-skills seo-migration-check
git clone https://github.com/lionkiii/claude-seo-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/lionkiii/claude-seo-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/seo-migration-check" ~/.claude/skills/lionkiii-claude-seo-skills-seo-migration-check && rm -rf "$T"
skills/seo-migration-check/SKILL.mdSite Migration SEO Validator
Validates redirect chains, canonical tags, metadata, and content preservation during site migrations.
Inputs
Either:
andold
: Two URLs for a single-page check (e.g.,newhttps://old.com/page
)https://new.com/page
: Path to CSV/text file with URL pairs, one per line:fileold_url,new_url
If file provided: Read it and process each line. Skip blank lines and lines starting with
#.
For large files (>50 URL pairs), process first 50 and note truncation.
Execution
For each URL pair, run checks a-f:
Check a: Redirect Chain Validation
Fetch old URL with WebFetch and follow redirects (track each hop):
- Record redirect type: 301 (permanent), 302 (temporary), 307, 308
- Count redirect hops
- Record final destination URL
Evaluate:
- Final destination matches expected
URL: PASS — mismatch: FAILnew - Redirect type is 301: PASS — 302/307: WARN (temporary redirects pass less link equity)
- Hop count 1: PASS — hop count 2: WARN — hop count >2: FAIL (redirect chain too long)
- Direct 200 on old URL (no redirect): FAIL (old page still live, not redirected)
Check b: Canonical Consistency
Fetch new URL, extract
<link rel="canonical" href="..."> from <head>.
- Canonical matches new URL exactly: PASS
- Canonical missing: WARN (Google will infer, but explicit is better)
- Canonical points to old URL: FAIL (critical — tells Google old is authoritative)
- Canonical points to third URL: WARN
Check c: Title and Meta Preservation
Compare title and meta description between old URL (before redirect) and new URL. Note: old URL may already redirect, so if old URL is not directly fetchable, skip comparison and note.
If comparable:
- Title: Extract both. Compare word overlap.
-
70% word overlap: PASS
- 40-70% overlap: WARN (may be intentional change)
- <40% overlap: WARN with note ("significant title change — verify this was intentional")
-
- Meta description: Extract both.
- Present on both: PASS
- Missing on new URL: WARN
- Both missing: NOTE
Check d: HTTP Status
Verify new URL returns 200 OK:
- 200: PASS
- 301/302 (new URL also redirects): WARN with destination
- 404: FAIL
- 500/5xx: FAIL
Check e: Content Similarity
If both old and new pages are fetchable, compare word counts:
- New page word count >= 80% of old: PASS
- New page word count 50-80% of old: WARN (possible content reduction)
- New page word count < 50% of old: FAIL (significant content loss) If old URL not directly fetchable (already redirects): skip and note.
Check f: Schema Preservation
Extract
@type values from JSON-LD blocks on both pages.
- Same schema types present: PASS
- Schema types reduced: WARN (lost structured data)
- Key schema missing on new (e.g., Product, Article, LocalBusiness): WARN
- No schema on either: NOTE (not a regression)
Overall Per-URL Result
FAIL: any check is FAIL WARN: no FAILs but any check is WARN PASS: all checks PASS or NOTE
Output Format
## Migration Validation: [old URL] → [new URL] (or: ## Migration Validation: [N] URL pairs from [filename]) ### Summary | Status | Count | |--------|-------| | PASS | N | | WARN | N | | FAIL | N | | Total | N | ### Per-URL Results | Old URL | New URL | Redirect | Canonical | Title | Meta | Status Code | Schema | Overall | |---|---|---|---|---|---|---|---|---| | /old | /new | 301✓ | PASS | PASS | WARN | 200 | PASS | WARN | ### Failed Items Detail For each FAIL result, expanded information: **[old URL] → [new URL]** - Redirect: [issue description] - Canonical: [issue description] - [etc.] - Recommended fix: [specific action] ### Recommendations [Prioritized list of actions based on failures and warnings] ## Data Sources - Live URL fetching via WebFetch - Redirect chain analysis (following HTTP headers)