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

CI npm version PyPI version License: MIT

InstalarInício rápidoReferência da CLIComparaçãoFAQContribuindo

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 dois casos.

Installing llmscout-cli with npm, then running llmscout init and llmscout check against a live site, with the resulting PASS/WARN/FAIL check output in the terminal

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 se encaixa na 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 exige Node 18+ (declarado em package.json engines). As duas dependências de tempo de execução 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 via npm.

[!NOTE] A instalação via npm inclui undici como dependência transitiva de cheerio. npm audit já sinalizou um aviso de alta gravidade contra ela no passado; o bloco overrides de package.json fixa undici (e js-yaml/nanoid) em versões corrigidas para resolver o problema. Execute npm audit após a instalação para confirmar que a árvore de dependências 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 tempo de execução — a análise de HTML e a busca via HTTP usam apenas a biblioteca padrão do Python. Veja python/README.md para o guia completo específico para Python.

Em seguida, em qualquer projeto que você queira verificar:

llmscout init .

Isso cria um scaffold de configuração llmscout.json e um pequeno arquivo de skill para Claude Code no diretório de destino. Defina a URL do seu site e execute llmscout check ..

Início rápido

Crie o scaffold de uma 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."
    }
  ]
}

Running llmscout --json check to produce structured JSON output with per-check id, status, message, and fix fields plus a summary object

check sai com 0 quando nenhuma verificação FALHA, com 1 quando pelo menos uma verificação FALHA (apenas WARN não faz a execução falhar), e com 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 de GEO, listadas por nome em As 21 verificações.
  • Zero ferramentas externas, em qualquer linguagem. child_process nunca é importado em nenhum lugar do código-fonte TypeScript; a versão Python tem zero dependências de tempo de execução. As verificações rodam dentro do processo, em vez de chamar scripts Python externos ou um navegador headless.
  • Multiplataforma por construção. Sem chamadas de shell python3 versus py -3 e 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 seja http(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.json executa a suíte completa em vários caminhos de repositórios de clientes locais em uma única invocação, e --out-dir grava um arquivo de relatório com nome automático por site — criado para agências que verificam vários sites de clientes de uma só vez.
  • Saída estruturada. Todo comando aceita um flag global --json para saída legível por máquina, permitindo que um agente que chame 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 flag --user-agent para sobrescrevê-lo.
  • Bem testado. 248 testes TypeScript e 233 testes Python, ambos reproduzíveis localmente com npm test / npm run test:coverage e pytest. A distribuição Python tem zero dependências de tempo de execução, então não há nada para uma auditoria de dependências sinalizar. No lado do npm, npm audit atualmente relata um aviso de alta gravidade em undici, uma dependência transitiva trazida por cheerio, não no código deste projeto.

Por que as verificações GEO importam agora

O tráfego de busca está genuinamente migrando para respostas mediadas por IA, e a mudança é recente e bem medida, não uma hipótese:

  • Os AI Overviews do próprio Google já estão reduzindo o click-through. A Ahrefs mediu o CTR da posição 1 em palavras-chave que acionam AI Overview 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 constatou quedas de 61% no CTR orgânico e de 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 constatou que o ChatGPT responde por 92% de todo o tráfego de referência vindo 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%. A OpenAI e a Anthropic desde então dividiram seus bots em crawlers de treinamento (GPTBot, ClaudeBot) e crawlers separados de busca/recuperação, bloqueáveis de forma independente (OAI-SearchBot, Claude-SearchBot). (Cloudflare Radar, "From Googlebot to GPTBot") A verificação ai-crawler-directives do 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 afeta se o assistente dela ainda consegue 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 um post de blog. (Cloudflare, "Markdown for Agents") Vale ser honesto sobre o estado atual: uma análise independente em 300.000 domínios constatou que, na prática, nenhum grande crawler de IA envia hoje o cabeçalho Accept: text/markdown para realmente negociá-lo — eles descobrem Markdown apenas por links diretos. (Dries Buytaert) A verificação markdown-negotiation do 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, afirmou publicamente que o Google não a suporta e não tem planos de suportá-la, comparando-a à meta tag obsoleta keywords. (Search Engine Journal) A verificação llms-txt do LLMScout relata sua presença como informativa, nunca como um requisito de aprovação — o papel da ferramenta é relatar o que está realmente configurado, não prescrever uma política que as evidências ainda não sustentam.
  • O Google removeu os rich results de FAQ da Busca totalmente em 7 de maio de 2026. (Search Engine Journal) O schema FAQPage em si não está obsoleto — 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ção faq-schema do LLMScout ainda relata sobre ele, apenas sem dar a entender que ele gera um rich result no SERP do Google.

As 21 verificações

Cada verificação reporta 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
Title tag (title)Um <title> existe e tem entre 10 e 60 caracteres.
Meta description (meta-description)Um <meta name="description"> existe e tem entre 50 e 160 caracteres.
Canonical tag (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: no robots.txt verificada como localização alternativa. Uma resposta que pareça uma página de desafio de CDN (por exemplo, Cloudflare bot management) recebe uma mensagem distinta em vez de um "sitemap malformado" genérico.
Estrutura de headings (heading-structure)Exatamente um <h1>, e nenhum nível de heading pulado (por exemplo, um <h1> seguido diretamente por um <h3>).
Cobertura de alt em imagens (image-alt)As tags <img> têm um atributo alt (um alt="" intencional para imagens decorativas conta como coberto).
Open Graph tags (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 redes sociais.
Twitter/X Card tags (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 snippet (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 grandes demais que atrasam o carregamento da página.
Cadeia de redirecionamentos (redirect-chain)A cadeia completa de redirecionamentos da página inicial, alertando 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, não padronizada — veja Por que as verificações de GEO importam agora; a ausência é apenas 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. Isto é um relatório do que está configurado, nunca uma recomendação para permitir ou bloquear.
Schema de FAQ (faq-schema)JSON-LD FAQPage está presente (informativo; só é relevante para páginas que realmente têm uma FAQ — veja a nota sobre a descontinuação dos 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 consegue dividir em blocos, em vez de um único bloco grande e não estruturado. Por design, não consegue ver conteúdo que só aparece após JavaScript no lado do cliente.
Schema Speakable (speakable-schema)Um SpeakableSpecification está presente no JSON-LD, para elegibilidade de respostas por assistentes de voz.
Schema de organização (organization-schema)JSON-LD Organization/Person com um array sameAs de URLs oficiais de perfil está presente, para sinais de Knowledge Panel.
Negociação de conteúdo Markdown (markdown-negotiation)Se o site serve uma representação text/markdown quando solicitada 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 Link RFC 8288 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 própria saída --help da 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
ComandoArgumentoOpçõesFinalidade
init<path> diretório de destino--site-url <url> define siteUrl imediatamenteCria a 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 do manifesto.

--json, --user-agent, -V/--version e -h/--help são as únicas opções globais.

Códigos de saída

CódigoSignificado
0init foi bem-sucedido, ou check/fleet foi concluído sem nenhum FAIL.
1check: pelo menos uma verificação falhou (FAIL). fleet: pelo menos um site falhou ou apresentou erro.
2Erro 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 precise invocar 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, portanto 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

Running cat fleet.json to show a two-site manifest, then llmscout fleet ./fleet.json checking both sites and printing a per-site PASS/FAIL summary

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 único manifesto e verifica todos com 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 será 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 vários 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 invoque. 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 foram 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çãoAssinaturaO 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) => CheckContextConstró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 exceção vira um resultado FAIL em vez de abortar a execução.
hasFailure(results: CheckResult[]) => booleantrue se o status de qualquer resultado for "FAIL".
ALL_CHECKS / TECHNICAL_CHECKS / GEO_CHECKSCheck[]A suíte completa de verificações, ou apenas uma das duas categorias.
initProject(targetPath: string, opts?: { siteUrl?: string }) => InitResultCria a estrutura llmscout.json e o arquivo de skill do Claude Code. Idempotente.
loadFleetManifest / runFleetveja src/fleet.tsCarrega um manifesto de frota e executa a suíte em todos os sites do manifesto.
safeFetch / assertHttpUrlveja src/fetch-utils.tsO wrapper de fetch 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. Ainda não existe um site de documentação de API gerada; esta tabela e os comentários TSDoc do próprio código-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. Ainda não existem documentos Sphinx gerados; 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 do repositório, um manifesto de pacote ou uma issue aberta), citada abaixo da 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.

LLMScoutclaude-seo (AgriciDaniel)geo-seo-claude (zubair-trabzada)geo-optimizer-skill (Auriti-Labs)
Requer PythonNãoSim (Python 3.10+)SimSim (Python 3.9+)
Requer Playwright / navegador headlessNãoOpcional (Chromium instalado automaticamente pelo install.sh para renderização de SPA)Opcional, para algumas verificaçõesNão é necessário para a função principal
Instalaçãonpm / PyPI (dependências: cheerio+commander ou nenhuma)git clone + install.sh / install.ps1, ou Claude Code /plugingit clone + install.sh / install-win.shpip install ou uvx
Multiplataforma / Windows pronto para usoSim (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, #139A dor de instalação no Windows também é um padrão recorrente aqui: issues #69, #21, #3pip/uv são multiplataforma; não verificado além disso
Cobertura de bots crawler de IA7 bots, crawlers de treinamento e de busca rastreados separadamente (GPTBot/OAI-SearchBot, ClaudeBot/Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended)Não é uma verificação dedicadaNão é uma verificação dedicadaNão verificado
Verificação de negociação de conteúdo MarkdownSim (markdown-negotiation)NãoNãoNão
PapelVerificadorVerificadorVerificador + gerador de relatóriosVerificador
CoberturaTécnico + GEO (21 verificações)Técnico + GEO (ampla)Focada em GEOTécnico + GEO
LicençaMITMITNão verificadoMIT

Fontes: LLMScout, a partir 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, a partir da seção de instalação do seu README (Python 3.10+, install.sh/install.ps1, /plugin), sua licença MIT e as issues abertas #137/#138/#139. geo-seo-claude, a partir do seu README e do seu próprio rastreador de issues (dores de instalação no Windows: issues #69, #21, #3, todas citadas acima). geo-optimizer-skill, a partir 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 de GEO pagos e hospedados, 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 por trás de um padrão recorrente de bugs de instalação/Windows/caminhos relatados contra ele, incluindo três issues (desde então fechadas, mas cada uma documentando o modo de falha arquitetural que este projeto existe para evitar): #137 (uma instalação limpa do /plugin não provisiona nem as dependências Python nem o Playwright Chromium), #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 ficam na 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 em uso ativo (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 hospedeiro, 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 a provisionar, nenhum pip install a executar além do próprio pacote, nenhum binário de navegador a baixar e nenhum caminho relativo de script a resolver; portanto, uma instalação limpa se comporta da mesma forma 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 consegue avaliar conteúdo que só aparece depois que o JavaScript do lado do cliente renderiza. A verificação documenta essa limitação na 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 para onde o espaço GEO realmente se moveu 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 rastreadores de IA de treinamento e de busca, a negociação de conteúdo Markdown e a descontinuação documentada pelo Google dos rich results de FAQ.

O LLMScout foi renomeado recentemente do seu nome original, SeoFleet. Ambas as distribuições estão sendo republicadas sob o novo nome de pacote (llmscout-cli tanto no npm quanto no PyPI) — veja Instalação para ambos os caminhos e os selos acima para o status de versão em tempo real.

FAQ

O LLMScout exige 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 declara isso na própria mensagem de resultado.

O que "zero-config" significa aqui, concretamente? llmscout init <path> grava 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 em produção (via --site-url ou editando o arquivo), porque a ferramenta não consegue inferir a URL pública de um projeto a partir dos 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 rastreadores de treinamento e rastreadores de busca separadamente? Porque a OpenAI e a Anthropic realmente os executam agora como user agents separados e bloqueáveis de forma independente. Bloquear o GPTBot (treinamento) não tem efeito sobre se o OAI-SearchBot ainda consegue recuperar e citar sua página ao vivo em uma resposta do ChatGPT, e a mesma divisão se aplica a 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. 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 o dono de um site pode agir; ele não toma posição sobre uma questão não resolvida.

Por que não consertar diretamente o claude-seo ou o geo-seo-claude 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 vários sites de uma vez? Sim. O llmscout fleet manifest.json executa a suíte completa contra todos os sites em um manifesto JSON local em uma única invocação, e o --out-dir grava um arquivo de relatório com nome automático por site em vez de um único despejo de stdout combinado — criado 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 obter JSON estruturado, incluindo campos id, status, message e fix por verificação, 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 em tempo de execução. Ele executa as mesmas 21 verificações com os mesmos vereditos 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-fonte 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) executa lint, typecheck, build, cobertura e npm audit --audit-level=high em todo 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.