Install
$ agentstack add skill-jakelabate-claude-seo-skills-keyword-cannibalization-audit ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Keyword Cannibalization Audit
Audit a website for pages that compete with each other for the same query, and produce an actionable report. Findings are candidates to confirm — some overlap is legitimate; this skill surfaces the clusters and recommends a hierarchy.
When to use this skill
Use this skill when the user asks to:
- Audit or fix keyword cannibalization
- Find pages competing for the same keyword / query
- Decide which page should rank for a topic and what to do with the rest
- Review overlapping or competing content
Inputs to collect
- Site URL or URL list — a live site root to crawl (auto-seeds from
/sitemap.xml), or a text file with --url-list.
- Scope — pages to crawl (default 500,
--max-pages). - Brand suffix — e.g.
"| Acme Co"so brand words don't inflate title
similarity (--brand-suffix).
- Overlap threshold — Jaccard similarity to flag competing pages (default
0.6, --overlap).
Workflow
Step 1: Crawl and capture target signals
Use scripts/extract_targets.py:
python3 scripts/extract_targets.py https://example.com --max-pages 500 --output target_inventory.json
# already crawled once (e.g. in a full SEO audit)? skip the crawl and reuse the shared cache:
# python3 scripts/fetch_pages.py https://example.com --output page_cache.json
# python3 scripts/extract_targets.py --from-cache page_cache.json --output target_inventory.json
For each page it records title, H1, meta description, noindex, word count, and the top body keywords by frequency.
Step 2: Run the audit checks
python3 scripts/audit_cannibalization.py target_inventory.json --brand-suffix "| Acme Co" --overlap 0.6 --output audit_report.json
Step 3: Evaluate the audit checks
Evaluate each check in references/audit-checks.md. Core checks:
| Check | Severity | |---|---| | Duplicate title target | High | | Overlapping target cluster (keyword signatures) | Medium | | Shared primary keyword (title bigram) | Low |
Step 4: Produce the report
Write a report following references/report-template.md: summary, duplicate title targets first, then overlapping clusters (largest first) each with a recommended hierarchy, and a prioritized action list.
Step 5: Recommend fixes
- For each cluster, name one primary page and a role for every other page:
differentiate to a distinct sub-query, merge, or 301/canonicalize into the primary.
- Frame as hierarchy, not deletion — supporting pages that target distinct
intents and link up to the primary are healthy.
- Always recommend confirming with Search Console query data before
consolidating: this audit infers competition from on-page signals.
- Related angles:
meta-data-audit(duplicate titles) and
content-quality-audit (duplicate bodies).
- Base every grouping on observed signatures; never invent rankings.
Optional: export the report
As a Word document (.docx)
If the user wants the report as a .docx (for example, to share with stakeholders or attach to a ticket), save the Markdown report to a file and convert it:
python3 scripts/md_to_docx.py report.md --output report.docx
scripts/md_to_docx.py uses only the Python standard library (no pip install) and renders headings, tables, lists, links, bold/italic, and code blocks. Offer this whenever a user asks for a Word doc, a .docx, or a shareable/downloadable report.
As a CSV of findings (.csv)
If the user wants the raw findings as a spreadsheet (for filtering, sorting, or triage in Sheets or Excel), convert the audit's audit_report.json directly:
python3 scripts/findings_to_csv.py audit_report.json --output findings.csv
scripts/findings_to_csv.py is also standard-library only. It writes one row per finding, with check and severity columns prepended and list fields (e.g. the pages sharing a duplicate value) joined with ; . Unlike the .docx, which reformats the written report, the CSV is a direct dump of the structured findings — offer it whenever a user wants the data itself, a spreadsheet, or to slice findings by check or severity.
Resources
scripts/md_to_docx.py— convert the Markdown report into a Word (.docx) document (standard library only)scripts/findings_to_csv.py— flatten the audit findings JSON into a CSV, one row per finding (standard library only)references/audit-checks.md— full definitions, thresholds, and rationalereferences/report-template.md— report output structurescripts/extract_targets.py— crawl and capture keyword-target signalsscripts/audit_cannibalization.py— run cannibalization audit checks
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: JakeLabate
- Source: JakeLabate/Claude-SEO-Skills
- License: MIT
- Homepage: https://www.jakelabate.com/claude-seo-skills/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.