Módulo 2 · Curso O4AI
Descoberta: robots.txt, sitemap, Link e DNS-AID
Antes de ler ou agir, um agente precisa saber o que existe. Este módulo cobre os quatro mecanismos de descoberta que os scanners verificam, do mais antigo (robots.txt, de 1994) ao mais novo (DNS-AID, rascunho de 2026), e mostra como eles se encadeiam para que um agente vá do domínio até a API certa sem adivinhar.
Neste módulo
Aula 1
robots.txt (RFC 9309) como porta de entrada
O robots.txt nasceu em 1994 como convenção informal e virou padrão em 2022, com a RFC 9309 (Robots Exclusion Protocol). Ele fica sempre na raiz do host, em /robots.txt, e é o primeiro arquivo que crawlers e muitos agentes buscam. Para O4AI ele tem três funções: dizer o que pode ser rastreado, apontar o sitemap e, como você verá no módulo 4, declarar preferências de uso por IA.
O que a RFC 9309 define
- O arquivo é agrupado por linhas
User-agent, seguidas de regrasAlloweDisallow. Um crawler segue o grupo cujo nome casa com o seu, e o grupo*só se nada mais casar. - Quando duas regras casam, vale a mais específica (o caminho mais longo). Em empate entre Allow e Disallow, vale o Allow.
- Os curingas
*(qualquer sequência) e$(fim do caminho) são suportados. - O arquivo deve ser servido como
text/plainem UTF-8. Respostas 4xx significam "sem restrições"; erros 5xx significam "não rastreie" até o arquivo voltar. - Crawlers devem processar pelo menos 500 KiB do arquivo e podem fazer cache por até 24 horas.
robots.txt mínimo e válido
# https://exemplo.com.br/robots.txt
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /carrinho
Disallow: /*?sessao=
Sitemap: https://exemplo.com.br/sitemap.xmlUm ponto que confunde: o robots.txt é um pedido, não um controle de acesso. Ele não impede um bot de acessar nada, e listar caminhos sensíveis em Disallow só serve para mostrá-los a quem lê o arquivo. Área privada se protege com autenticação. O robots.txt organiza o comportamento dos bots que respeitam regras, e é esse comportamento que os scanners de O4AI medem.
O que o scanner verifica
Que /robots.txt responde 200, com tipo text/plain, e que tem pelo menos uma diretiva User-agent válida. É a checagem mais fácil de passar e, segundo a Cloudflare, 78% dos grandes domínios já passam.
Fontes desta aula: RFC 9309: Robots Exclusion Protocol
Aula 2
Sitemap XML e a referência no robots.txt
O sitemap é um arquivo XML que lista as URLs que você quer que sejam encontradas, com metadados como a data da última modificação. O protocolo é mantido em sitemaps.org desde 2006 e é aceito por todos os grandes buscadores. Para um agente, o sitemap é a forma mais barata de ter uma visão completa do site sem rastrear link por link.
sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://exemplo.com.br/curso-o4ai.html</loc>
<lastmod>2026-11-11</lastmod>
</url>
</urlset>Regras que fazem diferença
- Cada arquivo aceita até 50 mil URLs e 50 MB sem compressão. Acima disso, use um sitemap index que aponta para vários arquivos (o relatório de exemplo deste curso mostra um site com
sitemap.xmle um segundo sitemap temático). - Use URLs absolutas e canônicas. Uma URL no sitemap que redireciona ou devolve 404 ensina o agente a desconfiar do arquivo.
-
lastmodsó ajuda se for verdadeiro. Datas que mudam a cada build sem mudança de conteúdo fazem o crawler ignorar o campo. - Referencie o sitemap no robots.txt com a linha
Sitemap:, que pode aparecer várias vezes e fica fora dos grupos de user-agent.
Para agentes, vale pensar no sitemap junto com os formatos do módulo 3. Se cada página tem uma versão Markdown, o llms.txt funciona como um "sitemap comentado" para modelos, e o sitemap XML continua sendo a lista completa e verificável.
Fontes desta aula: sitemaps.org: Sitemaps XML format
Aula 3
Cabeçalhos Link (RFC 8288): descoberta em cada resposta
A RFC 8288 (Web Linking) define o cabeçalho HTTP Link, que expressa a mesma ideia do elemento <link> do HTML, mas em qualquer resposta, inclusive em JSON, PDF ou imagem. Cada link tem um destino e um tipo de relação (rel). Para um agente, o cabeçalho Link é valioso porque aparece em uma simples requisição HEAD, sem precisar baixar e interpretar o HTML.
Resposta da página inicial com cabeçalhos Link
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Link: </.well-known/api-catalog>; rel="api-catalog"; type="application/linkset+json",
</llms.txt>; rel="describedby"; type="text/plain",
</index.md>; rel="alternate"; type="text/markdown",
</.well-known/agent-skills/index.json>; rel="agent-skills"; type="application/json"Relações mais usadas em O4AI
| rel | Aponta para | Origem |
|---|---|---|
api-catalog | O catálogo de APIs em /.well-known/api-catalog | RFC 9727 |
service-desc | Descrição legível por máquina de uma API (ex.: OpenAPI) | RFC 8631 |
service-doc | Documentação para humanos da API | RFC 8631 |
describedby | Um recurso que descreve o atual | Registro IANA |
alternate | Outra representação, como a versão Markdown | HTML / IANA |
sitemap | O sitemap | Usado em linksets |
agent-skills | O índice de Agent Skills | Proposta Agent Skills discovery |
mcp | O MCP Server Card | Proposta de comunidade |
A checagem dos scanners é simples: a página inicial precisa ter pelo menos um cabeçalho Link útil para agentes. No relatório que inspirou este curso, a falha "No Link headers found on target page" é uma das mais comuns, porque o HTML costuma ter <link rel="alternate">, mas o servidor não envia o cabeçalho equivalente.
O cabeçalho Link conecta este módulo aos outros. Ele aponta para o API Catalog (módulo 5), para o índice de skills e o Server Card (módulo 6) e para a versão Markdown (módulo 3). Pense nele como o "índice remissivo" do site, entregue em cada resposta.
Cuidado com o tamanho
Cabeçalhos muito grandes podem ser cortados por proxies e CDNs. Mantenha no cabeçalho só as relações de descoberta mais importantes e coloque o resto no API Catalog, que é um linkset em JSON feito para isso.
Fontes desta aula: RFC 8288: Web Linking · RFC 8631: Link Relation Types for Web Services · RFC 8615: Well-Known URIs
Aula 4
DNS-AID: descoberta de agentes pelo DNS
Todos os mecanismos anteriores dependem de uma requisição HTTP. O DNS-AID (DNS for AI Discovery) propõe que a descoberta comece um passo antes, no DNS, que é distribuído, tem cache em todo lugar e pode ser assinado com DNSSEC. A proposta é o rascunho draft-mozleywilliams-dnsop-dnsaid na IETF, escrito por autores da Infoblox, da Deutsche Telekom e independentes. É um rascunho individual: ainda não é padrão e muda entre versões.
Os nomes
O rascunho reserva o rótulo _agents sob o domínio da organização e define nomes previsíveis:
_index._agents.exemplo.com.br: ponto de entrada, que leva ao índice dos agentes da organização._mcp._agents.exemplo.com.br: serviços que falam MCP._a2a._agents.exemplo.com.br: agentes que falam A2A.<id>._mcp._agents.exemplo.com.br: um serviço específico, com apelidos amigáveis apontando para ele.
Os registros
O DNS-AID não cria tipos novos de registro. Ele usa SVCB e HTTPS (RFC 9460), os mesmos registros que navegadores já consultam para descobrir HTTP/3. Em ServiceMode (prioridade maior que zero), o registro aponta o host do serviço e carrega parâmetros como alpn (protocolos aceitos) e port. Em AliasMode (prioridade zero), funciona como apelido.
Zona DNS com DNS-AID (adaptado dos exemplos do rascunho)
; ponto de entrada
_index._agents.exemplo.com.br. 3600 IN SVCB 1 agentes.exemplo.com.br. (
alpn="h2,h3" port=443 )
; servidor MCP
_mcp._agents.exemplo.com.br. 3600 IN HTTPS 1 mcp.exemplo.com.br. (
alpn="h3,h2" port=443 mandatory="alpn,port" )
; apelido para um serviço específico
faturamento._mcp._agents.exemplo.com.br. 300 IN SVCB 0 a4k2f9._mcp._agents.exemplo.com.br.O rascunho também prevê chaves de parâmetro próprias, ainda com números provisórios (como key65001 para uma URN de capacidade e key65010 para os protocolos aceitos), um registro TXT de desafio para validar o domínio e o uso opcional de TLSA (DANE) para fixar o certificado.
DNSSEC é obrigatório
O texto é explícito: uma zona pública usada para descoberta de agentes deve usar DNSSEC, e o agente deve usar um resolvedor que valide as assinaturas e tratar respostas inválidas como falha. A razão é que um registro forjado no DNS mandaria o agente para um servidor MCP falso, que poderia receber dados ou instruções maliciosas.
Como o scanner testa
No relatório de exemplo, o scanner faz consultas DoH (DNS sobre HTTPS) por SVCB, HTTPS e TXT em _index._agents, _a2a._agents e _mcp._agents, com e sem www. Respostas NXDOMAIN em todas resultam em "DNS-AID well-known entrypoint records not found". Você pode reproduzir com:
dig +short _index._agents.exemplo.com.br SVCB
dig +short _mcp._agents.exemplo.com.br HTTPS
curl -s -H 'accept: application/dns-json' \
'https://cloudflare-dns.com/dns-query?name=_index._agents.exemplo.com.br&type=SVCB'Vale implementar?
Se você não tem um servidor MCP ou agente A2A público, não há o que anunciar e o DNS-AID não faz sentido ainda. Se tem, o custo é baixo (alguns registros e DNSSEC ligado), mas lembre que o rascunho pode mudar nomes e parâmetros. Documente a versão que você seguiu.
Fontes desta aula: IETF: draft-mozleywilliams-dnsop-dnsaid · RFC 9460: SVCB e HTTPS · specification.website: DNS-AID
Erros comuns na descoberta
- robots.txt servido como HTML. Frameworks de página única devolvem o index.html para qualquer caminho. O scanner vê status 200, mas o conteúdo é inválido.
- Sitemap com URLs que redirecionam. Comum depois de migração de http para https ou de mudança de barra final.
- Link apenas no HTML. O agente que faz HEAD ou que pede Markdown nunca vê o
<link>do HTML. Envie o cabeçalho. - DNS-AID sem DNSSEC. Pelo rascunho, registros não assinados não devem ser usados pelo agente. Publicar sem DNSSEC é trabalho perdido.
- Bloquear tudo no robots.txt por medo de IA. Um
Disallow: /para*tira o site também do buscador. As regras por finalidade ficam no módulo 4.
Aplicação prática: monte a camada de descoberta
- Valide o robots.txt: status 200,
text/plain, grupo*e linhaSitemap:. - Confira que todas as URLs do sitemap respondem 200 e são canônicas. Um script com curl em laço resolve.
- Adicione na página inicial o cabeçalho
Linkcom pelo menosrel="alternate"; type="text/markdown"(que você implementa no módulo 3) e, se tiver API,rel="api-catalog". - Se você já tem um servidor MCP público, ligue o DNSSEC e publique
_mcp._agentse_index._agents.
Siglas e termos deste módulo
- DNS-AID:
- DNS for AI Discovery, descoberta de agentes via DNS.
- SVCB:
- Service Binding, registro DNS que descreve como se conectar a um serviço (RFC 9460).
- DNSSEC:
- DNS Security Extensions, assinaturas criptográficas para respostas DNS.
- DoH:
- DNS over HTTPS, consultas DNS feitas por HTTPS.
- ALPN:
- Application-Layer Protocol Negotiation, lista de protocolos aceitos (h2, h3).
- DANE / TLSA:
- Mecanismo para publicar no DNS o certificado esperado de um serviço.
- IANA:
- Internet Assigned Numbers Authority, que mantém os registros de nomes e parâmetros.