onpage-audit
Skill0 starsChanged 22 days agoMITView on GitHub
Run a technical on-page audit of a set of pages on a Search Console property with the GSC Wizard MCP tools: pick the URLs from the user's list, the top pages by clicks, or a sitemap, crawl them in batches with audit_onpage_seo (indexability, canonical, titles and meta, headings, links, images, structured data), optionally confirm a canonical mismatch with a quota-aware URL inspection, then report issues grouped by severity with affected URLs and fixes. Use when the user says "audit these pages", "check my on-page SEO", "technical check of my top pages", "are my titles and meta descriptions ok", or asks for a technical review of specific URLs.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- FlorianBruniaux/google-search-console-mcptheir own version, first seen Oct 15, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- FlorianBruniaux/google-search-console-mcp★ 22same name
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 repository33 other files it gives its agents.
- ai-assistant-trafficSkill
- anomaly-checkSkill
- bing-crawl-healthSkill
- bing-performanceSkill
- branded-splitSkill
- cannibalizationSkill
- client-reportSkill
- content-decaySkill
- content-groupsSkill
- core-web-vitalsSkill
- country-deviceSkill
- ctr-optimizationSkill
- experiment-resultsSkill
- ga4-overviewSkill
- indexing-healthSkill
- indexing-trackerSkill
- indexnow-submitSkill
- long-tail-analysisSkill
- merchant-center-healthSkill
- page-deep-diveSkill
- portfolio-overviewSkill
- property-setupSkill
- query-deep-diveSkill
- quick-winsSkill
- ranking-changesSkill
- shopping-performanceSkill
- site-auditSkill
- sitemap-auditSkill
- site-migrationSkill
- traffic-dropSkill
- traffic-forecastSkill
- weekly-reportSkill
- yandex-performanceSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 0 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
Resolve the property: If the user's request or the conversation names a property, use it.
- Very specific: line 18
No list and no traffic read: omit urls and let the tool auto-pick the top pages by impressions with maxUrls (default 10, max 25) and …
- Very specific: line 22
Run the audit in batches: Call audit_onpage_seo with siteUrl and urls (up to 25).
- Very specific: line 25
Read auditedCount, skipped, contextRange (the 28-day window behind impressions and clicks) and summary: total_pages, total_issues, …
- Very specific: line 26
Read pages[], sorted by issueCount descending then impressions.
- Very specific: line 32
If pages is empty, read emptyBecause and do what nextStep says.
- Very specific: line 48
Confirm a canonical mismatch (optional, quota-aware): Only for pages with impressions where canonicalIsSelf is false or canonicalUrl is …
- Very specific: line 51
Stop if a response carries quotaExhausted: true.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
On-Page Audit
Crawl a chosen set of pages on one property, run the technical on-page checks on each, and report the issues grouped by severity with the affected URLs and the fix. The user's request may contain a property, a list of URLs, a sitemap URL, a section path (for example "/blog/"), or a page count; use it to skip resolution and to narrow the URL set. This skill reads the pages' own HTML. For whether Google indexed them, run the indexing-health skill.
Workflow
- Resolve the property. If the user's request or the conversation names a property, use it. Site URLs use GSC formats:
sc-domain:example.comorhttps://www.example.com/. Otherwise calllist_sitesand pick the obvious match. If several plausible properties exist, ask the user which one before continuing.- The property also bounds the crawl:
audit_onpage_seofetches only URLs that belong to it (a domain property covers its subdomains, a URL-prefix property only its own origin and path prefix) and lists any other URL inskippedwith a reason, so a URL on another host needs its own property.
- The property also bounds the crawl:
- Choose the URL set. Take the first source that applies, and keep the whole workflow to about 25 to 50 pages unless the user asks for more, because every page is fetched live from the user's site.
- The user named URLs: use them as given, at most 25 per call (the
urlscap). - "My top pages" or no hint: call
query_top_pageswith thesiteUrlandlimit: 25, omittingstartDateandendDatefor the last 28 settled days, and take thepagevalues. Rows are sorted by clicks, highest first;ctris a 0-100 percentage, never multiply it by 100;positionis lower-is-better. GSC data lags about 2 to 3 days, so the window ends before today. - No list and no traffic read: omit
urlsand let the tool auto-pick the top pages by impressions withmaxUrls(default 10, max 25) andminImpressions(default 0, counted over the same 28 days). - A sitemap or a section: call
get_sitemap_performancewithsitemapUrl(on the property host; one level of sitemap-index expansion) andmaxUrls(default 500, max 2000). Audit the URLs with clicks or impressions first. - URLs with zero impressions are an index-coverage question for the sitemap-audit and indexing-health skills, not an on-page one, unless the user asks about them.
- The user named URLs: use them as given, at most 25 per call (the
- Run the audit in batches. Call
audit_onpage_seowithsiteUrlandurls(up to 25).- The tool fetches each page live, honouring robots.txt Crawl-delay per host and the property's crawl rate, and stops after about 50 seconds. When
truncatedis true, the URLs innotAuditedwere not fetched: call again withurlsset to that list and repeat untilnotAuditedis empty. - On a slow or throttled site, batches of 10 finish more reliably than batches of 25. A site that keeps answering 429 can be crawled more gently with
update_site(lowercrawlMaxConcurrency, raisecrawlMinDelayMs) once the user confirms the change; a read-only connection refuses it. - Read
auditedCount,skipped,contextRange(the 28-day window behindimpressionsandclicks) andsummary:total_pages,total_issues,by_severity(critical, high, medium, low, info),indexable_pages,non_indexable_pages.summarycovers one call, so merge the batches yourself before reporting totals and say so. - Read
pages[], sorted byissueCountdescending thenimpressions. Crawl fields per page:statusCode,redirected,redirectChain,responseTimeMs,bodyBytes,impressions,clicks. - On-page fields per page:
indexable,indexabilityStatus,noindex,canonicalUrl,canonicalIsSelf,title,titleLength,metaDescriptionLength,h1Count,wordCount,internalLinks,externalLinks,imagesMissingAlt,imagesCount,hasStructuredData,structuredDataTypes,schemaIssues,hasViewport,lang,hreflangCount. - Each entry in
issues[]hasid,category,severityandmessage;issueCountis the length of that list and the primary sort key. crawlNote: some pages answered a blocked-looking status because a bot rule rejects the crawler; relay the whitelisting advice instead of reporting broken pages.robotsNote: robots.txt disallows GSCWizard-Bot, so those pages were not fetched and carry theblocked-by-robotsissue.metricsUnavailablewithcontextNote:impressionsandclicksare null, meaning unknown, not 0; the on-page checks still stand.- If
pagesis empty, reademptyBecauseand do whatnextStepsays.
- The tool fetches each page live, honouring robots.txt Crawl-delay per host and the property's crawl rate, and stops after about 50 seconds. When
- Interpret by category and weight by traffic. Severities are critical, high, medium, low, info; categories are indexability, canonical, meta, headings, content, links, images, structured-data, technical. Read them with this table.
| Category | Issue ids | What it means and the usual fix |
| indexability | blocked-by-robots (critical), noindex (critical with impressions, else high), nofollow (medium) | Google is told to stay away; remove the robots rule, tag or header unless it is intentional |
| technical | fetch-failed, http-error (critical), redirect-loop (high), redirected, slow-response, missing-viewport, large-page-weight (low), non-html (info) | The URL does not serve a plain 200 HTML page; fix the status, shorten the chain, link to the final URL, trim the page |
| canonical | missing-canonical (medium), canonicalised (medium with impressions, else low) | The page points elsewhere or nowhere; make the preferred URL self-canonical, consolidate duplicates |
| meta | missing-title (high), missing-meta (medium), title-long, title-short, meta-long, meta-short (low) | Rewrite titles and descriptions within the length hints in message; prioritise pages with impressions but low ctr |
| headings, content | missing-h1 (high), multiple-h1 (low), thin-content (medium under 100 words, else low) | One descriptive H1; expand or merge thin pages |
| links, images | no-internal-links (medium), images-missing-alt (low) | Link the page into the site; add alt text, most important on pages with image impressions |
| structured-data | no-structured-data (low), schema issues from schemaIssues (medium when the level is error) | Add or repair JSON-LD for the page type; an error-level schema issue can cost rich results |
Always rank a finding by the impressions and clicks of the pages it affects, not by its count: a noindex on a page with clicks is an emergency, a short title on a page with no impressions is housekeeping. Issue message texts carry the measured value (the title length, the word count, the HTTP status), so quote them rather than restating thresholds.
- Confirm a canonical mismatch (optional, quota-aware). Only for pages with impressions where
canonicalIsSelfis false orcanonicalUrlis null.- First call
list_url_inspectionswithurlContainsset to the path andlatestPerUrl: true. It spends no quota and returns the storedgoogle_canonicalanduser_canonicalper row; a row whosegoogle_canonical,user_canonicalandinspection_result_linkare all null predates canonical storage. - If nothing is stored, call
get_inspection_quotaand readremaining(Google allows 2,000 inspections per property per day, shared with the app;unavailable: truemeans the counter could not be read and the figures are placeholders, so treat the quota as unknown). Only when plenty remains, callinspect_urlwithinspectionUrlfor at most 3 to 5 pages and comparegoogleCanonical,userCanonicaland the audit'scanonicalUrl. A null canonical means Google did not report one, which is common for unindexed pages. - Stop if a response carries
quotaExhausted: true. For a wider inspection run, hand over to the indexing-health skill.
- First call
Output
Open with one line of scope: pages audited, pages skipped or not audited, the contextRange, and the merged issue counts by severity with indexable versus non-indexable pages. Then present, in this order:
- Issues by severity (
audit_onpage_seo, with the context range): one table, critical first, with columns Severity, Issue (id), Category, Affected pages, Example URL, Fix. Group identical ids across pages into one row and give the fix in one sentence. - Worst pages (top 5 to 10 by
issueCountthenimpressions): URL, impressions, clicks, status code, issue count, the most severe issue. Keep prose for interpretation, not for restating numbers. - Canonical check (only if step 5 ran): URL, declared canonical, Google's canonical, verdict.
- Not yet audited: the URLs still in
notAuditedorskipped, with the reason, if any remain. - Crawl notes: the whitelisting or robots.txt advice from
crawlNoteandrobotsNote, when either is present, since those pages need the user's action before a rerun.
End with a short prioritized list of 3 to 7 concrete recommendations ordered by traffic at stake and effort, each naming the pages and the action. Present every multi-row result as a compact markdown table (top rows only, typically 5 to 10). Do not fabricate rows the tools did not return; if a batch returned no issues, say the pages passed the checks that were run.
Error handling
If any tool call fails with an authentication or subscription error, tell the user to run /mcp to (re)authenticate, and that a GSC Wizard account with an active plan or trial plus a connected Google Search Console account is required. If the property is not found, re-run list_sites and offer the closest matches instead of guessing a URL format. If a single tool fails for another reason, report the gap in the relevant section and complete the rest of the workflow with the remaining data.
Grounding
Every number you report must name the tool it came from and the date range it covers, for example "clicks 12,340 (get_site_summary, 2026-09-21 to 2026-09-27)". For a table, state the tool and date range once on the line above it. If you derive a figure yourself (a delta, a sum, a share), say so and name the tool outputs it was computed from. Never report a number no tool returned.
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.

