# markdown-for-agents

## Что такое Markdown for Agents?

**Markdown for Agents** — паттерн, при котором веб-сервер поддерживает HTTP content negotiation и возвращает страницу в формате Markdown для AI-агентов, запрашивающих `Accept: text/markdown`.

```http
GET /blog/article HTTP/1.1
Accept: text/markdown

HTTP/1.1 200 OK
Content-Type: text/markdown

# Заголовок статьи
Текст без навигации, рекламы и JS...
```

## Зачем сайту Markdown for Agents?

HTML-страницы содержат навигацию, рекламу и скрипты — «шум», который снижает качество парсинга AI-моделями. Markdown — чистый структурированный текст, который LLM читают эффективнее.

Поддержка content negotiation позволяет одному URL обслуживать и людей (HTML), и агентов (Markdown) без дублирования контента.

## Как реализовать Markdown for Agents?

**Express.js / Node.js:**
```typescript
app.get('/article/:slug', (req, res) => {
  const accept = req.headers['accept'] ?? '';
  if (accept.includes('text/markdown')) {
    res.setHeader('Content-Type', 'text/markdown');
    return res.send(getMarkdownContent(req.params.slug));
  }
  res.send(getHtmlPage(req.params.slug));
});
```

**Next.js App Router:**
```typescript
// app/blog/[slug]/route.ts
export async function GET(req: Request, { params }: { params: { slug: string } }) {
  const accept = req.headers.get('accept') ?? '';
  if (accept.includes('text/markdown')) {
    const md = await getMarkdownContent(params.slug);
    return new Response(md, {
      headers: { 'Content-Type': 'text/markdown; charset=utf-8' },
    });
  }
  // fallback to page render
}
```

**Astro SSR:**
```typescript
// src/pages/blog/[slug].ts
export async function GET({ params, request }: APIContext) {
  const accept = request.headers.get('accept') ?? '';
  if (accept.includes('text/markdown')) {
    const md = await getMarkdownContent(params.slug);
    return new Response(md, {
      headers: { 'Content-Type': 'text/markdown; charset=utf-8' },
    });
  }
}
```

**Cloudflare Workers** (через [Markdown for Agents](https://developers.cloudflare.com/workers-ai/markdown-for-agents/)): Workers AI поддерживает паттерн встроенно — проверьте документацию.

## Как мы проверяем Markdown for Agents?

Сканер делает `GET /` с заголовком `Accept: text/markdown` и проверяет ответ.

1. **`Content-Type: text/markdown`** — сервер признаёт запрос и отвечает Markdown
2. **Непустое содержимое** — тело ответа не пустое
3. **Markdown-структура** — тело начинается с `#` или содержит Markdown-разметку

Статус **pass** — сервер вернул `Content-Type: text/markdown` с непустым телом. Статус **fail** — сервер вернул HTML или проигнорировал `Accept` заголовок.

[← Все термины глоссария](/glossary)
