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
Instalación • Inicio rápido • Referencia de CLI • Comparación • Preguntas frecuentes • Contribuciones
Ejecuta 21 comprobaciones de SEO técnico y GEO (optimización para motores generativos) en tu sitio, en TypeScript puro o Python puro, sin intérprete de Python, sin navegador sin interfaz gráfica y sin herramientas externas en ninguno 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 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 la instalación de npm.
[!NOTE] La instalación de npm incluye
undicicomo dependencia transitiva decheerio.npm auditha señalado un aviso de alta gravedad 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 de ejecución: el análisis de HTML y la obtención de HTTP usan solo 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 crea una configuración llmscout.json y un pequeño archivo de habilidad de Claude Code en el directorio de destino. Establece la URL de tu sitio y ejecuta llmscout check ..
Inicio rápido
Crea una configuración 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, 1 cuando al menos una comprobación falla (WARN por sí solo no hace fallar la ejecución) y 2 en 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 herramientas externas, en cualquiera de los dos lenguajes.
child_processnunca se importa en el código fuente de TypeScript; el puerto de Python tiene cero dependencias de ejecución. Las comprobaciones se ejecutan dentro del proceso en lugar de invocar scripts de Python o un navegador sin interfaz gráfica. - Multiplataforma por diseño. Sin invocaciones de shell de
python3frente apy -3y sin resolución de rutas relativas, por lo que la misma instalación funciona de manera idéntica en Windows, macOS y Linux. - Obtención reforzada. El único envoltorio de obtención (
src/fetch-utils.ts) rechaza cualquier esquema que no seahttp(s), bloquea hosts de bucle local/privados/enlace local, sigue redirecciones manualmente un salto a la vez y limita la cadena a 5 saltos y el cuerpo de 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 indicador 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 cadenas de estilo bot) y un indicador
--user-agentpara sobrescribirlo. - Bien probado. 248 pruebas de TypeScript y 233 de Python, ambas reproducibles localmente con
npm test/npm run test:coverageypytest. La distribución de Python tiene cero dependencias de ejecución, por lo que no hay nada que una auditoría de dependencias pueda señalar. En el lado de npm, el bloqueoverridesdepackage.jsonfijaundici(una dependencia transitiva decheerio) a un rango parcheado, ynpm auditactualmente reporta cero vulnerabilidades.
Por qué las comprobaciones GEO importan ahora
El tráfico de búsqueda se está desplazando genuinamente hacia respuestas mediadas por IA, y el cambio es reciente y bien medido, no hipotético:
- Los AI Overviews de Google ya están reduciendo los clics. Ahrefs midió que el 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 promedio del CTR del 58 % en el estudio. (Ahrefs, diciembre de 2025) El análisis independiente de Semrush sobre 10 millones de palabras clave encontró que el CTR orgánico cae un 61 % y el CTR de pago un 68 % cuando aparece un AI Overview en la página de resultados. (Semrush)
- ChatGPT en sí 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 participación de GPTBot en el tráfico de rastreadores de IA subió del 5 % al 30 %. OpenAI y Anthropic han dividido desde entonces sus bots en rastreadores de entrenamiento (GPTBot, ClaudeBot) y rastreadores de búsqueda/recuperación separados e independientemente bloqueables (OAI-SearchBot, Claude-SearchBot). (Cloudflare Radar, "From Googlebot to GPTBot") La comprobación
ai-crawler-directivesde LLMScout informa sobre los siete bots principales actuales de entrenamiento y búsqueda (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended) por separado, ya que bloquear el bot de entrenamiento de una empresa no tiene 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. 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 punto de referencia vio una reducción del 80 % en tokens en una publicación de blog. (Cloudflare, "Markdown for Agents") Vale la pena ser honesto sobre el estado actual: un análisis independiente en 300 000 dominios encontró que, en la práctica, ningún rastreador importante de IA envía actualmente el encabezadoAccept: text/markdownpara negociarlo; descubren Markdown solo mediante enlaces directos. (Dries Buytaert) La comprobaciónmarkdown-negotiationde LLMScout informa sobre esto sin pretender 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 pretende 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 el propio Gary Illyes de Google ha declarado públicamente que Google no lo admite y no tiene planes de hacerlo, comparándolo con la etiqueta metakeywordsobsoleta. (Search Engine Journal) La comprobaciónllms-txtde LLMScout informa su presencia como informativa, nunca como un requisito obligatorio: el trabajo de la herramienta es informar lo que realmente está configurado, no prescribir una política que la evidencia aún no respalda. - Google eliminó los resultados enriquecidos de FAQ de la Búsqueda por completo el 7 de mayo de 2026. (Search Engine Journal) El propio esquema
FAQPageno está obsoleto: sigue siendo un 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 aún informa sobre él, solo que sin implicar que ya genera un resultado enriquecido en el SERP de Google.
Las 21 comprobaciones
Cada comprobación informa 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 está dentro de 10-60 caracteres. |
Meta descripción (meta-description) | Existe un <meta name="description"> y está dentro de 50-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 verificada como ubicación alternativa. Una respuesta que parece una página de desafío de CDN (por ejemplo, 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 omitidos (por ejemplo, un <h1> seguido directamente por un <h3>). |
Cobertura de alt de 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 requeridos 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 configuradas, y señala un noindex absoluto. |
Peso de imágenes (image-weight) | El tamaño real en bytes de cada imagen (mediante una solicitud HEAD), señalando 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)
Verificación (id) | Qué comprueba |
|---|---|
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é las verificaciones GEO importan ahora mismo; la ausencia es informativa). |
Directivas de rastreadores de IA (ai-crawler-directives) | Informa del 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 para 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). |
Amabilidad para la 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 una matriz sameAs de URL de perfiles 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> establecer siteUrl inmediatamente | Crear la estructura llmscout.json más un archivo de habilidad de Claude Code. Idempotente: los archivos existentes no se tocan. |
check | <path> directorio del proyecto que contiene llmscout.json | --out-dir <dir> también escribir un archivo de informe con nombre automático para este sitio; (global --json, --user-agent) | Ejecutar las verificaciones seleccionadas contra el siteUrl configurado. |
fleet | <config.json> manifiesto de flota | --out-dir <dir> también escribir un archivo de informe con nombre automático por sitio, nombrado a partir del campo name del manifiesto; (global --json, --user-agent) | Ejecutar 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 se completó sin FAIL. |
1 | check: al menos una verificación falló. fleet: al menos un sitio falló o dio error. |
2 | Error de uso: esquema de URL no válido, llmscout.json faltante/ilegible/no vá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 verificaciones 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, así 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 lado a lado como repositorios locales. Declaras cada sitio en un manifiesto y los verificas 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 en 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, así 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 biblioteca
Ambas distribuciones también son bibliotecas realmente 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 se prueban 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 verificaciones contra un contexto. Una verificació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 verificaciones, o solo una de las dos categorías. |
initProject | (targetPath: string, opts?: { siteUrl?: string }) => InitResult | Crea la estructura llmscout.json y el archivo de habilidad de Claude Code. Idempotente. |
loadFleetManifest / runFleet | ver src/fleet.ts | Cargar un manifiesto de flota y ejecutar la suite en cada sitio. |
safeFetch / assertHttpUrl | ver src/fetch-utils.ts | El envoltorio de fetch endurecido descrito en Características, exportado para reutilización en una verificación personalizada. |
Tipos: Check, CheckContext, CheckResult, CheckStatus ("PASS" \| "FAIL" \| "WARN"), CheckCategory ("technical" \| "geo"), SiteResources, LLMScoutConfig, FleetManifest. No existe aún un sitio de documentación de API generada; esta tabla y los comentarios TSDoc de la 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__. No existen aún 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 del repositorio, un manifiesto de paquete o un problema abierto), citada debajo de la tabla. "Verificador" significa que la herramienta audita un sitio en vivo existente; "generador" 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 sin cabeza | No | Opcional (Chromium autoinstalado por install.sh para renderizado SPA) | Opcional, para algunas verificaciones | 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: problemas #137, #138, #139 | El dolor de instalación en Windows también es un patrón recurrente aquí: problemas #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 verificación dedicada | No es una verificación dedicada | No verificado |
| Verificación de negociación de contenido Markdown | Sí (markdown-negotiation) | No | No | No |
| Rol | Verificador | Verificador | Verificador + generador de informes | Verificador |
| Cobertura | Técnico + GEO (21 verificaciones) | Técnico + GEO (amplio) | Enfocado en GEO | Técnico + GEO |
| Licencia | MIT | MIT | No verificado | MIT |
Fuentes: LLMScout, de 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 problemas abiertos #137/#138/#139. geo-seo-claude, de su README y su propio rastreador de problemas (problemas de dolor 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 verificadores 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 verifica 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 tiempo de ejecución (cheerio, commander) y cero intérpretes o navegadores externos, y una CLI de Python con cero dependencias de tiempo de ejecución en absoluto. Ni child_process (TypeScript) ni una llamada a subproceso (Python) aparecen en ninguna parte de las verificaciones 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 verificaciones invocando scripts de Python (renderizado basado en Playwright, dependencias instaladas por pip) desde las instrucciones de la habilidad. Esa cadena de herramienta externa más resolución de rutas es la causa raíz detrás de un patrón recurrente de errores de instalación/Windows/rutas reportados contra él, incluyendo tres problemas (cerrados desde entonces, pero cada uno documentando 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 Chromium de Playwright), #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 utilizada activamente (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 verificaciones equivalentes desde cero. La decisión de diseño que importa es lo que no hace: como las verificaciones se ejecutan dentro del proceso anfitrión en lugar de lanzar un intérprete externo y un navegador sin interfaz, 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 paquete en sí, 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 verificació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 renderiza. La verificación documenta esta limitación en su propia salida.
Más allá de la cuña de corrección de instalación, las verificaciones de LLMScout siguen la dirección concreta y respaldada por evidencia hacia la que el espacio GEO realmente se ha movido desde mediados de 2025: consulte Por qué las verificaciones GEO importan ahora para las fuentes citadas detrás de esa afirmación, incluida la división de rastreadores de IA de entrenamiento versus búsqueda, la negociación de contenido Markdown y la deprecación documentada por Google de los resultados enriquecidos de FAQ.
LLMScout fue renombrado recientemente desde su nombre original, SeoFleet. Ambas distribuciones se están republicando bajo el nuevo nombre del paquete (llmscout-cli tanto en npm como en PyPI): consulte Instalación para ambas rutas y las insignias anteriores para el estado de versión en vivo.
Preguntas frecuentes
¿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 interfaz?
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 subproceso en ninguna parte de las verificaciones de ninguna implementación. La compensación es que la verificación de extracción de contenido solo lee HTML estático y no puede ver contenido renderizado por JavaScript. Así lo indica 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 debe proporcionar es la URL de su 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 verificaciones 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 su 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 uno. llms.txt es una convención real y en crecimiento, pero Google ha declarado públicamente que no la admite: consulte Por qué las verificaciones 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 verificaciones se realizan invocando 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 fallos de instalación y ruta no puede reaparecer. 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í. Pase el indicador global --json a cualquier comando para obtener JSON estructurado, incluidos los campos por verificación id, status, message y fix, más un objeto de resumen. Los códigos de salida son estables: 0 limpio, 1 al menos un FALLO, 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 en tiempo de ejecución. Ejecuta las mismas 21 verificaciones 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 LICENCIA): puede usar, modificar y redistribuir LLMScout en trabajos comerciales y de código cerrado, sin regalías y sin obligación de abrir el código de nada de lo que verifica. El único requisito es mantener el aviso de copyright y el texto de la licencia si redistribuye el código fuente en sí.
Contribuciones
Consulte CONTRIBUTING.md para la guía completa, que cubre tanto los códigos base de TypeScript como de 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, cobertura 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 verificación número 22 es intencionalmente pequeño: implemente la interfaz Check (src/types.ts) en un archivo nuevo bajo src/checks/, luego regístrela en src/checks/index.ts (y el equivalente de Python bajo python/src/llmscout/checks/, según CONTRIBUTING.md).
Licencia
MIT. Consulte LICENCIA.