Claude-seo-skills seo-gsc-content-decay
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-content-decay" ~/.claude/skills/lionkiii-claude-seo-skills-seo-gsc-content-decay && rm -rf "$T"
skills/seo-gsc-content-decay/SKILL.mdGSC Content Decay — 90-Day Decline Detection
@skills/seo/references/mcp-degradation.md @skills/seo/references/gsc-api-reference.md
Identifies pages experiencing true content decay: both clicks AND impressions declining over a 90-day comparison period. Filters out seasonal variation by requiring both metrics to decline simultaneously.
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 content-decay` 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:
Date Calculation
Use Bash to calculate 90-day comparison windows (GSC has ~3 day delay):
currentEnd=$(date -v-3d +%Y-%m-%d) currentStart=$(date -v-93d +%Y-%m-%d) previousEnd=$(date -v-93d +%Y-%m-%d) previousStart=$(date -v-183d +%Y-%m-%d) echo "Current: $currentStart to $currentEnd | Previous: $previousStart to $previousEnd"
Execution
Call
with 90-day window:compare_performance
: the site propertysiteUrl
: currentStartcurrentStartDate
: currentEndcurrentEndDate
: previousStartpreviousStartDate
: previousEndpreviousEndDate
:dimension"page"
: 1000limit
Post-processing — identify true decay: Filter results to rows where BOTH conditions are true:
(clicks declined)clicksChange < 0- Impressions declined (if
field available, checkimpressionsChange
; if not available, use the presence of lower current impressions vs previous)impressionsChange < 0
This double-filter removes pages that lost clicks but maintained/grew impressions (which often indicates seasonal or competitor CTR changes, not content decay).
Sort by
clicksChangePercent ascending (most severe decay first).
Calculate decay severity: For each decaying page, compute click change percentage if not provided:
changePercent = abs(clicksChange / previousClicks) * 100
Severity classification:
: CRITICALchangePercent > 50
: HIGHchangePercent >= 30 and <= 50
: MEDIUMchangePercent >= 10 and < 30
Recommendation per page based on position change:
- Position declined significantly (positionChange > 5): "Review competitor content — rankings lost"
- Position stable but impressions fell: "Check for technical issues — may have indexing problems"
- Position slightly declined (positionChange 1-5): "Update and refresh content to regain relevance"
- Position improved but clicks fell: "Review search intent — content may no longer match query intent"
CTR display rule: API returns CTR as decimal — multiply by 100 for display.
Output Format
## GSC Content Decay: [site property] **Current Period:** [currentStart] to [currentEnd] (90 days) **Previous Period:** [previousStart] to [previousEnd] (90 days) **Decay pages found:** [count] ### Content Decay Report | Decay Severity | URL | Current Clicks | Previous Clicks | Change% | Curr Position | Prev Position | Pos Change | Action | |----------------|-----|---------------|-----------------|---------|---------------|---------------|------------|--------| | CRITICAL | [url] | [n] | [n] | -X.X% | [X.X] | [X.X] | ↑/↓ X.X | [action] | | HIGH | [url] | [n] | [n] | -X.X% | [X.X] | [X.X] | ↑/↓ X.X | [action] | | MEDIUM | [url] | [n] | [n] | -X.X% | [X.X] | [X.X] | ↑/↓ X.X | [action] | ... ### Summary by Severity | Severity | Pages | Avg Click Loss | |----------|-------|----------------| | CRITICAL (>50% drop) | [n] | [X.X%] | | HIGH (30-50% drop) | [n] | [X.X%] | | MEDIUM (10-30% drop) | [n] | [X.X%] |
Truncate long URLs to 60 characters with
... for readability.
If no decay pages found, report: "No content decay detected. No pages show simultaneous
decline in both clicks and impressions over the 90-day comparison period."