# Markdown for Agents: Serve Your Pages in Markdown to AI

> What serving a Markdown version of your pages to AI agents means: .md URLs, content negotiation, Cloudflare's feature and what Google says.

URL: https://clione.ai/glossary/markdown-for-agents/
Lang: en

Markdown is a syntax for writing formatted text with simple signs: hash marks for headings, asterisks for bold. "Markdown for agents" is not about writing that way but about **serving every page of your site in that format too**, so an [AI agent](/glossary/ai-agent/) reads it without the menu, the scripts or the layout. It is not [llms.txt](/glossary/llms-txt/), which is an index of the site, and it is not Shopify's [`agents.md`](/glossary/agents-md/), which describes the store: it is a clean version of each page. It matters because a [product page](/glossary/product-page/) in HTML carries far more code than content, and the agents that read the web already ask for this version.

## What is standard and what is not

Three pieces of very different origin live under the same name, and it pays to separate them before deciding anything.

**[Content negotiation](/glossary/content-negotiation/), which is standard.** HTTP allows one address to have several representations of the same resource. Content negotiation works like this: the client says what it prefers with the `Accept` headers, and the server picks the representation according to those preferences. The response's `Vary` header says which request headers it took into account when choosing.[^rfc9110] The `text/markdown` type has existed as a registered type since March 2016: RFC 7763 describes it as a family of plain-text syntaxes that can be converted to HTML, and it **requires declaring the character set** with the `charset` parameter.[^rfc7763] With those two pieces, an agent can send `Accept: text/markdown` to the same URL as your product page and get Markdown back.

**URLs ending in .md, which are a proposal.** The llms.txt proposal suggests that the pages an agent might need have a clean Markdown version at the same URL, with `.md` added at the end (`page.html.md`) or replacing the extension (`page.md`); URLs with no file name add `index.html.md` or `index.md`. So a client can find them, it recommends linking them with `rel="alternate" type="text/markdown"`, in the HTML or in an HTTP [`Link` header](/glossary/link-header/).[^llmstxt] It is a convention with an author and a date, not a standard from any standards body.

**Automatic conversion, which is a vendor feature.** On February 12, 2026, Cloudflare introduced Markdown for Agents, in beta.[^cf-md-blog] If you turn it on for your zone, when a request arrives with `Accept: text/markdown`, Cloudflare fetches the HTML from your server, converts it to Markdown and delivers it. It is available at no cost on the Pro, Business and Enterprise plans, only converts HTML and **does not convert responses larger than 2 MB**. The response carries `Content-Type: text/markdown; charset=utf-8`, a `Vary` that includes `Accept` so the [cache](/glossary/cdn-caching-for-bots/) stores the two versions separately, a [token](/glossary/token/) estimate in `x-markdown-tokens`, and it loses the `ETag` and `Last-Modified` headers.[^cf-md-docs]

| Piece                                     | What it is                                 | Who defines it              |
| ----------------------------------------- | ------------------------------------------ | --------------------------- |
| `Accept: text/markdown` at the same URL   | HTTP content negotiation                   | IETF, RFC 9110 and RFC 7763 |
| URL ending in `.md` and `rel="alternate"` | A convention for finding the clean version | The llmstxt.org proposal    |
| Markdown for Agents                       | HTML-to-Markdown conversion on the network | Cloudflare, beta feature    |

The case for it is size. Cloudflare measured its own announcement post: **16,180 tokens in HTML and 3,150 in Markdown, 80% fewer**. And it reported that widely used coding agents, such as Claude Code and OpenCode, already send that header when requesting a page.[^cf-md-blog] Less leftover text leaves more room in the model's [context window](/glossary/context-window/) for what matters.

## What Google says

For Google Search, the answer is short: you do not need to create machine-readable files, AI text files, markup or Markdown to appear in Search, **generative AI features included**, because Search does not use them.[^google-ai-guide] Markdown for agents is for the other readers: the assistants and agents that request pages to answer or to act.

There is a line not to cross. Google defines cloaking as presenting different content to users and to search engines with the intent to manipulate rankings and mislead users, and gives as an example inserting text or keywords only when the one requesting the page is a search engine.[^google-spam] A Markdown version that says the same as the page is not that. One that adds arguments, prices or promises the page does not have comes close to it.

## In a store

A **fictional example**: a tripod's product page, requested by an agent using content negotiation.

```bash
curl -s -D - -H "Accept: text/markdown" https://example-tripods.com/products/travel-tripod
```

```text
HTTP/2 200
content-type: text/markdown; charset=utf-8
vary: Accept

# Carbon travel tripod

Folding tripod for mirrorless cameras, with a ball head.

- Price: 189.00 USD
- Availability: in stock

## Frequently asked questions

### Does it fit in carry-on luggage?
Yes, folded it is smaller than a standard carry-on backpack.
```

What matters is not the format but what it carries: the name, the price, the availability and the answers to the buyer's doubts, without the menu, the footer or the cart. That text has to match the HTML product page; if the price changes in one, it changes in the other. Clione generates one Markdown document per product, with its name, its details, a buying guide, its keywords and its frequently asked questions, and serves it on the store's own domain.


**Turning on Cloudflare's conversion also publishes a signal about how your content can be used.** By default, every Markdown response carries the `content-signal` header with `ai-train=yes, search=yes, ai-input=yes`, meaning the content can be used to train models, for search results and as agent input, unless your server sends its own header.[^cf-md-docs] If you closed the door to training crawlers in your [`robots.txt`](/glossary/robots-txt/), check that this signal does not say the opposite. What to let through and what not is the [AI bot blocking](/glossary/ai-bot-blocking/) decision.


## How to check it

1. **Request a product page with the `Accept: text/markdown` header**, with `curl` as in the example, and look at the response's `Content-Type`. If `text/html` comes back, your site does not negotiate the format.[^rfc9110]
2. **Try the proposal's convention**: the same URL with `.md` at the end. A 404 only says you do not use it.[^llmstxt]
3. **Look in the product page's HTML for a `<link rel="alternate" type="text/markdown">`**, or in the response headers for a `Link` with that type: that is how an agent learns the clean version exists.[^llmstxt]
4. **If the version exists, compare it with the page**: price, availability and text have to match.[^google-spam]
5. **If you use Cloudflare, check the `Vary` header** (it has to include `Accept`) and the `content-signal` header, and decide whether the default signal is the one you want.[^cf-md-docs]

## Related concept: llms.txt

[llms.txt](/glossary/llms-txt/) and Markdown for agents come from the same proposal, but they do different jobs. llms.txt is **a single file that summarizes the site and links its pages**; the Markdown versions are those pages, one by one, cleaned up. The proposal joins them: llms.txt should link model-readable versions, and each Markdown version can point to the llms.txt that covers it with `rel="describedby"`.[^llmstxt] One is the index; the other, the content.

To keep going, the [content negotiation](/glossary/content-negotiation/) entry explains the HTTP mechanism in more detail, and this topic's [reading path](/learn/crawling-and-indexing/) orders the rest of the terms.
