traffic-drop
Skill0 starsChanged 21 days agoMITView on GitHub
Diagnose why organic traffic dropped on one Search Console property using the GSC Wizard MCP tools. Dates the break with the change-point and anomaly detectors, sizes it with before and after windows, then tests causes in order: Google ranking updates, logged site changes, query and page ranking losses, position-band shifts, device or country segments, reporting artefacts, and deindexed tracked pages. Ends with the most probable cause, a runner-up, what the evidence rules out, and an optional annotation. Use when the user asks "why did my traffic drop", "clicks fell last week", "did the Google update hit me", "lost rankings", "traffic down since", or "what happened on" a date.
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
- ranking-changesSkill
- shopping-performanceSkill
- site-auditSkill
- sitemap-auditSkill
- site-migrationSkill
- traffic-forecastSkill
- weekly-reportSkill
- yandex-performanceSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 0 are distinctive, and 9 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.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 14
Date the break: Call detect_change_points with metric: "clicks" and days: 180 (14 to 480).
- Very specific: line 16
If count is 0, read emptyBecause and nextStep before saying anything, then trendSummary (firstWindow, lastWindow, ratio, slopePerDay, …
- Very specific: line 17
Run the same call with metric: "impressions".
- Very specific: line 19
Single-day view: Call detect_anomalies with metric: "clicks" and days: 90 (minimum 21.
- Very specific: line 20
Read anomalies (date, actual, expected, deviationPercent, severity, direction) and keep the down entries around the break.
- Very specific: line 21
Check coverage.zeroFilledDays and coverage.trailingGap: days without rows count as zero, so a run of zero days is a data gap or a …
- Very specific: line 24
Size the drop: Call get_site_summary with startDate set to the break date and endDate set to the latest settled date (both explicit, so the …
- Very specific: line 27
If get_filter_options shows branded keywords configured, repeat with brand: "non_branded": a drop confined to branded queries is brand …
- Very specific: line 29
Test the causes in this order: Keep the two windows from step 4 (before = the previous window, after = the current window) in every call so …
≈ “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
Traffic Drop Diagnosis
Answer "why did my organic traffic drop?" for one Search Console property: date the break, size it, test the usual causes in a fixed order, and name the most probable one with the evidence for and against it. The user's request may contain a property, the date or period the user noticed the drop ("since mid-September"), a metric (clicks or impressions), and a focus hint such as a country, a device or a site section; honor each by narrowing the windows and the segment checks.
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. GSC data lags about 2 to 3 days: 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. - Date the break. Call
detect_change_pointswithmetric: "clicks"anddays: 180(14 to 480). When the user names a period, passstartDateandendDateinstead;startDateoverridesdays. Read the response in this order:changePoints: each entry carriesdate,direction,beforeMean,afterMeanandchangePercent(the means coverwindowDaysdays either side of the break;segmentMeanBeforeandsegmentMeanAftercover the whole segments). Take the latest entry withdirection: "down", or the one nearest the date the user complained about, as the break date.- If
countis 0, reademptyBecauseandnextStepbefore saying anything, thentrendSummary(firstWindow,lastWindow,ratio,slopePerDay,direction,halfwayDate). A gradual slide has no step: report it as a trend dated byhalfwayDate, and lowersensitivity(1 to 5, default 2) only whennextStepsuggests it. - Run the same call with
metric: "impressions". A break in both metrics is a visibility loss; a break in clicks alone while impressions hold is a CTR loss (titles, a SERP feature, a layout change), which rankings alone will not explain.
- Single-day view. Call
detect_anomalieswithmetric: "clicks"anddays: 90(minimum 21;sensitivity2 to 6, default 3.5).- Read
anomalies(date,actual,expected,deviationPercent,severity,direction) and keep thedownentries around the break;severityrunscritical,high,medium,low,info. - Check
coverage.zeroFilledDaysandcoverage.trailingGap: days without rows count as zero, so a run of zero days is a data gap or a deindexing, not a demand change. - A single-day anomaly with no change point is an event (an outage, a holiday), not a drop; say so and stop the cause hunt early unless the user disagrees.
- Read
- Size the drop. Call
get_site_summarywithstartDateset to the break date andendDateset to the latest settled date (both explicit, so the window is reproducible).- The response holds
currentandpreviousblocks withclicks,impressions,ctrandavgPosition;previousis the same-length window immediately before, which is the baseline. Derive the deltas yourself and say so. - Fewer than 7 days after the break makes the sizing provisional; say that too.
- If
get_filter_optionsshows branded keywords configured, repeat withbrand: "non_branded": a drop confined to branded queries is brand demand, not ranking.
- The response holds
- Test the causes in this order. Keep the two windows from step 4 (before = the
previouswindow, after = thecurrentwindow) in every call so the evidence lines up.- Google updates.
list_algo_updateswithstartDate14 days before the break andendDate14 days after. An entry inupdates(name,beginISO,endISO,severity) whose rollout overlaps the break supports an algorithmic cause only when the ranking test below also shows broad losses. An empty list is not proof that nothing changed: only confirmed updates are listed. - Logged site changes.
list_annotationswithsiteUrl,startDate14 days before andendDate7 days after the break. A deploy, migration, template, robots or canonical change on or just before the break date is the strongest single lead. - Ranking losses.
get_ranking_changeswithdimension: "query",startDate/endDateset to the after window,comparisonStartDate/comparisonEndDateset to the before window,limit: 50(per bucket, max 10000). Readdeclinedandlost; rows carrykey,clicks,prevClicks,position,prevPositionandpositionDelta(prevPosition minus position, so a negative value is a worse rank), andcountsgives the full bucket sizes. Repeat withdimension: "page". - Band shift.
get_position_distributionwithgranularity: "period"anddimension: "query", once per window. CompareimpressionShareandrowsper band (label1-3, 4-10, 11-20, 21+). - Segment-only drop.
query_devices(it takes no limit and returns at most the three devices) andquery_countrieswithlimit: 20, each once per window;devicesandcountriesrows carrydeviceorcountry,clicks,impressions,ctr,position. Compare each segment's share of the loss with its share of the baseline. - Reporting artefacts.
analyze_sampling_impactonce per window.totalsis the ground truth;querySampling.gap.anonymisedShareis a 0-1 fraction andmissingClicksPercentstays on a 0-100 scale. - Deindexing.
get_indexing_trackerfirst; whentrackeris null, say no tracker exists and skip. Otherwiseget_indexing_tracker_reportwithdayscovering the break (default 30, max 90) and readlostPagesTotal,lostPages(url,changedAt,coverageState) andcoverageBreakdown.
- Google updates.
- Decide. Rank the causes by how much of the sized loss each explains, using the cause map below. Weight by clicks at stake, not by percentages: a cause that explains the top page's loss outranks one that explains ten small queries.
Cause map
| Evidence pattern | Reads as |
| Many queries down a few positions across many pages, update rollout overlapping the break | Google update (algorithmic) |
| A few pages lose most of the clicks, their queries fall or vanish, no update overlap | Page-level: content, canonical or template change on those pages |
| Annotation on or just before the break date | Site change; confirm against the page and query losers |
| Impression share leaves 1-3 and 4-10 for deeper bands | Ranking loss |
Band shares unchanged while totals.impressions fell | Lost demand (seasonality) or lost indexing |
| Clicks break, impressions and position hold | CTR loss: titles, a SERP feature, a layout change |
| One device or one country carries the whole loss, the rest flat | Local cause: mobile template, market SERP feature, geo-targeting or hreflang |
anonymisedShare rises while totals.clicks holds | Reporting artefact: query tables lost rows, the site did not |
lostPages dated at the break match the page decliners | Deindexing; the indexing-health skill owns the fix |
Output
- Dated finding: one sentence with the break date, the metric,
beforeMean,afterMeanandchangePercent(detect_change_points), or the trend when no step was found, plus the worst single day fromdetect_anomalies. - Size: a two-row table of the before and after windows from
get_site_summary(clicks, impressions, CTR, average position, derived delta).ctrvalues are already percentages on a 0-100 scale; never multiply them by 100.position: lower is better, so a change toward a lower number is an improvement; never color it as a decline. Cause tests: one table with a row per cause and three columns:
Cause Evidence (tool, dates, numbers) Verdict Verdicts are supported, ruled out or inconclusive. Below it, the top 5 declined queries and the top 5 declined pages. 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 tool returned nothing, say so.
- Verdict: the most probable cause, the runner-up, and what the evidence rules out, each in one or two flowing sentences. Say when the evidence is inconclusive rather than forcing a story.
- Log it (optional): offer to record the finding with
create_annotation(siteUrl,eventDateset to the break date,labelup to 200 characters, optionaldescriptionup to 1000 andcategory). Show the exact fields and ask the user to confirm before calling; the call writes a chart marker and changes nothing else. If it is refused because the connection is read-only, say this step needs write access and leave it there. - End with a short prioritized list of 3 to 7 concrete recommendations, each naming the pages or queries to act on. For a slow slide rather than a step, point to the content-decay skill; for pages trading places on the same queries, to the cannibalization skill; for lost pages, to indexing-health.
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.

