---
title: "Agent readability checker: llms.txt, robots.txt, JSON-LD"
canonical: https://wavect.io/tools/agent-readability-checker/
language: en
description: "Free browser-local AI visibility check. Paste robots.txt, llms.txt, a Markdown mirror, or page HTML and get 42 deterministic checks on whether answer engines can read and cite you."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

BROWSER-LOCAL AI VISIBILITY CHECK

# Find out whether an answer engine can read you, without paying for an audit.

Paste one file. The checker runs the same mirror rules that hard-fail this website's own production build, then returns a score, the evidence line behind every finding, and the fix. Nothing is fetched and nothing is uploaded.

[Run a check](#tool-app) [How it works](https://github.com/wavect/agent-readability-checker)

- Rules 42 deterministic checks
- Processing Local and offline
- Inputs robots.txt, llms.txt, Markdown, HTML
- Verdict Evidence, not a ranking promise

**READABILITY**

ROBOTS.TXT · PASTED **48/100 · patchy**

Local analysis · nothing fetched

THE DIRECT ANSWER

To check whether AI answer engines can cite your site, verify four things: that retrieval fetchers such as OAI-SearchBot, PerplexityBot, and Claude-User are not disallowed in robots.txt, that a clean Markdown or llms.txt copy exists and is advertised in the page head, that your JSON-LD is valid and names the organisation behind the page, and that the HTML you serve already contains the text instead of loading it with JavaScript. This tool checks all four from a file you paste. It cannot prove that any assistant will actually cite you.

CHECK THE FILE YOU ACTUALLY SERVE

## Agent readability bench

Paste the complete file, not an excerpt. Curl the URL and paste the response body, so you are checking what a fetcher receives rather than what your CMS shows you.

Nothing leaves this tab

**Agent readability bench** Static · deterministic · browser-local

Load sample Check locally

01

### File contents

Waiting for input

File type Detect automaticallyrobots.txtllms.txtMarkdown mirrorPage HTML File contents

Shortcut: Ctrl or Command + Enter. Maximum input: 400,000 characters.

02

### Findings

Not checked

Paste a complete file to see the score, the rules that failed, and the evidence line for each one.

Readability score

03

### Evidence and exports

A score measures whether agents can read this file. It does not predict that an assistant will cite you.

Analysis stays in this browser tab No URL is ever requested No upload and no persistence Core v0.1.4

THREE MOVES

## Check what a fetcher receives, not what your CMS previews.

Those are different files more often than people expect, and the difference is where AI visibility quietly dies.

1. 01 - **Fetch the real file** - Curl your robots.txt, llms.txt, Markdown mirror, or page URL and copy the response body. A preview inside your CMS is rendered by your CMS, not served to a crawler.
2. 02 - **Paste and check locally** - The checker works out which of the four file types you pasted, runs only the rules that apply to it, and prints the line that triggered each finding.
3. 03 - **Fix the criticals first** - Export the JSON or Markdown report and start at the top. Criticals are the findings that remove you from answers outright, and there are rarely more than two.

READ THE EVIDENCE, NOT A MAGIC SCORE

## Three results worth understanding

The interesting cases are the files that look careful and are not.

Looks deliberate, blocks everything `User-agent: GPTBot Disallow: / User-agent: * Disallow: /` **AR103 critical**

Blocking GPTBot is a training opt-out. The wildcard underneath takes every answer-engine fetcher with it, because a crawler with no group of its own inherits the wildcard.

Training blocked on purpose `User-agent: CCBot Disallow: / Sitemap: https://example.com/sitemap.xml` **AR104 low, score 98**

The same shape without the wildcard. Opting out of training is a licensing decision, so it is reported and it does not sink the grade.

llms.txt with relative links `- [Fractional CTO](/services/fractional-cto-austria/): leadership` **AR204 high**

llms.txt gets fetched and passed around detached from the page it came from, so there is no base URL left to resolve against. Absolute links or nothing.

WHY WE CAN CLAIM THIS

## These rules already run against our own site on every build.

The Markdown mirror rules are ported from the verifier that hard-fails this website's production build. We are not describing a best practice we read about somewhere. We are handing you the gate we have to pass ourselves.

### Ported, not invented

The mirror rules come from scripts/verify_machine_markdown.mjs in this site's repository. If one of them is wrong, our own deploys break before your audit does.

### Retrieval and training are different questions

Blocking GPTBot opts you out of model training. Blocking OAI-SearchBot removes you from answers. Most robots.txt files treat these as one decision, so the checker scores them apart.

### Evidence over score

Every finding prints the line that triggered it and the fix. A number you cannot audit is a sales instrument, not a diagnostic.

### No fetching, by design

The checker never requests a URL. Your staging hosts and internal paths stay out of everyone's logs, including ours.

HONEST LIMITS

## What a static check cannot tell you

- It reads one pasted file. It does not crawl your site, follow links, or compare pages against each other.
- A clean result means nothing is blocking an agent from reading this input. It does not predict that any assistant will cite you.
- robots.txt is a request. Well-behaved fetchers honour it and others ignore it, so a permissive file is not a guarantee either.
- Findings marked heuristic are inferred from the shape of the file rather than proven. Confirm those by hand.
- Crawler names change. The agent lists are accurate as of the core version shown and will need updating over time.

## Questions about the readability checker

### Is this the same thing as an SEO audit?

No. An SEO audit asks whether you rank. This asks a narrower and more mechanical question: can an agent fetch this file, parse it, and attribute it to you. Those checks are deterministic, which is why a tool can answer them and why a score you can audit is possible at all.

### Why does it not just fetch my URL?

Because a browser cannot fetch an arbitrary site without a proxy, and running one would mean your URLs, staging hosts, and internal paths pass through our infrastructure. Every tool we publish keeps the input in your tab, so pasting is the honest version of this tool rather than the limited one.

### Should I block GPTBot?

That is a licensing decision, not a visibility one, and the tool treats it that way. Blocking GPTBot or CCBot opts you out of training data. It does not remove you from ChatGPT or Perplexity answers, because those are served by separate retrieval fetchers. Blocking the retrieval fetchers is what removes you from answers.

### Do I need an llms.txt file?

It is not a standard and no engine is obliged to read it. It is cheap to publish and it gives an agent a clean map instead of your rendered navigation, so we run one. If you publish one, the rules here are worth passing, starting with absolute URLs.

### What does the score actually mean?

It starts at 100 and deducts per finding, weighted by severity, so one critical cannot be outweighed by a pile of passes. It measures machine legibility of the file you pasted. It is not a prediction, a ranking, or a certification.

### Can you fix the findings for us?

Yes, that is the service behind the tool. The checker is deliberately complete on its own, so you can run it, read the evidence, and hand the report to whoever you like, including your current team.

SUPPORT AND SECURITY

## Report a wrong rule

A rule that fires on correct output is a bug and we want to hear about it. Open an issue with the input that triggered it. If you find something with security impact, report it privately instead.

[Open an issue](https://github.com/wavect/agent-readability-checker/issues) [Report privately](https://github.com/wavect/agent-readability-checker/security)

FREE · OPEN SOURCE · NOTHING LEAVES YOUR TAB

## Run it on your robots.txt first.

That one file decides whether any of the rest matters. If a retrieval fetcher is disallowed there, no amount of structured data will get you cited.

[Return to the checker](#tool-app) [View the source](https://github.com/wavect/agent-readability-checker)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/tools/agent-readability-checker/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-18",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-18",
      "url": "https://wavect.io/tools/agent-readability-checker/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "applicationCategory": "DeveloperApplication",
  "browserRequirements": "JavaScript capable browser",
  "codeRepository": "https://github.com/wavect/agent-readability-checker",
  "description": "Free browser-local AI visibility check. Paste robots.txt, llms.txt, a Markdown mirror, or page HTML and get 42 deterministic checks on whether answer engines can read and cite you.",
  "isAccessibleForFree": true,
  "name": "Agent Readability Checker",
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "EUR"
  },
  "operatingSystem": "Any modern browser",
  "softwareVersion": "0.1.4",
  "url": "https://wavect.io/tools/agent-readability-checker/"
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/",
      "name": "Home",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/tools/",
      "name": "Small tools for jobs that should not stay annoying.",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/tools/agent-readability-checker/",
      "name": "Agent Readability Checker",
      "position": 3
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. An SEO audit asks whether you rank. This asks a narrower and more mechanical question: can an agent fetch this file, parse it, and attribute it to you. Those checks are deterministic, which is why a tool can answer them and why a score you can audit is possible at all."
      },
      "name": "Is this the same thing as an SEO audit?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Because a browser cannot fetch an arbitrary site without a proxy, and running one would mean your URLs, staging hosts, and internal paths pass through our infrastructure. Every tool we publish keeps the input in your tab, so pasting is the honest version of this tool rather than the limited one."
      },
      "name": "Why does it not just fetch my URL?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "That is a licensing decision, not a visibility one, and the tool treats it that way. Blocking GPTBot or CCBot opts you out of training data. It does not remove you from ChatGPT or Perplexity answers, because those are served by separate retrieval fetchers. Blocking the retrieval fetchers is what removes you from answers."
      },
      "name": "Should I block GPTBot?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It is not a standard and no engine is obliged to read it. It is cheap to publish and it gives an agent a clean map instead of your rendered navigation, so we run one. If you publish one, the rules here are worth passing, starting with absolute URLs."
      },
      "name": "Do I need an llms.txt file?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "It starts at 100 and deducts per finding, weighted by severity, so one critical cannot be outweighed by a pile of passes. It measures machine legibility of the file you pasted. It is not a prediction, a ranking, or a certification."
      },
      "name": "What does the score actually mean?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, that is the service behind the tool. The checker is deliberately complete on its own, so you can run it, read the evidence, and hand the report to whoever you like, including your current team."
      },
      "name": "Can you fix the findings for us?"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
