Install
$ agentstack add skill-lionkiii-claude-seo-skills-seo-internal-links ✓ 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.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Internal Link Audit
Crawls a domain to build an internal link graph. Identifies orphan pages, underlinked pages, and broken internal links. Suggests anchor text improvements.
Inputs
domain: Target domain URL (e.g.,https://example.com). Include protocol.max_pages(optional): Max pages to crawl. Default: 100. Maximum: 200.
Execution
Step 1: Crawl Site
Use scripts/fetch_page.py and scripts/parse_html.py to crawl the site:
# Fetch homepage
python3 scripts/fetch_page.py
# Parse HTML to extract links
python3 scripts/parse_html.py
Follow internal links only (same domain hostname). Normalize URLs:
- Remove trailing slashes (treat
/aboutand/about/as same) - Remove URL fragments (
#section) - Preserve query strings only if they appear to be content (not tracking: strip
utm_*,ref=,source=)
Respect robots.txt: fetch /robots.txt first, skip disallowed paths. Cap crawl at max_pages. Track crawl queue (BFS order from homepage).
Step 2: Build Link Graph
For each crawled page, record:
- Source URL
- Target URL (all internal links found)
- Anchor text for each link
Build adjacency structure:
outbound[url]= list of (target, anchor_text)inbound[url]= list of (source, anchor_text)
Step 3: Calculate Per-Page Metrics
For each crawled page:
- Inbound internal links count (links from other crawled pages pointing here)
- Outbound internal links count (links from this page to other pages)
- Link depth from homepage (BFS level at which this page was first discovered)
Step 4: Identify Issues
- Orphan pages (hard finding): Pages discovered via sitemap (
/sitemap.xml) or linked from other pages but with zero inbound internal links. Fetch sitemap first to identify all known URLs. - Underlinked pages (heuristic flag): Pages with fewer inbound internal links than a configurable threshold (default: 3). This threshold is a heuristic for prioritizing internal-linking work — Google defines no numeric minimum, so it is not a Google requirement.
- Excessive outbound: Pages with > 100 outbound internal links (PageRank dilution).
- Broken internal links: For top 20 most-linked pages, verify HTTP status. Flag 4xx/5xx.
Step 5: Anchor Text Suggestions for Top 5 Underlinked Pages
For each of the 5 most underlinked pages (fewest inbound links, excluding orphans):
- Fetch the page and extract H1 and `` tag
- Identify top 3 relevant anchor text options based on: H1 noun phrases, title keywords, page URL slug
- Find pages in crawl that mention related terms and could link to this page
- Output: target URL, suggested anchors (ranked), recommended source pages
Anchor text guidance (per Google's crawlable-links doc, https://developers.google.com/search/docs/crawling-indexing/links-crawlable):
- Write descriptive, reasonably concise link text relevant to the target page
- Avoid generic anchors like "click here", "read more", or "website"
- Links must be `
elements with anhref` attribute resolving to a crawlable URL — Google can't reliably extract script-driven pseudo-links
Step 6: Optional Ahrefs Enrichment
If Ahrefs available (ToolSearch '+ahrefs'):
- Fetch
site-explorer-pages-by-internal-linksfor the domain - Cross-reference crawl findings with Ahrefs data
- Add
### Ahrefs Internal Link Datasection showing discrepancies
Output Format
## Internal Link Audit: [domain]
### Summary Stats
| Metric | Value |
|--------|-------|
| Pages crawled | N / max_pages |
| Total internal links | N |
| Avg inbound links per page | N.N |
| Orphan pages found | N |
| Underlinked pages (below threshold, default 100)
| Page | Outbound Links |
|------|----------------|
## Data Sources
- Internal crawl via fetch_page.py + parse_html.py ([N] pages, [date])
- [Ahrefs MCP — if used]
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: lionkiii
- Source: lionkiii/claude-seo-skills
- License: MIT
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.