Skip to main content
O ChatCLI inclui três ferramentas web nativas — @webfetch, @websearch e @wikipedia — que permitem ao agent buscar informações na internet, fazer fetch de páginas web e consultar a Wikipedia sem depender de servidores MCP externos.
As web tools são ferramentas nativas do ChatCLI, disponíveis automaticamente nos modos agent e coder. Não e necessário configurar servidores MCP para usa-las.

@webfetch

Faz o fetch de uma URL, remove o HTML e retorna o conteúdo textual limpo. Ideal para ler documentações, artigos, READMEs e qualquer página web.

Como Funciona

1

Requisicao HTTP

O ChatCLI faz uma requisicao GET para a URL fornecida com headers padrão de navegador.
2

Parse HTML

O HTML recebido e parseado usando golang.org/x/net/html, extraindo apenas o conteúdo textual.
3

Limpeza

Tags de script, style, navegacao e elementos não-textuais são removidos. O texto resultante e limpo e formatado.
4

Retorno

O conteúdo textual e retornado ao agent como resultado da tool call.

Uso

O LLM invoca @webfetch automaticamente quando precisa acessar conteúdo de uma URL. Você também pode solicitar explicitamente:

Formatos de Argumentos

Exemplo

O @webfetch respeita redirects (até 10), timeouts (30s) e retorna erros claros para URLs inacessíveis ou com problemas de SSL.

Filtros para payloads grandes

Endpoints como Prometheus /metrics, dumps de configuração ou listagens longas podem facilmente exceder dezenas de milhares de caracteres. O @webfetch aceita um conjunto de parâmetros que aplicam filtragem por linha antes do truncamento, evitando que o miolo útil seja descartado: Exemplo — filtrar Prometheus por prefixo de métrica:
Exemplo — paginar dentro do payload filtrado:
Exemplo — salvar tudo no scratch dir e ler trechos sob demanda depois:
Resposta:
O agente pode então emitir um read_file apontando para o caminho absoluto retornado, escolhendo o intervalo exato de linhas que importa.
save_to_file sempre confina escritas a CHATCLI_AGENT_TMPDIR. Se save_path for um caminho absoluto ou contiver .., apenas o filepath.Base é usado, e a escrita é validada para garantir que o resultado fica dentro do scratch dir.

Auto-save inteligente

Quando o LLM chama @webfetch sem filtro, exclude, range ou save_to_file explícito, e o body retornado supera o threshold de auto-save, o ChatCLI promove o fetch automaticamente para modo save_to_file=true. Isso protege o contexto contra páginas gigantes sem obrigar o modelo a saber o tamanho de antemão. Default: bodies acima de 10.000 bytes (configurável via CHATCLI_WEBFETCH_AUTOSAVE_BYTES) passam pelo auto-save. O resultado inline fica em um preview compacto (~5.000 chars) e a resposta começa com um marker explícito:
Para desativar ou relaxar o auto-save — por exemplo, em batches offline onde o agente precisa do body inteiro inline — suba o threshold:
Ou, na chamada específica, passe filter (mesmo que .*), from_line/to_line explícitos, ou save_to_file com false. Presença de qualquer um desses desabilita a promoção automática.
Ver Eficiência de Tokens para o contexto completo dessa decisão.

Renderização de páginas JavaScript (SPA)

Páginas que constroem o conteúdo no client (SPAs, tabelas montadas via JavaScript) retornam um “casco” vazio no fetch estático — <div id="root"> e bundles, sem o conteúdo real. O @webfetch resolve isso com uma cadeia de escalonamento:
1

Fetch estático

Sempre o primeiro passo. Páginas server-rendered param aqui — zero custo extra.
2

Detecção de shell JS

Heurística: texto extraído fino + sinais estruturais (mount points vazios #root/#app, aviso <noscript>, marcadores de framework — React, Next, Angular, Vue, Nuxt, Svelte, Gatsby, Remix, Flutter).
3

Render headless via CDP

Um Chromium real renderiza a página (espera load + DOM estável) e o DOM resultante passa pelo mesmo pipeline de extração/filtros/auto-save.
4

Fallbacks sem browser

Sem browser disponível, o estado embutido __NEXT_DATA__ (Next.js) é recuperado do HTML estático; em último caso, uma nota honesta avisa o modelo que o fetch pode estar incompleto.
Descoberta de browser (ordem): Chrome → Chromium → Edge → Brave → caminho explícito em CHATCLI_WEBFETCH_RENDER_BROWSER → download opt-in de um Chromium pinado (~150 MB, uma vez) com CHATCLI_WEBFETCH_RENDER_AUTOPROVISION=true. Sem API keys, sem serviços externos. Postura de produção: um browser compartilhado por processo (lançamento lazy, reuso com health-check, shutdown após 2 min ocioso), circuit breaker (2 falhas de launch → 5 min de pausa), contexto incógnito por render (cookies nunca vazam entre sites) e SSRF reforçado dentro do browser — cada sub-request da página é validado via interceptação CDP, espelhando o guard do caminho HTTP normal. DOM renderizado limitado a 10 MB.

@websearch

Realiza uma busca web e retorna os resultados com título, URL e snippet. Suporta dois backends keyless por design — nada de API key externa para cadastrar: DuckDuckGo (scraping HTML) é o default zero-config, e SearxNG self-hosted é o preferido em ambiente corporativo quando você aponta para uma instância interna.

Backends disponíveis

Cadeia de fallback

A cada query, o ChatCLI monta uma cadeia ordenada de backends. Se o primeiro falha ou retorna vazio, o próximo é tentado automaticamente. Ordem default (CHATCLI_WEBSEARCH_PROVIDER não setado ou auto):
Override explícito para priorizar SearxNG:
Resultado: cadeia vira searxng → duckduckgo → brave → mojeek. Os demais continuam como fallback se a instância SearxNG falhar. O mesmo vale para qualquer provider: CHATCLI_WEBSEARCH_PROVIDER=brave move o Brave para o topo e mantém o resto atrás.

Variáveis de ambiente

Comando /websearch

Gerenciador interativo do backend preferido. Autocomplete disponível para subcomandos e nomes de provider. O /websearch provider é apenas para a sessão corrente. Para persistir, exporte a env no shell ou adicione ao .env.

Configurando SearxNG self-hosted

A instância SearxNG precisa ter a JSON API habilitada — não vem ativa por default. No settings.yml do SearxNG:
Se você apontar o SEARXNG_URL para uma instância sem JSON habilitado, o ChatCLI retorna um erro acionável ao invés de uma mensagem de decode confusa:
A imagem oficial searxng/searxng no Docker Hub sobe em 30 segundos. Em ambiente corporativo, um único container com ingress interno já é suficiente — e resolve o problema de “DDG bloqueado pelo proxy” de uma vez.

Como funciona internamente

1

Seleção da cadeia

SelectSearchChain()CHATCLI_WEBSEARCH_PROVIDER e SEARXNG_URL, retorna uma lista ordenada de backends a tentar.
2

Tentativa sequencial

Para cada backend na cadeia: chama a função de busca. Se retorna resultados, pára e formata. Se falha ou retorna zero, loga o motivo e avança para o próximo.
3

Formatação

Resultados viram texto formatado com via <provider> no cabeçalho, numerados com título + URL + snippet.

Formatos de Argumentos

Exemplo

O cabeçalho (via DuckDuckGo) ou (via SearxNG) deixa claro qual backend respondeu — útil para diagnosticar por que alguma query não voltou resultado (ex.: DDG serviu CAPTCHA → fallback para SearxNG).
Por que keyless? O ChatCLI é usado em ambientes corporativos onde gerenciar API keys de terceiros (Brave Search, Tavily, SerpAPI) gera atrito operacional — cadastro, rotação, approvals. SearxNG self-hosted resolve fechamento de rede sem custo recorrente; DuckDuckGo cobre o caso casual sem nenhuma config.

@wikipedia

Consulta a Wikipedia de forma keyless via a API pública do MediaWiki: busca títulos de artigos que combinam com um termo, ou lê a introdução (resumo em texto puro) de um artigo específico. Companheira natural do @websearch/@webfetch para checagem factual rápida — sem API key, sem servidor MCP.

Como Funciona

São dois modos:
  • search — recebe um termo e retorna até 5 títulos de artigos correspondentes (os títulos exatos para usar no read).
  • read — recebe o título exato de um artigo e retorna a introdução em texto puro (sem HTML, sem markup).
O idioma é configurável via lang (default en; ex.: pt, es, fr). Valores como pt-BR são normalizados para pt.

Uso

O LLM invoca @wikipedia automaticamente quando precisa de um fato verificável. O fluxo típico é: buscar pelo termo, depois ler o título exato retornado.

Formatos de Argumentos

Exemplo

O @wikipedia é keyless e respeita a etiqueta da API do MediaWiki (User-Agent identificado). Para checagem factual rápida, ele é mais barato e direto que encadear @websearch + @webfetch.

Comparacao


Disponibilidade

As web tools estão disponíveis nos seguintes modos:
No modo chat interativo, as web tools não estão disponíveis. Você precisa estar em agent ou coder mode para que o LLM possa invocá-las como tool calls.

Próximos Passos

MCP Integration

Integre ferramentas web adicionais via MCP servers.

Plugins Agenticos

Veja todas as ferramentas disponíveis para o agent.