DEV Community

Rudrendu Paul
Rudrendu Paul

Posted on

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

Co-authored by Rudrendu Paul and Sourav Nandy.

Repo: 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.

What LLMScout checks

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.

Install

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

npm install -g llmscout-cli
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Run your first check

Once installed, point it at a site:

llmscout init ./my-site --site-url https://yourdomain.com
llmscout check ./my-site
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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.

JSON output and CI

For CI, add --json and the output becomes something a script can actually parse:

llmscout --json check ./my-site
Enter fullscreen mode Exit fullscreen mode

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.

Fleet mode for multiple sites

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
Enter fullscreen mode Exit fullscreen mode

The manifest:

{
  "sites": [
    { "name": "client-a", "path": "./clients/client-a" },
    { "name": "client-b", "path": "./clients/client-b" }
  ]
}
Enter fullscreen mode Exit fullscreen mode

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.

Wrap up

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
npm: https://www.npmjs.com/package/llmscout-cli
PyPI: 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.

Top comments (1)

Collapse
 
citedy profile image
Dmitry Sergeev

finally someone made a tool for this, ngl i've been wondering how to actually track citations instead of just guessing.