seo-page
Skill201 starsChanged 5 months agoMITView on GitHub
URL-level SEO intelligence — which keywords this page ranks for, traffic captured, position history, SERP context, and AI Search citation status. Produces a keep / refresh / consolidate / kill verdict for one page. Distinct from `seo-technical-audit` (which checks technical health, not keyword/traffic performance) and from `seo-content-brief` (which produces a NEW article from a topic). Use when the user asks "analyze this page", "page SEO performance", "what does this URL rank for", "page traffic", "should I refresh this page", or provides a single URL for analysis.
31 other projects use a version of this, 1 of them edited.
Adopted by
Most recently taken up by
- alpit-patel/seo-aeo-geo-kittheir own version, first seen Nov 8, 2026
- zhtyyx/codex-seotheir own version, first seen Nov 1, 2026
- joaoguirunas/team-ostheir own version, first seen Oct 21, 2026
- susantedit/claude-skillstheir own version, first seen Oct 20, 2026
- webdevarif/claude-skillstheir own version, first seen Oct 20, 2026
- ZachArticulateV/designer-pro-and-seotheir own version, first seen Oct 19, 2026
Used with
Projects with it also use seo-agentic, seo-maps and 6 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
AgriciDanielSkillseo-agentic
Audit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Use when the user asks whether AI agents can use or browse the site, or about llms.txt or WebMCP. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).
Also in 5 projects that use this
timruebenachSkillseo-maps
Maps intelligence for local SEO — geo-grid rank tracking, GBP profile auditing via API, review intelligence across Google/Tripadvisor/Trustpilot, cross-platform NAP verification (Google/Bing/Apple/OSM), competitor radius mapping, and LocalBusiness schema generation from API data. Three-tier capability: free (Overpass + Geoapify), DataForSEO (full intelligence), DataForSEO + Google (maximum coverage). Use when user says "maps", "geo-grid", "rank tracking", "GBP audit", "review velocity", "competitor radius", "maps analysis", "local rank tracking", "Share of Local Voice", or "SoLV".
Also in 17 projects that use this
timruebenachSkillseo-image-gen
AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics. Powered by Gemini via nanobanana-mcp. Requires banana extension installed. Use when user says \"generate image\", \"OG image\", \"social preview\", \"hero image\", \"blog image\", \"product photo\", \"infographic\", \"seo image\", \"create visual\", \"image-gen\", \"favicon\", \"schema image\", \"pinterest pin\", \"generate visual\", \"banner\", or \"thumbnail\".
Also in 16 projects that use this
mangollcSkillseo-backlinks
Backlink analysis and link building strategy: competitor backlink profiling, outreach plan generation, monthly SEO reporting framework, toxic link identification, link opportunity scoring, and unlinked mention discovery.
Also in 16 projects that use this
- +4 more from timruebenach
Other versions31 projects use a version of this.
Word for word · 0
None found.
Edited · 1
- amirjahfar1/automate-seo-with-claude★ 285% same
Wrote their own version · 30
- AgriciDaniel/claude-seo★ 20ksame name
- nowork-studio/toprank★ 4.1ksame name
- nowork-studio/notfair-plugin★ 4.1ksame name
- zhtyyx/codex-seo★ 152same name
- coopersimson96/ai-content-system★ 17same name
- ZachArticulateV/designer-pro-and-seo★ 10same name
- joaoguirunas/team-os★ 6same name
- oegeyilmaz9/seo-aeo-geo-ultimate★ 6same name
- 01clauding/claude-seo-skill★ 4same name
- avalonreset/legends-seo-dungeon★ 4same name
20 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository31 other files it gives its agents.
- ai-search-gaps-to-social-campaignSkill
- client-onboarding-proposalSkill
- local-gmb-visibilitySkill
- seo-adsSkill
- seo-agency-landing-pageSkill
- seo-ai-search-share-of-voiceSkill
- seo-ai-social-reportSkill
- seo-apiSkill
- seo-backlink-gapSkill
- seo-backlinks-profileSkill
- seo-competitor-gap-analysisSkill
- seo-competitor-pagesSkill
- seo-content-auditSkill
- seo-content-briefSkill
- seo-driftSkill
- seo-firecrawlSkill
- seo-gaps-to-social-campaignSkill
- seo-geoSkill
- seo-googleSkill
- seo-hreflangSkill
- seo-imagesSkill
- seo-keyword-clusterSkill
- seo-keyword-nicheSkill
- seo-localSkill
- seo-planSkill
- seo-schemaSkill
- seo-sitemapSkill
- seo-subdomainSkill
- seo-sxoSkill
- seo-technical-auditSkill
- site-audit-to-social-distributionSkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 3 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 30 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 44
If the URL's domain isn't a verified GSC property: surface "GSC: {target_domain} not verified — add it in Search Console" and continue with …
- Distinctive: line 72
If no peer URL competes, this signal is "no cannibalization detected" — pass through to step 9.
- Very specific: line 77
Write PAGE.md (output spec below).
- Very specific: line 81
Create a folder seo-page-{target-slug}-{YYYYMMDD}/ with:
- Very specific: line 167
Call DATA_getCreditBalance before running.
- Very specific: line 173
GSC canonical mismatch (any verdict): if step 4b detects userCanonical ≠ googleCanonical, flag this as a critical issue in PAGE.md …
- Very specific: line 174
Don't invent reasons. Anchor every claim in PAGE.md to a number from the raw data files.
- Distinctive: line 175
When between KEEP and REFRESH, default to REFRESH — small refreshes compound.
“Common” is measured: kept by at least 6 in 10 of the 30 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Example output: examples/seo-page-notion-keyboard-shortcuts-20260514/PAGE.md
Page Intelligence
Show what a single URL ranks for, what traffic it captures, where its weak and strong points are, and what to do about it. The deliverable is an opinionated verdict — KEEP, REFRESH, CONSOLIDATE, or KILL — anchored in objective signals from SE Ranking's URL-level data.
Prerequisites
- SE Ranking MCP server connected.
- Claude's
WebFetchtool available (for the page-level HTML sense-check). - User provides: (a) a target URL, optionally (b) target market country (default:
us), (c) primary topical keyword (auto-inferred from<title>+<h1>if not supplied).
Process
- Validate target & preflight. See
skills/seo-firecrawl/references/preflight.mdfor the canonical 3-stage preflight (credit balance, Firecrawl availability, Google APIs). Skill-specific notes:- Confirm the URL is fetchable; derive parent domain. If the user supplied a primary keyword, use it; otherwise infer it in step 3.
- Estimated SE Ranking cost for this skill: ~10–15 credits typical (URL overview, ranking keywords, page authority, SERP context for top 3–5 keywords).
- Firecrawl: optional with WebFetch fallback, ~1 Firecrawl credit if available. When available, step 6 recovers
og:*,twitter:*, canonical, robots meta, JSON-LD types, and hreflang count from raw<head>— WebFetch returns markdown only and strips those fields. Without Firecrawl, the affected lines inPAGE.mdemit(skipped — Firecrawl not installed). Pass--no-firecrawlto treat Firecrawl as unavailable even when installed (credit conservation). - Google APIs: tier 1 (GSC available) unlocks step 4b (GSC URL performance + URL Inspection) after the page-authority step. See
skills/seo-google/references/cross-skill-integration.md§ "seo-page" for the full recipe.
- URL-level overview
DATA_getUrlOverviewWorldwide- Pull keyword count, organic traffic estimate, paid keyword count, paid traffic estimate, top regions.
- Note: traffic estimates are directional — they don't replace Google Search Console.
- Ranking keywords
DATA_getDomainKeywords(use theurlparam for exact match — notfilter_url)- Pull every keyword the URL ranks for in the target country, with positions.
- Sort by traffic-weighted score:
volume × CTR-by-position(use a standard CTR curve: 1=28%, 2=15%, 3=11%, 4=8%, 5=7%, 6=5%, 7=4%, 8=3%, 9=2%, 10=2%, 11+=1%). - Take the top 3–5 as the URL's "primary keywords" for SERP work in step 5.
- Page authority
DATA_getPageAuthority+DATA_getPageAuthorityHistory- Current PA score and its 12-month trajectory.
- Flag any drop > 5 points in the last 90 days.
4b. GSC URL performance + URL Inspection (only if google-api.json is present, tier ≥ 1)
- Replaces the directional traffic estimate from step 2 with first-party Google data for the exact URL.
- Pull GSC search analytics for the URL (last 28 days, by query and page):
python3 scripts/gsc_query.py --property "{config.default_property}" --url "{target_url}" --days 28 --json - Pull URL Inspection (real indexation status, canonical Google sees, last crawl date):
python3 scripts/gsc_inspect.py "{target_url}" --site-url "{config.default_property}" --json - If the URL's domain isn't a verified GSC property: surface "GSC: {target_domain} not verified — add it in Search Console" and continue with SE Ranking data only.
- Surface in
PAGE.md"## Snapshot":GSC last 28d: {clicks}/{impressions}/{ctr}% CTR / pos {position}andGoogle sees: {INDEXED|EXCLUDED} · canonical {userCanonical} → {googleCanonical} · last crawled {date}. - Feed into the verdict heuristic:
INDEXED+ impressions > 100 + position 4–10 → harden REFRESH (clear quick-win).EXCLUDED(any reason) → harden KILL or CONSOLIDATE.userCanonical ≠ googleCanonical→ flag as critical issue regardless of verdict. - See
skills/seo-google/references/cross-skill-integration.md§ "seo-page" for the full recipe.
- SERP context
DATA_getSerpResultsandDATA_getAiOverview- For each of the 3–5 primary keywords:
- Top 10 organic results (URL, title, snippet).
- SERP features present (PAA, image carousel, video, shopping, etc.).
- AIO presence and citations — is this URL cited in the AIO?
- For each of the 3–5 primary keywords:
- HTML sense-check
WebFetch(always) +mcp__firecrawl-mcp__firecrawl_scrape(when available)- WebFetch first (free, instant): extract
<title>, meta description, all<h1..h6>, lang, word count, internal-link count, image count. WebFetch returns markdown so anything in<head>beyond<title>is lost — the next bullet recovers it. - Firecrawl second (1 Firecrawl credit; pass
formats: ["rawHtml"]) — recovers what WebFetch can't see. Pin the format torawHtml; the defaulthtmlis post-processed and silently strips canonical, hreflang, and<script type="application/ld+json">blocks on many sites. If those head fields come back zero on a site that obviously has them (any major SaaS homepage), you forgot therawHtmlflag — re-run.- From
metadata:og:title,og:description,og:image,twitter:card,viewport, robots meta, canonical URL. - From the returned
rawHtml: every<script type="application/ld+json">block. Parse each as JSON, list detected@types (Article, BreadcrumbList, Organization, Product, etc.). Note any block that fails to parse. - hreflang: count
<link rel="alternate" hreflang="…">occurrences inrawHtml.
- From
- If Firecrawl unavailable: the WebFetch portion still runs; populate Page basics' OG / Twitter / canonical / robots / JSON-LD / hreflang lines as
(skipped — Firecrawl not installed). Don't infer from markdown. - Sense-check: does the page actually talk about its top-ranking keyword in title and H1? If a page ranks for keywords it doesn't address textually, that's a strong consolidation signal.
- WebFetch first (free, instant): extract
- Domain context
DATA_getDomainOverviewWorldwide(parent domain)- Light-weight: parent DA, total keywords, total traffic. Used to contextualise the page's PA against its domain.
- Cannibalization check
DATA_getDomainPages- Pull the parent domain's pages ranked by organic traffic. Cap at the top 50 — that's where the cannibalization risk concentrates.
- For the candidate URL's top-3 traffic-weighted keywords (from step 3), scan the peer-page list: does any other URL on the same domain rank in the top 20 for any of those keywords?
- Cannibalization signal: any peer URL ranking ≤ 20 for the candidate's top-3 keywords. Record peer URL, keyword, peer position vs candidate position, peer traffic.
- Cheaper than the old approach. Previous versions cross-checked via
DATA_getDomainKeywordson the parent domain — that endpoint can return tens of thousands of rows on large sites and is unnecessarily heavy for this question.DATA_getDomainPagesranked by traffic surfaces the high-impact peers directly. - If no peer URL competes, this signal is "no cannibalization detected" — pass through to step 9.
- Synthesise verdict
- Apply the verdict heuristic (see Tips) to produce KEEP / REFRESH / CONSOLIDATE / KILL.
- For REFRESH, identify the top 3 specific changes (e.g., "add an H2 on 'alternatives' which 7 of 10 SERP winners use").
- Write
PAGE.md(output spec below).
Output format
Create a folder seo-page-{target-slug}-{YYYYMMDD}/ with:
seo-page-{target-slug}-{YYYYMMDD}/
├── PAGE.md (synthesised verdict + plan — primary deliverable)
├── keywords.csv (full keyword list with positions — load-bearing CSV the auditor walks through row-by-row)
├── 04-serp-context.md (top 10 + AIO for top 3–5 keywords — load-bearing reference for SERP-driven REFRESH discussions)
└── evidence/
├── 01-url-overview.md (raw DATA_getUrlOverviewWorldwide)
├── 02-keywords.md (raw DATA_getDomainKeywords filtered)
├── 03-authority.md (PA + history)
├── 05-page-snapshot.md (HTML extracts)
└── 06-cannibalization.md (peer pages on the same domain competing for the top-3 keywords)Top-level: PAGE.md + keywords.csv + 04-serp-context.md. The other step files preserve raw API/HTML extracts in evidence/ for reproducibility — auditors lean on the CSV and SERP context, not the per-call dumps.
PAGE.md follows this shape:
# Page Intelligence: {URL}
> Snapshot dated {YYYY-MM-DD} · Country: {country} · Primary keyword: {keyword}
## Snapshot
- Ranking keywords: {n}
- Estimated monthly organic traffic: {n}
- Page authority: {PA} ({↑/↓ trajectory over 90 days})
- Primary topic: {topic}
- AIO citations: {n} of {checked} primary-keyword AIOs cite this URL
- GSC last 28d: {clicks} clicks / {impressions} impressions / {ctr}% CTR / avg position {n} *(or `not configured` / `property not verified`)*
- Google sees: {INDEXED|EXCLUDED|...} · canonical {userCanonical} {→ googleCanonical if differ} · last crawled {YYYY-MM-DD}
## Page basics
- `<title>`: {value}
- meta description: {value | absent}
- `og:title`: {value | absent | skipped — Firecrawl required}
- `og:description`: {value | absent | skipped}
- `og:image`: {url | absent | skipped}
- `twitter:card`: {summary | summary_large_image | absent | skipped}
- `<link rel="canonical">`: {URL | self-referential | absent | skipped}
- meta robots: {index,follow | noindex,nofollow | absent | skipped}
- JSON-LD types detected: {Article, BreadcrumbList, Organization | none | skipped}
- hreflang variants: {n | skipped}
## What this page wins
- {keyword} — position {n}, ~{volume} monthly searches, ~{traffic} monthly clicks.
- ... (top 3–5)
## Almost-wins (page-2 refresh opportunities)
- {keyword} — position {n}, ~{volume} monthly searches. The top 3 SERP winners all do {pattern} that this page doesn't.
- ... (top 3 examples)
## What this page misses
- {keyword} — competitors {comp1}, {comp2} rank in top 5; this page is absent.
- ...
## Same-domain cannibalization
- {peer URL} — ranks position {n} for "{keyword}" (candidate ranks position {m}). Peer estimated traffic: {n}/mo.
- ... (only list rows where a peer URL ranks ≤ 20 for one of the candidate's top-3 keywords; if none, write "No same-domain cannibalization detected on top-3 keywords.")
## AI Search angle
- {n} of {checked} AIO queries on the URL's keywords cite this page.
- The AIOs that DON'T cite this page tend to cite {pattern} (e.g., comparison tables, step-by-step how-tos).
- Recommended GEO move: {one specific change}.
## Verdict: {KEEP | REFRESH | CONSOLIDATE | KILL}
Reasoning: {1–2 sentences anchored in objective signals from above}.
### If REFRESH — top 3 changes
1. {Specific change}
2. {Specific change}
3. {Specific change}
## Raw data
- keywords.csv — full enriched ranking-keyword list
- 04-serp-context.md — per-keyword SERP top-10 with AIO
- evidence/05-page-snapshot.md — HTML extractskeywords.csv columns: keyword,volume,kd,position,intent,traffic_estimate,url
Tips
- Respect SE Ranking Data API rate limit: 10 requests per second. The 3–5 SERP queries in step 5 should be paced sequentially.
- Call
DATA_getCreditBalancebefore running. ~10–15 credits is typical for one URL. - Verdict heuristic:
- KEEP: PA stable or up; traffic stable or up; top 3 keywords held in their positions; AIO citations present where AIO appears.
- REFRESH: any of (PA dropped >5 in 90 days; traffic dropped >20%; a top-3 keyword fell to position 11+; AIO citations missing while competitors get cited). Hardens when GSC data (step 4b) shows
INDEXED+ impressions > 100 + average position 4–10 (clear quick-win territory). - CONSOLIDATE: cannibalization detected (step 8) — a peer URL on the same domain ranks ≤ 20 for one or more of the candidate's top-3 keywords. CONSOLIDATE harden when the peer outranks the candidate AND captures higher traffic; otherwise CONSOLIDATE recommendation is "merge into the candidate" rather than "kill the candidate."
- KILL: PA <10 AND traffic <50/mo AND no top-10 keyword AND no internal links pointing to it. Hardens when JSON-LD schema is also absent (Firecrawl detected zero blocks) — the page has no signals for any crawler, organic or AI. Also hardens when URL Inspection (step 4b) returns
EXCLUDEDfor any reason. - GSC canonical mismatch (any verdict): if step 4b detects
userCanonical ≠ googleCanonical, flag this as a critical issue inPAGE.mdregardless of the verdict — it points at indexing instability that the verdict on its own can't resolve.
- Don't invent reasons. Anchor every claim in
PAGE.mdto a number from the raw data files. - When between KEEP and REFRESH, default to REFRESH — small refreshes compound.
- The
keywords.csvis the auditable trail. If a stakeholder questions the verdict, walk them through the CSV row by row. - For pages with very low data (new pages, <5 ranking keywords), the verdict is unreliable. Flag as "insufficient data — re-run after 60 days" rather than forcing a verdict.
DATA_getPageAuthorityHistoryall-zeros caveat: if the endpoint returnsinlink_rank: 0(or equivalent) for every date in the history window, treat as "insufficient history" — don't claim a drop or recommend REFRESH based on it. Often happens for very high-authority pages where the metric is saturated, or for URLs that haven't accumulated enough longitudinal data. Cross-check withDATA_getPageAuthority(current value) — if current PA is meaningful but history is flat-zero, flag the gap explicitly inPAGE.mdrather than synthesising a trajectory.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

