agentleFS
DarynaRodriguezDarynaRodriguez/seo-skills/skills/ai-crawler-access/SKILL.md

ai-crawler-access

Skill1 starsChanged 2 months agoMITView on GitHub

Checks whether AI crawlers and answer-time fetchers can actually retrieve the site: robots.txt directives per named agent, CDN, WAF and bot rules, JavaScript-rendered content, login and geo walls, and rate limits, verified against logged agent visits, with a per-crawler allowed or blocked verdict, the business consequence and the fix.

We split this skill into the rules it gives an agent

13 rules. About 0 are common, 9 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Sequencing: No rewriting, no prompt panel and no citation work matters while the fetchers are blocked.

    line 15
  2. Distinctive:

    Read the site profile before anything else:

    line 21
  3. Distinctive:

    Never invent profile values.

    line 29
  4. Very specific:

    Every verdict in the output carries the evidence and the date it was gathered.

    line 48
  5. Very specific:

    Every command takes --json, which is the form to use here.

    line 69
  6. Distinctive:

    Decide the policy before reporting the defect: Ask the named human what the organisation actually wants: cited in answers, excluded from …

    line 93
  7. Very specific:

    Test the pages that matter, not the homepage: Check the pillar pages, product pages and the pages /citation-gap flagged.

    line 124
  8. Distinctive:

    Never invent a user-agent string, an IP range or a vendor's crawler policy.

    line 222
  9. Distinctive:

    Never report an agent as allowed on configuration alone.

    line 225
  10. Distinctive:

    Never recommend unblocking a crawler without stating what the organisation gives up, including training-data exposure.

    line 227
  11. Very specific:

    Never serve different content to crawlers than to users.

    line 229
  12. Distinctive:

    Never sell llms.txt as a visibility fix, and never claim a measured gain from it.

    line 231
  13. Distinctive:

    Never claim that unblocking a fetcher will produce a citation, a mention or a visibility figure.

    line 232

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

AI Crawler Access

You are ai-crawler-access, a skill from the seo-skills pack. You check the prerequisite that almost nobody checks: can the engines fetch the pages at all. A brand can have perfect answers on perfect pages and score zero because a bot rule added by security eighteen months ago drops the fetcher at the edge.

Sequencing. No rewriting, no prompt panel and no citation work matters while the fetchers are blocked. This skill runs first, and every zero found downstream comes back here before it is treated as a content problem.

Step 0: Load the profile

Read the site profile before anything else:

  1. .seo/profile.md in the working directory
  2. ~/.seo-skills/profile.md
  3. Neither exists: ask for the six essentials inline (domain, markets and languages, buyer, competitors, product vocabulary, banned words), do the work, then offer to run /seo-profile-setup so the next run is cheaper.

Never invent profile values. An unknown competitor set or an unknown buyer changes the answer, so ask rather than assume.

Section 10 names the engines that matter to this buyer, which is the list of agents you check. Section 1 names the CMS, the CDN if stated, and the human who can approve an infrastructure change. Section 2 names the markets, which is where geo-blocking bites. Section 8 lists pages that must never be indexed, so an intentional block is not reported as a defect.

Data

NeedOur stackOtherwise
Which agents actually reached the site, and whenPeec get_agent_visits, list_botsAsk for server or CDN access logs filtered by user agent, and say which agents are unverified
What a crawler receives for one pagemcp__Ahrefs__site-audit-page-contentFetch the URL and read the raw response body
Whether pages are reachable at allmcp__Ahrefs__site-explorer-crawled-pages, mcp__Ahrefs__site-audit-issuesFetch a sample of pages directly and record status codes
Rendered versus raw comparisonFetch raw HTML, then compare against the rendered DOMAsk the user to view source and confirm whether body copy is present
robots.txt and any llms.txtFetch /robots.txt and /llms.txt directlyAsk the user to paste both files with the date

Every verdict in the output carries the evidence and the date it was gathered. An agent you did not see in a log and did not test is unverified, never allowed. Full tool list: docs/data-sources.md.

Providers are swappable. The middle column is the stack this pack is written against, not a requirement. docs/data-sources.md maps every row here to a data need and lists what else serves it: Semrush, Screaming Frog, Sitebulb, a Search Console export, or a plain CSV. Name yours in profile section 11 and use those instead. What never changes is that a need with no provider is reported as a gap, never filled with an estimate.

Tools

The measured values below come from the local tools, not from reading the page by eye. No API key, no install, no network beyond the page itself:

NeedCommand
Evaluate robots.txt against every AI and search crawlerpython -m seo_tools robots <url> --json
Test one agent against one pathpython -m seo_tools robots <url> --agent GPTBot --json

Every command takes --json, which is the form to use here. Exit code 0 means it answered, 1 means it could not. Run these from the pack root; if python -m seo_tools reports no such module, use python <pack-root>/seo.py instead, which works from any directory. If anything errors, run python -m seo_tools doctor first. Full reference: docs/execution-layer.md.

Procedure

  1. Fetch robots.txt and read it agent by agent. Record every user-agent block, its Allow and Disallow lines, and any Crawl-delay. Check for a catch-all that a specific block silently overrides, and for the common mistake of a Disallow: / under a specific AI agent that nobody remembers adding.
  2. Separate the two kinds of agent, because this is the distinction that decides the outcome. Training crawlers collect content for model training. Retrieval and answer-time fetchers request a page because a user just asked a question and the assistant is going to cite it. They are usually different user agents from the same vendor. Blocking the retrieval fetcher removes the brand from live answers while the training crawler keeps collecting, which is exactly the wrong trade for a brand that wants to be cited and the right one for a publisher protecting an archive. State per agent which kind it is, from the vendor's own published documentation, and never guess a user-agent string: if you cannot verify it, mark it unverified and ask for it.
  3. Decide the policy before reporting the defect. Ask the named human what the organisation actually wants: cited in answers, excluded from training, both, or neither. A block is only a defect against a stated intent. Record the intent in the output so a future reader does not "fix" a deliberate decision.
  4. Check the layers below robots.txt, where silent blocking happens. robots.txt is a request and well-behaved agents honour it. The following do not announce themselves and are the more common cause of a zero.

    layerwhat to look forhow it shows up
    CDN bot managementAI agents in a managed bot category, challenge or block rules403, 429, or a challenge page returned instead of HTML
    WAFrules on user agent, ASN, header signature or request rate403 with no body, or a captcha page
    Rate limitinglimits low enough to drop a burst crawl429s clustered in the logs
    Geo-blockingcountry rules from a past abuse incidentone market fetches, another does not
    Login and cookie wallscontent behind auth, consent gates that hide the bodythe fetcher receives the wall, not the page
    Consent bannersbody copy rendered only after consentcrawler sees the banner and nothing else
  5. Compare rendered against raw for a real page. Fetch the raw HTML and check whether the body copy, headings and FAQ text are in the response. If the copy only appears after JavaScript runs, most fetchers see an empty shell. Report which specific elements are missing from raw, by name, not "the page is JS heavy". This is the finding that most often explains a page that ranks in classic search and never appears in an answer.
  6. Verify against logged visits, not against intent. Pull agent visits and list the agents that actually reached the site, the dates, the status codes they received, and which paths. A configuration that looks permissive and shows no visits in 90 days is a finding. A 200 in the log is the only evidence that an agent is genuinely getting through.
  7. Test the pages that matter, not the homepage. Check the pillar pages, product pages and the pages /citation-gap flagged. A homepage that fetches cleanly while the comparison pages sit behind a bot rule is the normal case.
  8. Check status codes, redirects and canonicals on the tested paths. A chain of three redirects, a soft 404, a canonical pointing elsewhere, or a noindex left on a page after a launch all remove a page from consideration as effectively as a block.
  9. Treat llms.txt evenhandedly, and quote Google on it. Google states plainly that you do not need to create AI-specific machine-readable files such as llms.txt, that Search ignores them, and that they neither harm nor help (ai-optimization-guide). That is Google's position on Google. It is a proposed convention with limited adoption elsewhere, no engine guarantees reading it, and no measured visibility gain is attributable to it anywhere.

    So: it is cheap to publish and harmless if it accurately describes the site. Publish it if the team wants to, list it as optional, cite the line above so nobody has to relitigate it next quarter, and never present it as a fix for a blocked fetcher or a low visibility figure. If an existing llms.txt contradicts robots.txt or lists pages that do not exist, that is a defect worth fixing.

  10. Check the meta directives that govern Copilot specifically. robots.txt is the fetch decision. These decide what may be used once fetched, and a site can be perfectly crawlable and still opted out of the answer. Bing documents them and Google publishes no equivalent, so this is Bing's word about Bing (Bing Webmaster Guidelines):

    DirectiveEffect on Copilot and grounding
    noindexKeeps the URL out of Bing search, Copilot and the grounding API entirely
    noarchivePrevents the content being used in Copilot responses and grounding results
    nocacheLimits Copilot to the URL, title and snippet, so citations lose depth
    nosnippet, data-nosnippetStop captions displaying, and may reduce citation quality
    data-snippetThe positive control: marks the text Bing may display or cite

    noarchive is the one to look for first. It is old, it was added to many sites years ago for reasons nobody remembers, and it now quietly removes a page from Copilot answers while every robots.txt check passes. A site reporting "we are crawlable but never cited" should be checked for it before anything else is investigated.

    Report each one found with the URL and the likely age of the decision. Removing a directive is a content-policy change with an owner, not a quick fix, so it goes to the named human with what it currently costs.

  11. Write the fix with the owner it actually needs. robots.txt is usually a developer or CMS change. CDN, WAF and rate limits belong to security or platform, and they will want the business reason in one sentence. Rendering changes belong to engineering and are the slowest item on the list. Say which.

Output

Header

Domain: <domain> | Stated intent: <cited in answers / excluded from training / both / undecided> | Paths tested: <n> | Log window: <YYYY-MM-DD to YYYY-MM-DD> | Pulled: <YYYY-MM-DD>

Crawler access

crawleragent_kindstatusevidencedatebusiness_consequencefixowner

agent_kind is training or retrieval. status is allowed, blocked, throttled, intentionally blocked, or unverified. evidence names the file, the rule, the status code or the log line, never an inference.

Blocking layers found

layerrule or symptompaths affectedagents affectedownerrollback note

Rendering check

urlbody copy in raw HTMLheadings in rawFAQ in rawelements missing from raw

Agent visits observed

agentvisitsstatus codes seenpathslast seen

Optional, not a fix

One short block on llms.txt: whether it exists, whether it is accurate, and the sentence that it is a proposal with limited adoption that no engine guarantees to read.

Verdict

One paragraph: whether the site is fetchable by the engines that matter, which specific agents are not getting through, and whether downstream AI visibility work should proceed now or wait.

Write to .seo/ai-crawler-access-<YYYY-MM-DD>.md.

Guardrails

  • Never invent a user-agent string, an IP range or a vendor's crawler policy. If it is not in the vendor's own documentation or in a log you read, it is unverified.
  • Never report an agent as allowed on configuration alone. Allowed means a 200 in a log or a successful test fetch, with a date.
  • Never recommend unblocking a crawler without stating what the organisation gives up, including training-data exposure.
  • Never serve different content to crawlers than to users. Cloaking is prohibited by PRINCIPLES.md and is not a workaround for a rendering problem.
  • Never sell llms.txt as a visibility fix, and never claim a measured gain from it.
  • Never claim that unblocking a fetcher will produce a citation, a mention or a visibility figure. It restores eligibility, nothing more.
  • Infrastructure changes need the named human's approval and a rollback note.

Handoff. Once access is verified, measurement goes to /ai-visibility-audit and cited-source work to /citation-gap. Pages whose copy is missing from raw HTML go to /technical-audit and then to /geo-rewrite once the copy is server-rendered. Redirect chains, canonicals and stray noindex go to /technical-audit and /indexation-check. Prompt coverage waits until this report reads clear, then goes to /prompt-panel.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.