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
- Distinctive: line 15
Sequencing: No rewriting, no prompt panel and no citation work matters while the fetchers are blocked.
- Distinctive: line 21
Read the site profile before anything else:
- Distinctive: line 29
Never invent profile values.
- Very specific: line 48
Every verdict in the output carries the evidence and the date it was gathered.
- Very specific: line 69
Every command takes --json, which is the form to use here.
- Distinctive: line 93
Decide the policy before reporting the defect: Ask the named human what the organisation actually wants: cited in answers, excluded from …
- Very specific: line 124
Test the pages that matter, not the homepage: Check the pillar pages, product pages and the pages /citation-gap flagged.
- Distinctive: line 222
Never invent a user-agent string, an IP range or a vendor's crawler policy.
- Distinctive: line 225
Never report an agent as allowed on configuration alone.
- Distinctive: line 227
Never recommend unblocking a crawler without stating what the organisation gives up, including training-data exposure.
- Very specific: line 229
Never serve different content to crawlers than to users.
- Distinctive: line 231
Never sell llms.txt as a visibility fix, and never claim a measured gain from it.
- Distinctive: line 232
Never claim that unblocking a fetcher will produce a citation, a mention or a visibility figure.
≈ “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.
Files
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:
.seo/profile.mdin the working directory~/.seo-skills/profile.md- 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-setupso 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
| Need | Our stack | Otherwise |
| Which agents actually reached the site, and when | Peec get_agent_visits, list_bots | Ask for server or CDN access logs filtered by user agent, and say which agents are unverified |
| What a crawler receives for one page | mcp__Ahrefs__site-audit-page-content | Fetch the URL and read the raw response body |
| Whether pages are reachable at all | mcp__Ahrefs__site-explorer-crawled-pages, mcp__Ahrefs__site-audit-issues | Fetch a sample of pages directly and record status codes |
| Rendered versus raw comparison | Fetch raw HTML, then compare against the rendered DOM | Ask the user to view source and confirm whether body copy is present |
| robots.txt and any llms.txt | Fetch /robots.txt and /llms.txt directly | Ask 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:
| Need | Command |
| Evaluate robots.txt against every AI and search crawler | python -m seo_tools robots <url> --json |
| Test one agent against one path | python -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
- Fetch robots.txt and read it agent by agent. Record every user-agent block,
its
AllowandDisallowlines, and anyCrawl-delay. Check for a catch-all that a specific block silently overrides, and for the common mistake of aDisallow: /under a specific AI agent that nobody remembers adding. - 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.
- 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.
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.
layer what to look for how it shows up CDN bot management AI agents in a managed bot category, challenge or block rules 403, 429, or a challenge page returned instead of HTML WAF rules on user agent, ASN, header signature or request rate 403 with no body, or a captcha page Rate limiting limits low enough to drop a burst crawl 429s clustered in the logs Geo-blocking country rules from a past abuse incident one market fetches, another does not Login and cookie walls content behind auth, consent gates that hide the body the fetcher receives the wall, not the page Consent banners body copy rendered only after consent crawler sees the banner and nothing else - 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.
- 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.
- Test the pages that matter, not the homepage. Check the pillar pages,
product pages and the pages
/citation-gapflagged. A homepage that fetches cleanly while the comparison pages sit behind a bot rule is the normal case. - Check status codes, redirects and canonicals on the tested paths. A chain
of three redirects, a soft 404, a canonical pointing elsewhere, or a
noindexleft on a page after a launch all remove a page from consideration as effectively as a block. 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.
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):
Directive Effect 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 noarchiveis 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.
- 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
| crawler | agent_kind | status | evidence | date | business_consequence | fix | owner |
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
| layer | rule or symptom | paths affected | agents affected | owner | rollback note |
Rendering check
| url | body copy in raw HTML | headings in raw | FAQ in raw | elements missing from raw |
Agent visits observed
| agent | visits | status codes seen | paths | last 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.mdand 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.
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- jstanx/aeo-toolkit★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- accessibility-auditSkill
- ai-visibility-auditSkill
- cannibalisation-auditSkill
- citation-gapSkill
- competitor-gapSkill
- content-briefSkill
- content-decaySkill
- demand-trendsSkill
- drift-checkSkill
- geo-rewriteSkill
- heading-architectSkill
- indexation-checkSkill
- internal-linkingSkill
- keyword-discoverySkill
- keyword-page-mappingSkill
- keyword-prioritisationSkill
- meta-writerSkill
- page-optimiserSkill
- performance-reportSkill
- prompt-panelSkill
- schema-builderSkill
- seo-profile-setupSkill
- serp-analysisSkill
- site-auditSkill
- site-inventorySkill
- snippet-targetingSkill
- technical-auditSkill
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.

