cs-seo
SEO analysis from GSC exports — finds quick wins, problems, and proposes code fixes for meta tags
SKILL.mdskills/seo/SKILL.md
GitHubSEO Audit & Optimization
Analyze Google Search Console CSV exports, identify optimization opportunities, propose code fixes.
CTR Benchmarks by Position
| Position | Desktop | Mobile |
|---|---|---|
| 1 | 28-32% | 24-28% |
| 2 | 14-18% | 12-15% |
| 3 | 9-12% | 8-10% |
| 4-5 | 5-8% | 4-6% |
| 6-10 | 2-5% | 1.5-4% |
| 11-20 | 1-2% | 0.5-1.5% |
GSC/GA4 File Patterns
| Pattern | Contains |
|---|---|
Queries*.csv |
Search queries |
Pages*.csv |
Page performance |
Devices*.csv |
Device breakdown |
Countries*.csv |
Geo distribution |
Chart*.csv |
Daily trends |
*Landing_page*.csv |
GA4 entry pages |
*Pages_and_screens*.csv |
GA4 all pages |
*Events*.csv |
GA4 user events |
Supports localized column names (auto-detected).
Structured Data Templates
Use these schemas customized with actual site data: Article (@type: Article — headline, author, datePublished), Product (@type: Product — name, offers with price/currency), FAQ (@type: FAQPage — mainEntity array of Question/Answer), TouristTrip (@type: TouristTrip — itinerary, provider, offers), LocalBusiness (@type: LocalBusiness — name, url, telephone, address), HowTo (@type: HowTo — step array), Breadcrumb (@type: BreadcrumbList — itemListElement).
Meta Tag Patterns
Next.js App Router: export const metadata: Metadata = { title, description, openGraph } or generateMetadata(). Pages Router: <Head><title>. React Helmet: <Helmet><title>.
Inputs
$ARGUMENTS:
/path/to/metrics— folder with GSC CSV exports--url https://example.com— remote mode (no local project)--compare /path/prev /path/curr— compare two periods--fix— apply fixes (local mode only)
| Mode | Has | Result |
|---|---|---|
| Local | CSV + project | Full analysis + code fixes |
| Remote | CSV + --url |
Analysis + recommendations |
| Data-only | CSV only | Metrics analysis only |
Step 1: Check Browser MCP
Try to use one of: mcp__puppeteer__*, mcp__playwright__*, or mcp__browserbase__*. Browser MCP enables SERP screenshots and live site meta tag analysis.
If no browser MCP is available, continue and note:
⚠️ Browser MCP not available — no SERP screenshots, no competitor analysis, remote mode cannot fetch live meta tags.
To enable: claude mcp add puppeteer --scope user -- npx -y @modelcontextprotocol/server-puppeteer
Step 2: Detect & Parse Data
Scan folder for CSV files. Auto-detect type by column names (supports localized exports).
Output summary:
GSC: Queries (1,234), Pages (89), Devices (3), Countries (12)
Period: 2026-01-05 to 2026-02-04 | Clicks: 12,456 | CTR: 2.73%
Tip: If GA4 CSV files are detected in the folder, suggest running
/cs-analyticsfor behavioral analysis (funnels, conversions, user flows).
Branded split: Auto-detect brand from domain/package.json. Split queries into branded/non-branded with separate metrics.
Period comparison (if --compare): Calculate deltas, show gainers/losers.
Step 3: Gather Context
Local mode: Detect framework (Next.js/Remix/Astro/Nuxt/SvelteKit), build URL→file mapping, find meta patterns.
Remote mode: Use Browser MCP to fetch meta tags from live pages (top 20 by impressions).
Data-only: Skip meta analysis, provide generic recommendations.
Step 4: Calculate SEO Health Score (0-100)
| Factor | Weight | How to score |
|---|---|---|
| Avg Position | 25% | 25 if avg < 5, 20 if < 8, 15 if < 12, 10 if < 20, 5 if < 30, 0 if 30+ |
| CTR vs benchmark | 20% | Per-page: compare actual CTR to the CTR benchmarks table above benchmark for that position. Score = avg(actual/benchmark) × 20, capped at 20 |
| Mobile/Desktop parity | 15% | 15 if gap < 20%, 10 if < 50%, 5 if < 100%, 0 if 100%+. Gap = abs(mobile_CTR - desktop_CTR) / min(mobile_CTR, desktop_CTR) |
| Zero-click pages | 15% | 15 if < 5% pages have 0 clicks, 10 if < 15%, 5 if < 30%, 0 if 30%+ |
| Cannibalization | 15% | 15 if no clusters, 10 if 1-2 clusters, 5 if 3-5, 0 if 6+ |
| Rich results % | 10% | 10 if structured data on 50%+ pages, 5 if on any page, 0 if none |
Always show the scoring breakdown in the report — show each factor's score and why, not just the total.
Step 5: Identify Quick Wins
- Position 4-10 — almost top 3, small push needed
- High impressions, low CTR — title/description not compelling
- Zero-click pages — impressions but no clicks
For each quick win, show:
- Page URL, current title
- Current metrics: clicks, impressions, CTR, avg position
- CTR gap: compare actual CTR vs benchmark for that position (see the CTR benchmarks table above)
- Estimated gain with formula:
monthly_impressions × (benchmark_CTR - current_CTR). Example: "4,693 impressions × (3.5% benchmark at pos 8 − 0.47% actual) = +142 clicks/month" - Specific action (rewrite title, add structured data, etc.)
Always show the math — never give estimated gains without the calculation.
Step 6: Detect Problems
- Cannibalization — multiple pages for same query cluster → show all competing pages, which one should be canonical, and what to do with the rest (redirect, noindex, differentiate)
- Mobile gap — if mobile CTR differs from desktop by > 50%, flag it. Suggest checking: title truncation on mobile, page speed, mobile UX
- Declining pages — traffic drop (if
--compare) → update content - HTTP/WWW/param duplicates — look for the same page URL appearing in GSC with different schemes (http/https), www/non-www, or query params. Sum up the split clicks to show wasted potential
- Missing meta tags — if remote/local mode: check for missing or duplicate title tags, missing descriptions, descriptions over 160 chars, titles over 60 chars
- Content-intent mismatch — pages with high impressions but CTR far below benchmark for their position → the search intent may not match what the page offers
Step 7: Technical SEO Audit
Check in project or via Browser MCP:
- robots.txt — exists? blocking important paths? sitemap reference?
- sitemap — exists? dynamic? pages missing?
- Canonical — duplicates? missing tags?
- Hreflang — if i18n detected, check cross-references
- Core Web Vitals — if Browser MCP available, run Lighthouse. If not, recommend user check PageSpeed Insights and include a link:
https://pagespeed.web.dev/analysis?url={site_url} - HTTP/HTTPS/WWW variants — check GSC data for multiple URL variants of the same page (http:// vs https://, www vs non-www). Flag if clicks are split across variants — recommend 301 redirects to canonical.
Step 8: SERP Analysis (with Browser MCP)
For top 5-10 queries:
- Screenshot Google SERP
- Compare your title/description vs competitors
- Identify SERP features (snippets, PAA, videos)
- Extract competitor patterns (numbers, year, brackets, length)
Step 9: Generate Fixes
Local: Read file, show current meta, generate optimized version with rationale.
Remote: Show fetched meta, provide recommendations with example code.
For each page:
- Current title/description + issues
- Optimized meta (based on queries, CTR benchmarks, competitors)
- Structured data suggestion if applicable
Step 10: Apply Fixes (--fix, local only)
If --fix in remote mode → warn and skip.
If --fix in local mode → Ask: "Apply SEO fixes? (X files)"
- All — apply all
- Review each — show diff, confirm per file
- None — skip
Step 11: Generate Report
Structure the report in this exact order:
# SEO Audit Report
**Site**: example.com | **Period**: Jan 5 – Feb 4, 2026 (31 days) | **Mode**: Local/Remote
---
## Data Summary
GSC: Queries (X), Pages (Y), Devices (Z), Countries (W)
Period: ... | Clicks: X | Impressions: Y | CTR: Z% | Avg Position: X
## Traffic Split (Device, Branded/Non-Branded, Top Countries)
## SEO Health Score: X/100
Show each factor with score AND reasoning (not just the number).
## Quick Wins (Estimated +X clicks/month)
For each: page, metrics, CTR gap formula, estimated gain, action.
## Problems Detected
Severity labels: CRITICAL / HIGH / MEDIUM. For each: what, why, impact.
## Technical SEO Audit
robots.txt, sitemap, canonical, OG tags, HTTP variants, Core Web Vitals link.
## Top N Action Items (Priority Order)
Table with: #, Action, Impact, Effort, Estimated Gain.
## Recommended Meta Tag Fixes
Per page: current → new title, current → new description, rationale.
## Structured Data Recommendations
Use the structured data templates from above, customized with actual site data
(real page titles, real company name, real URLs — not generic placeholders).
Important
- Read-only by default —
--fixrequired for changes, confirmation always needed - Browser MCP required for remote mode — without it, remote meta tag analysis is not possible