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-overv