ranking-changes
Skill0 starsChanged 21 days agoMITView on GitHub
Compare search rankings between any two periods for one Search Console property with the GSC Wizard MCP tools: new, lost, improved and declined queries and pages, movement between position bands, daily drill-downs on the top movers in each direction, and the Google updates or logged site changes that explain them. The user picks both windows, from last week against the week before to this quarter against the same quarter last year. Use when the user asks "what moved up or down", "winners and losers", "which keywords dropped", "ranking changes since", "compare this month with last month", or "year over year rankings".
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
- onpage-auditSkill
- page-deep-diveSkill
- portfolio-overviewSkill
- property-setupSkill
- query-deep-diveSkill
- quick-winsSkill
- 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
6 rules. About 0 are common, 0 are distinctive, and 6 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.
6
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 20
Query movers: Call get_ranking_changes with dimension: "query", the four dates from step 2, and limit: 50 (per bucket, 1 to 10000.
- Very specific: line 21
Read counts for the full size of each bucket, then the buckets new, lost, improved and declined.
- Very specific: line 30
Band movement: Call get_position_distribution twice with granularity: "period" and dimension: "query": once with the current window as …
- Very specific: line 33
If truncated is true on the live API path, raise scanLimit (1000 to 200000) and say the deep bands were understated.
- Very specific: line 51
Do not fabricate rows the tools did not return.
≈ “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
Ranking Changes
Report the winners and losers between two periods on one property and explain the biggest moves. Unlike the weekly-report skill, which is a fixed digest over the last settled week, this skill lets the user choose both windows, including year over year. The user's request may contain a property, the two periods in any phrasing ("September vs August", "last 14 days vs the 14 before", "Q3 2026 vs Q3 2025"), a dimension to lead with (queries or pages), a search type, and a focus hint such as a country or a section; honor each.
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. - Fix the two windows. The default is the last 28 settled days compared with the previous 28, which is what the tools use when all four date fields are omitted. Otherwise:
- Translate the user's phrasing into
startDate/endDate(the current window) andcomparisonStartDate/comparisonEndDate(the baseline) as YYYY-MM-DD, and keep both windows the same length. - Keep the newest 2 days out of the current window: GSC data lags about 2 to 3 days, so never treat the most recent 2 days as complete, and if a dip appears at the very edge of the range, say it is likely reporting lag, not a real drop.
- For year over year, use the same calendar dates one year earlier; on a site with a weekly rhythm shift by 364 days rather than 365 so the weekdays line up.
- State both windows on the first line of the output. If
get_position_distributionanswers the baseline window withemptyBecause, orget_ranking_changesfiles nearly every key asnewwith an emptylostbucket (its ownemptyBecauseappears only when both periods are empty), the stored history does not reach that far; say so instead of guessing.
- Translate the user's phrasing into
- Query movers. Call
get_ranking_changeswithdimension: "query", the four dates from step 2, andlimit: 50(per bucket, 1 to 10000; raise it to 200 on a large property). PasssearchTypeonly when the user asked for image, video or news; the default is web.- Read
countsfor the full size of each bucket, then the bucketsnew,lost,improvedanddeclined. - Each row carries
key,clicks,impressions,ctr,position,prevClicks,prevImpressions,prevPositionandpositionDelta(prevPosition minus position: positive is an improvement, negative a decline; a new or lost key's missing side reads 0). improvedanddeclinedarrive sorted by the size of the position move,newbyclicksandlostbyprevClicks; re-rank improved and declined by click impact (clicksfor improved,prevClicksfor declined) before choosing the rows to show.- Note
dataSource: on the live API a key just below the scan cut can show as new or lost, so treat small new and lost rows there with care.
- Read
- Page movers. Repeat the call with
dimension: "page".- Match page losers against query losers: a page that lost its top queries is the unit to fix.
- A query that moved although its page held means another page on the site took it over, which is the cannibalization skill's job; a page that is new while its queries are not points to a URL change, so check for a migration before calling it a win.
- Band movement. Call
get_position_distributiontwice withgranularity: "period"anddimension: "query": once with the current window asstartDate/endDate, once with the baseline.- Compare
bucketsbylabel(1-3, 4-10, 11-20, 21+) onrows,impressions,clicksandimpressionShare; derive the share deltas yourself and say so. - When the move built up over the window rather than landing on one day, call it once more with
granularity: "daily"over the current window and readdays, one row per date with the count of distinct queries per band, to see the day the counts shifted. - If
truncatedis true on the live API path, raisescanLimit(1000 to 200000) and say the deep bands were understated.
- Compare
- Drill into the top three movers each way. For the three largest gainers and the three largest losers by click impact, pull the daily series across both windows:
get_query_performancewithquery,startDateset to the baseline start andendDateto the current end (addpageUrlwhen the user wants the query on one URL) returnsdailyrows.get_page_performancewithpageUrland the same dates does the same for a page.- Read each series for its shape: a step on one date (look for a cause on that date), a slow slide (content decay; point to the content-decay skill), or a swing that reversed inside the window (volatility, not a trend). Say whether the move still holds in the last 7 settled days.
- Explain. Pull the events that span both windows:
list_annotationswithsiteUrl,startDateset to the baseline start andendDateto the current end, for logged site changes.list_algo_updateswith the same dates, for Google ranking updates (updatesrows carryname,beginISO,endISO,severity); an empty list is not proof that nothing changed, since only confirmed updates are listed.- Tie each top mover to an event on or just before its step date where the dates line up, and say plainly when nothing does. A year-over-year span covers many updates, so name only those overlapping the step dates found in step 6.
Interpretation rules
ctrvalues are already percentages on a 0-100 scale. Never multiply them by 100.position: lower is better. A change toward a lower number is an improvement; never color it as a decline.positionDeltaalready has the sign the right way round: positive means improved.- Judge by clicks and impressions at stake, not by percentage or position change alone: a query falling from 2 to 5 on 3,000 clicks outranks one falling from 40 to 80 on 10.
- Present every multi-row result as a compact markdown table (top rows only, typically 5 to 10); keep prose for interpretation, not for restating numbers.
- Do not fabricate rows the tools did not return. If a bucket is empty, say so, and quote the tool's
emptyBecausewhen it gives one.
Output
State both windows and the lead dimension on the first line, then present, in this order:
Four compact tables, one per bucket in the order improved, declined, new, lost. Each holds the top 5 queries followed by the top 5 pages for that bucket, and the bucket's
countsvalue sits above it so the reader sees how many rows it really holds:Key Clicks (current) Clicks (baseline) Position (current) Position (baseline) positionDelta Band movement: a four-row table (1-3, 4-10, 11-20, 21+) with rows, impressions and impression share for both windows and the derived delta, plus one sentence on what the shift means (share leaving 1-3 is lost visibility on winning terms; rows entering 11-20 from 21+ are terms within reach):
Band Rows (current) Rows (baseline) Impressions (current) Impressions (baseline) Share (current) Share (baseline) Share delta - Drill-downs: for each of the six movers, two or three flowing sentences on the shape of the daily series, when it moved, whether it still holds, and the matched update or annotation if any.
- Recommendations: a short prioritized list of 3 to 7 concrete items, each naming the query or page and the action, for example refresh the page that slid, consolidate the two pages trading one query, strengthen a page that reached 4-10 and can take 1-3, or rewrite titles where position held but clicks fell.
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.

