# How to Check If AI Systems Can Find and Cite Your Site (in 5 Minutes)

> Source: <https://dev.to/rudrendu_paul/how-to-check-if-ai-systems-can-find-and-cite-your-site-in-5-minutes-545g>
> Published: 2026-07-28 16:51:42+00:00

*Co-authored by Rudrendu Paul and Sourav Nandy.*

**Repo:** [github.com/RudrenduPaul/LLMScout](https://github.com/RudrenduPaul/LLMScout), a zero-dependency, cross-platform CLI that runs 21 GEO/AEO checks against any website. `npm install -g llmscout-cli`

or `pip install llmscout-cli`

.

Position-1 click-through rate on keywords that trigger an AI Overview fell from 7.3% in December 2023 to 1.6% in December 2025, per Ahrefs. If an AI system can't find or cite your site, that traffic doesn't come back on its own. Here's how to check where your own site actually stands, in under five minutes.

LLMScout is a CLI that runs 21 checks against any site: 12 covering technical SEO fundamentals, 9 covering GEO signals specifically for AI systems. Every check reports PASS, WARN, or FAIL, and the whole run exits with a machine-readable code, so it drops straight into CI. It ships as two distributions: an npm package with two runtime dependencies, and a Python package with zero. Neither one needs a headless browser.

One check worth knowing about before you run it is `ai-crawler-directives`

. It reports on all 7 major AI bots separately, because blocking GPTBot (which trains models) does nothing to stop OAI-SearchBot (which does live retrieval for ChatGPT) from fetching and citing your page. They're independently configurable in robots.txt, and most tools treat them as a single signal.

There are two ways to install it. If you're not sure which one you want, try npm first:

```
npm install -g llmscout-cli
```

This needs Node 18+, and it pulls in exactly two runtime dependencies: `cheerio`

and `commander`

. No Python, no browser download, no subprocess calls.

If you'd rather use Python:

```
pip install llmscout-cli
```

This version has zero runtime dependencies; it's pure standard library. It runs the same 21 checks and gives the same PASS/WARN/FAIL verdicts as the npm version.

Both install in under a minute on Windows, macOS, and Linux.

Once installed, point it at a site:

```
llmscout init ./my-site --site-url https://yourdomain.com
llmscout check ./my-site
```

`init`

writes an `llmscout.json`

config file into `./my-site`

. `check`

fetches the URL in that config and runs all 21 checks against it.

Here's real output from running `check`

against example.com:

```
LLMScout check -- https://example.com

[PASS] (technical) Title tag
  Title "Example Domain" is 14 characters, within the recommended 10-60 range.

[WARN] (technical) Meta description
  No meta description found.
  Fix: Add <meta name="description" content="..."> with 50-160 characters summarizing the page.

[WARN] (technical) Canonical tag
  No <link rel="canonical"> tag found.
  Fix: Add a canonical link tag pointing at the preferred URL for this page.

[FAIL] (technical) robots.txt
  robots.txt was not reachable at https://example.com/robots.txt (HTTP 404).
  Fix: Add a robots.txt file at your site root, even a permissive one, so crawlers
  and agents have explicit directives.

[WARN] (technical) sitemap.xml
  No sitemap was reachable (tried: https://example.com/sitemap.xml).
  Fix: Add a sitemap.xml at your site root, or point to one with a Sitemap: directive
  in robots.txt, to help search engines discover pages.

[PASS] (technical) Heading structure
  Exactly one <h1> and no skipped heading levels detected.

[WARN] (geo) Structured data (JSON-LD)
  No JSON-LD structured data found.
  Fix: Add schema.org JSON-LD markup (e.g. Organization, WebSite, or Article) so
  generative engines can understand the page's entities.

[WARN] (geo) AI crawler directives
  robots.txt is unreachable, so AI-crawler directives could not be determined.
  Fix: Add a reachable robots.txt if you want to state an explicit policy for AI
  crawlers (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot,
  Google-Extended, Applebot-Extended).

Summary: 6 PASS, 14 WARN, 1 FAIL (21 checks)
```

There are three things worth understanding about that output.

FAIL exits with code 1. At least one check failed outright, and that's the signal a CI pipeline should gate on. WARN is a missed optimization; it won't fail the run on its own. PASS means the check came back clean.

Notice the dependency between the last two checks: because robots.txt is unreachable, `ai-crawler-directives`

can't determine any policy, so it reports WARN instead of FAIL. An unreachable robots.txt and one that explicitly blocks every AI bot are different problems with different fixes, and the tool keeps that distinction explicit instead of collapsing both into one warning.

Every WARN and FAIL comes with a fix suggestion built in. You don't need to look up what a canonical tag is or how to add one; the fix line tells you.

For CI, add `--json`

and the output becomes something a script can actually parse:

```
llmscout --json check ./my-site
```

Exit codes: `0`

for a clean run, `1`

if at least one check FAILed, `2`

for a usage or config error. That's enough to fail a build on a new FAIL without writing your own parser logic.

The JSON includes per-check `id`

, `status`

, `message`

, and `fix`

fields, plus a `summary`

object with the totals. Wire it into a pre-merge check and a PR that regresses on structured data or robots.txt breaks the build instead of shipping quietly. The full schema is in the README.

If you manage more than one site, `llmscout fleet`

takes a JSON manifest of site paths and runs the full 21-check suite against every one of them in a single command. `--out-dir`

writes one auto-named report file per site instead of dumping everything to stdout at once.

```
llmscout fleet ./fleet.json --out-dir ./reports
```

The manifest:

```
{
  "sites": [
    { "name": "client-a", "path": "./clients/client-a" },
    { "name": "client-b", "path": "./clients/client-b" }
  ]
}
```

That produces `client-a.txt`

and `client-b.txt`

(or `.json`

with `--json`

), one report per site, named straight from the manifest's `name`

field. That gives an agency a separate, named report file per client that you can open, send, or archive, instead of scrolling back through one combined terminal dump.

The checks cover the signals that matter most for AI-system citability: structured data, crawler access policies, content extractability, entity markup. Contested signals, like `llms.txt`

, are flagged as informational since the evidence for their impact is still developing. Run it against your own site and see where you actually stand.

GitHub: [https://github.com/RudrenduPaul/LLMScout](https://github.com/RudrenduPaul/LLMScout)

npm: [https://www.npmjs.com/package/llmscout-cli](https://www.npmjs.com/package/llmscout-cli)

PyPI: [https://pypi.org/project/llmscout-cli/](https://pypi.org/project/llmscout-cli/)

*Co-authored by Rudrendu Paul and Sourav Nandy. Rudrendu is an AI/ML builder and published researcher (ICML, Springer Nature, Elsevier, IEEE) with 15+ years of experience at Fortune 50 companies, building open-source tools for the AI development ecosystem. Find the code at github.com/RudrenduPaul.*
