country-device
Skill0 starsChanged 22 days agoMITView on GitHub
Analyse a Search Console property's international and device performance with the GSC Wizard MCP tools: per-country and per-device tables for the current and prior window from query_countries and query_devices, market-specific winning and losing pages and queries from filtered query_search_analytics pulls, the property anchor from get_site_summary, and real-user Core Web Vitals per form factor from get_core_web_vitals. Use when the user asks "which countries drive my traffic", "how do I perform in Germany", "mobile vs desktop", "is mobile dropping", "where is my CTR low for the position I hold", or about hreflang, local content or international SEO.
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
- 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
- traffic-forecastSkill
- weekly-reportSkill
- yandex-performanceSkill
The file
We split this skill into the rules it gives an agent
7 rules. About 0 are common, 1 is distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
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 14
Anchor and windows: Call get_site_summary with days: 28, or with startDate/endDate when the user gave dates (a date you pass always wins …
- Very specific: line 15
Read current and previous (clicks, impressions, ctr, avgPosition) and deltas (clicks, impressions, ctrPoints, positionDelta).
- Very specific: line 16
Keep range.startDate/range.endDate and comparison.startDate/comparison.endDate from the response and pass those exact dates to every later …
- Very specific: line 23
Devices: Call query_devices twice the same way (current window, then comparison window).
- Very specific: line 34
Keep to two dimensions: three or more distinct dimensions send the read to the live API, which is slower and capped.
- Distinctive: line 47
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
Country and Device Performance
Build a markets table and a device table for one property, find the gaps (markets where the position is fine but the CTR is low, declines that only mobile shows), and recommend fixes. The user's request may contain a property (a GSC site URL or a recognizable name), a date range, a country (a name or an ISO 3166-1 alpha-3 code), a device, or a URL path to narrow the winners and losers step.
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. - Anchor and windows. Call
get_site_summarywithdays: 28, or withstartDate/endDatewhen the user gave dates (a date you pass always wins anddaysonly sizes an edge you leave out). Use the last 28 days compared with the previous period unless the user specifies dates.- Read
currentandprevious(clicks,impressions,ctr,avgPosition) anddeltas(clicks,impressions,ctrPoints,positionDelta). - Keep
range.startDate/range.endDateandcomparison.startDate/comparison.endDatefrom the response and pass those exact dates to every later call, so all sections line up. - 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.
- Read
- Markets.
query_countriestakes a single date range and no comparison argument, so call it twice: once with the current window and once with the comparison window, withlimit: 25(raise it, or page withoffsetset topagination.nextOffset, when the user wants more markets).- Rows are
countries[]withcountry,clicks,impressions,ctr(0-100) andposition, sorted by clicks. Country codes are lowercase ISO 3166-1 alpha-3 as the tools return them (for exampleusa,gbr,deu); print the country name next to the code and keep the code, in that case, for filters, since anequalsmatch is case-sensitive on both data paths. - Join the two calls by
countryand derive the click, impression, CTR-point and position deltas; say they are derived. Quote property totals fromcoverage.siteTotals, not from summed rows, and give each top market's share of total clicks as a derived figure.
- Rows are
- Devices. Call
query_devicestwice the same way (current window, then comparison window). Rows aredevices[]withdevice(DESKTOP,MOBILE,TABLET),clicks,impressions,ctrandposition.- Join by
device, derive the deltas and the mobile share of clicks. - A mobile-only decline is mobile clicks down while desktop is flat or up. Check whether mobile
positionworsened (a ranking problem, often page experience or mobile content parity) or only mobilectrfell (a SERP-layout or snippet problem).
- Join by
- CTR gaps. For each of the top 5 to 10 markets, compare its
ctrandpositionwith the property anchor from step 2 and with the best-performing market at a similar position. Apply the same comparison toMOBILEversusDESKTOP.- A market whose position is within about one place of a comparable market but whose CTR is clearly lower is a CTR gap. The usual causes are a page in the wrong language ranking there, titles and snippets written for another market, missing or conflicting hreflang, or local competitors with richer results.
- Report no gap where the numbers do not show one; a low CTR at position 15 is a ranking problem, not a CTR gap.
- Market-specific winners and losers. For each market the user cares about (or the top 3 by clicks plus the market with the largest negative delta), call
query_search_analyticswithdimensions: ["page"],rowLimit: 50andfilters: [{ "dimension": "country", "operator": "equals", "expression": "<lowercase alpha-3 code>" }], once per window; join bykeys[0](the page) and rank the page deltas.- To see which page ranks where across markets in one pull, call it with
dimensions: ["country", "page"]androwLimit: 500(rows carrykeys: [country, page]). A market served mainly by a page written for another market is the hreflang or local-content signal to report. - For devices, call it with
dimensions: ["device", "query"]androwLimit: 500for both windows, or filter with{ "dimension": "device", "operator": "equals", "expression": "MOBILE" }anddimensions: ["query"]; the device expression is uppercase, asquery_devicesreturns it. - Keep to two dimensions: three or more distinct dimensions send the read to the live API, which is slower and capped. Rows carry
clicks,impressions,ctr(0-100) andposition; derive every delta you present.
- To see which page ranks where across markets in one pull, call it with
- Core Web Vitals per form factor.
get_core_web_vitalsmeasures one device class per call (formFactor:ALLby default, orPHONE,DESKTOP,TABLET), so call it withformFactor: "PHONE"and again withformFactor: "DESKTOP", and optionally withurlset to the biggest mobile losing page from step 6.- Read
metrics[](label,coreWebVital,latestP75Formatted,latestRating,p75Series,goodDensitySeries),periods(oldest first, so the last entry is the latest week) andregressions. Whenregressionsis empty,methodLimitsexplains that only a rating-band change between the two latest weeks is listed, so readp75Seriesfor a slower drift. - A
notConfigured: trueresponse means the Chrome UX Report connection is not set up in the app; say so and skip page experience rather than guessing. AnoData: trueresponse means CrUX holds too little real-world Chrome traffic for that target and form factor; quote itsmessageand run the wider call itsnextStepnames if present. - A poor or regressing mobile vital next to a mobile-only decline from step 4 is a probable cause; without the decline it is a watch item.
- Read
Interpretation rules
ctrvalues are already percentages on a 0-100 scale. Never multiply them by 100.coverage.hiddenClicksShareand the CrUXgoodDensitySeriesare 0-1 fractions, so multiply those by 100 to present them.position: lower is better. A change toward a lower number is an improvement; never color it as a decline.- Judge by clicks and impressions at stake, not by percentage alone: a 30% drop on a 40-click tablet row matters less than a 4% drop on the mobile row.
- 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 market or device is absent from a window, say so instead of filling in a zero.
Output
Present, in this order:
- Anchor: one sentence with the window, the comparison window and the four property metrics with their deltas (
get_site_summary). Markets table (
query_countries, both windows):Code Country Clicks Prior clicks Delta Impressions CTR Position Pos. delta Share of clicks Device table (
query_devices, both windows):Device Clicks Prior clicks Delta Impressions CTR Position Pos. delta Share of clicks - Gaps: a short list naming each market or device gap with the evidence (the two numbers compared and the tools they came from): CTR gaps at a fine position, mobile-only declines, wrong-market pages ranking, and the Core Web Vitals verdict per form factor with any regression.
- Winners and losers per market (
query_search_analytics): one small table per market covered, with page, clicks, prior clicks, delta and position. - End with a short prioritized list of 3 to 7 concrete recommendations, each naming the market or device and the pages or queries to act on: add or fix hreflang where another market's page ranks, write or localise content for a market with impressions but weak CTR, rewrite titles and snippets for a CTR gap, fix the regressing mobile vital or the mobile content gap, and what to re-check next period.
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.

