LLMScout
Verificador de SEO e GEO sem configuração: 21 verificações técnicas de SEO e de mecanismos generativos para um site ao vivo.
Documentação
LLMScout
Instalação • Início rápido • Referência da CLI • Comparação • FAQ • Contribuição
Executa 21 verificações de SEO técnico e GEO (otimização para mecanismos generativos) no seu site, em TypeScript puro ou Python puro, sem interpretador Python, sem navegador headless e sem ferramentas externas em nenhum dos casos.

Instalação
O LLMScout é distribuído como duas distribuições independentes e complementares. Ambas executam as mesmas 21 verificações com os mesmos veredictos PASS/WARN/FAIL, então escolha a que melhor se adapta à sua ferramenta.
Node/TypeScript (npm):
npm install -g llmscout-cli
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
A CLI tem como alvo Node 18+ (declarado em package.json engines). As duas dependências de runtime são cheerio (análise de HTML) e commander (análise de argumentos): não há interpretador Python, nem pip install, nem download de Playwright/Chromium em nenhum lugar da instalação npm.
[!NOTE] A instalação npm inclui
undicicomo dependência transitiva decheerio.npm auditsinalizou um aviso de alta gravidade contra ele no passado; o blocooverridesdepackage.jsonfixaundici(ejs-yaml/nanoid) em faixas corrigidas para fechar essa lacuna. Executenpm auditapós a instalação para confirmar que sua árvore resolvida está limpa.
Python (PyPI):
pip install llmscout-cli
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
Zero dependências de runtime — a análise de HTML e a busca HTTP usam apenas a biblioteca padrão do Python. Consulte python/README.md para o guia completo específico do Python.
Em seguida, em qualquer projeto que você queira verificar:
llmscout init .
Isso cria um esqueleto de configuração llmscout.json e um pequeno arquivo de skill do Claude Code no diretório de destino. Defina a URL do seu site e execute llmscout check ..
Início rápido
Crie um esqueleto de configuração e execute uma verificação em um site ao vivo:
llmscout init ./my-site --site-url https://example.com
llmscout check ./my-site
Saída 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)
A mesma execução com --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 sai com código 0 quando nenhuma verificação falha, 1 quando pelo menos uma verificação falha (apenas WARN não faz a execução falhar) e 2 em erro de uso, como um llmscout.json ausente ou mal configurado.
Recursos
- 21 verificações em duas categorias. 12 verificações de SEO técnico e 9 verificações de GEO, listadas por nome em As 21 verificações.
- Zero ferramentas externas, em qualquer linguagem.
child_processnunca é importado em nenhum lugar do código-fonte TypeScript; a versão Python tem zero dependências de runtime. As verificações são executadas dentro do processo, em vez de chamar scripts Python ou um navegador headless. - Multiplataforma por construção. Sem chamadas de shell
python3versuspy -3e sem resolução de scripts por caminho relativo, então a mesma instalação roda de forma idêntica no Windows, macOS e Linux. - Busca endurecida. O único wrapper de busca (
src/fetch-utils.ts) rejeita qualquer esquema que não sejahttp(s), bloqueia hosts loopback/privados/link-local, segue redirecionamentos manualmente um salto por vez e limita a cadeia a 5 saltos e o corpo da resposta a 10 MiB. - Modo frota com relatórios por site.
llmscout fleet manifest.jsonexecuta a suíte completa em vários caminhos de repositórios de clientes locais em uma única invocação, e--out-direscreve um arquivo de relatório com nome automático por site — criado para agências que verificam muitos sites de clientes de uma vez. - Saída estruturada. Todo comando aceita um sinalizador global
--jsonpara saída legível por máquina, permitindo que um agente que invoca a CLI analise os resultados programaticamente. - Um User-Agent real e configurável. Envia um User-Agent de navegador genuíno por padrão (alguns frameworks SSR e CDNs rejeitam strings estilo bot) e um sinalizador
--user-agentpara substituí-lo. - Bem testado. 248 testes TypeScript e 233 testes Python, ambos reproduzíveis localmente com
npm test/npm run test:coverageepytest. A distribuição Python tem zero dependências de runtime, então não há nada para uma auditoria de dependências sinalizar. No lado npm, o blocooverridesdepackage.jsonfixaundici(uma dependência transitiva decheerio) em uma faixa corrigida, enpm auditatualmente relata zero vulnerabilidades.
Por que as verificações de GEO importam agora
O tráfego de busca está genuinamente mudando para respostas mediadas por IA, e essa mudança é recente e bem medida, não uma hipótese:
- Os próprios AI Overviews do Google já estão reduzindo o click-through. A Ahrefs mediu o CTR da posição 1 em palavras-chave que acionam AI Overviews cair de 7,3% (dezembro de 2023) para 1,6% (dezembro de 2025) — uma redução média de 58% no CTR em todo o estudo. (Ahrefs, dezembro de 2025) A análise independente da Semrush com 10 milhões de palavras-chave encontrou queda de 61% no CTR orgânico e 68% no CTR pago quando um AI Overview aparece na página de resultados. (Semrush)
- O próprio ChatGPT agora é uma fonte de tráfego real e mensurável. A análise do Search Engine Land de 6,77 milhões de sessões descobriu que o ChatGPT responde por 92% de todo o tráfego de referência de assistentes de IA, convertendo a 7,1% — próximo dos 7,8% da busca paga. (Search Engine Land)
- Os crawlers de IA não são mais um único crawler. Entre maio de 2024 e maio de 2025, a participação do GPTBot no tráfego de crawlers de IA subiu de 5% para 30%. OpenAI e Anthropic desde então dividiram seus bots em crawlers de treinamento (GPTBot, ClaudeBot) e crawlers de busca/recuperação separados e bloqueáveis de forma independente (OAI-SearchBot, Claude-SearchBot). (Cloudflare Radar, "From Googlebot to GPTBot") A verificação
ai-crawler-directivesdo LLMScout relata separadamente os sete principais bots atuais de treinamento e busca (GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended), já que bloquear o bot de treinamento de uma empresa não tem efeito sobre se o assistente dela ainda pode recuperar e citar sua página ao vivo por meio do próprio bot de busca. - Entrega nativa em Markdown é uma prática real e emergente, não uma moda. A Cloudflare documenta a negociação de conteúdo HTTP (
Accept: text/markdown) como uma forma baseada em padrões de servir aos agentes uma representação mais leve e limpa de uma página — o benchmark deles viu uma redução de 80% em tokens em uma postagem de blog. (Cloudflare, "Markdown for Agents") Vale ser honesto sobre o estado atual: uma análise independente em 300.000 domínios descobriu que, na prática, nenhum grande crawler de IA envia atualmente o cabeçalhoAccept: text/markdownpara negociá-lo — eles descobrem Markdown apenas por links diretos. (Dries Buytaert) A verificaçãomarkdown-negotiationdo LLMScout relata isso sem fingir que o ecossistema está mais avançado do que está. - Nem todo sinal nesse espaço está resolvido, e o LLMScout não finge o contrário.
llms.txté uma convenção real, conduzida pela comunidade (criada em setembro de 2024, adotada por cerca de 8-10% dos principais sites em meados de 2026, incluindo Anthropic, Stripe, Cloudflare e Vercel) — mas o próprio Gary Illyes, do Google, declarou publicamente que o Google não a suporta e não tem planos de suportá-la, comparando-a à meta tagkeywordsdescontinuada. (Search Engine Journal) A verificaçãollms-txtdo LLMScout relata sua presença como informativa, nunca como um requisito de aprovação — o trabalho da ferramenta é relatar o que está realmente configurado, não prescrever uma política que as evidências ainda não suportam. - O Google removeu os rich results de FAQ da Busca completamente em 7 de maio de 2026. (Search Engine Journal) O schema
FAQPageem si não está descontinuado — continua sendo uma marcação válida que outros mecanismos e assistentes de IA ainda podem analisar para extração de respostas diretas — então a verificaçãofaq-schemado LLMScout ainda relata sobre ele, apenas sem implicar que ele gera um rich result no SERP do Google.
As 21 verificações
Cada verificação relata PASS, WARN ou FAIL, com uma sugestão de correção para qualquer coisa que não seja um PASS limpo. Um WARN é uma otimização perdida, não uma página quebrada, e nunca faz a execução falhar sozinho.
SEO técnico (12)
Verificação (id) | O que ela verifica |
|---|---|
Tag de título (title) | Um <title> existe e está entre 10-60 caracteres. |
Meta descrição (meta-description) | Um <meta name="description"> existe e está entre 50-160 caracteres. |
Tag canônica (canonical) | Um <link rel="canonical"> existe e seu href é uma URL válida (hrefs relativos são resolvidos, não penalizados). |
robots.txt (robots-txt) | /robots.txt está acessível e contém pelo menos uma diretiva User-agent. |
sitemap.xml (sitemap-xml) | /sitemap.xml está acessível e válido, com uma diretiva Sitemap: em robots.txt verificada como localização alternativa. Uma resposta que parece uma página de desafio de CDN (por exemplo, gerenciamento de bots da Cloudflare) recebe uma mensagem distinta em vez de uma genérica de "sitemap malformado". |
Estrutura de cabeçalhos (heading-structure) | Exatamente um <h1>, e nenhum nível de cabeçalho pulado (por exemplo, um <h1> seguido diretamente por um <h3>). |
Cobertura de alt em imagens (image-alt) | Tags <img> têm um atributo alt (um alt="" intencional para imagens decorativas conta como coberto). |
Tags Open Graph (open-graph) | As meta tags og:title, og:description, og:image e og:url estão presentes, para pré-visualizações ricas de links em plataformas sociais. |
Tags Twitter/X Card (twitter-card) | Uma meta tag twitter:card válida e seus campos complementares obrigatórios estão presentes. |
Diretivas meta robots (robots-meta-directives) | Diretivas avançadas de controle de snippets (max-snippet, max-image-preview, max-video-preview) estão definidas, e sinaliza um noindex explícito. |
Peso das imagens (image-weight) | O tamanho real em bytes de cada imagem (via requisição HEAD), sinalizando imagens superdimensionadas que atrasam o carregamento da página. |
Cadeia de redirecionamentos (redirect-chain) | A cadeia completa de redirecionamentos da página inicial, avisando sobre cadeias longas e falhando se a cadeia terminar em um status de erro. |
GEO / otimização para mecanismos generativos (9)
Verificação (id) | O que ela verifica |
|---|---|
Dados estruturados (structured-data) | Blocos JSON-LD <script type="application/ld+json"> existem e são analisados como JSON válido. |
llms.txt (llms-txt) | Um /llms.txt está presente na raiz do site (uma convenção emergente e não padronizada — veja Por que as verificações de GEO importam agora; a ausência é informativa). |
Diretivas de crawler de IA (ai-crawler-directives) | Relata o estado de permissão/bloqueio do robots.txt para GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended e Applebot-Extended. Este é um relatório do que está configurado, nunca uma recomendação para permitir ou bloquear. |
Schema de FAQ (faq-schema) | FAQPage JSON-LD está presente (informativo; relevante apenas para páginas que realmente têm um FAQ — veja a nota sobre a descontinuação de rich results do Google em maio de 2026 acima). |
Facilidade de extração de conteúdo (content-extraction) | Heurística: a página tem estrutura de cabeçalho/parágrafo que um mecanismo pode dividir, em vez de um grande bloco não estruturado. Não consegue ver conteúdo que só aparece após JavaScript no lado do cliente, por design. |
Schema Speakable (speakable-schema) | Um SpeakableSpecification está presente em JSON-LD, para elegibilidade de respostas de assistentes de voz. |
Schema de organização (organization-schema) | Organization/Person JSON-LD com um array sameAs de URLs de perfil oficial está presente, para sinais do Knowledge Panel. |
Negociação de conteúdo Markdown (markdown-negotiation) | Se o site serve uma representação text/markdown quando solicitado via negociação de conteúdo Accept: text/markdown. |
Cabeçalho Link (link-header) | Se a resposta da página inicial envia um cabeçalho RFC 8288 Link para descoberta de serviço legível por máquina. |
Você pode executar apenas uma categoria editando o bloco checks em llmscout.json ({ "checks": { "technical": true, "geo": false } }).
Referência da CLI
Transcrito da saída --help da própria ferramenta.
$ 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 | Opções | Propósito |
|---|---|---|---|
init | <path> diretório de destino | --site-url <url> define siteUrl imediatamente | Estrutura llmscout.json mais um arquivo de skill do Claude Code. Idempotente: arquivos existentes não são alterados. |
check | <path> diretório do projeto contendo llmscout.json | --out-dir <dir> também grava um arquivo de relatório com nome automático para este site; (global --json, --user-agent) | Executa as verificações selecionadas contra o siteUrl configurado. |
fleet | <config.json> manifesto da frota | --out-dir <dir> também grava um arquivo de relatório com nome automático por site, nomeado a partir do campo name do manifesto; (global --json, --user-agent) | Executa a suíte completa contra todos os sites no manifesto. |
--json, --user-agent, -V/--version e -h/--help são as únicas opções globais.
Códigos de saída
| Código | Significado |
|---|---|
0 | init foi bem-sucedido, ou check/fleet concluído sem FAIL. |
1 | check: pelo menos uma verificação falhou. fleet: pelo menos um site falhou ou apresentou erro. |
2 | Erro de uso: esquema de URL inválido, llmscout.json ausente/ilegível/inválido, siteUrl em branco, manifesto ausente ou qualquer outro erro de configuração. |
Servidor MCP
O LLMScout inclui um servidor Model Context Protocol para que um agente de IA (Claude, Cursor ou qualquer cliente compatível com MCP) possa executar verificações de SEO/GEO em um site ao vivo diretamente, sem que um humano invoque a CLI manualmente.
Instale o extra:
pip install "llmscout-cli[mcp]"
Adicione-o à configuração do seu cliente MCP (para Claude Desktop, claude_desktop_config.json):
{
"mcpServers": {
"llmscout": {
"command": "uvx",
"args": ["--from", "llmscout-cli", "llmscout-mcp"]
}
}
}
O servidor expõe uma ferramenta, run, que chama o binário npm llmscout publicado com o
subcomando e argumentos fornecidos, além de --json, e retorna o resultado JSON analisado:
run(["check", "./my-site", "--site-url", "https://example.com"])
O transporte é stdio, então não há nada para hospedar: o cliente MCP inicia o servidor como um
subprocesso local. Fonte: python/src/llmscout/mcp_server.py.
Modo frota

fleet é voltado para agências ou equipes que mantêm vários sites de clientes lado a lado como repositórios locais. Você declara cada site em um manifesto e verifica todos em um único 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).
Adicione --out-dir ./reports e o resultado de cada site também é gravado em seu próprio arquivo com nome automático (client-a.txt, client-b.txt ou .json com --json) — em vez de um único despejo de stdout combinado, uma agência que executa isso em muitos sites de clientes obtém um relatório distinguível por cliente. O path de cada entrada do manifesto é resolvido em relação ao diretório do próprio arquivo de manifesto, não ao diretório de trabalho do processo, então o mesmo manifesto funciona independentemente de onde você o invoca. Tudo é acesso ao sistema de arquivos local, sem SSH e sem superfície de execução remota.
Referência da API de biblioteca
Ambas as distribuições também são bibliotecas genuinamente importáveis, não apenas CLIs. As exportações abaixo são reais (extraídas de src/index.ts e python/src/llmscout/__init__.py), e os exemplos são testados contra os pacotes publicados, não escritos de memória.
TypeScript (llmscout-cli no 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"
| Exportação | Assinatura | O que faz |
|---|---|---|
loadSite | (rawSiteUrl: string, fetchFn?: FetchFn) => Promise<CheckContext> | Valida a URL, busca os recursos do site e constrói um CheckContext em uma única chamada. O que check e fleet chamam internamente. |
fetchSiteResources | (siteUrl: URL, fetchFn?: FetchFn) => Promise<SiteResources> | Nível mais baixo: busca a página inicial mais robots.txt/sitemap.xml/llms.txt em paralelo, sem construir um CheckContext. |
buildCheckContext | (resources: SiteResources, fetchFn?: FetchFn) => CheckContext | Constrói um CheckContext a partir de recursos que você já buscou (analisa a página inicial uma vez com cheerio). |
runChecks | (checks: Check[], ctx: CheckContext) => Promise<CheckResult[]> | Executa uma lista de verificações contra um contexto. Uma verificação que lança uma exceção se torna um resultado FAIL em vez de abortar a execução. |
hasFailure | (results: CheckResult[]) => boolean | true se o status de qualquer resultado for "FAIL". |
ALL_CHECKS / TECHNICAL_CHECKS / GEO_CHECKS | Check[] | A suíte completa de verificações, ou apenas uma das duas categorias. |
initProject | (targetPath: string, opts?: { siteUrl?: string }) => InitResult | Estrutura llmscout.json e o arquivo de skill do Claude Code. Idempotente. |
loadFleetManifest / runFleet | veja src/fleet.ts | Carrega um manifesto de frota e executa a suíte em todos os sites nele. |
safeFetch / assertHttpUrl | veja src/fetch-utils.ts | O wrapper de busca endurecido descrito em Recursos, exportado para reutilização em uma verificação personalizada. |
Tipos: Check, CheckContext, CheckResult, CheckStatus ("PASS" \| "FAIL" \| "WARN"), CheckCategory ("technical" \| "geo"), SiteResources, LLMScoutConfig, FleetManifest. Nenhum site de documentação de API gerada existe ainda; esta tabela e os comentários TSDoc da própria fonte são a referência.
Python (llmscout-cli no 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
O pacote Python espelha o TypeScript função por função: 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, além dos tipos Check, CheckContext, CheckResult e SiteResources. Lista completa no __all__ de python/src/llmscout/__init__.py. Nenhuma documentação Sphinx gerada existe ainda; o docstring do módulo (import llmscout; help(llmscout)) e esta tabela são a referência.
Comparação
Cada célula abaixo é extraída de uma fonte verificável (um arquivo de repositório, um manifesto de pacote ou uma issue aberta), citada sob a tabela. "Verificador" significa que a ferramenta audita um site existente ao vivo; "gerador" significa que ela emite arquivos de ativos de SEO/GEO para você publicar.
| LLMScout | claude-seo (AgriciDaniel) | geo-seo-claude (zubair-trabzada) | geo-optimizer-skill (Auriti-Labs) | |
|---|---|---|---|---|
| Requer Python | Não | Sim (Python 3.10+) | Sim | Sim (Python 3.9+) |
| Requer Playwright / navegador headless | Não | Opcional (Chromium instalado automaticamente por install.sh para renderização SPA) | Opcional, para algumas verificações | Não necessário para a função principal |
| Instalação | npm / PyPI (deps: cheerio+commander ou nenhum) | git clone + install.sh / install.ps1, ou Claude Code /plugin | git clone + install.sh / install-win.sh | pip install ou uvx |
| Multiplataforma / Windows pronto para uso | Sim (sem shelling, sem resolução de caminho) | Inclui um install.ps1 para Windows, mas falhas de instalação nova/Windows/caminho são um padrão recorrente: issues #137, #138, #139 | A dor de instalação no Windows também é um padrão recorrente aqui: issues #69, #21, #3 | pip/uv são multiplataforma; não verificado além disso |
| Cobertura de bots crawler de IA | 7 bots, crawlers de treinamento e busca rastreados separadamente (GPTBot/OAI-SearchBot, ClaudeBot/Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended) | Não é uma verificação dedicada | Não é uma verificação dedicada | Não verificado |
| Verificação de negociação de conteúdo Markdown | Sim (markdown-negotiation) | Não | Não | Não |
| Papel | Verificador | Verificador | Verificador + gerador de relatórios | Verificador |
| Cobertura | Técnico + GEO (21 verificações) | Técnico + GEO (amplo) | Focado em GEO | Técnico + GEO |
| Licença | MIT | MIT | Não verificado | MIT |
Fontes: LLMScout, do package.json, src/fetch-utils.ts, src/checks/index.ts deste repositório e da ausência de child_process em src/. claude-seo, da seção de instalação do seu README (Python 3.10+, install.sh/install.ps1, /plugin), sua licença MIT e issues abertas #137/#138/#139. geo-seo-claude, do seu README e do seu próprio rastreador de issues (problemas de instalação no Windows issues #69, #21, #3, todos citados acima). geo-optimizer-skill, do seu README (Python 3.9+, pip install geo-optimizer-skill / uvx, MIT, CLI com comandos de auditoria/correção).
Produtos de análise hospedados como Profound, Peec e Evertune são uma categoria diferente (painéis de rastreamento GEO hospedados e pagos, não verificadores OSS instaláveis) e estão intencionalmente fora desta tabela.
O que é o LLMScout e por que ele existe
O LLMScout é uma ferramenta de linha de comando independente e de código aberto que verifica um site quanto a 21 problemas de SEO técnico e otimização para mecanismos generativos. Ele é distribuído como duas distribuições genuinamente independentes e equivalentes em recursos: uma CLI TypeScript/Node com duas dependências de runtime (cheerio, commander) e zero interpretador ou navegador externo, e uma CLI Python com zero dependências de runtime. Nem child_process (TypeScript) nem uma chamada de subprocesso (Python) aparecem em nenhuma das verificações de qualquer implementação.
Ele existe para substituir o fluxo de instalação de um projeto existente, AgriciDaniel/claude-seo, para uma classe específica de problema. Esse projeto é uma skill de SEO/GEO do Claude Code que realiza suas verificações chamando scripts Python (renderização baseada em Playwright, dependências instaladas via pip) a partir das instruções da skill. Essa cadeia de ferramentas externas mais resolução de caminhos é a causa raiz de um padrão recorrente de bugs de instalação/Windows/caminho relatados contra ele, incluindo três issues (já fechadas, mas cada uma documentando o modo de falha arquitetural que este projeto existe para evitar): #137 (uma instalação nova do /plugin não provisiona nem as dependências Python nem o Chromium do Playwright), #138 (as instruções da skill fixam python3, que não existe em uma instalação padrão do Windows), e #139 (as skills chamam scripts/*.py por um caminho relativo que não resolve quando os scripts estão sob a raiz do plugin). A mesma classe de dor aparece de forma independente no zubair-trabzada/geo-seo-claude, outra skill de GEO do Claude Code ativamente usada (issues #69, #21, #3) — o modo de falha é arquitetural, não específico de um projeto.
O LLMScout não é um fork de nenhum dos dois projetos. Ele não compartilha código com eles, tem um nome diferente e reimplementa as verificações equivalentes do zero. A escolha de design que importa é o que ele não faz: como as verificações rodam dentro do processo host em vez de lançar um interpretador externo e um navegador headless, toda a classe de falhas por trás desses bugs não existe aqui. Não há interpretador para provisionar, nenhum pip install para executar além do próprio pacote, nenhum binário de navegador para baixar e nenhum caminho relativo de script para resolver, então uma instalação nova se comporta igual em todas as plataformas. O custo direto dessa escolha é que a verificação de extração de conteúdo é uma heurística de HTML estático e não pode avaliar conteúdo que só aparece após o JavaScript do lado do cliente renderizar. A verificação documenta essa limitação em sua própria saída.
Além da cunha de correção de instalação, as verificações do LLMScout acompanham a direção concreta e baseada em evidências que o espaço GEO realmente tomou desde meados de 2025 — veja Por que as verificações de GEO importam agora para as fontes citadas por trás dessa afirmação, incluindo a divisão entre crawlers de IA de treinamento versus busca, a negociação de conteúdo Markdown e a depreciação documentada pelo Google de resultados ricos em FAQ.
O LLMScout foi recentemente renomeado de seu nome original, SeoFleet. Ambas as distribuições estão sendo republicadas sob o novo nome do pacote (llmscout-cli tanto no npm quanto no PyPI) — veja Instalação para ambos os caminhos, e os badges acima para o status de versão ao vivo.
FAQ
O LLMScout requer Python?
Não. A distribuição npm é TypeScript/Node puro com duas dependências (cheerio, commander). Não há etapa de pip install e nenhum interpretador Python envolvido em nenhum ponto desse caminho.
Ele usa Playwright ou um navegador headless?
Não, em nenhuma das distribuições. Ambas buscam HTML via http(s) e o analisam (cheerio em TypeScript, a biblioteca padrão em Python). Não há download de Chromium e nenhuma chamada de subprocesso em nenhuma das verificações de qualquer implementação. A compensação é que a verificação de extração de conteúdo lê apenas HTML estático e não consegue ver conteúdo renderizado por JavaScript. Ela diz isso em sua própria mensagem de resultado.
O que "zero-config" significa aqui, concretamente?
O llmscout init <path> escreve um llmscout.json funcional e um arquivo de skill do Claude Code sem prompts. O único valor que você precisa fornecer é a URL do seu site ao vivo (via --site-url ou editando o arquivo), porque a ferramenta não consegue inferir a URL pública de um projeto a partir de seus arquivos locais. Depois disso, o llmscout check <path> roda sem configuração adicional; todas as 21 verificações rodam por padrão.
Por que o LLMScout rastreia crawlers de treinamento e crawlers de busca separadamente? Porque a OpenAI e a Anthropic realmente os executam como user agents separados e independentemente bloqueáveis agora. Bloquear o GPTBot (treinamento) não tem efeito sobre se o OAI-SearchBot ainda pode recuperar e citar sua página ao vivo em uma resposta do ChatGPT, e a mesma divisão se aplica ao ClaudeBot versus Claude-SearchBot. Relatá-los juntos esconderia uma distinção real e acionável.
O LLMScout me diz para adicionar um llms.txt?
Não, ele apenas informa se um existe. O llms.txt é uma convenção real e crescente, mas o Google declarou publicamente que não a suporta — veja Por que as verificações de GEO importam agora para a fonte. O LLMScout relata fatos sobre os quais um dono de site pode agir; ele não toma posição sobre uma questão não resolvida.
Por que não apenas corrigir o claude-seo ou o geo-seo-claude diretamente em vez de construir uma ferramenta separada? Os bugs de instalação/Windows deles compartilham uma única causa raiz: as verificações são realizadas chamando uma cadeia de ferramentas externa de interpretador-mais-navegador a partir das instruções da skill. Corrigir cada sintoma deixa essa arquitetura no lugar. O LLMScout remove a arquitetura: sem cadeia de ferramentas externa, essa classe de falha de instalação e caminho não pode ocorrer. É uma reimplementação independente, não um patch.
Posso executá-lo contra muitos sites de uma vez?
Sim. O llmscout fleet manifest.json roda a suíte completa contra cada site em um manifesto JSON local em uma única invocação, e o --out-dir escreve um arquivo de relatório com nome automático por site em vez de um único despejo de stdout combinado — construído para agências que verificam muitos sites de clientes.
Um agente ou script pode consumir a saída?
Sim. Passe o flag global --json para qualquer comando para JSON estruturado, incluindo campos por verificação de id, status, message e fix, além de um objeto de resumo. Os códigos de saída são estáveis: 0 limpo, 1 pelo menos um FAIL, 2 um erro de uso/configuração.
Existe uma versão em Python?
Sim — o pip install llmscout-cli instala um port Python genuíno e independente (não um wrapper em torno do binário Node), com zero dependências de runtime. Ele roda as mesmas 21 verificações com os mesmos veredictos PASS/WARN/FAIL deste pacote npm. Veja python/README.md.
Posso usar o LLMScout comercialmente, ou em um projeto de código fechado? Sim. Ambas as distribuições são licenciadas sob MIT (veja LICENSE): você pode usar, modificar e redistribuir o LLMScout em trabalhos comerciais e de código fechado, sem royalties e sem obrigação de abrir o código de qualquer coisa que ele verifica. O único requisito é manter o aviso de direitos autorais e o texto da licença se você redistribuir o código-fonte em si.
Contribuindo
Veja CONTRIBUTING.md para o guia completo, cobrindo tanto os codebases TypeScript quanto Python. Comandos úteis para este pacote:
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) roda lint, typecheck, build, cobertura e npm audit --audit-level=high em cada push e pull request para main. Issues e pull requests são bem-vindos em https://github.com/RudrenduPaul/LLMScout/issues.
Adicionar uma 22ª verificação é intencionalmente pequeno: implemente a interface Check (src/types.ts) em um novo arquivo sob src/checks/, depois registre-a em src/checks/index.ts (e o equivalente em Python sob python/src/llmscout/checks/, conforme CONTRIBUTING.md).
Licença
MIT. Veja LICENSE.