Seo gsc cannibalization
Skill lionkiii/claude-seo-skills/skills/seo-gsc-cannibalization
Detect keyword cannibalization by identifying queries where multiple pages are competing for the same ranking. Uses Google Search Console data to find queries appearing across 2 or more pages. Use when user says "keyword cannibalization", "same keyword multiple pages", "cannibalizing keywords", or "duplicate rankings".From its SKILL.md
npx -y skills add lionkiii/claude-seo-skills --skill seo-gsc-cannibalizationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 2 commands, including `endDate=$(date -v-3d +%Y-%m-%d)` and 1 more.
SKILL.md
4.2 KB, 986 tokens by cl100k_base, as published. Nobody here has run it
GSC Cannibalization — Keyword Cannibalization Detection
@skills/seo/references/mcp-degradation.md @skills/seo/references/gsc-api-reference.md
Finds queries where multiple pages compete for the same ranking, causing them to cannibalize each other's traffic. Identifies the "winning" page and "losing" pages for each cannibalized keyword.
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
references/mcp-degradation.mdand stop:
## Google Search Console MCP Not Available
The `/seo gsc cannibalization` 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
site: The GSC property URL. Accept both formats:- Domain property:
sc-domain:example.com - URL prefix:
https://example.comorhttps://www.example.com - If user provides a bare domain (no prefix), call
list_sitesto identify the correct property format registered in GSC.
- Domain property:
Date Calculation
Use Bash to calculate dates (GSC has ~3 day delay):
endDate=$(date -v-3d +%Y-%m-%d)
startDate=$(date -v-31d +%Y-%m-%d)
echo "endDate: $endDate | startDate: $startDate"
Execution
Step 1 — Pull query+page data:
Call query_search_analytics with:
siteUrl: the site propertystartDate: calculated startDateendDate: calculated endDatedimensions:["query", "page"]rowLimit: 1000
Post-processing — detect cannibalization:
Group the results by query. For each query:
- Count distinct
pagevalues - If a query has 2 or more distinct pages → it is cannibalized
- Keep only cannibalized queries for the report
For each cannibalized query, identify:
- "Winning" page: the page with the most
clicksfor that query - "Losing" pages: all other pages competing for the same query
Sort cannibalized queries by total impressions descending (highest-traffic cannibalization issues first).
CTR display rule: API returns CTR as decimal — multiply by 100 for display.
Output Format
## GSC Cannibalization Report: [site property]
**Period:** [startDate] to [endDate] (28 days)
**Cannibalized queries found:** [count]
### Cannibalized Keywords
#### Query: "[query]" ([total impressions] impressions)
| Role | Page URL | Clicks | Impressions | CTR | Position |
|------|----------|--------|-------------|-----|----------|
| WINNING | [url] | [n] | [n] | [X.XX%] | [X.X] |
| losing | [url] | [n] | [n] | [X.XX%] | [X.X] |
**Recommendation:** [recommendation based on situation]
[Repeat for each cannibalized query...]
### Summary
| Metric | Value |
|--------|-------|
| Total cannibalized queries | [count] |
| Total pages involved | [count] |
| Estimated lost clicks | [sum of losing page clicks] |
Recommendation logic:
- If winning page has much higher position (lower number): consolidate losing pages into winning page via redirect or canonical
- If positions are close (within 3): add canonical signals pointing from losing to winning page; consider merging content
- If the pages cover distinct subtopics: differentiate content more clearly or use internal links to signal hierarchy
If no cannibalization found, report: "No keyword cannibalization detected. Each query appears on only one page in the top 1000 results."
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most marketing audience skills give in 986 tokens
Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07
- Apply Poppins font to headingsin 41 of 690, across 6 files
- Apply Lora font to body textin 41 of 690, across 6 files
- Use Arial fallback for headingsin 39 of 690, across 4 files
- Use Georgia fallback for body textin 39 of 690, across 4 files
- Maintain text hierarchy and formattingin 39 of 690, across 4 files
- Use accent colors for non-text shapesin 38 of 690, across 3 files
- Use RGB values for precise color matchingin 38 of 690, across 3 files
- Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
- Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
- Use active voice instead of passive voicein 26 of 690, across 10 files
- Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
- Prioritize clarity over clevernessin 22 of 690, across 8 files
Said here and by no other author read
- multiply ctr decimal by 100 for display
- call list_sites for bare domains
- calculate end date three days prior
- request query and page dimensions
- limit row request to 1000 rows
- group results by query
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.