Markdown para agentes de IA: Accept text/markdown, Content-Signal e Link Headers
Resposta curta: Markdown para agentes de IA significa que o seu servidor responde ao mesmo endereço com Markdown puro, em vez de HTML, quando o cliente pede isso com o cabeçalho de requisição
Accept: text/markdown. Os navegadores continuam recebendo HTML. São poucas linhas de código no servidor ou um recurso de CDN que você liga, e os agentes recebem texto limpo, sem menus e scripts. Um benefício para rankings ou citações em respostas de IA não está comprovado. Trate-o como um extra barato sobre um HTML legível, um bom robots.txt e um sitemap, nunca como substituto deles.
Por que os agentes de IA gostam de Markdown?
Uma página da web é feita para navegadores. Em volta do texto que você quer ler ficam a navegação, um banner de cookies, scripts, classes de estilo e rodapés. O olho de uma pessoa pula tudo isso. Um programa que precisa entregar a página a um modelo de linguagem não consegue pular de graça, porque o modelo tem uma janela de contexto limitada e cada elemento a mais ocupa parte dela.
O Markdown mantém o que importa para a leitura: títulos, parágrafos, listas, tabelas, links. Isso faz dos agentes e de ferramentas parecidas candidatos naturais a pedi-lo, e é também o motivo de a proposta do llms.txt ser escrita em Markdown. Falamos desse arquivo em llms.txt: o que é, como criar e se ele realmente funciona.
A Cloudflare deixa visível o argumento do tamanho. No anúncio do Markdown for Agents, a resposta de exemplo traz um cabeçalho x-markdown-tokens com uma estimativa da quantidade de tokens (725 no exemplo), de modo que o cliente pode avaliar quanto contexto a página vai ocupar.
O que isso não diz é se os grandes sistemas de busca com IA pedem Markdown. O anúncio da Cloudflare mostra dados do Radar sobre respostas em Markdown ao OAI-SearchBot. Isso prova que essas respostas acontecem, não que o crawler as solicita; a OpenAI não documenta isso. Por isso, não afirmamos. O que está documentado é que alguns agentes já pedem Markdown, como mostram as próximas seções.
Negociação de conteúdo: Accept, Vary e Content-Type
A negociação de conteúdo é uma parte antiga do HTTP. Um endereço pode ter várias representações, e o cliente diz qual prefere. Três cabeçalhos sustentam todo o mecanismo:
| Cabeçalho | Enviado por | Significado |
|---|---|---|
Accept | Cliente, na requisição | Quais tipos de conteúdo o cliente quer, com pesos opcionais (q=0.8) |
Content-Type | Servidor, na resposta | O que o servidor realmente enviou, aqui text/markdown; charset=utf-8 |
Vary: Accept | Servidor, na resposta | A resposta depende do cabeçalho Accept, então os caches não podem misturar as versões |
Um navegador envia primeiro text/html e acrescenta o curinga */* como alternativa. Um agente que quer Markdown o nomeia explicitamente, por exemplo Accept: text/markdown ou Accept: text/markdown, text/html;q=0.8. A Cloudflare escreve que agentes de programação comuns, como o Claude Code e o OpenCode, já enviam esses cabeçalhos Accept.
A regra que protege todo mundo é simples: responda com Markdown somente se text/markdown for citado explicitamente e não tiver peso menor do que text/html. O curinga */* nunca deve contar. Senão, um navegador, um verificador de links ou um bot de pré-visualização de redes sociais, que aceitam “qualquer coisa”, receberiam Markdown.
Markdown para agentes de IA com a Cloudflare
Em 12 de fevereiro de 2026, a Cloudflare anunciou o Markdown for Agents. Se o recurso estiver ativado na sua zona (ele está em beta, sem custo, nos planos Pro, Business e Enterprise), uma requisição com Accept: text/markdown recebe o seu HTML convertido para Markdown na hora. O seu servidor de origem não muda.
A resposta de exemplo do anúncio mostra quais cabeçalhos esperar:
content-type: text/markdown; charset=utf-8
vary: accept
x-markdown-tokens: 725
content-signal: ai-train=yes, search=yes, ai-input=yes
É o caminho mais rápido se o seu site já roda atrás da Cloudflare em um desses planos e o resultado convertido parece bom. Confira o resultado com curl (veja “Como testar com curl”) antes de confiar nele. Se você quer controle total sobre o que a versão em Markdown diz, ou se usa outra infraestrutura, monte a versão por conta própria.
Faça você mesmo: um exemplo curto em Node
O esboço a seguir contém as regras acima: Markdown só para um pedido explícito, Vary: Accept nas duas versões, um endereço fixo /index.md para clientes que não negociam e um link canonical no cabeçalho da resposta em Markdown. É um exemplo mínimo, não código de produção.
import http from 'node:http';
import { readFileSync } from 'node:fs';
function wantsMarkdown(accept = '') {
const weight = new Map();
for (const part of accept.toLowerCase().split(',')) {
const [range, ...params] = part.trim().split(';');
const q = params.find((p) => p.trim().startsWith('q='));
weight.set(range.trim(), q ? Number(q.trim().slice(2)) : 1);
}
const md = weight.get('text/markdown') ?? 0;
const html = weight.get('text/html') ?? weight.get('text/*') ?? weight.get('*/*') ?? 0;
return md > 0 && md >= html; // o curinga sozinho nunca seleciona Markdown
}
http.createServer((req, res) => {
if (req.url === '/index.md' || (req.url === '/' && wantsMarkdown(req.headers.accept))) {
res.writeHead(200, {
'Content-Type': 'text/markdown; charset=utf-8',
'Vary': 'Accept',
'Link': '<https://example.com/>; rel="canonical"',
});
return res.end(readFileSync('index.md'));
}
if (req.url === '/') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Vary': 'Accept' });
return res.end(readFileSync('index.html'));
}
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); // qualquer outro endereço responde 404
res.end('Not found');
}).listen(3000);
Três detalhes merecem um olhar mais atento:
- Vary nas duas versões. A resposta em HTML também precisa de
Vary: Accept; do contrário, um cache compartilhado pode guardar o HTML e entregá-lo a um agente que pediu Markdown, ou o contrário. - O endereço fixo.
/index.mdsempre devolve Markdown, não importa o que o cliente envie. Agentes e pessoas podem linkar para ele, e ele funciona onde não é possível definir cabeçalhos. O nosso seogrinder.com/index.md faz exatamente isso. - O cabeçalho canonical. A versão em Markdown é uma segunda representação da mesma página. O Google documenta que
rel="canonical"pode ser enviado como cabeçalho HTTP em arquivos que não são HTML. É um sinal forte de que a versão em Markdown pertence à página, não uma garantia (Google).
Escreva o arquivo Markdown à mão ou gere-o a partir da mesma fonte do HTML. De qualquer forma, ele deve dizer o mesmo que a página, só que sem a moldura.
Link headers: apontando os agentes para a descrição do seu site
O cabeçalho de resposta Link é definido na RFC 8288. Ele indica um endereço relacionado e o tipo de relação, por exemplo Link: </llms.txt>; rel="describedby". A relação describedby é registrada, e o significado dela se encaixa: o recurso linkado descreve este aqui. Um cliente que lê os cabeçalhos de resposta fica sabendo onde está a descrição do seu site antes mesmo de ler o corpo da resposta.
O seogrinder.com envia esse cabeçalho na página inicial e aponta para o próprio llms.txt. Na resposta em Markdown, o mesmo cabeçalho Link carrega também a relação canonical mostrada acima, separada por vírgula.
Se algum agente segue esses links hoje, isso não está comprovado. O custo é uma linha na configuração do servidor.
A linha Content-Signal
Em setembro de 2025, a Cloudflare introduziu uma linha para o robots.txt que diz o que um crawler pode fazer com o seu conteúdo depois de buscá-lo:
Content-Signal: search=yes, ai-input=yes, ai-train=no
search cobre a indexação e os snippets, ai-input significa usar o conteúdo diretamente em respostas de IA, e ai-train significa treinar ou ajustar um modelo. O anúncio da Cloudflare e o site contentsignals.org descrevem o formato. É uma declaração, não uma barreira: ninguém é obrigado a respeitá-la. A Cloudflare diz que os content signals expressam preferências, que não são contramedidas técnicas e que algumas empresas podem simplesmente ignorá-los. Como mostrado acima, o exemplo de Markdown da Cloudflare também traz um cabeçalho de resposta content-signal.
A linha pertence ao seu robots.txt, junto com todas as outras regras para bots de IA. Os detalhes, inclusive o erro comum dos grupos separados por bot, estão em robots.txt para crawlers de IA. O robots.txt do seogrinder.com usa um grupo compartilhado para todos os crawlers e nove identificadores de IA, com Content-Signal: search=yes, ai-input=yes, ai-train=yes.
Como testar com curl
Teste com a mesma ferramenta que um agente usaria. A opção -I mostra só os cabeçalhos:
curl -sI -H "Accept: text/markdown" https://example.com/
Procure quatro coisas na resposta: status 200, content-type: text/markdown, um vary que contenha Accept e um cabeçalho link com o endereço canonical. Este é o resultado para o seogrinder.com, reduzido às linhas relevantes:
HTTP/2 200
content-type: text/markdown; charset=utf-8
vary: Accept
link: </llms.txt>; rel="describedby"; type="text/plain", <https://seogrinder.com/>; rel="canonical"
Depois faça as verificações contrárias. Cada uma delas deve devolver text/html:
curl -sI -H "Accept: text/html" https://example.com/
curl -sI -H "Accept: */*" https://example.com/
curl -sI https://example.com/
Por último, envie -H "Accept: text/markdown, text/html;q=0.8". O Markdown deve vencer, porque tem peso maior.
Como o SEOgrinder verifica
Depois de uma análise, abra a aba Preparação para IA no SEOgrinder. Em “Verificações para agentes de IA” há sete linhas. Três delas dizem respeito a este artigo, e as três ficam no grupo “Extras”:
- Servir texto em vez de HTML (Markdown Negotiation): cumprido quando uma requisição com
Accept: text/markdowndevolve Markdown. - Levar os agentes até aos teus dados (Link Headers): procura relações úteis no cabeçalho de resposta.
- Declarar o uso do conteúdo (Content Signals): procura uma linha
Content-Signalcompleta, que cubraai-train,searcheai-input.
Os pontos em aberto mostram o botão Copiar prompt do agente direto na linha; os pontos cumpridos só o mostram depois que você expande a linha, junto com o texto encontrado. Para um ponto em aberto, o prompt descreve o que criar, mostra o estado atual com curl e dá um comando para conferir o resultado. Para um ponto cumprido, ele pede ao seu assistente de código que revise o que existe, altere só o necessário e pergunte a você antes de remover uma regra que não entenda. Decisões como permitir ou bloquear crawlers de IA continuam com você, e alguns prompts de pontos em aberto sugerem valores de exemplo; por isso, decida primeiro e leia o prompt antes de colá-lo no Claude Code, no Cursor, no GitHub Copilot ou no ChatGPT. Depois clique em Verificar de novo para analisar outra vez. Os relatórios ficam em cache por até 24 horas, e Verificar de novo força uma execução nova (algumas vezes por hora).
O SEOgrinder é franco sobre o grupo “Extras”: são sugestões de fabricantes individuais, e um efeito no Google não está comprovado. A ferramenta também não mede se o ChatGPT, o Gemini ou o Perplexity de fato mencionam a sua marca. Ela verifica a base técnica: as máquinas conseguem acessar e ler a sua página?
Vale o esforço?
Depende do que o seu site oferece. Documentação, páginas de referência, guias longos e bases de conhecimento são o tipo de conteúdo que os agentes buscam para responder a uma pergunta concreta, e uma versão limpa em Markdown é útil nesses casos. Para uma loja pequena ou um negócio local com cinco páginas, o tempo é mais bem gasto no básico: texto presente no HTML sem JavaScript, um robots.txt que deixe os bots de busca entrarem e um sitemap.
Sobre os recursos de IA do próprio Google, o Google diz que não há requisitos adicionais para aparecer nas AI Overviews ou no AI Mode, nem otimizações especiais necessárias; os detalhes estão na documentação do Google. Uma versão em Markdown, portanto, não é requisito ali. Outros assistentes podem se comportar de outra forma, mas ninguém pode prometer que um assistente de IA vai citar a sua página.
Erros comuns
- Nenhum cabeçalho Vary. Sem
Vary: Accept, um cache ou uma CDN pode servir a versão errada ao próximo visitante. - Um cache à frente que ignora o cabeçalho. Teste pelo endereço público, não só diretamente no servidor de origem.
- Markdown para navegadores. Se a sua verificação trata o curinga
*/*como pedido de Markdown, os visitantes veem texto cru. Teste com um navegador comum. - Nenhum link canonical. A versão em Markdown pode então ser tratada como uma página separada. Escolhemos o cabeçalho canonical em vez de
noindexporque a versão negociada fica no mesmo endereço da página. - Uma versão em Markdown que diz outra coisa. Mantenha o conteúdo igual ao da página HTML, só que sem a moldura. Não temos fonte sobre como os mecanismos de busca tratam diferenças entre as duas, então mantenha-as idênticas.
- Um arquivo desatualizado. Um
index.mdescrito à mão que lista a oferta do ano passado leva os agentes ao erro. Gere-o a partir da fonte da página ou coloque-o na sua lista de conferência. - Uma página HTML vazia. Se o próprio HTML não tem texto até o JavaScript rodar, o Markdown para agentes não resolve o problema dos outros clientes, como as pré-visualizações de redes sociais. O SEOgrinder aponta as páginas que só são montadas no navegador.
Perguntas frequentes
Markdown para agentes de IA é um fator de ranking?
Não há evidência disso. Veja-o como um formato de entrega para máquinas, não como alavanca de ranking.
O ChatGPT, o Claude ou o Perplexity pedem Markdown?
A Cloudflare escreve que agentes de programação como o Claude Code e o OpenCode já enviam Accept: text/markdown. Para os crawlers de busca dos grandes provedores, não há documentação de que eles peçam Markdown; os dados do Radar da Cloudflare mostram respostas em Markdown ao OAI-SearchBot, o que não prova um cabeçalho de requisição. Portanto, não está comprovado.
Preciso da Cloudflare?
Não. A Cloudflare oferece a conversão como recurso (em beta, nos planos Pro, Business e Enterprise). O esboço em Node acima mostra que poucas linhas de código no servidor bastam, e as mesmas regras podem ser implementadas em qualquer servidor ou framework.
Devo usar negociação de conteúdo ou um endereço .md separado?
Dá para fazer as duas coisas. Um endereço fixo como /index.md é fácil de linkar e de testar. A negociação mantém um único endereço para os dois públicos. O seogrinder.com oferece ambos na página inicial.
Os visitantes comuns chegam a ver a versão em Markdown?
Não, se você seguir a regra do curinga: o Markdown só é enviado quando text/markdown é citado explicitamente e não tem peso menor do que text/html.
Seu próximo passo
Faça a verificação gratuita no SEOgrinder e abra a aba Preparação para IA. Olhe as três linhas de Extras sobre Markdown, Link Headers e Content Signals e decida se o seu site é do tipo que os agentes leem. Se for, copie o prompt do agente, deixe o assistente fazer a alteração, confira o resultado com curl e verifique de novo.