Skip to main content
Glama
QueryRevAI

QueryRev AI Readiness

Official
README.md
# QueryRev AI Readiness

Checks how a site's public files treat AI crawlers: which of 11 AI crawlers robots.txt lets in, whether the llms.txt is a real llms.txt, and what the home page says without running scripts. Every result is a finding with its evidence. There are no scores, no model calls and no telemetry.

```
npx @queryrev/ai-readiness check www.example.com
```

Requires Node 22.19 or later. One runtime dependency (`undici`).

## Install

```
npx @queryrev/ai-readiness <command>      # no install
npm install --global @queryrev/ai-readiness
ai-readiness <command>
```

## Commands

| Command                                  | What it does                                                                                           |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `check <url>`                            | Crawler access, llms.txt, the home page as served, structured data and the sitemap                     |
| `robots test <file\|url> --agent --path` | Which robots.txt line decides for a crawler and a path. A file is read offline                         |
| `llms validate <file\|url> [--links]`    | Checks an llms.txt against [llmstxt.org](https://llmstxt.org); `--links` also requests up to 20 links |
| `llms generate <url> [--max-pages 30]`   | Builds the skeleton of an llms.txt from the site's own sitemap or home page links                      |
| `crawlers`                               | The crawlers covered, with vendor and purpose                                                          |

Options: `--json`, `--fail-on fail|warn`, `--allow-private-network`, `--no-color`, `--help`, `--version`. Options go after the command.

### `check`

```
$ ai-readiness check www.example.com
AI readiness check: https://www.example.com

Crawler access (robots.txt, whole site)
  Crawler             Purpose   Access
  GPTBot              training  allowed
  OAI-SearchBot       search    allowed
  ...

Findings
  PASS  robots-txt                  robots.txt found (77 bytes).
  PASS  sitemap-in-robots           robots.txt lists a sitemap.
        | https://www.example.com/sitemap.xml
  PASS  ai-search-crawler-access    All 5 AI search and user-fetch crawlers on the list can read the home page.
  INFO  ai-training-crawler-access  No AI training crawler on the list is blocked. Blocking them is the site's choice.
  WARN  organization-same-as        The Organization has no sameAs link to a profile on another site.
  ...

13 pass, 1 warn, 0 fail, 2 info
```

`check` asks for four files, in this order, and only where robots.txt lets this tool in: `/robots.txt`, the home page, `/llms.txt` and the sitemap. If robots.txt cannot be read, nothing else is requested and the exit code is 3.

Training crawlers are reported but never counted as a failure: blocking them is the site's choice. A crawler for AI search or for fetching a page when a user asks is a `fail` when robots.txt keeps it from the home page.

### `robots test`

```
$ ai-readiness robots test robots.txt --agent OAI-SearchBot --path /account/settings
  FAIL  robots-access  OAI-SearchBot may not fetch /account/settings: the "*" group (line 9), decided by line 10 (Disallow: /account/).
        | line 10: Disallow: /account/
```

With `--agent` the exit code answers the question: 0 when the crawler may fetch the path, 1 when it may not. Any token can be tested; the tool suggests only the crawlers it covers. Without `--agent` it tests every covered crawler.

Matching follows RFC 9309: the group that names the token applies, else the `*` group; the longest matching rule wins and `Allow` wins a tie.

### `llms validate`

```
$ ai-readiness llms validate https://www.example.com --links
  PASS  llms-txt-found     The file is an llms.txt.
  PASS  llms-txt-h1        The file has one H1, as llmstxt.org asks.
  PASS  llms-txt-summary   The file has a summary blockquote.
  PASS  llms-txt-sections  The file has 2 H2 sections of links and 14 links in all.
  FAIL  llms-txt-links     1 of 14 checked links answer 404 or 410.
        | 404 https://www.example.com/old-guide
```

A 200 alone is not enough: an HTML page, or a robots.txt, served at `/llms.txt` is reported as not being an llms.txt, and so is text that does not open with a Markdown H1. For a local file, `--links` needs `--base <site address>` to resolve the links.

### `llms generate`

```
$ ai-readiness llms generate https://www.example.com --max-pages 30 --out llms.txt
```

Reads robots.txt, then the sitemaps it lists (at most 5 files), else the links on the home page. Only pages on the same site are listed; pages that say `noindex`, redirect elsewhere or are closed to this tool by robots.txt are left out. Each page's title and meta description are used as the page wrote them. The result is a skeleton: read it and edit it before you publish it. With `--out` the file is written only if it does not exist, unless `--force` is given. Without `--out` the file goes to standard output and the notes to standard error.

## Crawlers covered

Crawlers covered: the 11 AI crawlers on this list, from OpenAI, Perplexity, Google, Apple, Common Crawl, Meta, Amazon and ByteDance. Other crawlers are not checked.

| Crawler            | Vendor       | Purpose  |
| ------------------ | ------------ | -------- |
| GPTBot             | OpenAI       | training |
| OAI-SearchBot      | OpenAI       | search   |
| ChatGPT-User       | OpenAI       | user     |
| PerplexityBot      | Perplexity   | search   |
| Perplexity-User    | Perplexity   | user     |
| Google-Extended    | Google       | training |
| Applebot-Extended  | Apple        | training |
| CCBot              | Common Crawl | training |
| Meta-ExternalAgent | Meta         | training |
| Amazonbot          | Amazon       | search   |
| Bytespider         | ByteDance    | training |

The line is printed at the end of `check`, `crawlers`, `llms validate`, `llms generate` and `robots test` without `--agent`, and is the `crawlersCovered` field of their JSON. `robots test --agent` tests the one token you name, covered or not. Nothing here says "all AI crawlers".

## What it cannot see

It reads public files over HTTP, as one visitor from your machine. It cannot see:

- a CDN or firewall rule that answers AI crawlers differently from how it answers this tool (a crawler that robots.txt allows can still be blocked at the network edge);
- what a crawler actually fetches, how often, or whether a page is cited by an AI answer;
- content that only appears after scripts run: the home page is read as served, without scripts;
- anything behind a login, a bot check or a block of this tool's own address.

## Network behaviour

The tool is meant to be run by anyone against any address, so it is strict about what it touches.

- User agent: `Mozilla/5.0 (compatible; QueryRev-AIReadiness/1.0; +https://queryrev.com/bot)`. Its robots.txt token is `QueryRev-AIReadiness`, and it obeys the rules written for that token (or `*`), including `Crawl-delay` up to 10 seconds.
- `check` and `llms generate` request a file only where robots.txt lets this tool in. `robots test` and `llms validate` fetch the one file you point them at; `llms validate --links` asks robots.txt before it requests each link.
- `GET` only. No cookies, no credentials, no proxy taken from the environment.
- Only `http` and `https`, only ports 80 and 443, no user name or password in the address, no IP-literal hosts, host names of at most 253 characters.
- The host name is resolved once and the connection goes to the address that was checked. Private, loopback, link-local, cloud metadata and other special-purpose ranges are refused.
- At most 3 redirects, each checked again; a redirect to another site is not followed.
- 5 seconds to connect, 10 seconds a request, 30 seconds for `check`, 120 seconds for `llms generate`.
- Size limits, counted after decompression and reported when reached: robots.txt 500 KiB, llms.txt 1 MiB, pages 2 MiB, sitemaps 5 MiB.
- One request a second to a host. The tool stops asking a host that answers 429 or 503.
- Text from a site is stripped of control and escape characters before it is printed.
- `--allow-private-network` lets the command line reach a staging site on a private network. It never opens cloud metadata addresses, IP-literal hosts or other ports. The library entry point has no such option.
- Nothing is sent to queryrev.com or to anyone but the site you ask about. There is no telemetry, no account and no key. The "Full report" link at the end of a report is printed, not opened.

## Use in CI

The exit code is the contract:

| Code | Meaning                                                                               |
| ---- | ------------------------------------------------------------------------------------- |
| 0    | Nothing at or above `--fail-on` (`fail` by default; `warn` to be stricter)            |
| 1    | Checks failed                                                                         |
| 2    | Usage error: a wrong command, option or input file                                    |
| 3    | The site could not be read: refused, unreachable, timed out, or robots.txt unreadable |
| 4    | Internal error                                                                        |

```
npx @queryrev/ai-readiness check https://www.example.com --fail-on fail
```

`--json` prints one JSON document on standard output and nothing else, for every exit code, errors included:

```json
{
  "schemaVersion": 1,
  "command": "check",
  "exitCode": 0,
  "failOn": "fail",
  "summary": { "pass": 13, "warn": 1, "fail": 0, "info": 2 },
  "site": { "origin": "https://www.example.com", "crawlerAccess": [], "findings": [] }
}
```

`schemaVersion`, the flags and the exit codes are the contract: a change to them is a major version. Within version 1, fields may be added. Each finding has a stable `id`, a `level` (`pass`, `warn`, `fail` or `info`), one sentence in `message`, a `docUrl`, and its evidence in `snippet` when there is one.

The `examples/` folder has a CI script that acts on the exit codes (`ci.sh`), a plain-Node consumer of the JSON (`read-report.mjs`), and a robots.txt with a script that tests it (`robots.txt`, `robots-check.sh`).

## In an MCP client and in GitHub

- **MCP server.** [`@queryrev/ai-readiness-mcp`](https://www.npmjs.com/package/@queryrev/ai-readiness-mcp) offers the same checks as tools and works with any MCP client that starts a local server: `npx -y @queryrev/ai-readiness-mcp`. Each tool returns the document that `--json` prints. Its source is the `mcp/` folder of this repository.
- **GitHub Action.** [`QueryRevAI/ai-readiness-action`](https://github.com/QueryRevAI/ai-readiness-action) fails a pull request when a change to `robots.txt` or `llms.txt` closes the site to AI search crawlers. It is offline by default.

## Licences

- The code is MIT (see `LICENSE`).
- The data under `data/` is CC BY 4.0 (see `data/LICENSE`). Credit it by citing the dataset below.

## How to cite

Cite the software with the metadata in `CITATION.cff` (GitHub shows a "Cite this repository" button). The crawler study the covered list comes from is a dataset under CC BY 4.0:

> QueryRev Research. State of AI Crawler Access (October 2026). Zenodo. https://doi.org/10.5281/zenodo.23424275

## Contributing

Issues and pull requests are welcome at https://github.com/QueryRevAI/ai-readiness. This repository is updated by release snapshots, so we apply an accepted change ourselves and credit you as a co-author on the commit; the next release carries it. A pull request is therefore closed with a note instead of being merged.

A new crawler for the covered list needs a link to the vendor's own documentation of its token.

## Security

Report a vulnerability to **security@queryrev.com**, not in a public issue. See `SECURITY.md`.

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

The five tools have mostly distinct roles: an aggregate audit (check), a focused robots.txt line matcher (robots_test), an llms.txt validator, an llms.txt generator, and a static crawler registry. The only real overlap is that `check` subsumes some robots.txt and llms.txt inspection that robots_test and llms_validate perform in depth, but the descriptions make the aggregate-vs-deep-dive boundary clear.

Naming Consistency3/5

Three tools follow a clear noun_verb pattern (robots_test, llms_validate, llms_generate), but `check` is a bare verb and `crawlers` a bare noun, so the pattern is not predictable across the set. Readable, but an agent cannot infer a name from a new operation.

Tool Count5/5

Five tools is well matched to a narrow AI-readiness auditing domain, with each tool covering a distinct artifact (robots.txt, llms.txt validation, llms.txt generation, crawler list, full audit). Nothing appears redundant or padded.

Completeness4/5

The surface covers the core lifecycle: enumerate crawlers, test robots rules, validate and generate llms.txt, and run a combined audit. Minor gaps exist in that structured-data and sitemap analysis are only reachable through the aggregate `check`, with no dedicated or configurable operation for them.

Maintenance

ActivityMaintained
ResponsivenessNo issues