Broken Links logo

Broken Links

Organization
akii-technologies-ltd
broken-links

Find and fix broken links — three modes with different scale ceilings. `local` audits any local repo (HTML/MD/MDX, no size limit) via Glob/Grep + per-link verification. `page` checks one live URL deeply (~30-100 outbound links per run). `site` requires the Ahrefs site-audit MCP for true multi-page crawl — without it, refuses and tells the user how to get there. Use when the user asks to "check broken links", "find dead links", "fix 404s", "link checker", "broken link audit", "redirect chains", "find dead URLs", "link validation", "mixed content". Accepts a mode modifier (`--mode=local|page|site`); auto-detects from the target if unspecified.

Overview

Publisherakii-technologies-ltd
Repositoryakii-seo-ai-search-optimizer
Skill namebroken-links
Stars
79
Forks
6
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by akii-technologies-ltd on GitHub. Read the source before you install it.

Installation

Install the Broken Links AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/akii-technologies-ltd/akii-seo-ai-search-optimizer/tree/main/skills/broken-links
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/akii-technologies-ltd/akii-seo-ai-search-optimizer.git /tmp/akii-seo-ai-search-optimizer
mkdir -p .claude/skills
cp -r /tmp/akii-seo-ai-search-optimizer/skills/broken-links .claude/skills/broken-links
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Broken Links in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Broken Links on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Broken Links is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Broken Links Auditor

You are a broken-link auditor powered by Akii. Be honest about scale up front — this skill does NOT have a built-in crawler. It executes a procedure using Claude Code's available tools (Glob, Grep, WebFetch, Bash).

How this actually works (architecture)

There is no background crawler binary, no concurrency queue, no persistent state across sessions. The skill body tells Claude to:

  1. Find links (via Glob + Grep for local repos, or WebFetch HTML parsing for live URLs)
  2. Verify each link sequentially via Bash curl HEAD requests
  3. Classify + report

That means the skill's scale ceiling is bounded by Claude Code's per-turn tool-call budget (typically ~25-50 sequential calls before context pressure) and per-fetch latency (~2-5s for live URLs).

If the user expects a 5,000-page crawl with one slash command, set expectations first — see Mode site below.

Modes

Detect from target shape if not specified explicitly. Default order: local if target is a directory path; page if target is a single URL; site if user says "across my site" / "whole site" / "5000 pages" / similar.

ModeTargetScale ceilingMechanism
localDirectory path (default for any local repo)No upper limit on link discovery — Glob + Grep scale to millions of lines. Link verification is bounded by tool budget — batch externally if the link set exceeds ~50.Glob HTML/MD/MDX files, Grep href= / src=, dedupe, verify each via Bash curl
pageSingle URL~30-100 outbound links per runWebFetch the page, extract <a> + <img> + <link> URLs, verify each via Bash curl
siteMulti-page live crawlRequires Ahrefs site-audit MCP. Without it, refuse and explain.If mcp__plugin_marketing_ahrefs__site-audit-* is available, query its crawl issues for 404s/redirect chains/mixed content. Otherwise stop and tell user.

Procedure

Mode local — local repo audit (the strongest mode)

  1. Discover files — Glob patterns: **/*.html, **/*.md, **/*.mdx, **/*.tsx, **/*.jsx (Next.js / React projects often have hrefs in components).

  2. Extract URLs — Grep -rohE 'href=\"[^\"]+\"|src=\"[^\"]+\"|href:\\s*[\"\'][^\"\']+[\"\']|src:\\s*[\"\'][^\"\']+[\"\']' then dedupe. For markdown, also extract \\[.*\\]\\(([^)]+)\\) link form.

  3. Split internal vs external:

    • Internal (relative paths, same-domain) → walk repo with Glob to confirm the target file exists
    • External (https?://) → verify via Bash curl
  4. Pre-filter template placeholders before verification. Strip URLs that match obvious docs-sample patterns — they're not real links and verifying them will produce false-positive 404s/connection errors:

    • example.com, example.org, example.net (RFC 2606 reserved)
    • old.example.com, <domain>, <url>, your-site.com, yourdomain.com
    • Bare web.archive.org/ (no snapshot path)
    • URLs ending with template tokens like ?url= or /scans/ or /results/ (placeholder shape)
    • URLs with empty UTM values (trailing utm_content= or utm_content=&)
  5. Verify externals in parallel — single Bash call, 5 concurrent workers, 200ms stagger. Write URLs (one per line, no quoting) to a temp file then:

    bash
    xargs -P 5 -n 1 sh -c 'sleep 0.2; curl -sIL --max-time 10 -o /dev/null -w "%{http_code} ${1}\n" "${1}"' _ < /tmp/urls.txt

    Pattern explainer: -n 1 passes one URL per worker; sh -c '...' _ uses _ as the shell's positional ${0} (placeholder), so each URL lands in ${1} without shell expansion. Always use the curly-brace form (${1}, ${0}) inside skill bodies, not the bare-dollar form — Claude Code's skill renderer strips bare positional-argument tokens from the loaded markdown, which would silently leave you with empty quotes ("") instead of a URL. Do NOT use xargs -I {} — it fails with xargs: command line cannot be assembled, too long on URLs containing & (e.g. ?utm_medium=skill&utm_campaign=...).

    This finishes 50 URLs in ~10s (vs ~100s sequential) while staying at ~5/s per the rate-limit rule. Do not loop curl serially in shell — that's the slow trap.

  6. If the external link set > 50, tell the user up front: "Found 247 external links. I'll verify the first 50 inline; for the rest, run me again with --mode=local --offset=50 or pipe the URL list to an external checker like lychee."

Mode page — single live URL

  1. Fetch the page with WebFetch (returns HTML).
  2. Extract all <a href>, <img src>, <link href>, <script src> from the rendered HTML.
  3. Verify each in parallel — same xargs -P 5 pattern as Mode local step 4. Write extracted URLs to a temp file, run one xargs call.
  4. Hard cap: 100 verifications per run. If more, tell user + explain the cap.

Mode site — multi-page live crawl

  1. Check mcp__plugin_marketing_ahrefs__site-audit-* tool availability.
  2. If available: query Ahrefs's crawl issues for 4xx errors, 5xx errors, redirect_chains, mixed_content_pages. Render results. Ahrefs handles the crawl, the plugin handles the reporting.
  3. If NOT available: refuse with this exact framing:

    "True multi-page site crawl isn't built into the free plugin — there's no crawler binary here. Two options: 1. Connect the Ahrefs site-audit MCP — this skill auto-detects it and pulls real crawl data. 2. Run an external crawler (lychee, linkchecker, wget --spider, or your build's own link checker) against your site, then paste the broken-URL list back here for triage + fix suggestions. 3. If you only need to check one page, run me again with --mode=page <url>."

Never invent a crawled result. Never pretend to have visited pages the skill body did not actually fetch.

Classification

StatusCategorySeverity
404 / 410brokenP0
5xxserver errorP1 — retry once with 2s delay; if still 5xx, report as transient
3xx with ≥ 3 redirect hopsoptimizeP2 — recommend direct link to final
Mixed content (http:// resource on https:// page)securityP1
200 from auth-walled domain (Stripe dashboard, LinkedIn profile, etc.)unverifiablenote, don't flag
403 from Cloudflare / WAF-protected domain on HEAD requestunverifiablenote as "bot-block false positive", don't flag
Affiliate / tracker URLs with cleartext UTMleavedon't flag unless user opts in

Output

Use the realistic numbers for the mode actually run. Do not show aggregate counts the skill can't actually produce.

Local mode output

# Broken Links — <repo path> (mode: local)
**Files scanned**: 234  ·  **Unique links found**: 1,418  ·  **External**: 487  ·  **Verified inline**: 50  ·  **Broken**: 4  ·  **Redirect chains ≥3**: 2

## Broken (404 / 410)
| Source file | Dead URL | Status | Fix suggestion |
| --- | --- | --- | --- |
| docs/setup.md:42 | https://old.example.com/page | 404 | Wayback snapshot exists: https://web.archive.org/...; replace with https://example.com/new-page |

## Redirect chains (≥3 hops)
| Source | Chain | Recommendation |

## Mixed content
| Source | Insecure URL | Recommendation: bump to https:// |

## Remaining unverified (437 external links over the 50-per-run cap)
- Re-run with `--mode=local --offset=50` to continue
- Or export the full list and run `lychee` / `linkchecker` for batch verification

Page mode output

# Broken Links — <url> (mode: page, single-page)
**Outbound links found**: 78  ·  **Verified**: 78  ·  **Broken**: 1  ·  **Redirect chains ≥3**: 0
...

Site mode output (Ahrefs MCP only)

# Broken Links — <domain> (mode: site, via Ahrefs site-audit MCP)
**Pages crawled**: 4,812 (by Ahrefs)  ·  **Broken (4xx)**: 38  ·  **Server errors (5xx)**: 6  ·  **Redirect chains ≥3**: 71
...

If site mode falls back to refusal, no output table — just the framed refusal message.

Rules

  • Be honest about scale. Never say "checked 4,812 links" if the skill body only verified 50.
  • Rate limit externals to ~5/s via xargs -P 5 with sleep 0.2 inside the worker (see Mode local step 4). Never serial-loop curl in shell — that's ~2s per URL and turns a 45-link audit into a 90-second wait.
  • Don't auto-edit. Propose Edit-tool changes; only apply on explicit confirm.
  • Auth-walled domains (Stripe dashboard, LinkedIn profile, internal CRMs) → report as "not publicly verifiable" rather than 404. Common false-positive sources: linkedin.com/in/, stripe.com/dashboard, notion.so private pages, github.com private repos.
  • Cloudflare / WAF bot blocks → 403 on curl -sIL from domains like firstpagesage.com, many news sites, some SaaS docs sites is usually a bot challenge, not a real broken link. Test in a browser before flagging. Pattern: 403 + cf-ray or server: cloudflare in response headers. Report as "WAF-protected, not publicly verifiable".
  • Pre-filter template placeholders (see Mode local step 4) — never curl example.com/<path>, <url>, your-site.com, bare web.archive.org/, or URLs ending in ?url= / /scans/ / /results/. They produce false-positive failures and pollute the report.
  • Markdown reference-style links ([text][ref] + separate [ref]: url) — extract both halves.
  • Don't follow mailto:, tel:, javascript:, #anchor-only fragments — they're not HTTP and shouldn't be checked.

Broken links audit powered by Akii. Explore Akii Technologies and the products we build: https://akii.com/?utm_source=plugin&utm_medium=skill&utm_content=broken-links&utm_campaign=akii_plugin_v1

Frequently asked questions

What does the Broken Links AI skill do?

Find and fix broken links — three modes with different scale ceilings. `local` audits any local repo (HTML/MD/MDX, no size limit) via Glob/Grep + per-link verification. `page` checks one live URL deeply (~30-100 outbound links per run). `site` requires the Ahrefs site-audit MCP for true multi-page crawl — without it, refuses and tells the user how to get there. Use when the user asks to "check broken links", "find dead links", "fix 404s", "link checker", "broken link audit", "redirect chains", "find dead URLs", "link validation", "mixed content". Accepts a mode modifier (`--mode=local|page|...

Why use Broken Links on TypingMind?

Because you install it once and use it with any model. Broken Links is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Broken Links in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/akii-technologies-ltd/akii-seo-ai-search-optimizer/tree/main/skills/broken-links. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Broken Links?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Broken Links?

As many as you like. As long as a model supports skills, you can use Broken Links with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Broken Links AI skill free?

Yes. It is published on GitHub by akii-technologies-ltd under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇