From claude-blog
Detects keyword cannibalization in blog posts by extracting keywords from titles/headings, clustering similar targets, and scoring competition severity with merge recommendations. Local grep scan or DataForSEO API modes.
npx claudepluginhub agricidaniel/claude-blog --plugin claude-blogThis skill uses the workspace's default tool permissions.
Detect when multiple blog posts compete for the same search keywords. Two modes:
Analyzes multiple pages for keyword overlap, content similarity, SEO cannibalization risks, and search intent conflicts. Suggests differentiation, consolidation, and resolution strategies when reviewing similar content.
Analyzes web pages for SEO cannibalization via keyword overlap, topic similarity, search intent, and content duplication. Suggests consolidation, differentiation, and prevention strategies.
Audits full blog site scanning all posts for quality scores, orphan pages, topic cannibalization, stale content, and AI citation readiness using parallel subagents. Produces per-post scores and prioritized action queue.
Share bugs, ideas, or general feedback.
Detect when multiple blog posts compete for the same search keywords. Two modes: local-only analysis (default) and DataForSEO API mode for SERP-level data.
| Mode | Flag | Cost | Data Source |
|---|---|---|---|
| Local | (default) | Free | File content analysis via Grep/Read |
| API | --api | ~$0.01/call | DataForSEO Page Intersection + Ranked Keywords |
Local mode works without any API keys. API mode requires DataForSEO credentials
set as environment variables: DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD.
Use Glob to find all content files in the target directory:
**/*.md, **/*.mdx, **/*.htmlnode_modules/, .git/, drafts/For each file, read and extract keyword signals from:
Primary keyword extraction method:
Group posts into clusters using these matching rules (in priority order):
For each cluster with 2+ posts, assess severity and generate a recommendation.
Display the results table and per-cluster recommendations.
Requires the --api flag. Uses WebFetch to call DataForSEO endpoints.
Page Intersection - find keywords where multiple URLs rank:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/page_intersection/live
Authorization: Basic <base64(login:password)>
{
"pages": {
"1": "https://example.com/post-a",
"2": "https://example.com/post-b"
},
"language_code": "en",
"location_code": 2840
}
Cost: ~$0.01 per call. Returns overlapping keywords with position, volume, CPC.
Ranked Keywords - get all keywords a single URL ranks for:
POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live
{
"target": "https://example.com/post-a",
"language_code": "en",
"location_code": 2840
}
Four severity levels based on overlap signals:
| Level | Criteria | Action Urgency |
|---|---|---|
| Critical | Same exact keyword, both pages in top 20 | Immediate |
| High | Same keyword cluster, one page outranks the other | This week |
| Medium | Related keywords with partial SERP overlap | This month |
| Low | Semantic similarity but different confirmed intents | Monitor |
severity_score = overlap_count x avg_search_volume x (1 / position_gap)
Where:
overlap_count = number of shared ranking keywordsavg_search_volume = mean monthly volume of shared keywordsposition_gap = absolute difference in average ranking position (min 1)Higher score = more urgent cannibalization problem.
Without SERP data, use a simplified scoring:
| Post A | Post B | Shared Keywords | Severity | Recommendation |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | Critical | MERGE |
| /email-tips | /email-marketing-guide | email marketing | High | DIFFERENTIATE |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | Critical | CANONICAL |
| /react-hooks | /react-state-mgmt | react, state | Low | NO ACTION |
For each flagged cluster, provide:
Four possible actions for each cannibalization cluster:
When both pages are thin or cover the same intent with similar depth.
When pages serve different intents but keyword targeting overlaps.
When one post is clearly the authority and the other is a lesser duplicate.
rel="canonical" on the weaker page pointing to the authorityWhen intent is genuinely different despite surface-level keyword similarity.