seo-audit
Skill2 starsChanged 3 months agoMITView on GitHub
Run a rigorous SEO audit on a real website using Google Search Console data pulled through an MCP connector, combining GSC performance analysis (striking-distance queries, CTR gaps against the site's own position curve, keyword cannibalization, traffic-decay diagnosis, index coverage) with on-page and technical best-practice checks, then produce a prioritized report with estimated click impact. Use this whenever the user wants an SEO audit, site audit, or "SEO review"; asks why their organic traffic, clicks, impressions, or rankings dropped or went flat; asks which pages or keywords to fix, improve, or prioritize; mentions Google Search Console or GSC at all; asks about indexing or coverage problems, canonicalization, crawl issues, cannibalization, low CTR, titles and meta descriptions, striking-distance or "almost ranking" keywords, Core Web Vitals, or sitemap health. Trigger even when the user never says the words "SEO" or "audit" — "why did my Google traffic tank last month", "which blog posts should I update", and "pull my Search Console data and tell me what's wrong" are all this skill.
185 other projects use a version of this.
Adopted by
Most recently taken up by
- nisarth/claude-skills-storetheir own version, first seen Nov 8, 2026
- alpit-patel/seo-aeo-geo-kittheir own version, first seen Nov 8, 2026
- foverse/seoversetheir own version, first seen Nov 8, 2026
- insight68/Skillstheir own version, first seen Nov 8, 2026
- figueroaignacio/ignaciofigueroa.devtheir own version, first seen Nov 8, 2026
- ftzi/livespectheir own version, first seen Nov 8, 2026
Used with
Projects with it also use openseo-review-web-content, openseo-release-notes and 10 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.
JwuthriSkillopenseo-review-web-content
Write and review content for the OpenSEO website (web/) — blog posts, guides, feature pages, FAQs. Distills the philosophy for on-brand, useful, accurate content. Use whenever adding or editing user-facing prose in web/content or web/src.
Also in 5 projects that use this
JwuthriSkillopenseo-release-notes
Cut an OpenSEO release — bump the version, draft user-facing release notes from commits since the last tag, run a review + subagent-verification pass, and open a "release: vX.X.X" PR. Use when the user asks to prepare a release, bump the version, or write release notes.
Also in 6 projects that use this
nicepkgSkillcommunity-led-growth
Expert in community-led growth (CLG) - leveraging user communities to drive acquisition, retention, and expansion. Covers building developer communities, user groups, ambassador programs, and turning customers into advocates. Knows the difference between community as a feature vs community as a growth engine, and how to measure community ROI. Use when "community-led, CLG, ambassador program, champion program, user community, developer community, word of mouth, user group, " mentioned.
Also in 5 projects that use this
nicepkgSkillph-community-outreach
Engage Reddit, Indie Hackers, Hacker News and other communities for Product Hunt launches. Use this skill to identify relevant communities, craft appropriate posts, and drive cross-platform engagement without appearing spammy.
Also in 5 projects that use this
xfstudioSkillmicro-saas-launcher
Expert in launching small, focused SaaS products fast - the indie hacker approach to building profitable software. Covers idea validation, MVP development, pricing, launch strategies, and growing to sustainable revenue. Ship in weeks, not months. Use when: micro saas, indie hacker, small saas, side project, saas mvp.
Also in 5 projects that use this
akii-technologies-ltdSkillkeyword-clustering
Cluster and organize keywords into topical groups for SEO. Use when the user asks to "cluster keywords", "group keywords", "organize keywords", "keyword mapping", "topic clusters", "keyword grouping", "build a content plan", "pillar pages", "topical authority", "semantic clustering", or pastes a list of keywords.
Also in 12 projects that use this
- +4 more from nicepkg
- +2 more from Jwuthri
Other versions185 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 185
- coreyhaines31/marketingskills★ 59ksame name
- anthropics/knowledge-work-plugins★ 35ksame name
- every-app/open-seo★ 27ksame name
- AgriciDaniel/claude-seo★ 20ksame name
- trycompai/crm★ 12ksame name
- Ryze-AI-Adgent/open-seo-mcp-skills★ 8.4ksame name
- TheCraigHewitt/seomachine★ 7.5ksame name
- legions-developer/evilcharts★ 3.2ksame name
- MaxMiksa/Auto-Company★ 3.2ksame name
- MaxMiksa/Autonomous-Company★ 3.2ksame name
175 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 repository4 other files it gives its agents.
- cold-emailSkill
- cro-auditSkill
- pitch-deckSkill
- wireframeSkill
The file
We split this skill into the rules it gives an agent
11 rules. 0 are common, 5 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 167 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 29
Search for the tools with ToolSearch using queries like search console, +searchconsole, google seo analytics.
- Very specific: line 31
If nothing loads, check the MCP registry (search_mcp_registry with keywords like ["google search console", "seo"]) and surface connect …
- Distinctive: line 40
If no GSC connection exists, say so plainly and offer the fallback: a best-practice-only audit from crawling the live site (Step 4), …
- Distinctive: line 52
Ask, or infer from context, only what changes the analysis:
- Very specific: line 59
Search type and market: Default type=web. If the site is image- or video-led, or has meaningful non-English markets, filter by country …
- Very specific: line 67
Read references/gsc-api-surface.md before the first query.
- Very specific: line 85
Use dataState=final for anything you compare across periods, so a partial most-recent day doesn't manufacture a fake decline.
- Very specific: line 157
Use the structure in references/report-template.md.
- Distinctive: line 161
Always include the data-caveats appendix.
- Distinctive: line 171
Never fabricate a metric: If a pull failed or returned nothing, say the analysis could not be run.
- Distinctive: line 185
Read before the first pull.
“Common” is measured: kept by at least 6 in 10 of the 167 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
SEO Audit via Google Search Console
Why this skill exists
Most SEO audits fail in one of two ways. They either dump every crawler warning into a 200-row spreadsheet with no sense of what actually costs money, or they assert causes ("your rankings dropped because of the algorithm update") that the available data cannot support.
This skill exists to avoid both. The core discipline is: every finding is tied to measured GSC data, states the mechanism behind it, and carries an impact estimate whose arithmetic is shown so the user can disagree with it. A finding you cannot quantify or explain is an observation, not a recommendation, and belongs in an appendix.
The second discipline is honesty about what Search Console can and cannot tell you. A
large fraction of published "GSC audit" advice quietly assumes data the API does not
expose. Getting this wrong produces confident, wrong conclusions — see
references/gsc-api-surface.md for exactly where the boundaries are.
Step 0 — Find the Search Console connection
There is no single canonical GSC MCP server, so do not assume tool names. Discover them:
- Search for the tools with
ToolSearchusing queries likesearch console,+searchconsole,google seo analytics. Load whatever matches. - If nothing loads, check the MCP registry (
search_mcp_registrywith keywords like["google search console", "seo"]) and surface connect options withsuggest_connectors. - Confirm which properties the connection can actually see before planning anything —
the equivalent of
sites.list. Property type matters: a domain property (sc-domain:example.com) aggregates all subdomains and protocols, a URL-prefix property (https://example.com/) does not. Auditing a URL-prefix property and reporting it as whole-site truth is a common and invisible error.
If no GSC connection exists, say so plainly and offer the fallback: a best-practice-only audit from crawling the live site (Step 4), clearly labeled as having no performance data behind it. Do not silently degrade into a generic checklist — the user asked for an audit grounded in their data, and they should know if they aren't getting one.
If the GSC MCP exposes write operations (submitting sitemaps, requesting indexing, deleting properties), treat them as outward-facing changes to the user's live search presence and confirm before calling them. Reading is the whole job here; writing is not.
Step 1 — Scope before pulling
Ask, or infer from context, only what changes the analysis:
- Which property, and its type (domain vs URL-prefix).
- The question behind the request. "Traffic dropped" is a diagnosis job and needs period-over-period plus year-over-year windows. "What should I work on" is an opportunity job and needs a single recent window at query+page granularity. These produce different reports; guessing wastes a lot of pulling.
- Search type and market. Default
type=web. If the site is image- or video-led, or has meaningful non-English markets, filter by country rather than blending markets — averaged position across countries is close to meaningless. - Section scope. For large sites, a path filter (
/blog/,/products/) produces a far more actionable audit than a whole-property average.
Step 2 — Pull the data
Read references/gsc-api-surface.md before the first query. It documents the exact
methods available, the row limits and pagination behavior, and five data caveats that
will silently corrupt your numbers if ignored — most importantly anonymized queries,
impression-weighted position averaging, and the freshness lag.
The standard pull set for a full audit:
| Pull | Dimensions | Window | Purpose |
| A | page, query | last 28 days | Opportunity + cannibalization core |
| B | page, query | previous 28 days | Period-over-period delta |
| C | page, query | same 28 days, prior year | Seasonality control |
| D | date | last 16 months | Trend shape, step-change detection |
| E | page, device | last 28 days | Mobile/desktop divergence |
| F | query, country | last 28 days | Market mix, if multi-market |
Paginate to exhaustion rather than taking the first page — rowLimit caps at 25,000 and
truncated data biases every ranked list toward whatever the API happened to return first.
Use dataState=final for anything you compare across periods, so a partial most-recent
day doesn't manufacture a fake decline.
Step 3 — Run the analyses
references/analyses.md specifies eight analysis modules with their thresholds, ranking
formulas, and the reasoning behind each cutoff. Read it and work through the modules that
fit the scope from Step 1.
scripts/analyze_gsc.py implements the deterministic ones — CTR-curve construction,
striking distance, cannibalization, and decay classification. Prefer it over
recomputing by hand: the math is fiddly, the script is tested against the caveats in the
reference doc, and it keeps results reproducible across runs.
python3 scripts/analyze_gsc.py --current pull_a.json --previous pull_b.json \
--year-ago pull_c.json --out findings.jsonIt accepts raw GSC API response shapes ({"rows": [{"keys": [...], "clicks": ...}]}) and
emits ranked findings. Pass --help for the full flag set.
One methodological note worth internalizing: the script builds the expected CTR curve from the property's own data — the median CTR at each integer position across the site — rather than applying published industry CTR benchmarks. Those benchmarks vary wildly by SERP layout, brand strength, and query intent, so importing them produces confident nonsense. A site compared against itself yields a defensible gap.
Step 4 — Add the on-page and technical layer
GSC tells you how pages perform, not why the HTML is wrong. references/onpage-checks.md
lists the checks worth running by fetching the actual pages, ordered by how often they
turn out to matter. Concentrate on the pages the Step 3 analyses flagged rather than
crawling everything — a check on a page with no impressions has no impact to estimate.
Core Web Vitals are not in the Search Console API. Get field data from the CrUX API or PageSpeed Insights API, and label it as such in the report.
Step 5 — Diagnose, don't just list
For every page or query with a decline, the combination of the three metrics identifies the mechanism. This table is the analytical core of the audit:
| Clicks | Impressions | Position | Mechanism | Where to look |
| ↓ down | → flat | → flat | CTR loss — SERP layout, AI Overview, or title change | Title/meta, SERP features, competitor snippets |
| ↓ down | ↓ down | ↓ worse | Genuine ranking loss | Content freshness, lost links, competitor gains |
| ↓ down | ↓ down | → flat | Demand loss or seasonality | Compare year-over-year before acting |
| → flat | ↑ up | ↓ worse | Broader but weaker matching | New irrelevant queries diluting the average |
| ↓ down | → flat | ↓ worse | Rank slide within page 1 | Often precedes a larger drop; act early |
The year-over-year pull exists specifically to stop the third row being misdiagnosed as the second. Seasonal declines get "wait" as a recommendation, and saying so builds more trust than inventing a fix.
Step 6 — Prioritize by impact over effort
Estimate incremental monthly clicks for each finding and show the arithmetic inline:
/guides/onboarding— 4,200 impressions/mo at position 11.3, CTR 0.9%. Median CTR at position 5 across this property is 4.1%. Moving to position 5 ≈ 4,200 × (0.041 − 0.009) ≈ +134 clicks/mo. Effort: M (needs ~600 words and 3 internal links).
Two rules keep these estimates from becoming fiction. Use the site's own CTR curve, never an imported one. And when a projection depends on a rank improvement you cannot guarantee, state the assumed target position rather than hiding it inside a single number.
Rank findings by impact ÷ effort. Lead the report with the three highest-leverage items, not the most numerous category of warning.
Step 7 — Write the report
Use the structure in references/report-template.md. It front-loads an executive summary
a non-specialist can act on and pushes methodology to an appendix, because the person
deciding whether to fund the work is rarely the person implementing it.
Always include the data-caveats appendix. It states the window, the property type, the freshness lag, and the anonymized-query gap. This is what makes the numbers auditable later, and it is the difference between a report that survives scrutiny and one that gets quietly distrusted.
Honesty rules
These matter more than any individual analysis, because an audit's only real product is trust in its conclusions.
- Never fabricate a metric. If a pull failed or returned nothing, say the analysis could not be run. An empty result is a finding.
- Distinguish measured from inferred. "Clicks fell 34%" is measured. "Because of the March core update" is a hypothesis — label it and give the evidence for and against.
- Report the anonymized-query gap. Query-dimension clicks always sum to less than property totals because GSC withholds rare queries. Don't reconcile them; state the gap.
- Don't recommend at unsupported precision. With 40 impressions in 28 days there is no CTR signal. Set minimum-volume thresholds and exclude what falls below them.
- Flag when the property type limits the conclusion. A URL-prefix property blind to
wwworhttpvariants cannot support whole-site claims.
Reference files
references/gsc-api-surface.md— available methods, quotas, and the five data caveats. Read before the first pull.references/analyses.md— the eight analysis modules, thresholds, ranking formulas.references/onpage-checks.md— technical and on-page checks, by expected impact.references/report-template.md— output structure.scripts/analyze_gsc.py— deterministic analysis over raw GSC responses.
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.

