Content Accessibility

Markdown for Agents

Content negotiation: сервер отдаёт Markdown вместо HTML по запросу AI-агента через Accept-заголовок.

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

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

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:

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:

// 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:

// 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): 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 заголовок.

Источники и спецификации