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 и проверяет ответ.
Content-Type: text/markdown— сервер признаёт запрос и отвечает Markdown- Непустое содержимое — тело ответа не пустое
- Markdown-структура — тело начинается с
#или содержит Markdown-разметку
Статус pass — сервер вернул Content-Type: text/markdown с непустым телом. Статус fail — сервер вернул HTML или проигнорировал Accept заголовок.