site-migration
Skill0 starsChanged 21 days agoMITView on GitHub
Check a site migration (a domain move, an HTTP to HTTPS switch, a URL restructure) before and after go-live with the migration tools of the GSC Wizard MCP server: the saved migrations, the health check around go-live (recovery, pace, momentum, projected milestones, URL success, a 0-100 risk score), the before-versus-after query and page winners and losers, the saved old-to-new redirect mappings, a quota-aware inspection of the worst new URLs, and a go-live annotation. Use when the user asks "how is the migration going", "did the site lose traffic after the domain move", "check my redirects", "which old URLs are not recovering", or wants a pre-launch baseline.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- afeezadebayo/technical-seo-skillstheir own version, first seen Oct 20, 2026
- textura-agency/next16-claude-startertheir own version, first seen Oct 14, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- textura-agency/next16-claude-starter★ 141same name
- afeezadebayo/technical-seo-skills★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
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
- 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 17
Saved migrations: Call list_migrations (no arguments).
- Very specific: line 22
Health check: Call get_migration_health with siteUrl set to the OLD property (side A) and either migrationId (its saved setup fills in …
- Very specific: line 34
Read summary.A and summary.B (totalClicks, totalImpressions, avgCtr, avgPosition), recoveryPct with recoveryNote (null under 10 baseline …
- Very specific: line 40
Redirect mappings: Call list_migration_redirects with summaryOnly: true first (one row per pair and label: siteUrlA, siteUrlB, label, …
- Distinctive: line 44
If a write is refused because the connection is read-only, say that this step needs write access and continue with the read-only parts.
- Very specific: line 46
Inspect the worst new URLs (optional, quota-aware): Call get_inspection_quota for the NEW property first and read remaining of limit (2,000 …
- Very specific: line 48
Read per result verdict, coverageState, indexingState, lastCrawlTime, googleCanonical against userCanonical (null means Google did not …
≈ “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
Site Migration Check
Read out a site migration before or after go-live: how much of the old traffic the new setup has recovered, where the losses sit, which old URLs are unmapped or failing, and what to fix first. The user's request may contain the old and new property, a go-live date, a saved migration name, a mapping label, a URL prefix or regex pair for a move inside one property, or a focus such as "redirects" or "losers".
Steps
- Resolve the properties. 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. A migration has two sides:- for a domain move, side A is the old property and side B the new one, and both must be in
list_sites; - for a protocol switch or a URL restructure inside one property, both sides are the same property split by a URL prefix or a regex;
- the go-live date is required: ask for it when neither the user's request nor a saved migration supplies one, because
get_migration_healthrefuses to run without agoLiveDateor amigrationIdthat carries one.
- for a domain move, side A is the old property and side B the new one, and both must be in
- Saved migrations. Call
list_migrations(no arguments).- Each entry carries
id,name,mode(cross-property,two-urlsorregex),siteUrlA,siteUrlB,urlPrefixA/urlPrefixBorregexA/regexB,goLiveDate,windowStrategy,windowDays,yoyBaseline,mappingLabel,alertsEnabled,lastCheckedAtandlastHealth(the daily re-check's last status, recovery, risk score and problem counts). - Pick the one the user means, or ask when several match.
- An empty list carries
emptyBecause(saved migrations are not available on the account, or none are saved) andnextStep; continue with explicit arguments, since nothing needs to be saved to run the analysis.
- Each entry carries
- Health check. Call
get_migration_healthwithsiteUrlset to the OLD property (side A) and eithermigrationId(its saved setup fills in everything the arguments leave out) orsiteUrlBplusgoLiveDate.- Without a
migrationIdthe tool always runs in cross-property mode, and omittingsiteUrlBreads one property joined by path. The prefix or regex split of a move inside one property comes only from a saved migration, so without one usecompare_migration(step 4) for that case. - Options:
windowStrategyrecent(default: the lastwindowDaysdays against thewindowDaysdays before go-live),from-go-live(the firstwindowDaysdays after launch, dip included) orfull(the 90 days before against every day since);windowDays1 to 365 (default 28);yoyBaseline: trueto compare with the same weeks a year earlier when the migration straddles a seasonal turn;mappingLabelto narrow the redirect mappings (__none__means unlabelled only);onlyMapped: trueto count only the pages the mappings claim. health:status,headline,recoveryPct(new clicks per day as a share of the old),baselineClicksPerDay,currentClicksPerDay,daysSinceGoLive,stage,pace(status,expectedPct,ratioagainst the stage's expected recovery),momentum(status,changePct,last7,prior7),projection(the recovery milestones),urlSuccess(units,failed,partial,insufficient; null without mappings),risk(score0 to 100,level,factors) andrecommendations.healthis null until a post-launch day has final data; before go-live the response still holds the baseline window, the mapping counts and the launchchecklist, which is the pre-launch readout.summary(totals and per-day figures for A before and B after, residual old URLs, pre-launch new URLs, mapping coverage) andredirects(total,checked,byStatus,byFlagfrom the stored checks; statuses includemigrated,kept,chain,temporary,wrong_target,not_redirected,broken_sourceandbroken_target).topLostPages,topRedirectProblems,topLostQueries,topLosingSections,handover,waterfall, andsegments(countriesanddeviceswithclicksBefore,clicksAfter,recoveryPct,shareBefore,shareAfter).warnings(code,severity,message;go_live_in_futuremeans there is no post-launch data yet) andtruncated/truncatedReads.- The call costs 5 rate-limit units plus 1 per 2,000 mappings, so run it once per window, not once per question.
- Without a
- Winners and losers. Call
compare_migrationwith themodeand its sides:cross-propertytakessiteUrlandsiteUrlB;two-urlstakessiteUrlplusurlPrefixAandurlPrefixB(a full URL, a host, or a path on any host);regextakessiteUrlplusregexAandregexB(2,000 characters at most, no nested quantifiers such as(a+)+).- Pass the same
goLiveDate,windowStrategy,windowDaysandyoyBaselineas step 3, neverstartDate/endDatetogether withgoLiveDate, andlimitup to 500 (default 50). - Read
summary.Aandsummary.B(totalClicks,totalImpressions,avgCtr,avgPosition),recoveryPctwithrecoveryNote(null under 10 baseline clicks or before any post-launch day), anddailyTrend. queriesandpagescarrytopGainersandtopLosers(byclicksDelta),trends(withgoLiveDateonly: rows and clicks per lost, declined, stable, improved, new and inactive) andpages.joinedBy(pathwhen two properties are joined by path,urlotherwise). Lists cover the top 25,000 rows per side;truncatedandtruncationNotesay when a cap was hit.- Without a
goLiveDatethe tool compares both sides over one shared window (default the last 28 settled days), which is the pre-launch way to size side A against a section of side B. - 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.
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.
- Pass the same
- Redirect mappings. Call
list_migration_redirectswithsummaryOnly: truefirst (one row per pair and label:siteUrlA,siteUrlB,label,count, plustotalMappings), then without it, filtered bysiteUrlA,siteUrlBandlabelwithlimitup to 5,000 (default 500), when the rows are needed (fromUrl,toUrl,label,createdAt).- Cross the mapping against
topLostPagesandtopRedirectProblems: an old URL losing clicks with no mapping is unmapped; one mapped to a target that gets nothing is a redirect that does not work. - When the user supplies old-to-new pairs, ALWAYS show the exact rows and ask for confirmation, then call
add_migration_redirectswithsiteUrlA,siteUrlB,redirects(fromUrl,toUrl; up to 10,000 per call) and alabelnaming the batch. Rows are appended and never deduplicated, so re-sending a list stores it twice; the result reportsinsertedandskipped. - To remove a batch, preview it with
list_migration_redirectsusing the same filters, confirm, then calldelete_migration_redirectswithlabeland/orsiteUrlA/siteUrlB; the result reportsdeleted. Deleting every mapping on the account needsconfirmDeleteAll: trueand a separate, explicit confirmation from the user. - If a write is refused because the connection is read-only, say that this step needs write access and continue with the read-only parts.
- Cross the mapping against
- Inspect the worst new URLs (optional, quota-aware). Call
get_inspection_quotafor the NEW property first and readremainingoflimit(2,000 a day per property;unavailable: truemeans the counter could not be read).- Take at most 10 to 15 new URLs (the
toUrlvalues) fromtopLostPagesandtopRedirectProblems, never more than 25 and never more than a small share of what remains; list them and ask the user to confirm, then callbulk_inspect_urlson the new property with thoseurls. It spends inspection quota and is refused on a read-only connection, in which case say this step needs write access. - Read per result
verdict,coverageState,indexingState,lastCrawlTime,googleCanonicalagainstuserCanonical(null means Google did not report one), andskippedwithskipReason;stopReason,quotaExhaustedandretryAfterSecondsexplain a run that stopped early. - A new URL that Google canonicalizes back to the old URL, or that is still not indexed weeks after go-live, is a redirect or canonical problem, not a ranking one. For the broader index picture run the indexing-health skill.
- Take at most 10 to 15 new URLs (the
- Log go-live (optional). Ask whether the launch is already annotated; if not, offer
create_annotationwithsiteUrl(the new property),eventDateset to the go-live date, alabelsuch as "Migration go-live: old.com to new.com" and an optionaldescription. Show the exact values and run it only after the user confirms; a read-only connection refuses it, so say then that this step needs write access.
Output
- Recovery status:
statusandheadlinefromhealth,recoveryPct, the per-day baseline and current clicks,daysSinceGoLive,stage, pace and momentum, the next projected milestone, and the risk score with its top factors. Before go-live, the baseline totals and the checklist instead. - Winners and losers: two compact tables from
compare_migration(pages, then queries) with the trend bucket counts, and the sections, countries or devices fromget_migration_healththat recover worse than the whole. - Unmapped and failing URLs, as one table with a column saying which bucket each row is in:
- old URLs with lost clicks and no mapping (from
topLostPagescrossed with the mappings); - redirect problems by status (from
redirects.byStatusandtopRedirectProblems) and the URL success counts; - the inspection verdicts from step 6, when it ran.
- old URLs with lost clicks and no mapping (from
- End with a short prioritized list of 3 to 7 concrete recommendations ordered by clicks at stake (which mappings to add, which redirects to fix, which sections to re-check, when to re-run), merged with the tool's own
recommendations. Say when it is too early to judge:healthnull, ago_live_in_futurewarning, or an after window under a week.
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.
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.

