Intercept

Dê ao seu IA a capacidade de ler a web. Busca URLs como markdown limpo com 9 estratégias de fallback. Lida com tweets, YouTube, arXiv, PDFs e páginas comuns.

Documentação

intercept-mcp

Dê ao seu IA a capacidade de ler a web. Um comando, sem necessidade de chaves de API.

Sem ele, seu IA acessa uma URL e recebe um 403, uma barreira ou uma parede de HTML bruto. Com intercept, ele quase sempre obtém o conteúdo — markdown limpo, pronto para uso.

Lida com tweets, vídeos do YouTube (com transcrições quando disponíveis), artigos do arXiv, PDFs, artigos da Wikipédia e repositórios do GitHub. Se a primeira estratégia falhar, ele tenta até 14 outras antes de desistir.

Funciona com qualquer cliente MCP: Claude Code, Claude Desktop, Codex, Cursor, Windsurf, Cline e outros.

intercept-mcp MCP server

Instalação

Claude Code

claude mcp add intercept -s user -- npx -y intercept-mcp

Codex

codex mcp add intercept -- npx -y intercept-mcp

Cursor

Configurações → MCP → Adicionar Servidor:

{
  "mcpServers": {
    "intercept": {
      "command": "npx",
      "args": ["-y", "intercept-mcp"]
    }
  }
}

Windsurf

Configurações → MCP → Adicionar Servidor → mesma configuração JSON acima.

Claude Desktop

Adicione ao seu claude_desktop_config.json:

{
  "mcpServers": {
    "intercept": {
      "command": "npx",
      "args": ["-y", "intercept-mcp"]
    }
  }
}

Outros clientes MCP

Qualquer cliente que suporte servidores MCP stdio pode executar npx -y intercept-mcp.

Nenhuma chave de API é necessária para a ferramenta fetch.

Como funciona

As URLs são processadas em quatro etapas:

1. Manipuladores específicos do site

Padrões de URL conhecidos são roteados para manipuladores dedicados antes do pipeline de fallback:

PadrãoManipuladorO que você obtém
twitter.com/*/status/*, x.com/*/status/*Twitter/XTexto do tweet, autor, mídia, estatísticas de engajamento (via APIs de terceiros)
youtube.com/watch?v=*, youtu.be/*YouTubeTítulo, canal, duração, visualizações, descrição, transcrição (quando legendas disponíveis)
arxiv.org/abs/*, arxiv.org/pdf/*arXivMetadados do artigo, autores, resumo, categorias
*.pdfPDFTexto extraído (somente PDFs com camada de texto)
*.wikipedia.org/wiki/*WikipédiaConteúdo limpo do artigo via API REST da Wikimedia
github.com/{owner}/{repo}GitHubConteúdo bruto do README.md
github.com/{o}/{r}/blob/{ref}/{path}GitHubConteúdo bruto do arquivo, com código formatado por linguagem
github.com/{o}/{r}/issues/{n}, /pull/{n}GitHubTítulo da issue/PR, estado, corpo, estatísticas de diff, comentários (via API do GitHub)
github.com/{o}/{r}/releases/tag/{t}, /releases/latestGitHubNotas de lançamento (via API do GitHub)

Os endpoints da API do GitHub funcionam sem autenticação (60 requisições/hora). Defina GITHUB_TOKEN para aumentar o limite.

2. Cache compartilhado (agentsweb.org)

Antes de acessar qualquer buscador, cada requisição verifica agentsweb.org — um cache global compartilhado de markdown para agentes de IA, apoiado por um pipeline paralelo de 9 fontes com renderização JS/SPA (React, Vue, Angular via Cloudflare Browser Run). Se outro agente já buscou esta URL, você obtém o resultado em menos de 50ms.

Cada busca bem-sucedida contribui automaticamente de volta. As entradas ganham confiança por meio de um modelo de consenso auto-reparável: quando instâncias independentes buscam a mesma URL e confirmam o mesmo conteúdo, a confiança aumenta.

Desative completamente com INTERCEPT_SHARED_CACHE=false, ou use o modo somente leitura (consome mas nunca contribui) com INTERCEPT_CACHE_READ_ONLY=true.

API do agentsweb.org

O agentsweb.org também expõe endpoints independentes para uso direto:

  • /web?q= — pesquisa na web
  • /research?q= — pesquisa + busca + cache em uma única chamada
  • /fetch?url= — busca sob demanda, com cache automático

Veja agentsweb.org/docs para documentação completa da API.

3. Pipeline de fallback

Se nenhum manipulador corresponder (ou o manipulador não retornar nada), a URL entra no pipeline de múltiplas camadas:

CamadaBuscadorEstratégia
0agentsweb.orgCache global compartilhado de markdown — instantâneo se outro agente já buscou esta URL
1Cloudflare Browser RunRenderização JS/SPA + extração de markdown — também alimenta agentsweb.org (opcional, precisa de token de API)
1Jina ReaderServiço de extração de markdown limpo
2Wayback MachineVersão arquivada do archive.org
2Arquivo.ptArquivo web português (ampla cobertura internacional)
2Common CrawlArquivo web de petabytes lido do índice do Common Crawl + S3 — não sujeito aos limites de taxa, detecção de bot ou paywall da origem
2CodetabsProxy CORS
3Endpoint MarkdownSolicita ao site uma versão markdown nativa (<path>.md + Accept: text/markdown)
3archive.phSnapshots arquivados via API timemap + busca TLS furtiva
3Busca brutaGET direto com cabeçalhos de navegador + conversão markdown via Turndown
3Busca furtivaImpersonação de impressão digital TLS do navegador via got-scraping (opt-in, veja abaixo)
3FlareSolverrSolucionador de desafios de navegador real para Cloudflare/DDoS-Guard (opt-in, precisa de uma instância FlareSolverr)
3Desbloqueador webAPI comercial de desbloqueio — rotação residencial + renderização + CAPTCHA (opt-in, chave própria, pago por requisição)
4RSS, CrossRef, Semantic Scholar, HN, RedditFallbacks de metadados / discussão
5OG MetaTags Open Graph (fallback garantido)

Os buscadores da camada 2 são executados em paralelo. Quando vários têm sucesso, o resultado de maior qualidade vence. Todas as outras camadas são executadas sequencialmente.

Todos os buscadores retornam Markdown adequado (cabeçalhos, links, negrito, tabelas, blocos de código) via Turndown — não texto simples.

4. Cache

Os resultados são armazenados em cache na memória com TTL (60 min para sucessos, 5 min para falhas). Máximo de 250 entradas com evicção LRU. URLs com falha são armazenadas em cache para evitar novas tentativas de URLs conhecidamente mortas. Todos os três parâmetros são configuráveis via INTERCEPT_CACHE_TTL_MS, INTERCEPT_CACHE_FAILURE_TTL_MS e INTERCEPT_CACHE_SIZE.

Ferramentas

fetch

Busca uma URL e retorna seu conteúdo como markdown limpo.

  • url (string, obrigatório) — URL a buscar
  • maxTier (número, opcional, 1-5) — Pare nesta camada para casos sensíveis à velocidade
  • maxLength (número, opcional, padrão 50000) — Máximo de caracteres a retornar
  • startIndex (número, opcional, padrão 0) — Deslocamento de caracteres para paginar conteúdo longo
  • noCache (booleano, opcional) — Ignorar caches de sessão e compartilhados e buscar ao vivo

Páginas longas são truncadas em maxLength com um aviso informando ao agente qual startIndex continua o conteúdo. A saída estruturada relata source, quality, contentLength, truncated, nextStartIndex e cacheAgeSeconds para que os agentes possam ramificar programaticamente.

URLs de imagem diretas (.png, .jpg, .gif, .webp, até 5 MB) são retornadas como um bloco de imagem MCP em vez de texto, para que o modelo de visão do próprio agente possa ler gráficos, diagramas, capturas de tela e documentos digitalizados. A saída estruturada relata source: "image", mimeType e bytes.

fetch_batch

Busca até 10 URLs em paralelo, cada uma através da mesma cadeia de manipulador/fallback.

  • urls (string[], obrigatório, 1-10) — URLs a buscar
  • maxTier, noCache — como em fetch
  • maxLength (número, opcional, padrão 20000) — Orçamento de caracteres por URL

research

Pesquisa na web e busca os principais resultados em uma única chamada — substitui uma pesquisa seguida de várias buscas.

  • query (string, obrigatório) — Consulta de pesquisa
  • count (número, opcional, 1-5, padrão 3) — Resultados a buscar
  • maxLength (número, opcional, padrão 20000) — Orçamento de caracteres por resultado
  • site (string, opcional) — Restringir a um domínio
  • freshness (string, opcional) — day, week, month ou year

search

Pesquisa na web e retorna resultados.

  • query (string, obrigatório) — Consulta de pesquisa
  • count (número, opcional, 1-20, padrão 5) — Número de resultados
  • site (string, opcional) — Restringir resultados a um domínio
  • freshness (string, opcional) — day, week, month ou year
  • page (número, opcional, 1-10) — Página de resultados para paginação

Usa a API Brave Search se BRAVE_API_KEY estiver definido, depois SearXNG se SEARXNG_URL estiver definido, depois DuckDuckGo como último recurso não confiável. freshness e page são ignorados pelo fallback DuckDuckGo.

extract

Extrai valores específicos de uma página como JSON em vez de prosa markdown — para quando você precisa de dados específicos, não da página inteira. Respeita autenticação e proxies por domínio.

  • url (string, obrigatório) — A URL da qual extrair
  • selectors (objeto, opcional) — Mapa de nome de campo → seletor CSS. Cada valor é uma string de seletor (retorna o texto da primeira correspondência) ou { selector, attr?, all? } — attr extrai um atributo (ex.: href), all: true retorna cada correspondência como um array.
  • tables (booleano, opcional) — Converte cada tabela HTML em um array de objetos de linha (padrão true quando nenhum selectors é fornecido).
{
  "url": "https://shop.example.com/item",
  "selectors": {
    "title": "h1",
    "price": ".price",
    "images": { "selector": "img.gallery", "attr": "src", "all": true }
  }
}

Retorna os fields e/ou tables extraídos como saída estruturada.

Recursos

intercept://session/recent

Lista markdown de URLs buscadas e armazenadas em cache nesta sessão, mais recentes primeiro. Re-buscar qualquer uma delas é instantâneo.

Prompts

research-topic

Pesquisa um tópico e busca os principais resultados para um resumo de múltiplas fontes.

  • topic (string) — O tópico a pesquisar
  • depth (string, padrão "3") — Número de principais resultados a buscar

extract-article

Busca uma URL e extrai os pontos-chave do conteúdo.

  • url (string) — A URL a buscar e resumir

Variáveis de ambiente

VariávelObrigatóriaDescrição
BRAVE_API_KEYNãoChave da API Brave Search para pesquisa
SEARXNG_URLNãoURL da instância SearXNG auto-hospedada (recomendado)
GITHUB_TOKENNãoToken do GitHub que aumenta os limites de taxa da API para o manipulador de issue/PR/release
INTERCEPT_AUTHNãoMapa JSON de domínio → cabeçalhos/cookies, para buscar conteúdo ao qual você está logado (veja Autenticação por domínio)
CF_API_TOKENNãoToken da API Cloudflare com permissão "Browser Rendering - Edit"
CF_ACCOUNT_IDNãoID da conta Cloudflare (obrigatório se CF_API_TOKEN estiver definido)
USE_STEALTH_FETCHNãoDefina como true para habilitar o buscador furtivo (veja aviso abaixo)
FLARESOLVERR_URLNãoURL de uma instância FlareSolverr (ex.: http://localhost:8191) para resolver desafios Cloudflare/DDoS-Guard
WEB_UNLOCKER_URLNãoModelo GET (com um placeholder {url} e sua chave de API) para um desbloqueador web comercial como ScrapingBee/ScraperAPI/ZenRows — o último recurso pago para os sites mais difíceis
INTERCEPT_SHARED_CACHENãoDefina como false para desabilitar o cache compartilhado agentsweb.org
INTERCEPT_CACHE_READ_ONLYNãoDefina como true para consumir mas nunca contribuir com o cache compartilhado
INTERCEPT_CACHE_TTL_MSNãoTTL do cache em memória para buscas bem-sucedidas em ms (padrão 3600000 = 60 min)
INTERCEPT_CACHE_FAILURE_TTL_MSNãoTTL do cache em memória para buscas com falha em ms (padrão 300000 = 5 min)
INTERCEPT_CACHE_SIZENãoMáximo de entradas no cache em memória (padrão 250)
HTTPS_PROXY / HTTP_PROXYNãoPassagem de proxy padrão — roteia todas as buscas de saída (incluindo furtivas) através do proxy. Respeita NO_PROXY.
INTERCEPT_PROXIESNãoLista separada por vírgula/espaço de proxies HTTP(S) para rotacionar, com nova tentativa automática através do próximo proxy em resposta bloqueada. Tem precedência sobre HTTPS_PROXY.

Pesquisa: Tem um fallback DuckDuckGo, mas é limitado por taxa e não confiável. Para uso em produção, auto-hospede SearXNG e defina SEARXNG_URL (veja abaixo), ou obtenha uma chave da API Brave Search.

Busca: Funciona sem nenhuma chave. Defina CF_API_TOKEN + CF_ACCOUNT_ID para habilitar o Cloudflare Browser Run (anteriormente Browser Rendering) para páginas com muito JavaScript (SPAs, sites React).

Busca furtiva (USE_STEALTH_FETCH)

Use por sua conta e risco. Quando ativado, isso adiciona um buscador que se passa por impressões digitais TLS de navegadores reais (suites de cifras Chrome/Firefox, configurações HTTP/2, ordenação de cabeçalhos) usando got-scraping. Isso pode contornar detecção de bots e gatilhos de CAPTCHA em sites que, de outra forma, bloqueariam requisições automatizadas.

Este buscador roda no nível 3 após a busca bruta regular. Se a busca bruta for bloqueada (CAPTCHA, desafio Cloudflare, 403), o buscador furtivo tenta novamente com personificação de navegador.

Isso pode violar os termos de serviço de alguns sites. Os autores do intercept-mcp não assumem responsabilidade por como este recurso é usado. Ele está desabilitado por padrão e deve ser explicitamente ativado.

Resolução de desafios (FLARESOLVERR_URL)

O buscador furtivo personifica a impressão digital TLS de um navegador, mas não pode executar um desafio JavaScript — então sites protegidos por um intersticial Cloudflare "Verificando seu navegador" / DDoS-Guard ainda o bloqueiam. FlareSolverr executa um navegador headless real que resolve o desafio e retorna o HTML da página.

Execute-o (Docker):

docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest

Em seguida, defina FLARESOLVERR_URL=http://localhost:8191. Ele roda no nível 3 como último recurso após os buscadores bruto e furtivo, e somente quando esta variável está definida. Resolver um desafio pode levar 30–60s, então é o buscador mais lento — mas recupera páginas que nada mais consegue.

Desbloqueador web comercial (WEB_UNLOCKER_URL)

Para os alvos mais difíceis — sites que precisam de rotação de IP residencial e renderização de navegador real e tratamento de CAPTCHA juntos — um desbloqueador comercial é a resposta pragmática. O intercept-mcp suporta qualquer desbloqueador que exponha um endpoint "OBTENHA esta URL, retorne o HTML", via um modelo com um espaço reservado {url} que contém sua chave de API:

# ScrapingBee
WEB_UNLOCKER_URL='https://app.scrapingbee.com/api/v1/?api_key=KEY&render_js=true&url={url}'
# ScraperAPI
WEB_UNLOCKER_URL='https://api.scraperapi.com/?api_key=KEY&render=true&url={url}'
# ZenRows
WEB_UNLOCKER_URL='https://api.zenrows.com/v1/?apikey=KEY&js_render=true&url={url}'

O intercept substitui o alvo (codificado em URL) por {url} e converte o HTML retornado (ou JSON que o envolve) para markdown. Ele roda no nível 3 como último recurso pago após os buscadores gratuitos, somente quando esta variável está definida — e suas credenciais no modelo são apenas enviadas ao desbloqueador, nunca ao alvo. O Web Unlocker baseado em proxy da Bright Data é apenas um proxy autenticado, então use HTTPS_PROXY / INTERCEPT_PROXIES para isso. Isso cobra por requisição.

Traga seu próprio proxy (HTTPS_PROXY)

Se buscas brutas começarem a ser sinalizadas, a correção mais eficaz geralmente é um IP de saída limpo — não uma impressão digital mais sofisticada. O intercept-mcp honra as variáveis de ambiente padrão HTTPS_PROXY / HTTP_PROXY / NO_PROXY, então você pode rotear todo o tráfego de saída através de qualquer proxy que já tenha:

HTTPS_PROXY=http://user:pass@proxy.example.com:8080 npx intercept-mcp

Isso funciona com qualquer proxy HTTP(S) — um Squid auto-hospedado, um nó de saída Tailscale, um VPS de $5 rodando 3proxy, ou proxies residenciais comerciais (Bright Data, Oxylabs, etc.). O buscador furtivo e as chamadas got-scraping também captam isso automaticamente.

Rotação de proxy (INTERCEPT_PROXIES)

Um único proxy ainda apresenta um único IP, que pode ser sinalizado sob carga. Defina INTERCEPT_PROXIES para uma lista separada por vírgulas ou espaços e o intercept-mcp faz round-robin entre eles, tentando automaticamente através do próximo proxy quando uma requisição retorna bloqueada (HTTP 403, 429, 451, 503) ou com erro:

INTERCEPT_PROXIES="http://user:pass@p1.example.com:8080,http://user:pass@p2.example.com:8080,http://p3.example.com:8080" npx intercept-mcp

As requisições se distribuem pela lista, e uma resposta bloqueada é tentada novamente através de uma saída diferente (até 3 tentativas) antes de desistir — então um punhado de proxies baratos, ou um endpoint residencial rotativo listado várias vezes, se comportam como um pool. INTERCEPT_PROXIES tem precedência sobre HTTPS_PROXY, aplica-se por requisição (então as chamadas furtivas e archive.ph got-scraping também rotacionam), e aceita proxies HTTP(S). Entradas inválidas são ignoradas.

Autenticação por domínio (INTERCEPT_AUTH)

A maior parte da web está atrás de um login. INTERCEPT_AUTH permite que você anexe seus próprios cabeçalhos ou cookies a requisições para uma origem específica, para que as ferramentas de busca possam ler conteúdo ao qual você está legitimamente conectado — uma assinatura paga, um painel privado, uma intranet, uma API autenticada.

É um objeto JSON que mapeia um domínio para um mapa de cabeçalhos. Um domínio também corresponde aos seus subdomínios:

INTERCEPT_AUTH='{
  "nytimes.com": { "Cookie": "nyt-s=...; nyt-a=..." },
  "api.acme.com": { "Authorization": "Bearer eyJ..." }
}' npx intercept-mcp

Para obter um cookie: abra o site conectado, abra DevTools → Rede, copie o cabeçalho de requisição Cookie de qualquer requisição para esse domínio.

Modelo de segurança — leia isto antes de usar

  • Credenciais só vão para a origem configurada. Cabeçalhos são chaveados no host real sendo contatado. Quando o intercept busca uma página através do Jina, um arquivo web, um proxy CORS, FlareSolverr, ou o cache compartilhado, esses intermediários se conectam a um host diferente, então seu cookie/token nunca é enviado a eles — apenas uma busca direta da origem o carrega.
  • Respostas autenticadas nunca tocam o cache compartilhado. Quando uma requisição corresponde a uma entrada INTERCEPT_AUTH, o intercept não lê nem escreve no cache público agentsweb.org para essa URL — então seu conteúdo privado/pago nunca é publicado, e você sempre obtém sua visão autenticada em vez de uma cópia anônima de um estranho. (O cache de sessão em processo ainda se aplica.)
  • Trate o valor como um segredo. Ele contém tokens de sessão ativos. Variáveis de ambiente são visíveis ao processo e seus filhos e podem ser capturadas no histórico do shell ou em listagens de processos — prefira um gerenciador de segredos ou um arquivo env não versionado, e nunca o envie para o controle de versão. Cookies expiram, então você precisará atualizá-los periodicamente.
  • Você é responsável pelo uso autorizado. Forneça apenas credenciais para contas que você possui ou tem permissão para usar, e respeite os termos de serviço de cada site. O intercept simplesmente encaminha os cabeçalhos que você fornece.

Auto-hospedagem do SearXNG

Para busca confiável, auto-hospede o SearXNG com Docker. Uma configuração está incluída no repositório:

git clone https://github.com/bighippoman/intercept-mcp.git
cd intercept-mcp/searxng && docker compose up -d

Em seguida, defina SEARXNG_URL=http://localhost:8888. Sem limites de taxa, sem CAPTCHAs, agrega Google + Bing + DuckDuckGo + Wikipedia + Brave.

Ou use qualquer instância SearXNG existente — basta definir SEARXNG_URL para sua URL.

Normalização de URL

URLs recebidas são automaticamente limpas:

  • Remove 60+ parâmetros de rastreamento (UTM, IDs de clique, analytics, testes A/B, etc.)
  • Remove fragmentos de hash
  • Atualiza para HTTPS
  • Limpa artefatos AMP
  • Preserva parâmetros funcionais (ref, format, page, offset, limit)

Proteção SSRF

Agentes passam URLs retiradas de conteúdo web não confiável, então as ferramentas de busca recusam qualquer coisa que aponte para infraestrutura local ou interna: faixas de IPv4/IPv6 loopback e privadas, endereços link-local (incluindo o endpoint de metadados de nuvem 169.254.169.254), CGNAT, faixas multicast/reservadas, e hostnames locais (localhost, *.local, *.internal, *.home.arpa). IPs literais são verificados, incluindo notações alternativas (decimal, hex) normalizadas pelo parser de URL; DNS não é resolvido, então hostnames públicos que apontam para IPs privados não são capturados.

Detecção de qualidade de conteúdo

Cada resultado de buscador é pontuado por qualidade. Falha automática em:

  • CAPTCHA / desafios Cloudflare
  • Paredes de login
  • Páginas de erro HTTP no corpo
  • Conteúdo com menos de 200 caracteres

Requisitos

  • Node.js >= 20
  • Nenhuma chave de API necessária para uso básico