LLMScout
Verificador de SEO y GEO sin configuración: 21 comprobaciones de SEO técnico y de motor generativo para un sitio en vivo.
Documentación
LLMScout
Install • Quickstart • CLI reference • Comparison • FAQ • Contributing
Ejecuta 21 comprobaciones de SEO técnico y GEO (optimización para motores generativos) contra tu sitio, en TypeScript puro o Python puro, con cero intérprete de Python, cero navegador sin interfaz y cero cadena de herramientas externa en cualquiera de los dos casos.

Instalación
LLMScout se distribuye como dos distribuciones independientes y complementarias. Ambas ejecutan las mismas 21 comprobaciones con los mismos veredictos PASS/WARN/FAIL, así que elige la que mejor se adapte a tu cadena de herramientas.
Node/TypeScript (npm):
npm install -g llmscout-cli
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
La CLI requiere Node 18+ (declarado en package.json engines). Las dos dependencias en tiempo de ejecución son cheerio (análisis de HTML) y commander (análisis de argumentos): no hay intérprete de Python, ni pip install, ni descarga de Playwright/Chromium en ningún lugar de la instalación npm.
[!NOTE] La instalación npm incorpora
undicicomo dependencia transitiva decheerio.npm auditha señalado un aviso de alta severidad contra ella en el pasado; el bloqueoverridesdepackage.jsonfijaundici(yjs-yaml/nanoid) a rangos parcheados para cerrarlo. Ejecutanpm auditdespués de la instalación para confirmar que tu árbol resuelto está limpio.
Python (PyPI):
pip install llmscout-cli
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
Cero dependencias en tiempo de ejecución: tanto el análisis de HTML como la obtención HTTP usan únicamente la biblioteca estándar de Python. Consulta python/README.md para la guía completa específica de Python.
Luego, en cualquier proyecto que quieras comprobar:
llmscout init .
Eso genera un config llmscout.json y un pequeño archivo de skill de Claude Code en el directorio destino. Define la URL de tu sitio y ejecuta llmscout check ..
Inicio rápido
Genera un config y ejecuta una comprobación contra un sitio en vivo:
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
Salida real de llmscout check contra https://example.com:
LLMScout check -- https://example.com
[PASS] (technical) Title tag
Title "Example Domain" is 14 characters, within the recommended 10-60 range.
[WARN] (technical) Meta description
No meta description found.
Fix: Add <meta name="description" content="..."> with 50-160 characters summarizing the page.
[WARN] (technical) Canonical tag
No <link rel="canonical"> tag found.
Fix: Add a canonical link tag pointing at the preferred URL for this page.
[FAIL] (technical) robots.txt
robots.txt was not reachable at https://example.com/robots.txt (HTTP 404).
Fix: Add a robots.txt file at your site root, even a permissive one, so crawlers and agents have explicit directives.
[WARN] (technical) sitemap.xml
No sitemap was reachable (tried: https://example.com/sitemap.xml).
Fix: Add a sitemap.xml at your site root, or point to one with a Sitemap: directive in robots.txt, to help search engines discover pages.
[PASS] (technical) Heading structure
Exactly one <h1> and no skipped heading levels detected.
[PASS] (technical) Image alt coverage
No <img> tags found on the page.
[WARN] (technical) Open Graph tags
No Open Graph tags found.
Fix: Add Open Graph meta tags (og:title, og:description, og:image, og:url) so shared links render rich previews on social platforms.
[WARN] (technical) Twitter/X Card tags
No twitter:card meta tag found.
Fix: Add <meta name="twitter:card" content="summary_large_image"> (or another valid card type) so links render rich previews on X/Twitter.
[WARN] (technical) Meta robots directives
No meta robots directives found; default Google Search snippet/preview limits will apply.
Fix: Add <meta name="robots" content="max-snippet:-1, max-image-preview:large, max-video-preview:-1"> to control search snippet appearance.
[PASS] (technical) Image weight
No <img> tags with an http(s) src to measure.
[PASS] (technical) Redirect chain
The homepage resolved with no redirects.
[WARN] (geo) Structured data (JSON-LD)
No JSON-LD structured data found.
Fix: Add schema.org JSON-LD markup (e.g. Organization, WebSite, or Article) so generative engines can understand the page's entities.
[WARN] (geo) llms.txt
No llms.txt found at https://example.com/llms.txt.
Fix: Optional: add an llms.txt at your site root summarizing the site for LLM-based agents (see llmstxt.org).
[WARN] (geo) AI crawler directives
robots.txt is unreachable, so AI-crawler directives could not be determined.
Fix: Add a reachable robots.txt if you want to state an explicit policy for AI crawlers (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended).
[WARN] (geo) FAQ schema
No FAQPage structured data found.
Fix: If this page has an FAQ section, mark it up with FAQPage JSON-LD so generative engines can surface individual answers.
[PASS] (geo) Content extraction friendliness
Found 1 heading(s) and 1 structured text block(s); content appears reasonably extractable. (Heuristic: cannot assess semantic quality or JS-rendered content.)
[WARN] (geo) Speakable schema
No Speakable structured data found.
Fix: If this page has content suited for voice assistants, add a "speakable" SpeakableSpecification to its JSON-LD so voice search can surface it.
[WARN] (geo) Organization schema
No Organization/Corporation/LocalBusiness/Person structured data found.
Fix: Add Organization (or Person) JSON-LD with a sameAs array of your official social/profile URLs to strengthen Knowledge Panel signals.
[WARN] (geo) Markdown content negotiation
Requesting https://example.com/ with "Accept: text/markdown" returned Content-Type "text/html" instead of text/markdown.
Fix: Optional: serve a text/markdown representation of pages when the client sends "Accept: text/markdown" so LLM-based agents can fetch clean Markdown directly instead of parsing HTML.
[WARN] (geo) Link header (RFC 8288)
The homepage does not send a Link response header.
Fix: Optional: add an RFC 8288 Link response header (e.g. <https://example.com/feed>; rel="alternate") to advertise machine-readable service-discovery endpoints to crawlers and AI agents.
Summary: 6 PASS, 14 WARN, 1 FAIL (21 checks)
La misma ejecución con --json:
llmscout --json check ./my-site
{
"siteUrl": "https://example.com",
"summary": {
"pass": 6,
"warn": 14,
"fail": 1,
"total": 21
},
"results": [
{
"id": "title",
"name": "Title tag",
"category": "technical",
"status": "PASS",
"message": "Title \"Example Domain\" is 14 characters, within the recommended 10-60 range."
}
]
}

check sale con 0 cuando ninguna comprobación falla, con 1 cuando al menos una comprobación falla (WARN por sí solo no hace fallar la ejecución), y con 2 ante un error de uso, como un llmscout.json faltante o mal configurado.
Características
- 21 comprobaciones en dos categorías. 12 comprobaciones de SEO técnico y 9 de GEO, enumeradas por nombre en Las 21 comprobaciones.
- Cero cadena de herramientas externa, en cualquiera de los dos lenguajes.
child_processnunca se importa en ningún lugar del código fuente TypeScript; la versión Python tiene cero dependencias en tiempo de ejecución. Las comprobaciones se ejecutan dentro del proceso en lugar de invocar scripts de Python o un navegador sin interfaz. - Multiplataforma por diseño. Sin invocaciones
python3-versus-py -3ni resolución de rutas relativas, por lo que la misma instalación funciona de forma idéntica en Windows, macOS y Linux. - Obtención endurecida. El único envoltorio de obtención (
src/fetch-utils.ts) rechaza cualquier esquema que no seahttp(s), bloquea hosts de loopback/privados/enlace-local, sigue las redirecciones manualmente de una en una y limita la cadena a 5 saltos y el cuerpo de la respuesta a 10 MiB. - Modo flota con informes por sitio.
llmscout fleet manifest.jsonejecuta la suite completa en muchas rutas de repositorios de clientes locales en una sola invocación, y--out-direscribe un archivo de informe con nombre automático por sitio, diseñado para agencias que comprueban muchos sitios de clientes a la vez. - Salida estructurada. Cada comando acepta un flag global
--jsonpara salida legible por máquina, de modo que un agente que invoque la CLI pueda analizar los resultados programáticamente. - Un User-Agent real y configurable. Envía un User-Agent de navegador genuino por defecto (algunos frameworks SSR y CDN rechazan por completo cadenas de tipo bot) y un flag
--user-agentpara sobrescribirlo. - Bien probado. 248 pruebas TypeScript y 233 pruebas Python, ambas reproducibles localmente con
npm test/npm run test:coverageypytest. La distribución Python tiene cero dependencias en tiempo de ejecución, por lo que no hay nada que una auditoría de dependencias pueda señalar. En el lado de npm,npm auditreporta actualmente un aviso de alta severidad enundici, una dependencia transitiva traída porcheerio, no en el código propio de este proyecto.
Por qué las comprobaciones GEO importan ahora mismo
El tráfico de búsqueda se está desplazando de forma real hacia las respuestas mediadas por IA, y el desplazamiento es reciente y está bien medido, no es una hipótesis:
- Los propios AI Overviews de Google ya están recortando el porcentaje de clics. Ahrefs midió que la CTR de la posición 1 en palabras clave que activan AI Overviews cayó del 7,3 % (diciembre de 2023) al 1,6 % (diciembre de 2025), una reducción media de CTR del 58 % en todo el estudio. (Ahrefs, diciembre de 2025) El análisis independiente de Semrush sobre 10 millones de palabras clave encontró que la CTR orgánica cae un 61 % y la CTR de pago un 68 % cuando aparece un AI Overview en la página de resultados. (Semrush)
- El propio ChatGPT es ahora una fuente de tráfico real y medible. El análisis de Search Engine Land de 6,77 millones de sesiones encontró que ChatGPT representa el 92 % de todo el tráfico de referencia de asistentes de IA, con una conversión del 7,1 %, cerca del 7,8 % de la búsqueda de pago. (Search Engine Land)
- Los rastreadores de IA ya no son un solo rastreador. Entre mayo de 2024 y mayo de 2025, la cuota de GPTBot en el tráfico de rastreadores de IA pasó del 5 % al 30 %. OpenAI y Anthropic han dividido desde entonces sus bots en rastreadores de entrenamiento (GPTBot, ClaudeBot) y rastreadores separados de búsqueda/recuperación, bloqueables de forma independiente (OAI-SearchBot, Claude-SearchBot). (Cloudflare Radar, "De Googlebot a GPTBot") La comprobación
ai-crawler-directivesde LLMScout informa por separado sobre los siete bots principales actuales de entrenamiento y búsqueda (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended), ya que bloquear el bot de entrenamiento de una empresa no tiene ningún efecto sobre si su asistente aún puede recuperar y citar tu página en vivo a través de su propio bot de búsqueda. - La entrega nativa en Markdown es una práctica real y emergente, no una moda pasajera. Cloudflare documenta la negociación de contenido HTTP (
Accept: text/markdown) como una forma basada en estándares de servir a los agentes una representación más ligera y limpia de una página; su propio benchmark vio una reducción del 80 % en tokens en una entrada de blog. (Cloudflare, "Markdown para agentes") Vale la pena ser honesto sobre el estado actual: un análisis independiente de 300 000 dominios encontró que, en la práctica, ningún rastreador importante de IA envía todavía la cabeceraAccept: text/markdownpara negociarla realmente; descubren Markdown solo mediante enlaces directos. (Dries Buytaert) La comprobaciónmarkdown-negotiationde LLMScout informa sobre esto sin fingir que el ecosistema está más avanzado de lo que está. - No todas las señales en este espacio están resueltas, y LLMScout no finge lo contrario.
llms.txtes una convención real impulsada por la comunidad (creada en septiembre de 2024, adoptada por aproximadamente el 8-10 % de los sitios principales a mediados de 2026, incluidos Anthropic, Stripe, Cloudflare y Vercel), pero Gary Illyes, de Google, ha declarado públicamente que Google no la admite ni tiene planes de hacerlo, comparándola con la etiqueta metakeywordsobsoleta. (Search Engine Journal) La comprobaciónllms-txtde LLMScout informa de su presencia como informativa, nunca como un requisito de aprobación: la función de la herramienta es informar de lo que realmente está configurado, no prescribir una política que la evidencia aún no respalda. - Google eliminó por completo los resultados enriquecidos de FAQ de la Búsqueda el 7 de mayo de 2026. (Search Engine Journal) El propio esquema
FAQPageno está obsoleto: sigue siendo marcado válido que otros motores y asistentes de IA aún pueden analizar para la extracción de respuestas directas, por lo que la comprobaciónfaq-schemade LLMScout sigue informando sobre él, solo que sin dar a entender que ya genera un resultado enriquecido en la SERP de Google.
Las 21 comprobaciones
Cada comprobación reporta PASS, WARN o FAIL, con una sugerencia de corrección para cualquier cosa que no sea un PASS limpio. Un WARN es una optimización perdida, no una página rota, y nunca hace fallar la ejecución por sí solo.
SEO técnico (12)
Comprobación (id) | Qué verifica |
|---|---|
Etiqueta de título (title) | Existe un <title> y tiene entre 10 y 60 caracteres. |
Meta descripción (meta-description) | Existe un <meta name="description"> y tiene entre 50 y 160 caracteres. |
Etiqueta canónica (canonical) | Existe un <link rel="canonical"> y su href es una URL válida (los href relativos se resuelven, no se penalizan). |
robots.txt (robots-txt) | /robots.txt es accesible y contiene al menos una directiva User-agent. |
sitemap.xml (sitemap-xml) | /sitemap.xml es accesible y válido, con una directiva Sitemap: en robots.txt comprobada como ubicación alternativa. Una respuesta que parece una página de desafío de CDN (por ejemplo, la gestión de bots de Cloudflare) recibe un mensaje distinto en lugar de uno genérico de "sitemap malformado". |
Estructura de encabezados (heading-structure) | Exactamente un <h1> y sin niveles de encabezado saltados (por ejemplo, un <h1> seguido directamente por un <h3>). |
Cobertura de alt en imágenes (image-alt) | Las etiquetas <img> tienen un atributo alt (un alt="" intencional para imágenes decorativas cuenta como cubierto). |
Etiquetas Open Graph (open-graph) | Las etiquetas meta og:title, og:description, og:image y og:url están presentes, para vistas previas de enlaces enriquecidas en plataformas sociales. |
Etiquetas de tarjeta Twitter/X (twitter-card) | Una etiqueta meta twitter:card válida y sus campos complementarios obligatorios están presentes. |
Directivas meta robots (robots-meta-directives) | Las directivas avanzadas de control de fragmentos (max-snippet, max-image-preview, max-video-preview) están establecidas, y señala un noindex rotundo. |
Peso de imagen (image-weight) | El tamaño real en bytes de cada imagen (mediante una solicitud HEAD), señalando las imágenes sobredimensionadas que ralentizan la carga de la página. |
Cadena de redirecciones (redirect-chain) | La cadena completa de redirecciones de la página de inicio, advirtiendo sobre cadenas largas y fallando si la cadena termina en un estado de error. |
GEO / optimización para motores generativos (9)| Comprobación (id) | Qué verifica |
| --- | --- |
| Datos estructurados (structured-data) | Los bloques JSON-LD <script type="application/ld+json"> existen y se analizan como JSON válido. |
| llms.txt (llms-txt) | Un /llms.txt está presente en la raíz del sitio (una convención emergente, no estandarizada -- ver Por qué los chequeos GEO importan ahora mismo; la ausencia es informativa). |
| Directivas de rastreadores de IA (ai-crawler-directives) | Informa el estado de permitir/bloquear en robots.txt para GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended y Applebot-Extended. Esto es un informe de lo que está configurado, nunca una recomendación de permitir o bloquear. |
| Esquema FAQ (faq-schema) | El JSON-LD FAQPage está presente (informativo; solo relevante para páginas que realmente tienen un FAQ -- ver la nota sobre la desaprobación de resultados enriquecidos de Google de mayo de 2026 más arriba). |
| Amigabilidad para extracción de contenido (content-extraction) | Heurística: la página tiene una estructura de encabezados/párrafos que un motor puede dividir, en lugar de un gran bloque no estructurado. No puede ver contenido que solo aparece después de JavaScript del lado del cliente, por diseño. |
| Esquema speakable (speakable-schema) | Un SpeakableSpecification está presente en JSON-LD, para la elegibilidad de respuestas de asistentes de voz. |
| Esquema de organización (organization-schema) | El JSON-LD Organization/Person con un array sameAs de URLs de perfil oficiales está presente, para señales del Panel de Conocimiento. |
| Negociación de contenido Markdown (markdown-negotiation) | Si el sitio sirve una representación text/markdown cuando se solicita mediante negociación de contenido Accept: text/markdown. |
| Cabecera Link (link-header) | Si la respuesta de la página de inicio envía una cabecera Link RFC 8288 para el descubrimiento de servicios legibles por máquina. |
Puedes ejecutar solo una categoría editando el bloque checks en llmscout.json ({ "checks": { "technical": true, "geo": false } }).
Referencia de CLI
Transcrito de la salida --help de la propia herramienta.
$ llmscout --help
Usage: llmscout [options] [command]
Zero-config, cross-platform SEO and GEO checks for local projects, with no
Python or headless-browser dependency.
Options:
-V, --version output the version number
--json output structured JSON instead of
human-readable text (default: false)
--user-agent <string> override the default User-Agent header sent on
outbound fetches
-h, --help display help for command
Commands:
init [options] <path> Scaffold a LLMScout setup (llmscout.json + a
Claude Code skill file) into a target
directory
check [options] <path> Run SEO/GEO checks against a local project's
configured site
fleet [options] <config.json> Run the full check suite against every site
listed in a fleet manifest
help [command] display help for command
| Comando | Argumento | Opciones | Propósito |
|---|---|---|---|
init | <path> directorio de destino | --site-url <url> establece siteUrl inmediatamente | Genera el andamiaje de llmscout.json más un archivo de habilidad de Claude Code. Idempotente: los archivos existentes no se modifican. |
check | <path> directorio del proyecto que contiene llmscout.json | --out-dir <dir> también escribe un archivo de informe con nombre automático para este sitio; (global --json, --user-agent) | Ejecuta las comprobaciones seleccionadas contra el siteUrl configurado. |
fleet | <config.json> manifiesto de flota | --out-dir <dir> también escribe un archivo de informe con nombre automático por sitio, nombrado desde el campo name del manifiesto; (global --json, --user-agent) | Ejecuta la suite completa contra cada sitio en el manifiesto. |
--json, --user-agent, -V/--version y -h/--help son las únicas opciones globales.
Códigos de salida
| Código | Significado |
|---|---|
0 | init tuvo éxito, o check/fleet completado sin FAIL. |
1 | check: al menos una comprobación falló. fleet: al menos un sitio falló o tuvo error. |
2 | Error de uso: esquema de URL inválido, llmscout.json faltante/ilegible/inválido, siteUrl en blanco, manifiesto faltante, o cualquier otro error de configuración. |
Servidor MCP
LLMScout incluye un servidor Model Context Protocol para que un agente de IA (Claude, Cursor o cualquier cliente compatible con MCP) pueda ejecutar comprobaciones SEO/GEO contra un sitio en vivo directamente, sin que un humano invoque la CLI manualmente.
Instala el extra:
pip install "llmscout-cli[mcp]"
Añádelo a la configuración de tu cliente MCP (para Claude Desktop, claude_desktop_config.json):
{
"mcpServers": {
"llmscout": {
"command": "uvx",
"args": ["--from", "llmscout-cli", "llmscout-mcp"]
}
}
}
El servidor expone una herramienta, run, que ejecuta el binario npm llmscout publicado con el subcomando y argumentos dados más --json, y devuelve el resultado JSON analizado:
run(["check", "./my-site", "--site-url", "https://example.com"])
El transporte es stdio, por lo que no hay nada que alojar: el cliente MCP inicia el servidor como un subproceso local. Fuente: python/src/llmscout/mcp_server.py.
Modo flota

fleet está dirigido a agencias o equipos que mantienen varios sitios de clientes en paralelo como repositorios locales. Declaras cada sitio en un manifiesto y los compruebas todos en un solo comando:
{
"sites": [
{ "name": "client-a", "path": "./clients/client-a" },
{ "name": "client-b", "path": "./clients/client-b" }
]
}
llmscout fleet ./fleet.json
LLMScout fleet report
[FAIL] client-a (/abs/path/clients/client-a) -- 6 PASS, 14 WARN, 1 FAIL
[PASS] client-b (/abs/path/clients/client-b) -- 8 PASS, 13 WARN, 0 FAIL
Fleet summary: 1 site(s) passed, 1 site(s) failed, 0 site(s) errored (2 total).
Añade --out-dir ./reports y el resultado de cada sitio también se escribe en su propio archivo con nombre automático (client-a.txt, client-b.txt o .json con --json) -- en lugar de un volcado combinado de stdout, una agencia que ejecute esto en muchos sitios de clientes obtiene un informe distinguible por cliente. El path de cada entrada del manifiesto se resuelve contra el directorio del propio archivo de manifiesto, no el directorio de trabajo del proceso, por lo que el mismo manifiesto funciona sin importar desde dónde lo invoques. Todo es acceso al sistema de archivos local, sin SSH y sin superficie de ejecución remota.
Referencia de la API de la biblioteca
Ambas distribuciones son también bibliotecas genuinamente importables, no solo CLIs. Las exportaciones a continuación son reales (extraídas de src/index.ts y python/src/llmscout/__init__.py), y los ejemplos están probados contra los paquetes publicados, no escritos de memoria.
TypeScript (llmscout-cli en npm):
import { loadSite, runChecks, ALL_CHECKS } from "llmscout-cli";
const ctx = await loadSite("https://example.com");
const results = await runChecks(ALL_CHECKS, ctx);
console.log(results[0].status, results[0].name);
// "PASS" "Title tag"
| Exportación | Firma | Qué hace |
|---|---|---|
loadSite | (rawSiteUrl: string, fetchFn?: FetchFn) => Promise<CheckContext> | Valida la URL, obtiene los recursos del sitio y construye un CheckContext en una sola llamada. Lo que check y fleet llaman internamente. |
fetchSiteResources | (siteUrl: URL, fetchFn?: FetchFn) => Promise<SiteResources> | Nivel más bajo: obtiene la página de inicio más robots.txt/sitemap.xml/llms.txt en paralelo, sin construir un CheckContext. |
buildCheckContext | (resources: SiteResources, fetchFn?: FetchFn) => CheckContext | Construye un CheckContext a partir de recursos que ya obtuviste (analiza la página de inicio una vez con cheerio). |
runChecks | (checks: Check[], ctx: CheckContext) => Promise<CheckResult[]> | Ejecuta una lista de comprobaciones contra un contexto. Una comprobación que lanza una excepción se convierte en un resultado FAIL en lugar de abortar la ejecución. |
hasFailure | (results: CheckResult[]) => boolean | true si el status de cualquier resultado es "FAIL". |
ALL_CHECKS / TECHNICAL_CHECKS / GEO_CHECKS | Check[] | La suite completa de comprobaciones, o solo una de las dos categorías. |
initProject | (targetPath: string, opts?: { siteUrl?: string }) => InitResult | Genera el andamiaje de llmscout.json y el archivo de habilidad de Claude Code. Idempotente. |
loadFleetManifest / runFleet | ver src/fleet.ts | Carga un manifiesto de flota y ejecuta la suite en cada sitio del mismo. |
safeFetch / assertHttpUrl | ver src/fetch-utils.ts | El envoltorio de fetch endurecido descrito en Características, exportado para reutilización en una comprobación personalizada. |
Tipos: Check, CheckContext, CheckResult, CheckStatus ("PASS" \| "FAIL" \| "WARN"), CheckCategory ("technical" \| "geo"), SiteResources, LLMScoutConfig, FleetManifest. Aún no existe un sitio de documentación de API generada; esta tabla y los comentarios TSDoc de la propia fuente son la referencia.
Python (llmscout-cli en PyPI):
from llmscout import load_site, run_checks, ALL_CHECKS
ctx = load_site("https://example.com")
results = run_checks(ALL_CHECKS, ctx)
print(results[0].status, results[0].name)
# PASS Title tag
El paquete de Python refleja el de TypeScript función por función: load_site, run_checks, has_failure, ALL_CHECKS/TECHNICAL_CHECKS/GEO_CHECKS, init_project, load_fleet_manifest/run_fleet, safe_fetch/assert_http_url, load_config/default_config/select_checks, más los tipos Check, CheckContext, CheckResult y SiteResources. Lista completa en python/src/llmscout/__init__.py's __all__. Aún no existen documentos Sphinx generados; el docstring del módulo (import llmscout; help(llmscout)) y esta tabla son la referencia.
Comparación
Cada celda a continuación se extrae de una fuente verificable (un archivo de repositorio, un manifiesto de paquete o un issue abierto), citada debajo de la tabla. "Checker" significa que la herramienta audita un sitio en vivo existente; "generator" significa que emite archivos de activos SEO/GEO para que los publiques.
| LLMScout | claude-seo (AgriciDaniel) | geo-seo-claude (zubair-trabzada) | geo-optimizer-skill (Auriti-Labs) | |
|---|---|---|---|---|
| Requiere Python | No | Sí (Python 3.10+) | Sí | Sí (Python 3.9+) |
| Requiere Playwright / navegador headless | No | Opcional (Chromium autoinstalado por install.sh para renderizado SPA) | Opcional, para algunas comprobaciones | No requerido para la función principal |
| Instalación | npm / PyPI (deps: cheerio+commander o ninguno) | git clone + install.sh / install.ps1, o Claude Code /plugin | git clone + install.sh / install-win.sh | pip install o uvx |
| Multiplataforma / Windows listo para usar | Sí (sin shelling, sin resolución de rutas) | Incluye un install.ps1 de Windows, pero los fallos de instalación nueva/Windows/rutas son un patrón recurrente: issues #137, #138, #139 | El dolor de instalación en Windows también es un patrón recurrente aquí: issues #69, #21, #3 | pip/uv son multiplataforma; no verificado más allá |
| Cobertura de bots rastreadores de IA | 7 bots, rastreadores de entrenamiento y búsqueda rastreados por separado (GPTBot/OAI-SearchBot, ClaudeBot/Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended) | No es una comprobación dedicada | No es una comprobación dedicada | No verificado |
| Comprobación de negociación de contenido Markdown | Sí (markdown-negotiation) | No | No | No |
| Rol | Checker | Checker | Checker + generador de informes | Checker |
| Cobertura | Técnico + GEO (21 comprobaciones) | Técnico + GEO (amplio) | Enfocado en GEO | Técnico + GEO |
| Licencia | MIT | MIT | No verificado | MIT |
Fuentes: LLMScout, de los package.json, src/fetch-utils.ts, src/checks/index.ts de este repositorio, y la ausencia de child_process en src/. claude-seo, de su sección de instalación del README (Python 3.10+, install.sh/install.ps1, /plugin), su licencia MIT y los issues abiertos #137/#138/#139. geo-seo-claude, de su README y su propio rastreador de issues (problemas de instalación en Windows #69, #21, #3, todos citados arriba). geo-optimizer-skill, de su README (Python 3.9+, pip install geo-optimizer-skill / uvx, MIT, CLI con comandos de auditoría/corrección).
Los productos de análisis alojados como Profound, Peec y Evertune son una categoría diferente (paneles de seguimiento GEO alojados y de pago, no comprobadores OSS instalables) y están intencionalmente fuera de esta tabla.
Qué es LLMScout y por qué existe
LLMScout es una herramienta de línea de comandos independiente y de código abierto que comprueba un sitio web para 21 problemas de SEO técnico y optimización de motores generativos. Se distribuye como dos distribuciones genuinamente independientes y equivalentes en funciones: una CLI de TypeScript/Node con dos dependencias de ejecución (cheerio, commander) y cero intérpretes o navegadores externos, y una CLI de Python con cero dependencias de ejecución en absoluto. Ni child_process (TypeScript) ni una llamada a subproceso (Python) aparecen en ninguna parte de las comprobaciones de ninguna implementación.
Existe para reemplazar el flujo de instalación de un proyecto existente, AgriciDaniel/claude-seo, para una clase específica de problema. Ese proyecto es una habilidad de Claude Code SEO/GEO que realiza sus comprobaciones mediante la invocación de scripts de Python (renderizado basado en Playwright, dependencias instaladas con pip) desde las instrucciones de la habilidad. Esa cadena de herramienta externa más resolución de rutas es la causa raíz de un patrón recurrente de errores de instalación/Windows/rutas reportados contra él, incluyendo tres problemas (ya cerrados, pero cada uno documenta el modo de fallo arquitectónico que este proyecto existe para evitar): #137 (una instalación nueva de /plugin no proporciona ni las dependencias de Python ni Playwright Chromium), #138 (las instrucciones de la habilidad codifican python3, que no existe en una instalación estándar de Windows), y #139 (las habilidades llaman a scripts/*.py a través de una ruta relativa que no se resuelve cuando los scripts viven bajo la raíz del plugin). La misma clase de dolor aparece de forma independiente en zubair-trabzada/geo-seo-claude, otra habilidad de Claude Code GEO activamente utilizada (problemas #69, #21, #3) — el modo de fallo es arquitectónico, no específico de un proyecto.
LLMScout no es un fork de ninguno de los dos proyectos. No comparte código con ellos, tiene un nombre diferente y reimplementa las comprobaciones equivalentes desde cero. La decisión de diseño que importa es lo que no hace: como las comprobaciones se ejecutan dentro del proceso anfitrión en lugar de lanzar un intérprete externo y un navegador sin cabeza, toda la clase de fallos detrás de esos errores no existe aquí. No hay intérprete que aprovisionar, no hay pip install que ejecutar más allá del propio paquete, no hay binario de navegador que descargar y no hay ruta de script relativa que resolver, por lo que una instalación nueva se comporta igual en todas las plataformas. El costo directo de esa decisión es que la comprobación de extracción de contenido es una heurística de HTML estático y no puede evaluar contenido que solo aparece después de que el JavaScript del lado del cliente se renderice. La comprobación documenta esta limitación en su propia salida.
Más allá de la cuña de corrección de instalación, las comprobaciones de LLMScout siguen la dirección concreta y respaldada por evidencia que el espacio GEO ha tomado desde mediados de 2025 — consulte Por qué las comprobaciones GEO importan ahora para las fuentes citadas detrás de esa afirmación, incluyendo la división entre rastreadores de IA de entrenamiento y de búsqueda, la negociación de contenido Markdown y la deprecación documentada por Google de los resultados enriquecidos de FAQ.
LLMScout fue recientemente renombrado desde su nombre original, SeoFleet. Ambas distribuciones se están republicando bajo el nuevo nombre de paquete (llmscout-cli tanto en npm como en PyPI) — consulte Instalación para ambas rutas, y las insignias de arriba para el estado de versión en vivo.
FAQ
¿LLMScout requiere Python?
No. La distribución npm es TypeScript/Node puro con dos dependencias (cheerio, commander). No hay paso de pip install ni intérprete de Python involucrado en ningún punto de esa ruta.
¿Usa Playwright o un navegador sin cabeza?
No, en ninguna de las dos distribuciones. Ambas obtienen HTML a través de http(s) y lo analizan (cheerio en TypeScript, la biblioteca estándar en Python). No hay descarga de Chromium ni llamada a subprocesos en ninguna de las comprobaciones de ninguna implementación. La compensación es que la comprobación de extracción de contenido solo lee HTML estático y no puede ver contenido renderizado por JavaScript. Así lo dice en su propio mensaje de resultado.
¿Qué significa "configuración cero" aquí, concretamente?
llmscout init <path> escribe un llmscout.json funcional y un archivo de habilidad de Claude Code sin indicaciones. El único valor que debes proporcionar es la URL de tu sitio en vivo (a través de --site-url o editando el archivo), porque la herramienta no puede inferir la URL pública de un proyecto a partir de sus archivos locales. Después de eso, llmscout check <path> se ejecuta sin configuración adicional; las 21 comprobaciones se ejecutan por defecto.
¿Por qué LLMScout rastrea los rastreadores de entrenamiento y los rastreadores de búsqueda por separado? Porque OpenAI y Anthropic realmente los ejecutan como agentes de usuario separados e independientemente bloqueables ahora. Bloquear GPTBot (entrenamiento) no tiene efecto sobre si OAI-SearchBot aún puede recuperar y citar tu página en vivo en una respuesta de ChatGPT, y la misma división se aplica a ClaudeBot versus Claude-SearchBot. Reportarlos juntos ocultaría una distinción real y accionable.
¿LLMScout me dice que agregue un llms.txt?
No, solo informa si existe. llms.txt es una convención real y creciente, pero Google ha declarado públicamente que no la admite — consulte Por qué las comprobaciones GEO importan ahora para la fuente. LLMScout informa hechos sobre los que el propietario de un sitio puede actuar; no toma posición sobre una cuestión no resuelta.
¿Por qué no simplemente arreglar claude-seo o geo-seo-claude directamente en lugar de construir una herramienta separada? Sus errores de instalación/Windows comparten una única causa raíz: las comprobaciones se realizan llamando a una cadena de herramientas externa de intérprete más navegador desde las instrucciones de la habilidad. Parchear cada síntoma deja esa arquitectura en su lugar. LLMScout elimina la arquitectura en su lugar: sin cadena de herramientas externa, esa clase de fallo de instalación y ruta no puede repetirse. Es una reimplementación independiente, no un parche.
¿Puedo ejecutarlo contra muchos sitios a la vez?
Sí. llmscout fleet manifest.json ejecuta la suite completa contra cada sitio en un manifiesto JSON local en una sola invocación, y --out-dir escribe un archivo de informe con nombre automático por sitio en lugar de un volcado combinado de stdout — diseñado para agencias que verifican muchos sitios de clientes.
¿Puede un agente o script consumir la salida?
Sí. Pasa la bandera global --json a cualquier comando para obtener JSON estructurado, incluyendo campos por comprobación id, status, message y fix, además de un objeto de resumen. Los códigos de salida son estables: 0 limpio, 1 al menos un FAIL, 2 un error de uso/configuración.
¿Hay una versión de Python?
Sí — pip install llmscout-cli instala un puerto de Python genuino e independiente (no un envoltorio alrededor del binario de Node), con cero dependencias de tiempo de ejecución. Ejecuta las mismas 21 comprobaciones con los mismos veredictos PASS/WARN/FAIL que este paquete npm. Consulte python/README.md.
¿Puedo usar LLMScout comercialmente, o en un proyecto de código cerrado? Sí. Ambas distribuciones tienen licencia MIT (consulte LICENSE): puedes usar, modificar y redistribuir LLMScout en trabajo comercial y de código cerrado, sin regalías y sin obligación de abrir el código de nada que verifique. El único requisito es mantener el aviso de copyright y el texto de la licencia si redistribuyes el código fuente en sí.
Contribución
Consulte CONTRIBUTING.md para la guía completa, que cubre tanto el código TypeScript como Python. Comandos útiles para este paquete:
npm install
npm run build # tsc build to dist/
npm run typecheck # tsc --noEmit
npm test # vitest run (248 tests)
npm run test:coverage
npm run lint # eslint src test
CI (.github/workflows/ci.yml) ejecuta lint, typecheck, build, coverage y npm audit --audit-level=high en cada push y pull request a main. Los problemas y pull requests son bienvenidos en https://github.com/RudrenduPaul/LLMScout/issues.
Agregar una 22.ª comprobación es intencionalmente pequeño: implementa la interfaz Check (src/types.ts) en un nuevo archivo bajo src/checks/, luego regístrala en src/checks/index.ts (y el equivalente en Python bajo python/src/llmscout/checks/, según CONTRIBUTING.md).
Licencia
MIT. Consulte LICENSE.