Table of contents
Ask three people what agents.md is and you get three answers. One says it is the file coding agents read in a repository. One says it is the Markdown page a store publishes for shopping agents. One says it is just llms.txt with a different name. All three have seen something real, and none of them are describing the same file.
This guide separates the two uses of the name, shows what belongs in a site-root agents.md, and gives you a check that cannot pass on the wrong thing. As of 4 October 2026 there is no RFC for the web version, so this is a convention you should treat with that in mind.
Quick summary
| Question | Short answer |
|---|---|
What is AGENTS.md the project? | A "README for agents": build, test and style instructions for coding agents, kept in a repository (agents.md) |
What is /agents.md on a website? | An informal convention: a Markdown page at your site root describing how an agent should work with the site |
| Is it a standard? | The repository format has a home and a spec site. The web-root version has no RFC and no registry |
| Does it replace llms.txt or robots.txt? | No. Three files, three jobs (table below) |
| Does AIScan score it? | Not directly. check:C2 grades /llms.txt and check:E1 catches soft 404s, which is the failure that fakes an agents.md |
| The trap | A request for /agents.md can return 200 with the wrong content |
Two files that share a name
The first is AGENTS.md in a code repository. The project describes it as "a simple, open format for guiding coding agents", a predictable place for setup commands, test instructions and code style, kept apart from the human README. It reports use across more than 60,000 open-source projects, and its list of supporting tools includes Codex, Cursor, Jules, Aider, Zed and VS Code. If you landed here looking for that, the reader is a coding agent and the file lives at the repo root. Nothing below changes it.
The second is /agents.md served from a website. The reader is a different kind of agent: an assistant that browses, a shopping agent acting for a buyer, a crawler deciding what to fetch. The name is borrowed. Nobody coordinates it, so the contents are whatever each site decides to put there.
What a real site-root file looks like
Allbirds publishes one. We fetched https://www.allbirds.com/agents.md on 4 October 2026 and it returned 200 with content-type: text/markdown; charset=utf-8. It is instructions, not a link list. It names a commerce discovery endpoint, lists the tool-calling flow from search to checkout, states that checkout needs human approval, tells agents to back off on 429, and points to policies and the sitemap. It also names itself as the canonical agent-facing description of the store.
Compare https://www.shopify.com/agents.md, which returned 200 with text/plain and reads like an llms.txt: a title, a summary, and annotated links. Two real files, two different ideas of the job. That is the convention at its current maturity, and it is why the contents below are guidance rather than a spec.
What belongs in it, and what does not
Use it for things an agent must do or must not do, which neither llms.txt nor robots.txt carries.
| File | Job | Reader | Authority |
|---|---|---|---|
robots.txt | Say which paths a crawler may request | Crawlers | A request convention, specified in RFC 9309 |
sitemap.xml | List the URLs you want found | Crawlers | Sitemaps protocol |
llms.txt | Hand an agent a curated index of readable pages | Agents reading content | Proposal at llmstxt.org |
agents.md | Tell an agent how to act on the site | Agents taking actions | Informal convention |
Our six-files comparison covers the first three in depth. Here is a starting template:
# Example Store: agent instructions
Applies to https://www.example.com.
## What you can do
- Read any public product or collection page. No authentication needed.
- Product data as JSON: GET /products/{handle}.json
## Rules
- Do not submit a payment without the buyer's explicit approval.
- Back off on HTTP 429. Do not retry faster than once a second.
- Do not request /cart, /checkout or /account for crawling.
## Where to find things
- Sitemap: /sitemap.xml
- Content index: /llms.txt
- Policies: /policies/refund-policy
- Contact for agent access problems: agents@example.com
Keep it short, factual and about actions. Put page summaries in llms.txt, not here. Never put secrets, private URLs or anything you would not print on a public page; the file is public by design. And treat it as a request, as with robots.txt: a well-behaved agent may follow it, nothing enforces it. Anything that must be blocked belongs at the server or edge.
Why a status check lies about this file
The mechanism is the same one in our soft 404 write-up. Many sites answer unknown paths with 200 and an HTML shell, or map any .md path onto a page that exists.
We saw the second case on a real site. https://vercel.com/agents.md returned 200 with text/markdown, 1,914 bytes, and it opens with "Build and run intelligent agents on Vercel". That is the Markdown rendering of their /agents marketing page, which is a page about agents, not an agents.md. A check that only reads the status code, or only the content type, marks it as present. A control path (a made-up .md URL) on the same host returned 200 text/html, so the host is not even honest about the files it lacks.
By contrast aiscan.site/agents.md and a nonsense .md path both return the same 404. That is the pattern you want: a missing file is plainly missing, so a real file is meaningful.
Path 1: write and serve the file yourself (any stack)
- Write the file using the template above and name it exactly
agents.md, lowercase. Some tools look forAGENTS.md, so serve the lowercase file and add a redirect only if you know a consumer needs the other case. - Place it where the web server serves the root. On a static host that is the site's root folder. On Next.js it is
public/agents.md. On a WordPress site, add it to the web root (the folder that containswp-config.php) through SFTP or your host's file manager. A file that physically exists at the root is normally served before WordPress routing runs. - Check the response header (next section). If it arrives as
application/octet-streamor triggers a download, add a MIME mapping. In Apache that isAddType text/markdown .md. In nginx, addmdto thetypesblock astext/markdown. - Link it from where agents already look. Mention it in your llms.txt under an
## Optionalor## Agentssection, and reference it in yourrobots.txtcomments if you like. Neither is required. - Re-run the verification below after every deploy. CDNs and caches are a common reason a fresh file keeps returning the old
404.
On WordPress, ThinkRank is the plugin we recommend for the files around it: robots.txt, robots meta, schema and llms.txt from one plugin instead of three fighting over robots.txt, with migration from Rank Math, Yoast, AIOSEO and SEOPress so nothing is re-entered. It does not publish an agents.md for you, so use the manual steps above for that one file. Yoast and Rank Math remain strong on classic on-page SEO and have longer track records there.
Path 2: Shopify, with an editor instead of a file
A Shopify theme cannot simply drop an arbitrary file at the domain root, which is why this is a platform problem rather than a copy-and-paste one. Shopify's own default behaviour here is covered in our Shopify llms.txt guide, including how its default llms.txt relates to /agents.md.
StoreSEO is the default recommendation for stores. It has an agents.md editor, generates llms.txt from your live products, collections, pages and articles, and handles schema and AEO markup, so the files stay in step with the catalogue instead of drifting. Start from the template, keep the buyer-approval rule, and publish. If you would rather not use an app, the Shopify platform page lists what a store can and cannot serve at the root today.
Verify: scan first, then by hand
Run npx aiscan-cli yoursite.com, or paste the URL at aiscan.site, free and no account. Two checks matter here. check:E1 (discoverability) requests a random path that cannot exist and fails you if it gets 200, which is the underlying condition that fakes an agents.md. check:C2 (content) validates your /llms.txt: 200, an H1, a ## section and Markdown links.
What AIScan cannot see: whether your agents.md content is accurate or useful, because it does not grade that file directly. A passing scan means your host reports missing files honestly. It does not mean your instructions are good.
If you would rather check by hand:
# 1. The file, with status, type and size
curl -sL -o /tmp/a.md -w '%{http_code} %{content_type} %{size_download}\n' https://yoursite.com/agents.md
# 2. A control path that cannot exist
curl -sL -o /dev/null -w '%{http_code} %{content_type}\n' https://yoursite.com/zz-no-such-file-7431.md
# 3. The first lines of the body
head -5 /tmp/a.md
Pass looks like this: command 1 gives 200 and text/markdown or text/plain, command 2 gives 404, and the body starts with your own heading. Fail looks like command 1 returning text/html, or commands 1 and 2 returning identical byte counts. If the control path also returns 200, your file does not prove anything and the host needs the 404 fix first; our correct 404 guide has the stack-specific steps.
Next action
Run npx aiscan-cli yoursite.com and read the E1 and C2 rows, then run the three curl commands above. If both come back clean, publish the file. Browse all setup guides at /guides, or generate the llms.txt that sits beside it with the llms.txt generator.
Frequently asked questions
What is agents.md?
Two things share the name. AGENTS.md in a repository is a README for coding agents. /agents.md at a website root is an informal convention for telling browsing and shopping agents how to act on the site.
Is agents.md an official standard?
The repository format has its own project site at agents.md. The website-root version has no RFC or registry as of 4 October 2026, so treat it as a convention and do not rely on any agent reading it.
How is agents.md different from llms.txt?
llms.txt is a curated index of pages an agent can read, per llmstxt.org. agents.md says how an agent should act: which actions are allowed, what needs human approval and how to back off.
Does agents.md replace robots.txt?
No. robots.txt tells crawlers which paths they may request under RFC 9309. Neither file is access control, so anything that must be blocked belongs at the server or edge.
My /agents.md returns 200 but shows my homepage or a marketing page. What is wrong?
Your host maps unknown paths, or any .md path, onto an existing page. Run a control request for a made-up .md path. If it also returns 200, fix your 404 handling first, then re-check the file.
The file downloads instead of displaying in the browser. How do I fix it?
The server is sending application/octet-stream. Add a MIME mapping for .md: AddType text/markdown .md in Apache, or md in the types block of nginx. Then re-run the curl check.
I added the file but /agents.md still returns 404. Why?
A CDN or page cache is probably holding the old 404. Purge the path, confirm the file sits in the web root, and on Shopify check whether your app publishes the file at the root route.
Does AIScan check for agents.md?
Not directly. check:C2 grades /llms.txt and check:E1 fails sites that return 200 for a path that cannot exist, which is the condition that makes a fake agents.md look real.
Related guides
What a Failing AIScan Check Really Says: 2,961 Fail Lines Audited
A failing check on a scan report is supposed to be an instruction. The site owner reads the line, knows what the scanner asked for, knows what came back, and knows what to change. We audited whether…
How to return a real 404 with a recoverable body on Wix
Wix gets the status code right and leaves the page empty. Request a URL that does not exist on a Wix site and you get a genuine 404, but the body is a scriptbuilt shell with no text and no links in…
Rate-limit AI crawlers without blocking them
Most advice on rate limiting AI crawlers stops at "add a limit". The part that costs you is where the limit applies and what it answers. A limit that covers /robots.txt and /llms.txt makes your own…
Which Agent-Readiness Checks Travel Together: 739 Sites, Three Bundles
Fix one agentreadiness check and a second one often moves with it. Fix another and nothing else changes. A scan report lists every check as its own line, so the reader cannot see which lines are…
