crea.site
3 min de lectura seoagents

llms.txt, robots.txt y páginas servidas como markdown

Los agentes leen distinto que los navegadores. Lo que recibe cada web generada: llms.txt, política para rastreadores de IA y cada página en markdown.

Una parte cada vez mayor de las personas que oirán hablar de un pequeño negocio nunca visitará su web. Le preguntarán a un modelo, y el modelo responderá con lo que haya podido leer.

Eso convierte «¿puede un agente leer esta web?» en una cuestión de distribución, no en una curiosidad técnica. De ahí salen tres cosas, y cada web generada aquí recibe las tres sin pedirlas.

robots.txt debería nombrar a los rastreadores de IA

Si no dices nada de ellos, caen en User-agent: *. Eso no es una política, es un valor por defecto heredado.

Por eso los nombramos. Los agentes de búsqueda y respuesta que devuelven citas (OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot) y los rastreadores de entrenamiento GPTBot, ClaudeBot, Google-Extended, meta-externalagent. Cada uno hereda exactamente la misma lista de Disallow que todos los demás: ningún bot accede a la API y ningún bot accede a una página solo para miembros.

Nombrarlos no va de ser permisivos. Va de que la política esté escrita en un sitio donde se pueda cambiar a propósito.

llms.txt es un índice, no un discurso de ventas

La convención llms.txt es sencilla: un título, un resumen de un párrafo en una cita y luego secciones con enlaces. Un modelo que llegue a él debería poder saber qué es esta web y dónde están las páginas importantes, en una sola petición y sin renderizar nada.

El nuestro se genera a partir de la definición del sitio, que importa más de lo que parece. El listado se filtra con la misma regla público/privado que el sitemap:

# Piekarnia Lune

> A sourdough bakery in Kraków. Bread baked daily, cakes to order,
> open from seven.

## Pages

- [Menu](https://...): What we bake, and what it costs.
- [Order a cake](https://...): Wedding and birthday cakes, two weeks' notice.

Una sola lista, leída tres veces: por el sitemap, por llms.txt y por la etiqueta meta robots. No hay forma de que las tres discrepen, porque no hay nada que mantener sincronizado.

Cada página, también como markdown

La forma más rápida de que te malinterpreten es obligar al lector a analizar una página de maquetación para encontrar tres frases. Por eso cada página de cada web generada responde tanto a markdown como a HTML:

  • Envía Accept: text/markdown y obtienes la página en markdown en la misma URL.
  • O añade .md a la ruta, para los muchos agentes que no negocian.

Las reglas que lo mantienen honesto merecen explicarse. Es una reescritura, no una redirección. Solo ocurre ante una petición explícita de text/markdown, nunca con */*: un navegador que envía «cualquier cosa» quiere la página. Ambas respuestas llevan Vary: Accept, así que una caché compartida no puede servir un mismo cuerpo a todos. Y la variante en markdown es noindex, de modo que nunca compite en las búsquedas con la página de la que es copia.

El serializador recorre la definición del sitio y no el HTML renderizado, y por eso el resultado sale limpio: una sección de características se convierte en una lista, unas FAQ en títulos con respuestas, una tabla de precios en una tabla. Un mapa o un calendario de reservas se convierte en una línea sincera que dice qué hay, en lugar de inventar lo que habría mostrado.

También se aplica a nosotros

Este artículo está disponible en la misma URL con .md al final. Igual que el resto de páginas de crea.site, y nuestro propio llms.txt las lista.

Un creador de webs cuyas propias páginas un agente no puede leer argumenta contra sí mismo.