traffic-forecast
Skill0 starsChanged 22 days agoMITView on GitHub
Project future clicks or impressions for a Search Console property with the GSC Wizard MCP tools and put the projection in a seasonal context: the seasonal-decomposition forecast with its auto-selected trendline (optionally a growth target, and a conversion rate plus order value for revenue), the same window last year, the monthly seasonal shape, a level-shift check on the history, and logged or planned changes. Use when the user asks "forecast my traffic", "how many clicks next quarter", "project organic traffic for next year", "what does seasonality look like", "set a realistic traffic target", or "estimate revenue from organic growth".
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-dropSkill
- 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 16
Check whether the history is representative: Call detect_change_points with metric set to the metric being forecast and days: 180.
- Very specific: line 19
When beforeMean is 0, changePercent is 0 by convention and the shift is traffic from zero, not "no change".
- Very specific: line 22
Run the forecast: Call forecast_traffic with:
- Very specific: line 33
When r2 is below about 0.5, or the second candidate's r2 is close to the first, re-run once with trendlineType forced to that second model …
- Very specific: line 37
Year-over-year context: Call get_site_summary twice with explicit startDate and endDate:
- Very specific: line 42
Seasonal shape: Call get_decay_overview with dimension: "page", granularity: "month", metric set to the forecast metric, the default …
- Very specific: line 45
Treat any month in incompletePeriods as unread, not as zero.
- Very specific: line 47
Planned and past changes: Call list_annotations with the property's siteUrl and a startDate one year back.
≈ “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 Forecast
Project future clicks or impressions for one property, place the projection next to last year's numbers and the seasonal shape, and say what has to change to beat the baseline. Every projected figure is an estimate and is labelled as one. The user's request may contain a property, the metric (clicks or impressions), a horizon ("next quarter", "12 months"), a growth target, a conversion rate and average order value for a revenue view, or the window to compare year over year.
Steps
- Resolve the property and the inputs. 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. Then translate the horizon intogranularityandforecastPeriods:- "next quarter" is
weeklywith 13 periods, "six months"weeklywith 26 (the default), "next year"monthlywith 12. - Weekly needs about 105 days of history (13 complete weeks) and monthly about 240 days (6 complete months), because the first and last period of the window are dropped as partial.
- "next quarter" is
- Check whether the history is representative. Call
detect_change_pointswithmetricset to the metric being forecast anddays: 180; raise it to480to cover the forecast's full default history (the window must stay between 14 and 480 days). Read:changePoints: each break carriesdate,direction,changePercent, andbeforeMean/afterMean, which are window means overwindowDaysdays either side of the break, not whole-period means (segmentMeanBefore/segmentMeanAftercover the full segments).- A break dated inside the last 90 days means the series moved to a new level recently and the trendline will blend the old level with the new one. Say so, and offer to shorten
historyDaysto the days since the break, never below 90 and never below what the granularity needs. - When
beforeMeanis 0,changePercentis 0 by convention and the shift is traffic from zero, not "no change". - With
count0,trendSummarystill carries the overall movement (firstMean14d,lastMean14d,ratio,slopePerDay,direction,halfwayDate); reademptyBecauseandnextStepbefore calling the traffic stable.
- Run the forecast. Call
forecast_trafficwith:siteUrl,metric(clicksorimpressions, default clicks),granularity(weeklyormonthly) andforecastPeriods(1 to 104, default 26).historyDays: the default 480 (90 to 1000; more history improves the seasonal indices) unless step 2 argued for a shorter fit.trendlineTypeleft onauto, which picks the best R-squared amonglinear,polynomial,logarithmic,exponentialandpower.growthRateonly when the user named a target: a decimal per forecast period, compounded by default (compoundGrowth: true), so 0.05 on a weekly forecast means +5% every week. Convert a yearly target first (a 20% yearly goal is about 0.0035 per week or 0.0153 per month) and state the conversion.additionalSessionsfor a flat amount added to every period (a planned content batch, for example).cvr(a decimal: 0.025 is 2.5%) andaov(in currency units) for a revenue view: together they addbaselineRevenueandgrowthRevenueto every row, labelled withcurrency(display only, default USD). Both must be above 0 or no revenue fields appear.- If the call fails with "Not enough history", report the complete periods it found, then restore the default
historyDaysif step 2 shortened it, switch to weekly granularity, or tell the user the property does not have enough data yet; the minimum of 13 weeks or 6 months cannot be lowered.
- Read the forecast. The response holds
historyRange,historicalPeriods,trendline(type,r2,equation),candidateTrendlines(every fitted model with itsr2, best first),seasonalIndices, andforecastrows withperiod(YYYY-WwworYYYY-MM),baselineSessions,growthSessionsand the revenue fields when requested. "Sessions" is the model's name for whichever metric was forecast.- The tool reports no confidence interval. The uncertainty it does report is
r2(how much of the history the trendline explains) and the spread between the candidate models. - When
r2is below about 0.5, or the second candidate'sr2is close to the first, re-run once withtrendlineTypeforced to that second model and present the two baselines as a range. - Quote
forecastNotewhen present (the model fell back, for example a flat forecast from a constant history), andsettledThroughordataMaturityso the reader knows where settled data ends. - 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 history, say it is likely reporting lag, not a real drop.
- The tool reports no confidence interval. The uncertainty it does report is
- Year-over-year context. Call
get_site_summarytwice with explicitstartDateandendDate:- once for the latest 28 settled days (or the window the user named), and once for the same dates 364 days earlier so weekdays line up;
- each call returns
currentandprevious(clicks,impressions,ctr,avgPosition) plusdeltasagainst the period immediately before the window. Compute the year-over-year change yourself from the twocurrentblocks and say so; thedeltasare the recent trend, not the year-over-year figure. ctrvalues are already percentages on a 0-100 scale; never multiply them by 100.position: lower is better, and a change toward a lower number is an improvement.
- Seasonal shape. Call
get_decay_overviewwithdimension: "page",granularity: "month",metricset to the forecast metric, the defaultmonths: 16andlimit: 10. Do not leavedimensionon its defaultquery: those rows and totals cover only the queries Google lists, not the whole site.periodslists the complete months,totals.perPeriod(when present) the per-month total over every page row read, the nearest figure to a property total here, and each row'svaluesarray is aligned toperiods.- Name the peak and trough months and check that the forecast's high and low periods fall where last year's did; if they do not, the seasonal indices were fitted on too little history and the forecast deserves a wider caveat.
- Treat any month in
incompletePeriodsas unread, not as zero.
- Planned and past changes. Call
list_annotationswith the property'ssiteUrland astartDateone year back; leaveendDateout so future-dated entries come back too.- A past change (a migration, a redesign, a content purge) explains a break from step 2 and says whether the old level is coming back.
- A planned one (a launch, a campaign, a seasonal promotion) is a reason the baseline will be beaten or missed and belongs in the recommendations.
Output
Present these sections in order, with "estimate" in the heading of every projected figure:
- Forecast table: one row per period from
forecast_traffic(period, baseline estimate, estimate with growth, revenue when requested), the chosen trendline with its R-squared, the range from the second model when step 4 produced one, and the history range the fit used. - Year-over-year context: the two
get_site_summarywindows side by side with the derived change, plus each window's own prior-period trend. - Seasonal shape: a short table of the monthly totals from
get_decay_overviewwith the peak and trough months named, and whether the forecast follows that shape. - Caveats, each in one sentence where it applies:
- a level shift from step 2 and how the fit was shortened, or why it was not;
- a low R-squared, a short history, a
forecastNote, or months inincompletePeriods; - the reporting lag, and that the projection extends the past and cannot see a future algorithm update or a site change.
- End with a short prioritized list of 3 to 7 concrete recommendations: what has to happen to beat the baseline (content ready before the peak months, decaying pages to refresh before the season turns, a growth target restated per period). Offer to log a planned change with
create_annotation, showing the exacteventDateandlabeland running it only after the user confirms; if the write is refused because the connection is read-only, say that this step needs write access. For a full decay triage point the user to the content-decay skill; for the broader health picture, the site-audit skill.
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. Weight the recommendations by the clicks and impressions at stake, not by percentages alone. Do not fabricate rows the tools did not return.
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.

