Claude-seo-skills seo-gsc-compare
git clone https://github.com/lionkiii/claude-seo-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/lionkiii/claude-seo-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/seo-gsc-compare" ~/.claude/skills/lionkiii-claude-seo-skills-seo-gsc-compare && rm -rf "$T"
skills/seo-gsc-compare/SKILL.mdGSC Compare — Period-over-Period Comparison
@skills/seo/references/mcp-degradation.md @skills/seo/references/gsc-api-reference.md
Compares GSC performance between two date periods — by default month-over-month (last 28 days vs prior 28 days). Surfaces top movers by page and query with directional indicators.
MCP Check
Before calling any GSC tool, verify the MCP is connected:
- Use ToolSearch with query
+google-search-console - If tools returned — note the actual tool name prefix, proceed to Inputs
- If no tools returned — display the GSC MCP error template from
and stop:references/mcp-degradation.md
## Google Search Console MCP Not Available The `/seo gsc compare` command requires the GSC MCP, which is not currently connected. **What you can do:** - Use `/seo technical <url>` for crawlability and indexability analysis (no live data) - Use `/seo audit <url>` for a full static SEO audit **To connect GSC MCP:** - Install and configure a Google Search Console MCP server (see README for setup) - Add it to ~/.claude/mcp.json at user scope (NOT project scope) - Verify GSC property access before running commands (domain vs URL prefix format) - See references/gsc-api-reference.md for property format details
Inputs
: The GSC property URL. Accept both formats:site- Domain property:
sc-domain:example.com - URL prefix:
orhttps://example.comhttps://www.example.com - If user provides a bare domain (no prefix), call
to identify the correct property format registered in GSC.list_sites
- Domain property:
(optional): Comparison type —type
(default),mom
, oryoycustom
,current_start
,current_end
,previous_start
(optional): Only used whenprevious_end
. Accept YYYY-MM-DD format.type=custom
Date Calculation
Use Bash to calculate comparison periods based on the requested type. GSC has ~3 day delay — all end dates use today-3.
Month-over-month (MoM, default):
currentEnd=$(date -v-3d +%Y-%m-%d) currentStart=$(date -v-31d +%Y-%m-%d) previousEnd=$(date -v-31d +%Y-%m-%d) previousStart=$(date -v-59d +%Y-%m-%d) comparisonLabel="Month-over-Month (last 28 days vs prior 28 days)"
Year-over-year (YoY):
currentEnd=$(date -v-3d +%Y-%m-%d) currentStart=$(date -v-31d +%Y-%m-%d) previousEnd=$(date -v-3d -v-1y +%Y-%m-%d) previousStart=$(date -v-31d -v-1y +%Y-%m-%d) comparisonLabel="Year-over-Year (last 28 days vs same period last year)"
Custom: Use the user-provided dates directly.
Execution
Step 1 — Page-level comparison: Call
compare_performance with:
: the site propertysiteUrl
: currentStartcurrentStartDate
: currentEndcurrentEndDate
: previousStartpreviousStartDate
: previousEndpreviousEndDate
:dimension"page"
: 500limit
Step 2 — Query-level comparison: Call
compare_performance with same dates but:
:dimension"query"
: 500limit
Post-processing: For each result set:
- Calculate summary totals (sum all current clicks vs previous clicks)
- Separate into "top gainers" (clicksChange > 0, sort descending) and "top losers" (clicksChange < 0, sort ascending)
- Compute overall percentage change:
(currentTotal - previousTotal) / previousTotal * 100
Direction indicators (unicode arrows for markdown):
- Positive change: ↑ (upward arrow)
- Negative change: ↓ (downward arrow)
- No change: → (rightward arrow)
CTR display rule: API returns CTR as decimal — multiply by 100 for display.
Output Format
## GSC Compare: [site property] **[comparisonLabel]** **Current:** [currentStart] to [currentEnd] **Previous:** [previousStart] to [previousEnd] ### Summary Deltas | Metric | Current | Previous | Change | Change% | |--------|---------|----------|--------|---------| | Total Clicks | [n] | [n] | ↑/↓ [n] | ↑/↓ X.X% | | Total Impressions | [n] | [n] | ↑/↓ [n] | ↑/↓ X.X% | | Avg CTR | [X.XX%] | [X.XX%] | ↑/↓ X.XX% | — | | Avg Position | [X.X] | [X.X] | ↑/↓ X.X | — | ### Top Gaining Pages (by clicks) | Page URL | Current Clicks | Previous Clicks | Change | Change% | |----------|---------------|-----------------|--------|---------| | [url] | [n] | [n] | ↑ [n] | ↑ X.X% | ... ### Top Losing Pages (by clicks) | Page URL | Current Clicks | Previous Clicks | Change | Change% | |----------|---------------|-----------------|--------|---------| | [url] | [n] | [n] | ↓ [n] | ↓ X.X% | ... ### Top Gaining Queries | Query | Current Clicks | Previous Clicks | Change | Change% | |-------|---------------|-----------------|--------|---------| | [query] | [n] | [n] | ↑ [n] | ↑ X.X% | ... ### Top Losing Queries | Query | Current Clicks | Previous Clicks | Change | Change% | |-------|---------------|-----------------|--------|---------| | [query] | [n] | [n] | ↓ [n] | ↓ X.X% | ...
Show top 10 gainers and top 10 losers for both pages and queries. Truncate long URLs to 60 characters with
... for readability.