← GSC Wizard - SEO analysisCONTENT HISTORY
WHAT CHANGED
Update to GSC Wizard - SEO analysis
Snapshot Oct 28, 2026 · 12:05 UTC · version 3.0.5
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save GSC Wizard - SEO analysis and check future changes in Following.
Up to 3 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "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.",
"included_files": [],
"name": "onpage-audit",
"skill_md_contents": "---\nname: onpage-audit\ndescription: 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.\n---\n\n# On-Page Audit\n\nCrawl 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.\n\n## Workflow\n\n1. **Resolve the property.** If the user's request or the conversation names a property, use it. Site URLs use GSC formats: `sc-domain:example.com` or `https://www.example.com/`. Otherwise call `list_sites` and pick the obvious match. If several plausible properties exist, ask the user which one before continuing.\n - The property also bounds the crawl: `audit_onpage_seo` fetches 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 in `skipped` with a reason, so a URL on another host needs its own property.\n\n2. **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.\n - The user named URLs: use them as given, at most 25 per call (the `urls` cap).\n - \"My top pages\" or no hint: call `query_top_pages` with the `siteUrl` and `limit: 25`, omitting `startDate` and `endDate` for the last 28 settled days, and take the `page` values. Rows are sorted by clicks, highest first; `ctr` is a 0-100 percentage, never multiply it by 100; `position` is lower-is-better. GSC data lags about 2 to 3 days, so the window ends before today.\n - 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 `minImpressions` (default 0, counted over the same 28 days).\n - A sitemap or a section: call `get_sitemap_performance` with `sitemapUrl` (on the property host; one level of sitemap-index expansion) and `maxUrls` (default 500, max 2000). Audit the URLs with clicks or impressions first.\n - 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.\n\n3. **Run the audit in batches.** Call `audit_onpage_seo` with `siteUrl` and `urls` (up to 25).\n - 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 `truncated` is true, the URLs in `notAudited` were not fetched: call again with `urls` set to that list and repeat until `notAudited` is empty.\n - 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` (lower `crawlMaxConcurrency`, raise `crawlMinDelayMs`) once the user confirms the change; a read-only connection refuses it.\n - Read `auditedCount`, `skipped`, `contextRange` (the 28-day window behind `impressions` and `clicks`) and `summary`: `total_pages`, `total_issues`, `by_severity` (critical, high, medium, low, info), `indexable_pages`, `non_indexable_pages`. `summary` covers one call, so merge the batches yourself before reporting totals and say so.\n - Read `pages[]`, sorted by `issueCount` descending then `impressions`. Crawl fields per page: `statusCode`, `redirected`, `redirectChain`, `responseTimeMs`, `bodyBytes`, `impressions`, `clicks`.\n - 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`.\n - Each entry in `issues[]` has `id`, `category`, `severity` and `message`; `issueCount` is the length of that list and the primary sort key.\n - `crawlNote`: some pages answered a blocked-looking status because a bot rule rejects the crawler; relay the whitelisting advice instead of reporting broken pages.\n - `robotsNote`: robots.txt disallows GSCWizard-Bot, so those pages were not fetched and carry the `blocked-by-robots` issue.\n - `metricsUnavailable` with `contextNote`: `impressions` and `clicks` are null, meaning unknown, not 0; the on-page checks still stand.\n - If `pages` is empty, read `emptyBecause` and do what `nextStep` says.\n\n4. **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.\n\n| Category | Issue ids | What it means and the usual fix |\n|---|---|---|\n| 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 |\n| 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 |\n| canonical | `missing-canonical` (medium), `canonicalised` (medium with impressions, else low) | The page points elsewhere or nowhere; make the preferred URL self-canonical, consolidate duplicates |\n| 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` |\n| headings, content | `missing-h1` (high), `multiple-h1` (low), `thin-content` (medium under 100 words, else low) | One descriptive H1; expand or merge thin pages |\n| 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 |\n| 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 |\n\n 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.\n\n5. **Confirm a canonical mismatch (optional, quota-aware).** Only for pages with impressions where `canonicalIsSelf` is false or `canonicalUrl` is null.\n - First call `list_url_inspections` with `urlContains` set to the path and `latestPerUrl: true`. It spends no quota and returns the stored `google_canonical` and `user_canonical` per row; a row whose `google_canonical`, `user_canonical` and `inspection_result_link` are all null predates canonical storage.\n - If nothing is stored, call `get_inspection_quota` and read `remaining` (Google allows 2,000 inspections per property per day, shared with the app; `unavailable: true` means the counter could not be read and the figures are placeholders, so treat the quota as unknown). Only when plenty remains, call `inspect_url` with `inspectionUrl` for at most 3 to 5 pages and compare `googleCanonical`, `userCanonical` and the audit's `canonicalUrl`. A null canonical means Google did not report one, which is common for unindexed pages.\n - Stop if a response carries `quotaExhausted: true`. For a wider inspection run, hand over to the indexing-health skill.\n\n## Output\n\nOpen 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:\n\n1. **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.\n2. **Worst pages** (top 5 to 10 by `issueCount` then `impressions`): URL, impressions, clicks, status code, issue count, the most severe issue. Keep prose for interpretation, not for restating numbers.\n3. **Canonical check** (only if step 5 ran): URL, declared canonical, Google's canonical, verdict.\n4. **Not yet audited**: the URLs still in `notAudited` or `skipped`, with the reason, if any remain.\n5. **Crawl notes**: the whitelisting or robots.txt advice from `crawlNote` and `robotsNote`, when either is present, since those pages need the user's action before a rerun.\n\nEnd 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.\n\n## Error handling\n\nIf any tool call fails with an authentication or subscription error, tell the user to reconnect the GSC Wizard app from their app or connector settings, 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.\n\n## Grounding\n\nEvery 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.\n"
}SHA-256 of public snapshot: 8c0b49aebb7172a61fd041f3ae1ad257856a69b9bd333e8745155358009a3e3c