Works with the AI Agents you already use

    Claude CodeClaude CodeCursorCursorCodex CLICodex CLIMuseMuseDotsDots+22 more

    AI Citability Audit

    1

    Audit whether AI answer engines can actually read and cite a page — crawler access, llms.txt, JavaScript-hidden content, and quotability, with severity-ranked fixes.

    Free

    Security scanned
    AI Citability Audit

    AI Citability Audit

    Example session with this skill installed

    We saved our homepage HTML, robots.txt and llms.txt into a folder. Search traffic is fine, but ChatGPT and Perplexity never mention us. Can you check whether answer engines can even read the site, and tell me what would make it citable?

    • Read your context and instructions
    • Compiled the ai citability audit

    Summary

    The site is unreachable to answer engines for two independent reasons — and neither one shows up in a browser, and neither one shows up in a search-ranking report.

    LayerFindings
    Access1 HIGH — robots.txt blocks every AI crawler
    Readability1 HIGH / 1 MEDIUM — one page is an empty JS shell, another hides its substance in script strings
    Discovery1 MEDIUM — no llms.txt
    Quotability3 MEDIUM — missing title, missing description, nothing quotable

    Net: no crawler that does not execute JavaScript can read either page. The content itself is fine — it is simply never delivered.

    Full report

    
    AI CITABILITY AUDIT
    ========================================================================
    source: ./fixtures/bad  (captured snapshot)
    
    HIGH=2  MEDIUM=9  LOW=3  INFO=1
    
    [HIGH] (access) R-BLOCK — AI crawlers are blocked outright: amazonbot, anthropic-ai, applebot-extended, bytespider, ccbot, chatgpt-user, claude-web, claudebot
        robots.txt disallows the whole site for one or more AI crawlers. A
        blocked crawler cannot cite you no matter how good the page is. This
        is very often accidental: a wildcard rule written for a different
        purpose now covers them.
        FIX: Inspect the rule, decide whether blocking is intentional, and
        if not, add an explicit Allow group for the crawlers you want.
        Blocking is a legitimate choice — but make it a choice.
    
    [HIGH] (readability) P-JS — Content looks JavaScript-rendered (page.html)
        The raw HTML carries 0 characters of text against 10622 characters
        of script. A crawler that does not execute JavaScript receives
        essentially an empty page. This is the single most common reason a
        site that ranks well in search is never cited by an answer engine:
        search engines render your JS, most answer-engine crawlers do not.
        FIX: Serve the primary content in the initial HTML (server-side
        render, static generation, or a pre-rendered fallback). Then verify
        by fetching the page with JS disabled and reading what comes back —
        not by looking at it in your browser, where it always looks fine.
    
    [MEDIUM] (discovery) L-MISSING — No llms.txt
        llms.txt is a proposed convention: a single markdown file at your
        root that tells a language model what your site is and which pages
        matter. Adoption is uneven, so treat it as a cheap, low-risk
        addition rather than a requirement.
        FIX: Publish /llms.txt: an H1 with your site name, a one-line
        summary as a blockquote, then a markdown list of your most important
        pages with a short description each. Keep it curated, not a full
        dump.
    
    [MEDIUM] (page) P-NODESC — No meta description (page.html)
        A page with no description leaves the summary to be guessed from
        whatever text the crawler can find.
        FIX: Add a one-sentence description that states what the page
        establishes, not what the company is.
    
    [MEDIUM] (page) P-NOTITLE — Missing <title> (page.html)
        The title is the strongest short signal a crawler has about what the
        page answers.
        FIX: Write a title that names the question the page answers.
    
    [MEDIUM] (quotability) P-NOJSONLD — No structured data (page.html)
        Structured data is the machine-readable version of your claims.
        Without it, a crawler has to infer that a number is a price, a fact
        is a fact, and an answer is an answer.
        FIX: Add JSON-LD: Article or FAQPage where it fits, Organization on
        the home page. Describe what is genuinely there.
    
    [MEDIUM] (quotability) Q-FEWSPECIFICS — Almost no verifiable specifics (js_partial.html)
        Found 0 numbers and 0 dates across 247 characters. An answer engine
        cites specifics — a figure, a date, a named result. Pages of
        well-argued generalities have nothing quotable in them.
        FIX: Add the concrete figures you already know: how many, how long,
        how much, compared with what, as of when.
    
    [MEDIUM] (quotability) Q-FEWSPECIFICS — Almost no verifiable specifics (page.html)
        Found 0 numbers and 0 dates across 0 characters. An answer engine
        cites specifics — a figure, a date, a named result. Pages of
        well-argued generalities have nothing quotable in them.
        FIX: Add the concrete figures you already know: how many, how long,
        how much, compared with what, as of when.
    
    [MEDIUM] (quotability) Q-THIN — Thin content (js_partial.html: 247 characters)
        Only 247 characters of text were extractable. Answer engines prefer
        sources they can quote from at length; a thin page gives them
        nothing to lift.
        FIX: Either deepen the page with specifics or let a stronger page
        carry the topic.
    
    [MEDIUM] (quotability) Q-THIN — Thin content (page.html: 0 characters)
        Only 0 characters of text were extractable. Answer engines prefer
        sources they can quote from at length; a thin page gives them
        nothing to lift.
        FIX: Either deepen the page with specifics or let a stronger page
        carry the topic.
    
    [MEDIUM] (readability) P-JSRENDER — Part of the content is assembled in JavaScript (js_partial.html)
        About 848 characters of prose appear only inside script blocks and
        never in the HTML itself, against 247 characters of visible text.
        The page is not an empty shell, so a shell check passes — but a
        crawler that does not run JS receives the frame without the
        substance. This is the quiet version of the JavaScript problem, and
        it is harder to notice because the page looks complete in a browser.
        FIX: Move the substance into the served HTML — render it at build
        time or server-side, and keep JavaScript for behaviour only. Verify
        by fetching the page with JS disabled and reading the raw response,
        not by opening it in a browser.
    
    [LOW] (access) R-NOSITEMAP — robots.txt declares no sitemap
        Without a Sitemap: line, discovery depends on links alone. Crawlers
        that see fewer links see less of your site.
        FIX: Add `Sitemap: https://your-domain/sitemap.xml`.
    
    [LOW] (page) P-NOCANON — No canonical link (page.html)
        Without a canonical, duplicates across http/https, trailing slash
        and query parameters compete as separate sources.
        FIX: Add a canonical link to the preferred URL.
    
    [LOW] (page) P-NOH1 — No H1 (page.html)
        A heading hierarchy tells a crawler which text is the document's
        claim and which is support.
        FIX: Add exactly one H1 stating the page's subject.
    
    [INFO] (quotability) Q-NOQUESTIONS — No question-shaped headings (page.html)
        Headings phrased as the user's actual question are the cheapest
        match between a page and an AI query.
        FIX: Where it reads naturally, phrase some H2/H3s as questions.
    
    ========================================================================
    This audit covers whether an answer engine CAN read and cite the
    page. It does not measure whether they DO. That needs probing real
    answers and counting mentions — a different job.
    

    What to do, in order

    Fix robots.txt first. It is a one-line change and everything else is blocked behind it. Add explicit Allow groups for the crawlers you want, plus a Sitemap: line.
    2.

    Move the substance into the served HTML — render at build time or server-side. Then verify by fetching the page with JavaScript disabled and reading the raw response, never by opening it in a browser.
    3.

    Open with the answer. State the conclusion in the first two hundred characters instead of building up to it, and put one number or date in roughly every 500 characters, so a quotation carries weight.
    4.

    Publish a curated /llms.txt — an H1, a one-line summary, and a short list of the pages worth reading. Cheap and low-risk.
    5. Re-run the audit and watch the counts fall. It exits 1 while findings remain, so it drops straight into CI.

    Next steps

    • Re-run after each fix; the report is deterministic, so the diff is meaningful
    • Add --json to keep a dated record and track the trend
    • Ask for a second pass on the pages that matter most commercially, not just the homepage

    Connects securely to your tools. The creator never sees your data.

    About this skill

    What it is

    A search-ranking check tells you whether Google likes a page. This tells you whether an answer engine can read it at all — and whether there is anything in it worth quoting.

    Those are different failure modes, and the second set is invisible to the tools you already have. A page can rank well, look perfect in a browser, and still be unreachable to the crawlers behind ChatGPT, Claude, Perplexity and Gemini.

    What it checks

    Access — is the page allowed in?

    • R-BLOCK (HIGH): robots.txt blocks AI crawlers — very often by accident, via a wildcard rule written for some other purpose
    • R-WILDCARD (HIGH): a wildcard group closes the whole site
    • R-NOROBOTS / R-NOSITEMAP (LOW): nothing documented for crawlers to follow

    Discovery — is there anything telling a model what the site is?

    • L-MISSING / L-EMPTY / L-MALFORMED (MEDIUM): llms.txt absent or unusable

    Readability without JavaScript — the failure that hides best

    • P-JS (HIGH): the page is an empty shell; content appears only after scripts run
    • P-JSRENDER (MEDIUM): the page is mostly static, but the substance lives inside script strings. This is the quiet version, and the one a browser check will never find

    Quotability — is there anything worth citing?

    • Q-THIN / Q-FEWSPECIFICS (MEDIUM): nothing concrete to quote
    • P-NOTITLE / P-NODESC / P-NOJSONLD (MEDIUM), plus LOW structural checks

    Why severity beats a single score

    Findings are reported by severity, not averaged into one number, because a HIGH and an INFO are not worth the same and a mean hides that. Each finding names the cause and the fix, not just the symptom.

    Verify the auditor before you trust it

    It ships with a control-group test:

    python scripts/self_check.py
    

    It asserts four directions: a deliberately uncitable site must produce the expected findings at the expected severities; a well-built citable page must produce zero; a page whose long prose sits in JSON-LD must not be reported as JavaScript-hidden; and a correctly structured llms.txt listing bare URLs must report one INFO, not a MEDIUM. An auditor that flags everything is as useless as one that flags nothing.

    Honest limits

    • It checks whether an engine can read and cite a page. It does not measure whether any engine does — that needs probing real questions against real assistants and counting mentions. Every report says so.
    • It does not execute JavaScript, deliberately: running the JS would hide the exact problem it looks for.
    • llms.txt is a proposed convention with uneven adoption, so it is never reported above MEDIUM.
    • No dependencies and no API keys. Standard library only. Read-only GETs, nothing sent anywhere, and it runs fully offline against a saved snapshot.

    How to use

    Skills on Agensi run inside your AI agent. Copy the prompt, paste it into your agent, and it connects to Agensi and installs this skill for you. If a payment is needed, your agent shows it to you first.

    Reviews

    No reviews yet

    Be one of the first to try it. Every listed skill passes our trust checks below.

    Security scanned

    Passed our 8-point scan before listing

    Fresh listing

    Recently published to Agensi

    Free forever

    No account required to browse

    Trust & safety

    Security scanned

    Verified clean 13 days ago

    • Free to download with an account

    Requires

    Python

    Listed13 days ago

    What's inside

    Frequently Asked Questions