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.
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ão | Manipulador | O que você obtém |
|---|---|---|
twitter.com/*/status/*, x.com/*/status/* | Twitter/X | Texto do tweet, autor, mídia, estatísticas de engajamento (via APIs de terceiros) |
youtube.com/watch?v=*, youtu.be/* | YouTube | Título, canal, duração, visualizações, descrição, transcrição (quando legendas disponíveis) |
arxiv.org/abs/*, arxiv.org/pdf/* | arXiv | Metadados do artigo, autores, resumo, categorias |
*.pdf | Texto extraído (somente PDFs com camada de texto) | |
*.wikipedia.org/wiki/* | Wikipédia | Conteúdo limpo do artigo via API REST da Wikimedia |
github.com/{owner}/{repo} | GitHub | Conteúdo bruto do README.md |
github.com/{o}/{r}/blob/{ref}/{path} | GitHub | Conteúdo bruto do arquivo, com código formatado por linguagem |
github.com/{o}/{r}/issues/{n}, /pull/{n} | GitHub | Título da issue/PR, estado, corpo, estatísticas de diff, comentários (via API do GitHub) |
github.com/{o}/{r}/releases/tag/{t}, /releases/latest | GitHub | Notas 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:
| Camada | Buscador | Estratégia |
|---|---|---|
| 0 | agentsweb.org | Cache global compartilhado de markdown — instantâneo se outro agente já buscou esta URL |
| 1 | Cloudflare Browser Run | Renderização JS/SPA + extração de markdown — também alimenta agentsweb.org (opcional, precisa de token de API) |
| 1 | Jina Reader | Serviço de extração de markdown limpo |
| 2 | Wayback Machine | Versão arquivada do archive.org |
| 2 | Arquivo.pt | Arquivo web português (ampla cobertura internacional) |
| 2 | Common Crawl | Arquivo 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 |
| 2 | Codetabs | Proxy CORS |
| 3 | Endpoint Markdown | Solicita ao site uma versão markdown nativa (<path>.md + Accept: text/markdown) |
| 3 | archive.ph | Snapshots arquivados via API timemap + busca TLS furtiva |
| 3 | Busca bruta | GET direto com cabeçalhos de navegador + conversão markdown via Turndown |
| 3 | Busca furtiva | Impersonação de impressão digital TLS do navegador via got-scraping (opt-in, veja abaixo) |
| 3 | FlareSolverr | Solucionador de desafios de navegador real para Cloudflare/DDoS-Guard (opt-in, precisa de uma instância FlareSolverr) |
| 3 | Desbloqueador web | API comercial de desbloqueio — rotação residencial + renderização + CAPTCHA (opt-in, chave própria, pago por requisição) |
| 4 | RSS, CrossRef, Semantic Scholar, HN, Reddit | Fallbacks de metadados / discussão |
| 5 | OG Meta | Tags 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 buscarmaxTier(número, opcional, 1-5) — Pare nesta camada para casos sensíveis à velocidademaxLength(número, opcional, padrão 50000) — Máximo de caracteres a retornarstartIndex(número, opcional, padrão 0) — Deslocamento de caracteres para paginar conteúdo longonoCache(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 buscarmaxTier,noCache— como emfetchmaxLength(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 pesquisacount(número, opcional, 1-5, padrão 3) — Resultados a buscarmaxLength(número, opcional, padrão 20000) — Orçamento de caracteres por resultadosite(string, opcional) — Restringir a um domíniofreshness(string, opcional) —day,week,monthouyear
search
Pesquisa na web e retorna resultados.
query(string, obrigatório) — Consulta de pesquisacount(número, opcional, 1-20, padrão 5) — Número de resultadossite(string, opcional) — Restringir resultados a um domíniofreshness(string, opcional) —day,week,monthouyearpage(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 extrairselectors(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? }—attrextrai um atributo (ex.:href),all: trueretorna cada correspondência como um array.tables(booleano, opcional) — Converte cada tabela HTML em um array de objetos de linha (padrão true quando nenhumselectorsé 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 pesquisardepth(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ável | Obrigatória | Descrição |
|---|---|---|
BRAVE_API_KEY | Não | Chave da API Brave Search para pesquisa |
SEARXNG_URL | Não | URL da instância SearXNG auto-hospedada (recomendado) |
GITHUB_TOKEN | Não | Token do GitHub que aumenta os limites de taxa da API para o manipulador de issue/PR/release |
INTERCEPT_AUTH | Não | Mapa JSON de domínio → cabeçalhos/cookies, para buscar conteúdo ao qual você está logado (veja Autenticação por domínio) |
CF_API_TOKEN | Não | Token da API Cloudflare com permissão "Browser Rendering - Edit" |
CF_ACCOUNT_ID | Não | ID da conta Cloudflare (obrigatório se CF_API_TOKEN estiver definido) |
USE_STEALTH_FETCH | Não | Defina como true para habilitar o buscador furtivo (veja aviso abaixo) |
FLARESOLVERR_URL | Não | URL de uma instância FlareSolverr (ex.: http://localhost:8191) para resolver desafios Cloudflare/DDoS-Guard |
WEB_UNLOCKER_URL | Não | Modelo 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_CACHE | Não | Defina como false para desabilitar o cache compartilhado agentsweb.org |
INTERCEPT_CACHE_READ_ONLY | Não | Defina como true para consumir mas nunca contribuir com o cache compartilhado |
INTERCEPT_CACHE_TTL_MS | Não | TTL do cache em memória para buscas bem-sucedidas em ms (padrão 3600000 = 60 min) |
INTERCEPT_CACHE_FAILURE_TTL_MS | Não | TTL do cache em memória para buscas com falha em ms (padrão 300000 = 5 min) |
INTERCEPT_CACHE_SIZE | Não | Máximo de entradas no cache em memória (padrão 250) |
HTTPS_PROXY / HTTP_PROXY | Não | Passagem de proxy padrão — roteia todas as buscas de saída (incluindo furtivas) através do proxy. Respeita NO_PROXY. |
INTERCEPT_PROXIES | Não | Lista 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