llms.txt es un archivo Markdown que colocas en la raíz de tu dominio para que los modelos de lenguaje entiendan la estructura y el contenido de tu sitio sin tener que crawlearlo página por página.
Si has visto la variante llm.txt (sin s), es el mismo estándar — el nombre oficial es llms.txt.

Lo propuso Jeremy Howard (fast.ai / Answer.AI) en septiembre de 2024 como respuesta a un problema concreto: los LLMs tienen ventanas de contexto limitadas y no pueden procesar un sitio completo de forma
eficiente. llms.txt les da un mapa curado en lugar de obligarlos a explorar a ciegas.

Al terminar esta guía tendrás el archivo generado, publicado en la raíz de tu servidor y validado con curl.


¿Cuándo y cómo leen los LLMs tu llms.txt?

Antes de ponerte a generar el archivo, conviene entender en qué escenarios realmente lo consumen los LLMs — porque no es automático de la forma en que muchos artículos sugieren.

Escenario 1 — El usuario incluye la URL manualmente. Cuando alguien pega https://tudominio.com/llms.txt directamente en el chat de ChatGPT o Claude, el modelo fetcha el archivo y
usa su contenido para responder preguntas sobre tu sitio. Este escenario funciona hoy y es verificable.

Escenario 2 — Agentes de IDE. Este es el caso de uso más sólido para developers. Herramientas como Cursor, Cline o Continue buscan llms.txt cuando apuntas al dominio de una
documentación. Si tienes una librería con docs publicadas, un llms.txt bien formado permite que esos agentes naveguen tu documentación sin crawlear ciegamente cada enlace. El impacto es tangible y
medible.

Escenario 3 — Crawlers de entrenamiento. GPTBot, ClaudeBot y similares pueden leer llms.txt durante el crawling. Sin embargo, ninguna compañía ha confirmado oficialmente que el
archivo influya en cómo sus modelos recomiendan contenido. Un estudio de 300,000 dominios de SERanking (noviembre 2025) no encontró correlación medible entre tener llms.txt y aparecer más en
respuestas de LLMs.

La conclusión honesta: llms.txt no te va a «posicionar en ChatGPT» de forma automática. Pero el costo de implementarlo es casi cero, y el caso de uso con agentes de IDE es real y útil hoy mismo.
Vale la pena.


llms.txt vs robots.txt vs sitemap.xml — ¿cuál hace qué?

Los tres archivos conviven en la raíz de tu dominio y ninguno reemplaza a los otros:

Archivo Propósito Quién lo lee Cuándo usarlo
robots.txt Controlar acceso de crawlers Bots de búsqueda (Googlebot, GPTBot) Siempre
sitemap.xml Listar todas las URLs para indexar Motores de búsqueda Sitios con más de 10 páginas
llms.txt Índice curado de contenido para LLMs LLMs en inferencia, agentes de IDE Si tienes documentación o contenido técnico
llms-full.txt Contenido completo de cada página embebido LLMs que necesitan contexto sin requests extra Proyectos pequeños con documentación densa

La diferencia entre llms.txt y llms-full.txt es importante: llms.txt es un índice con links (el LLM fetcha las páginas que le interesan), mientras que
llms-full.txt embebe el contenido completo de cada página referenciada en un solo archivo. Más adelante, la Ruta 2 muestra cómo generar ambas variantes con la CLI oficial.


Estructura de un llms.txt válido

El formato usa Markdown estándar. El único campo obligatorio es un H1 con el nombre de tu proyecto. Todo lo demás es opcional pero recomendado:

# Mi Proyecto                          ← obligatorio: nombre del sitio

  > Librería Python para procesar X.     ← recomendado: descripción en una oración

  Documentación completa en /docs.       ← opcional: contexto adicional en prosa

  ## Guías                               ← sección H2 (opcional, puede haber varias)

  - [Inicio rápido](/docs/quickstart): Cómo instalar y hacer la primera llamada
  - [Referencia de API](/docs/api): Endpoints, parámetros y ejemplos de respuesta
  - [Configuración](/docs/config): Variables de entorno y opciones avanzadas

  ## Optional                            ← sección especial: LLMs pueden omitirla si
                                          ← necesitan un contexto más corto

  - [Changelog](/changelog): Historial de versiones
  - [Roadmap](/roadmap): Funcionalidades planeadas

La sección ## Optional tiene significado semántico en la especificación: indica al LLM que puede omitir esas URLs si el contexto se vuelve muy largo. Úsala para contenido secundario — changelogs,
FAQs, páginas de marketing.

El archivo debe estar disponible en https://tudominio.com/llms.txt con Content-Type: text/plain y codificación UTF-8. El servidor no debe requerir autenticación para accederlo.


Cómo generar tu llms.txt desde la terminal

Tres rutas según tu stack. Elige la que encaje mejor.

Ruta 1 — Crear el archivo manualmente con bash

La opción más directa para sitios con pocas páginas o cuando quieres control total sobre qué incluir.

cat > public/llms.txt << 'EOF'
  # Mi Proyecto

  > Breve descripción de qué hace tu sitio o herramienta.

  ## Documentación

  - [Guía de inicio](/docs/intro): Primeros pasos con el proyecto
  - [Referencia de API](/docs/api): Endpoints disponibles y ejemplos
  - [Configuración](/docs/config): Variables de entorno y opciones

  ## Optional

  - [Changelog](/changelog): Historial de cambios por versión
  EOF

Cambia public/ por la raíz pública de tu servidor: dist/, static/, out/, o directamente /var/www/html/ según el stack. El archivo debe quedar
accesible en la raíz del dominio, no en un subdirectorio.

Ruta 2 — CLI oficial de llmstxt.org

La librería oficial (pip install llms-txt) incluye la herramienta llms_txt2ctx. Importante antes de ver el
código: llms_txt2ctx no genera tu llms.txt — lo parsea. Toma un llms.txt que ya creaste (con la Ruta 1 o la 3) y produce un documento de contexto optimizado
para pasarle a un LLM, fetacheando el contenido de cada URL referenciada.

pip install llms-txt

  # Genera contexto Markdown desde tu llms.txt (omite sección Optional)
  llms_txt2ctx llms.txt > llms-ctx.md

  # Incluye la sección Optional → equivalente a llms-full.txt
  llms_txt2ctx llms.txt --optional True > llms-ctx-full.md

El archivo llms-ctx-full.md resultante es lo que en muchos sitios se publica como llms-full.txt: el contenido completo de todas las páginas de tu llms.txt, listo para ser
incluido en el contexto de un LLM sin requests adicionales. Para publicarlo, cópialo a la raíz de tu servidor con el nombre llms-full.txt.

Ruta 3 — Script Python que genera llms.txt desde tu sitemap.xml

Si ya tienes un sitemap.xml, este script lee todas las URLs y genera el llms.txt automáticamente. Solo usa la biblioteca estándar de Python 3 — no necesitas instalar nada.

#!/usr/bin/env python3
  """Genera llms.txt desde sitemap.xml"""
  import urllib.request
  import xml.etree.ElementTree as ET

  # Configurar estas 3 variables antes de ejecutar
  SITEMAP_URL = "https://tudominio.com/sitemap.xml"
  SITE_NAME   = "Mi Proyecto"
  SITE_DESC   = "Breve descripción de qué hace tu sitio."

  OUTPUT_FILE = "llms.txt"

  def fetch_urls(sitemap_url):
      with urllib.request.urlopen(sitemap_url) as response:
          tree = ET.parse(response)
      ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
      return [loc.text for loc in tree.findall(".//sm:loc", ns)]

  urls = fetch_urls(SITEMAP_URL)
  base = SITEMAP_URL.rsplit("/sitemap.xml", 1)[0]

  with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
      f.write(f"# {SITE_NAME}\n\n")
      f.write(f"> {SITE_DESC}\n\n")
      f.write("## Páginas\n\n")
      for url in urls:
          path = url.replace(base, "") or "/"
          f.write(f"- [{path}]({url})\n")

  print(f"llms.txt generado con {len(urls)} URLs → {OUTPUT_FILE}")

Ejecuta con python3 generate_llms.py. Para sitios con muchas páginas, considera filtrar por sección relevante antes del loop — un llms.txt con 500 URLs es demasiado para que un LLM lo
procese útilmente.


Valida que el archivo está publicado correctamente

Antes de dar el trabajo por terminado, verifica que el archivo responde correctamente:

curl -I https://tudominio.com/llms.txt

El output debe incluir estas dos líneas:

HTTP/2 200
  content-type: text/plain; charset=utf-8

Si content-type aparece como text/html, el servidor está sirviendo el archivo con el MIME type incorrecto. Corrígelo según tu servidor:

nginx — añade dentro del bloque server {}:

types { text/plain txt; }

Apache — añade en .htaccess en la raíz:

AddType text/plain .txt

Reinicia el servidor y vuelve a ejecutar curl -I para confirmar.


Tres errores que hacen que llms.txt no funcione

Error 1 — Archivo fuera de la raíz del dominio.
Síntoma: curl -I tudominio.com/llms.txt devuelve HTTP 404.
Fix: mueve el archivo a la raíz pública del servidor, no a un subdirectorio como /blog/ o /docs/.

Error 2 — Content-Type incorrecto.
Síntoma: curl -I muestra content-type: text/html en lugar de text/plain.
Fix: aplica la configuración de MIME de la sección anterior según tu servidor web.

Error 3 — Sin H1 al inicio del archivo.
Síntoma: llms_txt2ctx falla con un error de parseo; algunos LLMs no identifican el proyecto correctamente cuando incluyes la URL manualmente.
Fix: asegúrate de que la primera línea del archivo sea # Nombre de tu proyecto. Es el único campo que la especificación marca como obligatorio.


Por dónde seguir

Ya tienes el archivo generado con uno de los tres métodos, publicado en la raíz de tu dominio y validado con curl. El caso de uso más inmediato: si tienes una librería con documentación pública,
apunta Cursor o Cline a tu dominio — deberían leer el llms.txt automáticamente y navegar tu docs con más precisión.

Para mantener el archivo actualizado, integra el script de la Ruta 3 como paso post-build en tu pipeline de CI/CD: genera el llms.txt cada vez que se actualice el sitemap.xml y copia
ambos a la raíz del servidor.