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.
Version 1.1.2Updated October 23, 2026
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.
- 1Gather the factsCollect the business's facts from the site itself, and only from the site.
- 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> - 3Write the file
- 4Serve itPick by how the site makes its pages. The code for each stack is in references/stacks.md.
File /llms.txt - 5Test itAdd these tests to the site's own test suite.
- 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.
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.
- 1The file starts with
# Business nameand a>summary. - 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.
- 3The file has no HTML and no dashes used as punctuation, every link is an absolute
httpsaddress on the site's own domain, and every##section holds only links. - 4The footer links to it.
- 5For a static file, the
--checkmode passes in the test suite. - 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:
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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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 -UseBasicParsingPuts 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.
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.mdNew-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.md
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.md
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.md
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.md
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.md
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.
- example.md
- CHANGELOG.md
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.
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.
Its three sections
- L5The file
- L47Built on each requestThe shape of a route that builds the file from the same data as the pages, in TypeScript.
- L82The test that catches a new page
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.
Its eight sections
- L5The parts, in orderThe proposal names these parts, in this order and no other:
- L19What breaks the shapeEach of these reads fine to a person and confuses a program that parses the file as the proposal describes.
- L33Before and afterA file as a plugin or a hurried hand often leaves it:
- L81What to leave outPages a search engine is told not to index, and pages robots.txt closes to crawlers.
- L90Large sitesThe proposal lets a file sit at any path, covering the pages under it, with the most specific file winning:
/docs/llms.txtcovers/docs/. - L99Markdown twinsThe proposal also asks that pages an agent may need offer a clean Markdown copy at the same address:
.mdadded (page.html.md) or the extension… - L116llms-full.txt
llms-full.txtis not part of the proposal. - L120Other addresses for the fileSome platforms also answer at
/.well-known/llms.txt.
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.
Its six sections
- L7Next.js (App Router)A route handler in a folder named for the file.
- L30AstroA static file endpoint: a file in
src/pagesnamed with the extension it makes. - L59A 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…
- L105WordPressFirst look for a plugin that already makes one: the proposal lists Yoast SEO and AIOSEO among those that generate an llms.txt.
- L151A plain server, a CDN, or a hosted builderA site served as plain files: put the built
llms.txtat the root. - L157A network of sites from one appOne route, one function, and the domain chooses the site.
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.
Its four sections
- L5The tests
get(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… - L67The live checksRun these after the site ships, against the real domain.
- L99Keeping 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.
- L108Troubleshooting
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.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.
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.
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## Optionalsection 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
httpson the site, and sections that hold anything but links. - Step 6 adds the
curlcheck, 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) andverify.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-Tagand canonical headers, the Next.js, Astro and WordPress docs used, one platform's llms-full.txt, Lighthouse's audit and MDN on theLinkheader.
- The file's shape follows v2 of the proposal: facts and notes for assistants sit above the first
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.
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.
---
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
- 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.
- 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.
- 3Manage Your Sitemaps With Sitemap Index Files, Google Search Central. How a sitemap index names other sitemaps, which the page test must follow.
- 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.
- 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
- 6Route Handlers, Vercel, on GitHub. Next.js route handlers, that `GET` is not cached by default, and `force-static` to build it once.
- 7route.js, Vercel, on GitHub. The non-UI response pattern, a folder named for the file with a `route.ts` inside.
- 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.
- 9Content collections, Astro Docs. `getCollection()`, the same data an Astro site's pages are built from.
- 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.
- 11flush_rewrite_rules(), WordPress Developer Resources. That flushing is expensive and belongs on activation, not on every request.
- 12WP_Sitemaps, WordPress Developer Resources. WordPress's own sitemap since 5.5, an index at `/wp-sitemap.xml`.
- 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
- 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.
- 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.
- 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
- 17Extend Claude with skills, Anthropic, Claude Code docs. Where Claude Code loads skills from, and how one is called.
- 18Build skills, OpenAI, ChatGPT Learn. Where Codex loads skills from, and how one is called.
- 19Agent Skills, Cursor docs. Where Cursor loads skills from, and how one is called.
- 20Specification, Agent Skills. The format every skill here keeps: the folder, the frontmatter and its limits.