← Back to Blog

llms.txt vs Claude Skills manifest: I tested 5 AI engines to see which file they actually read

Part of LLMO Field Guide

Two files landed in my “AI-readable metadata” folder this year. One is llms.txt, sitting at /llms.txt next to your robots.txt. The other is the Claude Skills manifest — the YAML frontmatter at the top of SKILL.md, the one Claude scans at session start to decide which skill to load. Both get sold with the same pitch: “put this file where an AI can find it and the AI will do the right thing.”

They are not the same file. They are not even the same category of file. And the market has already started conflating them, because a lot of “LLMO” content in 2026 uses the words manifest and AI-discoverable as if they refer to a single spec.

So I did the thing I should have done first: I picked five AI systems and watched what they actually fetched when I gave them a domain to look at. The result was not what my Twitter feed suggested.

The one-paragraph version

llms.txt is a public file for AI crawlers and IDE agents that already know how to look for it. The Claude Skills manifest is a private file inside your project (or your Anthropic org’s Skills library) that only Claude Code and the Claude apps read, and only when you point them at the folder. Of the five AI engines I tested, two fetched llms.txt reliably, one fetched it occasionally, two ignored it entirely, and zero would read a Skills manifest hosted on your public domain — not because they refused, but because they don’t know that file exists as a public convention.

If you were already routing traffic based on “AI will read my manifest,” you may want to sit down.

Setup: what I actually tested

I picked five engines, ran a controlled prompt through each one, and used a combination of server logs, Anthropic Skills docs, and public crawler behavior to figure out what each one fetched from the domain in question. Not lab-grade. But the pattern was legible after 12 runs per engine.

The engines:

  1. Claude (Sonnet 4.5 via claude.ai) — the browsing-enabled chat product, plus a separate Claude Code session on a repo that had a SKILL.md in place.
  2. ChatGPT (GPT-4.5 with web browsing) — the paid ChatGPT with browsing on.
  3. Perplexity (default model) — the answer engine that most obviously behaves like a crawler.
  4. Google AI Overviews (via a Search query that reliably triggered an Overview) — the one Gary Illyes told everyone does not support llms.txt.
  5. Copilot (Bing-backed, in Edge) — the sleeper. Bing’s crawl history matters here.

The domain: a small documentation site I own, freshly set up with:

  • robots.txt allowing all major AI bots
  • llms.txt at the root, 12 links, following the llmoframework.com reference layout
  • A SKILL.md in .claude/skills/site-guide/ inside the repo, plus a public copy at /skills/site-guide/SKILL.md on the deployed site just to see if anything sniffed it

The prompt to each engine, adjusted for their input styles, boiled down to: “Summarize what this site is about and how a new developer should navigate it.”

Then I read the request logs.

llms.txt vs Claude Skills manifest at a glance

Result 1: only 2 of 5 fetched llms.txt reliably

Here’s the request-log summary, deduped and cleaned up.

EngineFetched llms.txt?Fetched SKILL.md?
Claude (claude.ai)Sometimes (~40% of runs)Never on the public site
Claude CodeN/A (local repo)Yes, always (local .claude/skills/)
ChatGPT (browsing)NoNo
PerplexityYes, every runNo
Google AI OverviewsNoNo
Copilot (Bing)Yes on most runsNo

Perplexity and Copilot were the two consistent llms.txt readers. Claude’s chat product hit it maybe 4 out of 10 times, which is interesting on its own — I suspect it’s a routing decision inside Claude’s browsing tool rather than an on/off feature. ChatGPT’s browsing tool never touched it in my 12 runs. Google, as advertised, ignored it entirely.

Nobody — including Claude’s public-facing chat product — fetched the SKILL.md file I had deployed to the public path. That was fully expected, but I wanted the negative result on the record. Skills is a Claude Code / Anthropic-orchestrated feature, not a web convention. There is no “AI crawler reads your Skills manifest” story yet. If someone tells you there is, ask them for a User-Agent string.

Result 2: the two files answer different questions

Once I sat with the log data for a day, I stopped thinking of these as “two ways to expose your site to AI.” They’re two different contracts, aimed at different consumers, in two different trust tiers.

llms.txt is a curation file. It says: “Of the pages an AI could crawl on this site, here are the ones actually worth reading, in this order, with these short descriptions.” The audience is anything on the web that already has the manners to check /llms.txt before diving into your sitemap. Perplexity does. Copilot does most of the time. The others don’t.

The Claude Skills manifest is a capability declaration inside a workspace. It says: “When the user’s prompt looks like X, load this whole skill folder into context and follow the instructions inside.” The audience is Claude, running on a machine where you have already granted it access to the folder. There is no crawler sniffing a public Skills manifest, and even if there were, the manifest isn’t shaped for that purpose — a Skill is dozens of files including scripts and examples, not a summary of your site.

Trying to use llms.txt to trigger a Skill would be like putting a keyboard shortcut in your robots.txt. Trying to use a Skills manifest as an SEO artefact is the same shape of category error in reverse.

Result 3: three anti-patterns are already forming

Because the two files are getting conflated, I’ve watched three specific mistakes show up on new sites this quarter. They all have the same root cause: someone read “AI-readable manifest” as one concept.

Anti-pattern 1: “publish a SKILL.md at the root so ChatGPT can find it.” I’ve seen this recommended in at least two “LLMO in 2026” threads. Nobody fetches it. ChatGPT doesn’t know the file exists. Even if it did, the Skill body is instructions for an agent that operates a workspace — not descriptive content an LLM wants to summarize. The engine wouldn’t know what to do with it if it read it.

Anti-pattern 2: putting your llms.txt inside a .claude/ folder. The Claude Code convention put .claude/ on the map as “the directory AI reads.” So people started dropping public metadata files in there. .claude/skills/ is scanned only by Claude Code on a machine that has the repo. If you’re relying on Perplexity or Copilot to find something you moved into .claude/, they will not.

Anti-pattern 3: describing your product in your Skill’s description field the way you’d describe it in llms.txt. The Skill’s description is a routing decision, not a summary. Claude uses it to decide whether to load the Skill for a given prompt. If your description is a paragraph about your company’s mission, the Skill will never trigger for a real question. If it starts with the trigger keywords (“review the current PR,” “check my llms.txt,” “generate an OG image”), the Skill loads on the right prompts. Same string, but the audience treats it completely differently.

The general rule I’ve settled on: llms.txt is prose, aimed at reading. A Skills manifest is a switch, aimed at routing. Confuse the two and you get a file that neither reads nor triggers.

What I actually shipped

Given the 2-of-5 read rate on llms.txt, is it still worth shipping one? Yes, but with tempered expectations. The two engines that do read it (Perplexity and Copilot) are the ones most likely to cite your site as a source, which means the file punches above its 40% market weight on the metric that actually matters — inbound clicks from AI answers. The Princeton GEO study I’ve quoted before hammered the same asymmetry: it’s not who reads you, it’s who cites you.

For the Skills manifest, the calculus is different. If you’re writing Skills for your own team to use inside Claude Code, ship them. The description field is the single highest-leverage part of the file, because it’s the string that decides whether Claude bothers to load the rest. If you’re not using Claude Code, a SKILL.md file on your site is decorative HTML.

The one place these two files legitimately overlap is a tiny slice: if your Skill’s job is “help a Claude Code user understand this repo,” the same content that lives in llms.txt — a curated list of the most important files and what they do — is a decent starting point for the Skill body. Not the frontmatter, the body. And you’re still shipping two files, in two different places, with two different licenses of use.

The honest position on both

llms.txt is a real convention with a real (if small) audience. Ship one. Keep it under 20 links. Point at the pages you want cited, not everything you’ve ever written.

The Claude Skills manifest is a real feature with a real audience. Ship those inside your project or your Anthropic org’s Skills library. Do not publish a SKILL.md on your public site expecting an AI to summarize it — no AI crawler is looking for that file, and Claude only reads Skills from folders you’ve told it about.

The market will keep flattening these into “AI manifest” language for another six months at least, and there will be an “llms.txt best practices” post next month that includes a Skill YAML block. When you see it, close the tab.

Want to go deeper?

If you want the full LLMO playbook — how to actually get cited by the AI engines that matter, not just checked-by them — LLMO: AI Search Optimization for Engineers is the 12-chapter book with the measurement methodology, JSON-LD patterns, and audit checklists that this post skims.

Why ChatGPT Ignores Your Website Related book Why ChatGPT Ignores Your Website Google SEO won't get you cited by ChatGPT — this is the playbook for being seen by AI search, with measurement included View the book page →