Skillsllms.txt

Add an llms.txt that cannot go stale, with your agent

An agent skill for a site’s own repository. It gathers the facts the site already states, lists every page in the sitemap with its own title and description, serves the file from the same data as the pages, adds tests that catch a new page, and checks the live file with mttr. Its effect on AI visibility is unproven1,2, and the skill says so.

An illustration, from the skill’s worked example. The business is made up.

Version 1.1.2Updated October 23, 2026

Install itSKILL.mdCheck a site for llms.txt

What it does

It builds the file from what the site already says, serves it from the same data as the pages so it cannot drift, and adds the test that fails when a page is left out.

  1. 1Gather the factsCollect the business's facts from the site itself, and only from the site.
  2. 2List every pageThe sitemap is the source of truth: every page in it that can be indexed is listed once. The home page is the exception, since the file is about it.
    HTML
    <sitemap><loc>
  3. 3Write the file
  4. 4Serve itPick by how the site makes its pages. The code for each stack is in references/stacks.md.
    File
    /llms.txt
  5. 5Test itAdd these tests to the site's own test suite.
  6. 6Check it with mttrShip as the person allows, then check the live file.
    Terminal
    curl -sI https://<domain>/llms.txt

https://mttr.si/ai-crawler-checker?url=example.comwhether the live file is there, beside which AI crawlers are let in

The file it writes

The shape of the file, as step 3 gives it, after the llms.txt proposal. Every fact is one the site already states, and every page is listed with its own title and description.

llms.txt

The tests it adds

The site’s own test suite gets these, so a new page that is not in the file fails a test.

  1. 1The file starts with # Business name and a > summary.
  2. 2Every address in the sitemap appears in the file. This is the test that catches a new page. Check the other way too: every page address in the file is in the sitemap, which catches a retired page.
  3. 3The file has no HTML and no dashes used as punctuation, every link is an absolute https address on the site's own domain, and every ## section holds only links.
  4. 4The footer links to it.
  5. 5For a static file, the --check mode passes in the test suite.
  6. 6For an unbranded or white-label site, the operator's name and phone number do not appear.

When to use it

Reach for it when

  • mttr reports the llms-txt finding.
  • You want one plain outline of the site for any agent or assistant that asks.
  • You run several sites from one app and each needs its own file.

Leave it when

  • You expect it to move rankings or citations. No major assistant has said it reads the file.1
  • The site has no sitemap and no list of its pages yet: make that first.

Your agent loads it when a request matches the description in SKILL.md, or when you call it by name. A request like this one does:

A request that loads it
Add an llms.txt to this site from our sitemap, with a test that fails when a page is missing.
The description your agent matches

Adds a /llms.txt to a website, a plain text outline of the whole site for AI assistants, built from the site's own pages and facts so it cannot go stale, with tests that catch a missing page, and checks it with mttr. Use when asked to add, fix or update llms.txt, to outline a site for AI assistants or agents, or when mttr reports the llms-txt finding. Works for one site or a network of sites served from one app. Not a way to rank, as its effect on AI visibility is unproven.

What it calls

The three mttr tools its files call over MCP, in the order they first appear. Each links to its entry in the API reference.

And one address on mttr.si an agent can reach with no key:

  • /ai-crawler-checker?url=<domain>

Install it

The skill is a folder, mttr-llms-txt, with five files. Run the commands from the top of the site's repository, so everyone who works in it gets the skill. Your agent also needs mttr connected over MCP for the calls above: connecting an agent shows how.

Claude Code

Loads skills from .claude/skills/ in the repository, for everyone who works in it, or ~/.claude/skills/ for every project on your machine. Claude uses it when a request matches its description, or type /mttr-llms-txt.

Terminal, for Claude Code
mkdir -p .claude/skills/mttr-llms-txt/references
curl -fsSL https://mttr.si/skills/llms-txt/SKILL.md -o .claude/skills/mttr-llms-txt/SKILL.md
curl -fsSL https://mttr.si/skills/llms-txt/references/example.md -o .claude/skills/mttr-llms-txt/references/example.md
curl -fsSL https://mttr.si/skills/llms-txt/references/format.md -o .claude/skills/mttr-llms-txt/references/format.md
curl -fsSL https://mttr.si/skills/llms-txt/references/stacks.md -o .claude/skills/mttr-llms-txt/references/stacks.md
curl -fsSL https://mttr.si/skills/llms-txt/references/verify.md -o .claude/skills/mttr-llms-txt/references/verify.md
PowerShell, for Claude Code
New-Item -ItemType Directory -Force .claude\skills\mttr-llms-txt\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/llms-txt/SKILL.md -OutFile .claude\skills\mttr-llms-txt\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/example.md -OutFile .claude\skills\mttr-llms-txt\references\example.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/format.md -OutFile .claude\skills\mttr-llms-txt\references\format.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/stacks.md -OutFile .claude\skills\mttr-llms-txt\references\stacks.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/verify.md -OutFile .claude\skills\mttr-llms-txt\references\verify.md -UseBasicParsing

Puts the files in .claude/skills/mttr-llms-txt/.

Codex

Loads skills from .agents/skills/ in the repository and its parent folders, or ~/.agents/skills/ for every project. Codex uses it when a task matches its description, or mention it as $mttr-llms-txt; /skills lists them.

Terminal, for Codex
mkdir -p .agents/skills/mttr-llms-txt/references
curl -fsSL https://mttr.si/skills/llms-txt/SKILL.md -o .agents/skills/mttr-llms-txt/SKILL.md
curl -fsSL https://mttr.si/skills/llms-txt/references/example.md -o .agents/skills/mttr-llms-txt/references/example.md
curl -fsSL https://mttr.si/skills/llms-txt/references/format.md -o .agents/skills/mttr-llms-txt/references/format.md
curl -fsSL https://mttr.si/skills/llms-txt/references/stacks.md -o .agents/skills/mttr-llms-txt/references/stacks.md
curl -fsSL https://mttr.si/skills/llms-txt/references/verify.md -o .agents/skills/mttr-llms-txt/references/verify.md
PowerShell, for Codex
New-Item -ItemType Directory -Force .agents\skills\mttr-llms-txt\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/llms-txt/SKILL.md -OutFile .agents\skills\mttr-llms-txt\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/example.md -OutFile .agents\skills\mttr-llms-txt\references\example.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/format.md -OutFile .agents\skills\mttr-llms-txt\references\format.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/stacks.md -OutFile .agents\skills\mttr-llms-txt\references\stacks.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/verify.md -OutFile .agents\skills\mttr-llms-txt\references\verify.md -UseBasicParsing

Puts the files in .agents/skills/mttr-llms-txt/.

Cursor

Loads skills from .cursor/skills/ or .agents/skills/ in the repository, or ~/.cursor/skills/ for every project. It also reads .claude/skills/, so one copy there serves both. The agent uses it when it is relevant, or type / in Agent chat and pick it.

Terminal, for Cursor
mkdir -p .cursor/skills/mttr-llms-txt/references
curl -fsSL https://mttr.si/skills/llms-txt/SKILL.md -o .cursor/skills/mttr-llms-txt/SKILL.md
curl -fsSL https://mttr.si/skills/llms-txt/references/example.md -o .cursor/skills/mttr-llms-txt/references/example.md
curl -fsSL https://mttr.si/skills/llms-txt/references/format.md -o .cursor/skills/mttr-llms-txt/references/format.md
curl -fsSL https://mttr.si/skills/llms-txt/references/stacks.md -o .cursor/skills/mttr-llms-txt/references/stacks.md
curl -fsSL https://mttr.si/skills/llms-txt/references/verify.md -o .cursor/skills/mttr-llms-txt/references/verify.md
PowerShell, for Cursor
New-Item -ItemType Directory -Force .cursor\skills\mttr-llms-txt\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/llms-txt/SKILL.md -OutFile .cursor\skills\mttr-llms-txt\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/example.md -OutFile .cursor\skills\mttr-llms-txt\references\example.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/format.md -OutFile .cursor\skills\mttr-llms-txt\references\format.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/stacks.md -OutFile .cursor\skills\mttr-llms-txt\references\stacks.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/verify.md -OutFile .cursor\skills\mttr-llms-txt\references\verify.md -UseBasicParsing

Puts the files in .cursor/skills/mttr-llms-txt/.

Any other agent

An agent that does not load skills can still follow the file. Save the folder in the repository and point its standing instructions at it, with a line in AGENTS.md, which many agents read. The agent reads AGENTS.md when it starts, and follows the file when the task matches.

Terminal, for Any other agent
mkdir -p docs/mttr-llms-txt/references
curl -fsSL https://mttr.si/skills/llms-txt/SKILL.md -o docs/mttr-llms-txt/SKILL.md
curl -fsSL https://mttr.si/skills/llms-txt/references/example.md -o docs/mttr-llms-txt/references/example.md
curl -fsSL https://mttr.si/skills/llms-txt/references/format.md -o docs/mttr-llms-txt/references/format.md
curl -fsSL https://mttr.si/skills/llms-txt/references/stacks.md -o docs/mttr-llms-txt/references/stacks.md
curl -fsSL https://mttr.si/skills/llms-txt/references/verify.md -o docs/mttr-llms-txt/references/verify.md
echo "For adding llms.txt, follow docs/mttr-llms-txt/SKILL.md." >> AGENTS.md
PowerShell, for Any other agent
New-Item -ItemType Directory -Force docs\mttr-llms-txt\references | Out-Null
Invoke-WebRequest https://mttr.si/skills/llms-txt/SKILL.md -OutFile docs\mttr-llms-txt\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/example.md -OutFile docs\mttr-llms-txt\references\example.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/format.md -OutFile docs\mttr-llms-txt\references\format.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/stacks.md -OutFile docs\mttr-llms-txt\references\stacks.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/llms-txt/references/verify.md -OutFile docs\mttr-llms-txt\references\verify.md -UseBasicParsing
Add-Content AGENTS.md "For adding llms.txt, follow docs/mttr-llms-txt/SKILL.md."

Puts the files in docs/mttr-llms-txt/.

What is inside

Every file in the folder, as it is served at https://mttr.si/skills/llms-txt/, so an agent can fetch any one again to update it.

mttr-llms-txt/

  • SKILL.md179 lines14.7 KB

    The six steps from gathering the site’s facts to checking the live file, the file’s shape, its rules, two ways to serve it, the tests and the report.

  • references/

    • example.md91 lines4.6 KB

      A whole file for a sample business, a route that builds it from the site’s own data, and the test that catches a new page.

    • format.md122 lines7.8 KB

      The proposal’s exact parts in order, the mistakes that break them, a broken file and its fix, what to leave out, large sites split by section, Markdown twins and llms-full.txt.

    • stacks.md174 lines10.2 KB

      Building and serving the file in Next.js, Astro, a static site generator, WordPress, a plain server, and a network of sites from one app, each from the data the pages use.

    • verify.md123 lines8.9 KB

      The tests as code, the live checks with what a pass and a fail look like, keeping the file in sync, and a table of symptoms, causes and fixes.

  • CHANGELOG.md33 lines2.7 KB

    Every release and what it changed, newest first. Not installed: the changes, for you.

Its references

SKILL.md sends your agent to these files when a step needs them, so the main file stays short. Open the sections to see what each holds, or copy a request that points your agent at one.

references/example.md91 lines4.6 KBthree sections

A whole file for a sample business, a route that builds it from the site’s own data, and the test that catches a new page.

Open the file

Its three sections
  1. L5
    The file
  2. L47
    Built on each requestThe shape of a route that builds the file from the same data as the pages, in TypeScript.
  3. L82
    The test that catches a new page
references/format.md122 lines7.8 KBeight sections

The proposal’s exact parts in order, the mistakes that break them, a broken file and its fix, what to leave out, large sites split by section, Markdown twins and llms-full.txt.

Open the file

Its eight sections
  1. L5
    The parts, in orderThe proposal names these parts, in this order and no other:
  2. L19
    What breaks the shapeEach of these reads fine to a person and confuses a program that parses the file as the proposal describes.
  3. L33
    Before and afterA file as a plugin or a hurried hand often leaves it:
  4. L81
    What to leave outPages a search engine is told not to index, and pages robots.txt closes to crawlers.
  5. L90
    Large sitesThe proposal lets a file sit at any path, covering the pages under it, with the most specific file winning: /docs/llms.txt covers /docs/.
  6. L99
    Markdown twinsThe proposal also asks that pages an agent may need offer a clean Markdown copy at the same address: .md added (page.html.md) or the extension…
  7. L116
    llms-full.txtllms-full.txt is not part of the proposal.
  8. L120
    Other addresses for the fileSome platforms also answer at /.well-known/llms.txt.
references/stacks.md174 lines10.2 KBsix sections

Building and serving the file in Next.js, Astro, a static site generator, WordPress, a plain server, and a network of sites from one app, each from the data the pages use.

Open the file

Its six sections
  1. L7
    Next.js (App Router)A route handler in a folder named for the file.
  2. L30
    AstroA static file endpoint: a file in src/pages named with the extension it makes.
  3. L59
    A static site generator, or hand-written pagesWhen the pages are templates and nothing holds them as data, build the file after the site is built, from the built site itself: the sitemap gives the…
  4. L105
    WordPressFirst look for a plugin that already makes one: the proposal lists Yoast SEO and AIOSEO among those that generate an llms.txt.
  5. L151
    A plain server, a CDN, or a hosted builderA site served as plain files: put the built llms.txt at the root.
  6. L157
    A network of sites from one appOne route, one function, and the domain chooses the site.
references/verify.md123 lines8.9 KBfour sections

The tests as code, the live checks with what a pass and a fail look like, keeping the file in sync, and a table of symptoms, causes and fixes.

Open the file

Its four sections
  1. L5
    The testsget(path) stands for whatever the suite already uses to fetch a page from the app without a network: a test client, a request to the dev server, or…
  2. L67
    The live checksRun these after the site ships, against the real domain.
  3. L99
    Keeping it in syncBuilt from data on each request or at each build: nothing to do, as long as the page list is the sitemap's list.
  4. L108
    Troubleshooting

Version and changes

Version 1.1.2, October 23, 2026. The version is in SKILL.md under metadata, where the Agent Skills format keeps what it does not define, and follows semantic versioning: a new major version changes what the skill asks of you or your agent.

  1. 1.1.2October 23, 2026Current

    • The worked route writes "Notes for assistants" only when the site has notes, so a file is never left with an empty heading.
  2. 1.1.1October 19, 2026

    • The description no longer has a colon mid-sentence, which YAML read as a new key, so installers that parse the frontmatter skipped the skill.
  3. 1.1.0October 18, 2026

    • The file's shape follows v2 of the proposal: facts and notes for assistants sit above the first ## section, every ## section holds only links, an ## Optional section may come last, and a page with no description gets its link and no note.
    • Before you start checks for an existing file and what makes it, so a plugin and a new route never both answer.
    • Step 2 says what to leave out, follows a sitemap index, and splits a large site into one file per section.
    • Step 4 adds keeping or replacing a plugin's file; step 5's tests also catch a retired page, links that are not absolute https on the site, and sections that hold anything but links.
    • Step 6 adds the curl check, and reading the file with a fresh agent as the proposal suggests.
    • New references: format.md (the proposal's exact parts, mistakes that break them, a broken file and its fix, what to leave out, large sites, Markdown twins, llms-full.txt), stacks.md (Next.js, Astro, a static site generator, WordPress, a plain server, a network of sites) and verify.md (the tests as code, live checks with what a pass looks like, keeping it in sync, troubleshooting).
    • The worked example uses the new shape, cuts only the site's name from a title, and its page test matches whole links.
    • Sources add the proposal's v2 details, Google on sitemap indexes, X-Robots-Tag and canonical headers, the Next.js, Astro and WordPress docs used, one platform's llms-full.txt, Lighthouse's audit and MDN on the Link header.
  4. 1.0.1October 16, 2026

    • Says that Google Search does not need the file and that it neither helps nor hurts a site there, as Google wrote in June 2026.
    • A Sources list ends the file, each by its page's own title, with what the skill takes from it.
  5. 1.0.0October 16, 2026

    • First release: six steps from gathering the site's facts to checking the live file with mttr.
    • The file's shape, its rules for content, two ways to serve it, six tests to add, and a report template that says its effect is unproven.
    • A worked example: a whole file for a sample business, a route that builds it from the site's data, and the test that catches a new page.

The skill in full

This is the file the commands above fetch, as it is served at /skills/llms-txt/SKILL.md.

mttr-llms-txt/SKILL.md
---
name: mttr-llms-txt
description: Adds a /llms.txt to a website, a plain text outline of the whole site for AI assistants, built from the site's own pages and facts so it cannot go stale, with tests that catch a missing page, and checks it with mttr. Use when asked to add, fix or update llms.txt, to outline a site for AI assistants or agents, or when mttr reports the llms-txt finding. Works for one site or a network of sites served from one app. Not a way to rank, as its effect on AI visibility is unproven.
metadata:
  author: subinternal
  version: "1.1.2"
---

<!-- subinternal:header -->
```
╭──────────────────────────────────────────────────────────────╮
│        ▄                                                     │
│      ▄ █    mttr                                             │
│    ▄ █ █    llms.txt                                         │
│  ▄ █ █ █                                                     │
│                                                              │
│  skill 1.1.2  ·  by subinternal  ·  mttr.si/skills/llms-txt  │
╰──────────────────────────────────────────────────────────────╯
```

Print this header once, exactly as it is, in a code block, as the first thing you show when this skill starts. Then go on.
<!-- /subinternal:header -->

# llms.txt

Give the site a `/llms.txt`: a plain text outline for AI assistants that says who the business is, the facts an assistant should get right, and every page with its title and one line. Link to it from the footer. You work in the site's own repository.

What this does not do: no major assistant has said it reads llms.txt, and its effect on AI visibility is unproven. It is cheap, it cannot hurt, and it doubles as a clean outline of the site for any agent or person. Say so when you report, and never promise it will move rankings or citations.

Work the six steps in order. Do not change a file before step 3. Four references hold the depth, each linked where it is needed:

- [references/example.md](references/example.md): a whole file for a sample business, the route that builds it, and the test that catches a new page.
- [references/format.md](references/format.md): the proposal's exact format, what a parser expects, a broken file and its fix, large sites, Markdown twins and llms-full.txt.
- [references/stacks.md](references/stacks.md): building and serving it in Next.js, Astro, a static site generator, WordPress, a plain server, and a network of sites.
- [references/verify.md](references/verify.md): what to fetch and run to prove each step, keeping it in sync, and a table of symptoms, causes and fixes.

## Before you start

1. Ask the person for the site's live domain and whether you may deploy or only open a pull request.
2. Find how the site makes its pages: from data (a CMS, config files, a database, content collections), or as hand-written templates with a static sitemap. Step 4 depends on it.
3. Fetch `https://<domain>/llms.txt` now. If one exists, find what makes it (a plugin, a platform setting, a file in `public/`) before you add a second source; two sources for one address is the commonest way a file goes stale.
4. For a network of sites served from one app, each domain gets its own file about that site only. Nothing in one site's file names another site or the operator behind them.

## 1. Gather the facts

Collect the business's facts from the site itself, and only from the site.

- Its name, and what it does and where, in two or three sentences.
- Phone, email, where it is based, the area it serves, hours, and how to get a quote, each as a page of the site states it.
- What an assistant commonly gets wrong about it: two words for one service, prices quoted per job, an area it does not serve. Ask the person if you do not know.

Every fact already appears on the site. No new claims, prices, credentials, reviews or history. If the site does not say it, the file does not say it.

Take each fact from the one place the pages read it from (a config file, the CMS's settings, the footer's data), not by copying it out of rendered HTML. A fact copied by hand is a fact that goes stale when the phone number changes.

Verify: for each fact, name the file or record it came from. A fact with no source is left out.

## 2. List every page

The sitemap is the source of truth: every page in it that can be indexed is listed once. The home page is the exception, since the file is about it.

- Each page's title and description are the page's own, read from the page or from the data it is built from. Do not write new ones for this file.
- Strip the site's name from the end of each title.
- Group pages by what they are, not by their address: services, products or materials, tools, guides, company, areas served. A town's own pages go on that town's line, not in a list of their own.
- Leave out what a reader cannot use: `noindex` pages, redirects, search results, tag and pagination archives, thank-you and cart pages, login and account pages, and anything robots.txt keeps crawlers out of. If the sitemap lists any of these, fix the sitemap too.
- A page with no description of its own gets its link and no note. Do not invent one; tell the person which pages lack a description, since that is a gap mttr will also find.

A sitemap may be an index of other sitemaps (WordPress's is). Follow every `<sitemap><loc>` to the files it names before you count pages. Past a few hundred pages, see "Large sites" in [references/format.md](references/format.md): one file per section, linked from the root file, so each stays small enough to read.

Verify: the number of pages you will list equals the number of indexable addresses in the sitemap, less the home page.

## 3. Write the file

```
# Business name

> Two or three sentences: what the business is, what it does, and where.

- Phone: ...
- Email: ...
- Based in: ...
- Service area: ...
- Hours: ...
- Quotes: how to get one, with the address

Notes for assistants:

- Anything an assistant commonly gets wrong about this business.

## Services

- [Page title](https://example.com/services/page): The page's own description.

## Guides

- [Page title](https://example.com/guides/page): The page's own description.
```

- Plain text only: absolute `https` addresses, no HTML, no tracking parameters.
- Write number ranges as "1 to 3", and do not use dashes as punctuation.
- Keep it honest about limits: if prices are quoted per job, the notes say so.
- Every `##` section is a list of links and nothing else. Facts and notes go above the first `##`, where the proposal puts details that are not links. A `## Notes` heading with no links in it breaks the shape a parser expects.
- An `## Optional` section, last, may hold pages a reader can skip: old news, legal pages, long archives.

The shape follows the proposal at https://llmstxt.org: a heading with the name, a quoted summary, details, then sections of links, each with a short note. The parts, what is required and the mistakes that break it are in [references/format.md](references/format.md).

Google says Google Search does not need the file, and that it neither helps nor hurts a site's visibility there; it is fine to keep one for other services that read it. Say so if the person expects it to move Google rankings.

## 4. Serve it

Pick by how the site makes its pages. The code for each stack is in [references/stacks.md](references/stacks.md).

- Pages come from data: serve `/llms.txt` from a route that builds it on each request (or at each build) from that same data, so it cannot go stale. For a network of sites, one route outlines whichever site the request's domain names.
- Pages are hand-written templates with a static sitemap: write a build command that reads the sitemap, renders each page inside the app, takes its `<title>` and meta description, and writes `public/llms.txt`. Keep the hand-written facts in one config file, and give the command a `--check` mode that fails when the file on disk differs from a fresh build.
- A plugin or platform already makes one (step "Before you start", 3): keep it if its file passes the tests in step 5, and turn it off if you build your own. Never run both.

Either way:

- Serve it as `text/plain; charset=utf-8` with status 200, at `/llms.txt` with no redirect.
- Add a footer link: `<a href="/llms.txt" title="This site outlined for AI assistants">llms.txt</a>`.
- Do not block it in `robots.txt`.
- A draft or `noindex` site may still serve it. It does no harm and lets the file be checked before launch.

Markdown copies of pages (`page.md` beside `page`) are optional and part of the same proposal. They help most on documentation; for a business site the HTML pages are enough. If you add them, see "Markdown twins" in [references/format.md](references/format.md) for the headers that keep them out of search results.

## 5. Test it

Add these tests to the site's own test suite.

1. The file starts with `# Business name` and a `>` summary.
2. Every address in the sitemap appears in the file. This is the test that catches a new page. Check the other way too: every page address in the file is in the sitemap, which catches a retired page.
3. The file has no HTML and no dashes used as punctuation, every link is an absolute `https` address on the site's own domain, and every `##` section holds only links.
4. The footer links to it.
5. For a static file, the `--check` mode passes in the test suite.
6. For an unbranded or white-label site, the operator's name and phone number do not appear.

The code for each is in [references/verify.md](references/verify.md), with how to follow a sitemap index and how to run test 5 in continuous integration.

## 6. Check it with mttr

Ship as the person allows, then check the live file.

- First by hand: `curl -sI https://<domain>/llms.txt` answers `200` with `content-type: text/plain`, and no `location:` header. The other checks to run are in [references/verify.md](references/verify.md).
- With no key: `https://mttr.si/ai-crawler-checker?url=<domain>` says whether `/llms.txt` is there, beside which AI crawlers `robots.txt` lets in.
- Over MCP: `mttr_rescan({ site, reason: "added llms.txt" })`, `mttr_job({ id })` until done, then `mttr_changes({ site })`. The `llms-txt` finding should be gone. mttr counts the file when it answers 200 with text that is not an HTML page; the rest of this skill is what makes it worth reading.
- Then open the file and read it top to bottom as if you knew nothing about the business. Better, give only the file to a fresh agent and ask it three questions a customer would ask: where the business works, how to get a price, and what it does not do. If a fact is wrong or a section is confusing, fix the source, not the file.

If the finding stays, the troubleshooting table in [references/verify.md](references/verify.md) lists each cause: an HTML page served at the address (a single-page app's fallback is the usual one), a redirect to a login, a cache holding an old 404, or a firewall that answers crawlers differently.

## Report back

```
Site: <domain>. File: https://<domain>/llms.txt, <n> pages listed, built <on each request | at build | by <command>>.
Tests: <n> added, <passing | failing: which>.
mttr: llms-txt <fixed | still failing: why>.
Pages with no description of their own: <none | list>.
Its effect on AI visibility is unproven. It is a clean outline of the site, not a way to rank.
```

For a network of sites, one line for each site: its file's address and its page count.

## Sources

- [Optimizing your website for generative AI features on Google Search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide#mythbusting): Google's word that its Search can ignore files like llms.txt, and that Google may still crawl and index such a file like any other.
- [Latest documentation updates](https://developers.google.com/search/updates#clarifying-guidance-on-llms.txt-files): Google's note that the file neither helps nor hurts a site in Search, and is fine to keep for others.
- [Manage Your Sitemaps With Sitemap Index Files](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps): how a sitemap index names other sitemaps, which the page test must follow.
- [Robots Meta Tags Specifications](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag): the `X-Robots-Tag` header that keeps a non-HTML file, such as a Markdown twin, out of the index.
- [How to Specify a Canonical with rel="canonical" and Other Methods](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls): the `rel="canonical"` HTTP header that points a Markdown twin at its HTML page.
- [Route Handlers](https://github.com/vercel/next.js/blob/canary/docs/01-app/01-getting-started/15-route-handlers.mdx): Next.js route handlers, that `GET` is not cached by default, and `force-static` to build it once.
- [route.js](https://github.com/vercel/next.js/blob/canary/docs/01-app/03-api-reference/03-file-conventions/route.mdx): the non-UI response pattern, a folder named for the file with a `route.ts` inside.
- [Endpoints](https://docs.astro.build/en/guides/endpoints/): Astro's static file endpoints, where `src/pages/llms.txt.ts` builds `/llms.txt`, called at build time on a static site and on request with a server.
- [Content collections](https://docs.astro.build/en/guides/content-collections/): `getCollection()`, the same data an Astro site's pages are built from.
- [add_rewrite_rule()](https://developer.wordpress.org/reference/functions/add_rewrite_rule/): how a WordPress plugin answers an address of its own, and that rules must be flushed after they change.
- [flush_rewrite_rules()](https://developer.wordpress.org/reference/functions/flush_rewrite_rules/): that flushing is expensive and belongs on activation, not on every request.
- [WP_Sitemaps](https://developer.wordpress.org/reference/classes/wp_sitemaps/): WordPress's own sitemap since 5.5, an index at `/wp-sitemap.xml`.
- [llms.txt](https://www.mintlify.com/docs/ai/llmstxt): one documentation platform's llms-full.txt, every page in one file, which is a platform's convention and not part of the proposal.
- [llms.txt](https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt): Lighthouse's agentic browsing audit, which flags a server error on the file and treats a missing file as not applicable.
- [Link header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Link): the HTTP `Link` header, with the same meaning as an HTML `<link>`, for pointing a page at its Markdown twin and its llms.txt.
- [The /llms.txt file, v2](https://llmstxt.org): the proposal the file's shape follows, its required H1, its file lists, subpath files, Markdown twins and link relations.

Sources

20 pages

Each is in a ## Sources list in the file that cites it, by the page’s own title.

Google Search Central

  1. 1Optimizing your website for generative AI features on Google Search, Google Search Central. Google's word that its Search can ignore files like llms.txt, and that Google may still crawl and index such a file like any other.
  2. 2Latest documentation updates, Google Search Central. Google's note that the file neither helps nor hurts a site in Search, and is fine to keep for others.
  3. 3Manage Your Sitemaps With Sitemap Index Files, Google Search Central. How a sitemap index names other sitemaps, which the page test must follow.
  4. 4Robots Meta Tags Specifications, Google Search Central. The `X-Robots-Tag` header that keeps a non-HTML file, such as a Markdown twin, out of the index.
  5. 5How to Specify a Canonical with rel="canonical" and Other Methods, Google Search Central. The `rel="canonical"` HTTP header that points a Markdown twin at its HTML page.

Platforms

  1. 6Route Handlers, Vercel, on GitHub. Next.js route handlers, that `GET` is not cached by default, and `force-static` to build it once.
  2. 7route.js, Vercel, on GitHub. The non-UI response pattern, a folder named for the file with a `route.ts` inside.
  3. 8Endpoints, Astro Docs. Astro's static file endpoints, where `src/pages/llms.txt.ts` builds `/llms.txt`, called at build time on a static site and on request with a server.
  4. 9Content collections, Astro Docs. `getCollection()`, the same data an Astro site's pages are built from.
  5. 10add_rewrite_rule(), WordPress Developer Resources. How a WordPress plugin answers an address of its own, and that rules must be flushed after they change.
  6. 11flush_rewrite_rules(), WordPress Developer Resources. That flushing is expensive and belongs on activation, not on every request.
  7. 12WP_Sitemaps, WordPress Developer Resources. WordPress's own sitemap since 5.5, an index at `/wp-sitemap.xml`.
  8. 13llms.txt, Mintlify docs. One documentation platform's llms-full.txt, every page in one file, which is a platform's convention and not part of the proposal.

Standards and protocols

  1. 14The /llms.txt file, v2, llmstxt.org. The proposal the file's shape follows, its required H1, its file lists, subpath files, Markdown twins and link relations.
  2. 15llms.txt, Chrome for Developers. Lighthouse's agentic browsing audit, which flags a server error on the file and treats a missing file as not applicable.
  3. 16Link header, MDN Web Docs. The HTTP `Link` header, with the same meaning as an HTML `<link>`, for pointing a page at its Markdown twin and its llms.txt.

Agent skills format and clients

  1. 17Extend Claude with skills, Anthropic, Claude Code docs. Where Claude Code loads skills from, and how one is called.
  2. 18Build skills, OpenAI, ChatGPT Learn. Where Codex loads skills from, and how one is called.
  3. 19Agent Skills, Cursor docs. Where Cursor loads skills from, and how one is called.
  4. 20Specification, Agent Skills. The format every skill here keeps: the folder, the frontmatter and its limits.