Anyfetch
Búsqueda web y recuperación web sin claves de API. Lee los sitios que rechazan a los agentes de IA.
Documentación
Anyfetch
Búsqueda web y recuperación de páginas para agentes de IA. Un pequeño binario, sin claves API, y lee los sitios que rechazan a tu agente.
Gratuito y de código abierto, de los creadores de AliasMode.
Los entornos de agentes recuperan páginas con una identidad de bot, y gran parte de la web responde 403. Anyfetch envía la solicitud que envía un navegador real, para que tu agente obtenga la página.
| 97 sitios populares que bloquean agentes de IA | Páginas leídas |
|---|---|
| Anyfetch | 75 |
| curl | 47 |
| Servidor de recuperación MCP de referencia | 41 |
WebFetch integrado de Claude Code | 36 |
Anyfetch leyó 21 sitios que ninguna otra herramienta de la tabla pudo leer. Entre ellos: The New York Times, Reuters, Bloomberg, The Washington Post, Medium, Reddit, Stack Overflow y YouTube.
| 30 preguntas de investigación, cada una hecha dos veces | Respondidas correctamente ambas veces |
|---|---|
| Agente con Anyfetch | 30 |
Mismo agente con WebSearch y WebFetch integrados de Claude Code | 25 |
Diez de las preguntas tratan sobre una página en un sitio que bloquea agentes de IA. La recuperación integrada no pudo leer ninguna de esas 10 páginas. Su búsqueda encontró la respuesta en otra fuente para 5 de ellas. Anyfetch leyó las 10. Las preguntas se escribieron a partir de páginas que Anyfetch puede leer, por lo que este grupo muestra lo que las herramientas integradas pasan por alto.
| Una página, comenzando desde cero | Tiempo | Memoria máxima |
|---|---|---|
| Anyfetch | 0,19 s | 17 MB |
| Chromium sin interfaz | 1,15 s | 544 MB |
Medido el 2026-10-11 desde un servidor en la nube, sin proxy. Consulta cómo lo medimos y cómo ejecutarlo de nuevo.
Lo que obtiene tu agente
- Búsqueda sin clave. Resultados de Brave, Yahoo y DuckDuckGo, con filtros de dominio y fecha, frases entre comillas y paginación. Fuentes especializadas para GitHub, Stack Overflow, Hacker News, arXiv y artículos de investigación. O tu propio SearXNG.
- Buscar y leer en una sola llamada. Solicita los mejores resultados junto con la lista de resultados y obtén las partes de cada página que coinciden con tu consulta.
- Respuestas, no páginas completas. Proporciona una pregunta con la URL y obtén solo las partes de la página que coinciden. Las notas de la versión 3.15 de Python tienen 218.000 caracteres; la respuesta a una pregunta sobre ellas llegó en 2.200.
- Markdown limpio. Los enlaces, tablas y bloques de código permanecen intactos. Las páginas largas llegan en partes.
- PDFs. Los artículos e informes vuelven como texto, página por página.
- Sitios que necesitan JavaScript. Anyfetch lee los datos dentro de la página y usa la API pública o el feed del sitio para Stack Overflow, Reddit, publicaciones de X, PyPI y crates.io. No se ejecuta ningún navegador. Para páginas que no contienen nada sin sus scripts, puede usar Lightpanda, un motor pequeño opcional.
- Noticias y respuestas. Artículos completos en Reuters y Bloomberg, y las respuestas en Quora, a partir de los datos que estos sitios envían con la página.
- Solicitudes de nivel de navegador. TLS de Safari, HTTP/2 y huella de cabecera. Una recuperación rechazada se reintenta automáticamente, como el mismo navegador o como un segundo.
- Comprobaciones de Cloudflare. Cuando un sitio insiste en una comprobación de JavaScript, tu propio Firefox la supera una vez. Después, Anyfetch lee el sitio con solicitudes simples.
- Rápido en repeticiones. Varias páginas en una llamada, recuperadas al mismo tiempo. Una página recuperada en los últimos 15 minutos proviene de una copia local.
- Ligero. Un binario Rust de 16 MB. Sin navegador incluido, sin motor de JavaScript, sin Python, sin Node.
- Funciona en todas partes. Un servidor MCP stdio para entornos de agentes y una CLI simple para todo lo demás.
Instalación
macOS y Linux:
curl -fsSL https://aliasmode.github.io/anyfetch/install.sh | sh
Windows, en PowerShell:
irm https://aliasmode.github.io/anyfetch/install.ps1 | iex
El instalador coloca anyfetch en ~/.local/bin. Luego conecta Anyfetch a cada entorno de agente que encuentra en la máquina: Claude Code, Codex, Gemini CLI, Hermes Agent, Pi, Cline, Amp, OpenClaw y Cursor. Inicia una nueva sesión de agente y el agente tiene web_search, web_fetch y web_fetch_many.
¿Instalaste un entorno después? Ejecuta anyfetch setup. Usa el comando propio de cada entorno, te dice a qué se conectó y es seguro ejecutarlo de nuevo.
¿Solo Claude Code, en macOS o Linux? Puedes instalar Anyfetch como plugin en su lugar. El plugin obtiene el programa en su primer inicio:
claude plugin marketplace add aliasmode/anyfetch && claude plugin install anyfetch@anyfetch
Dentro de Claude Code 2.1.275 o posterior, esto es un solo paso: /plugin install anyfetch --marketplace aliasmode/anyfetch. Usa el plugin o el instalador, no ambos, o el agente verá cada herramienta dos veces.
Conecta tu agente manualmente
anyfetch setup hace esto por ti. Para hacerlo manualmente, cada entorno necesita un comando.
Claude Code
claude mcp add --scope user anyfetch -- anyfetch mcp
Codex
codex mcp add anyfetch -- anyfetch mcp
o en ~/.codex/config.toml:
[mcp_servers.anyfetch]
command = "anyfetch"
args = ["mcp"]
Hermes Agent
hermes mcp add anyfetch --command anyfetch --args mcp
Hermes se conecta, lista las herramientas y pide habilitarlas. Responde Y.
Pi
pi mcp add anyfetch -- anyfetch mcp
Pi oculta las herramientas MCP detrás de su modo de código por defecto. Para mostrar las herramientas al modelo directamente, establece la exposición en ~/.pi/agent/mcp.json:
{
"mcpServers": {
"anyfetch": { "command": "anyfetch", "args": ["mcp"], "exposure": "direct" }
}
}
Gemini CLI
gemini mcp add -s user anyfetch anyfetch mcp
OpenCode — en ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"anyfetch": { "type": "local", "command": ["anyfetch", "mcp"], "enabled": true }
}
}
Cursor — en ~/.cursor/mcp.json:
{
"mcpServers": {
"anyfetch": { "command": "anyfetch", "args": ["mcp"] }
}
}
Más entornos
| Entorno | Comando |
|---|---|
| Cline | cline mcp add anyfetch --yes -- anyfetch mcp |
| Amp | amp mcp add anyfetch -- anyfetch mcp |
| OpenClaw | openclaw mcp add anyfetch --command anyfetch --arg mcp |
| Goose | goose session --with-extension "anyfetch mcp" |
| VS Code (Copilot) | code --add-mcp "{\"name\":\"anyfetch\",\"command\":\"anyfetch\",\"args\":[\"mcp\"]}" |
Cualquier otro cliente MCP: añade un servidor stdio con el comando anyfetch y el argumento mcp.
Anyfetch está en el Registro MCP oficial como io.github.aliasmode/anyfetch.
¿Sin MCP? Dale la CLI al agente. Añade esto a AGENTS.md o al archivo de instrucciones del entorno:
## Web access
- Search the web: `anyfetch search "<query>"`
- Read pages: `anyfetch fetch <url> [<url>...] --format markdown`
Hazlo el predeterminado. Para que el agente use Anyfetch y no sus herramientas integradas, desactiva las integradas:
- Claude Code, en
~/.claude/settings.json:"permissions": { "deny": ["WebFetch", "WebSearch"] } - Codex, en
~/.codex/config.toml:web_search = "disabled"
Úsalo desde la línea de comandos
anyfetch search "rust async runtime comparison"
anyfetch search "tokio select" --site docs.rs --time year
anyfetch search "postgres vacuum freeze" --read 3
anyfetch search "retrieval augmented generation" --provider papers
anyfetch fetch https://stackoverflow.com/questions/231767 --format markdown
anyfetch fetch https://arxiv.org/pdf/1706.03762 --max-chars 8000 --offset 8000
anyfetch fetch https://docs.python.org/3.15/whatsnew/3.15.html --query "sampling profiler rate"
anyfetch fetch https://www.rust-lang.org/ https://go.dev/ https://ziglang.org/
La salida es JSON por defecto, para que los scripts y agentes puedan analizarla. --format markdown imprime solo el contenido de la página.
Herramientas
web_fetch
| Entrada | Significado |
|---|---|
url | La página a leer. |
query | Opcional. Una pregunta o palabras clave. El resultado tiene solo las partes de la página que coinciden. |
max_chars | Opcional. La cantidad máxima de caracteres de contenido a devolver. El valor predeterminado es 50.000, o 5.000 con un query. |
offset | Opcional. El primer carácter de contenido a devolver. No se usa con un query. |
fresh | Opcional. Recuperar de nuevo incluso si existe una copia de los últimos 15 minutos. |
El resultado tiene title, description, content (Markdown), total_chars, url (después de redirecciones), status y retrieved_at. Para leer una página larga en partes, llama de nuevo con un offset más alto hasta que alcance total_chars. Las partes provienen de la copia local, por lo que el sitio recibe una sola solicitud.
Con un query, la página se divide en sus párrafos, tablas y bloques de código. Las partes que mejor coinciden con las palabras de la consulta vuelven en orden de página, bajo sus encabezados, con [...] donde se omiten partes. El resultado entonces tiene focused: true. Una página sin partes coincidentes vuelve desde su inicio. Una segunda pregunta sobre la misma página usa la copia local.
HTML se convierte en Markdown. Un PDF se convierte en texto con marcas [Page N]. JSON, texto plano y feeds XML vuelven tal como están.
web_fetch_many
| Entrada | Significado |
|---|---|
urls | Las páginas a leer. Se recuperan al mismo tiempo. |
query | Opcional. Como para web_fetch. Cada página da hasta 5.000 caracteres. |
max_chars | Opcional. La cantidad máxima de caracteres de contenido por página. Por defecto las páginas comparten 50.000. |
fresh | Opcional. Como para web_fetch. |
El resultado tiene pages: una entrada por URL, en orden. Cada entrada es la página, o su error.
web_search
| Entrada | Significado |
|---|---|
query | La consulta de búsqueda. Las frases entre comillas funcionan. |
provider | Opcional. Consulta la lista a continuación. El valor predeterminado es auto. |
site | Opcional. Mantener resultados de un dominio, por ejemplo docs.rs. |
time | Opcional. day, week, month o year. |
page | Opcional. La página de resultados, desde 1. |
read | Opcional. También devolver, de esta cantidad de mejores resultados, las partes de cada página que coinciden con la consulta. |
searxng_url | La URL base de tu instancia SearXNG, para el proveedor searxng. Debe tener la salida JSON activada. |
Cada resultado tiene title, url y snippet, y content cuando estableces read.
| Proveedor | Fuente |
|---|---|
auto | Brave, luego Yahoo, luego DuckDuckGo: cada uno cuando el anterior no da resultados. |
brave | Brave Search. Alrededor de 20 resultados por página. |
yahoo | Yahoo Search. 7 resultados por página. Sin filtro year. |
duckduckgo | DuckDuckGo. Solo primera página. |
searxng | Tu propia instancia SearXNG. |
github | Repositorios de GitHub, con estrellas y lenguaje. |
stackoverflow | Preguntas de Stack Overflow, con puntuación y número de respuestas. |
hackernews | Historias de Hacker News, con puntos y el enlace de discusión. |
arxiv | Artículos de arXiv, con resúmenes. |
papers | Artículos de investigación de OpenAlex, con recuentos de citas y enlaces de acceso abierto. |
site, time y las frases entre comillas se aplican a los motores web. Las fuentes especializadas son API públicas gratuitas con sus propios límites de solicitudes.
Errores
Una llamada fallida devuelve un objeto error con un code sobre el que el agente puede actuar:
| Código | Significado |
|---|---|
challenge_required | El sitio respondió con un desafío de bot que necesita un navegador. |
http_error | El sitio rechazó la solicitud. status tiene el código HTTP. |
rate_limited | El sitio pidió reducir la velocidad. retry_after tiene la espera, cuando se da. |
timeout | El sitio no respondió dentro de 30 segundos. |
unsupported_content | La URL no es texto o un PDF (una imagen, por ejemplo). |
extraction_failed | La página no tiene contenido legible. Un PDF escaneado no tiene texto. |
Comprobaciones de Cloudflare
Algunos sitios responden a cada primera solicitud con una comprobación de JavaScript. Anyfetch lo maneja en dos pasos:
- Tu propio Firefox supera la comprobación una vez. Se ejecuta oculto, con un perfil desechable, durante unos segundos.
- Anyfetch guarda la autorización para ese sitio y vuelve a las solicitudes simples. En Medium, una pasada es válida por un año.
En nuestra prueba, la primera página de un sitio así tardó unos 5 segundos y la siguiente menos de 2 segundos.
Esto necesita Firefox, o un navegador basado en Firefox, en la máquina. Sin uno, nada cambia: la recuperación devuelve challenge_required.
| Configuración | Efecto |
|---|---|
ANYFETCH_BROWSER=off | Nunca iniciar un navegador. |
ANYFETCH_BROWSER=/path/to/browser | Usar este navegador basado en Firefox. |
Para un servidor MCP, establece la variable en la entrada del servidor. En Claude Code:
claude mcp add --scope user anyfetch -e ANYFETCH_BROWSER=off -- anyfetch mcp
Notas:
- Probado en Linux. En Windows, y para un Firefox empaquetado con snap (el predeterminado de Ubuntu), el navegador se usa solo cuando
ANYFETCH_BROWSERlo nombra. - Una autorización pertenece a la dirección que la obtuvo, por lo que el navegador no se usa junto con un proxy.
- Las autorizaciones guardadas están en
~/.config/anyfetch/clearance/. Elimina un archivo para olvidar un sitio.
Páginas que necesitan sus scripts
La mayoría de las páginas dan a Anyfetch su texto sin JavaScript: está en el HTML, en los datos de la página o detrás de una API pública. Algunas no contienen nada hasta que sus scripts se ejecutan. MSN, Spotify y Airbnb son ejemplos. Para esas, Anyfetch puede usar Lightpanda, un pequeño motor sin interfaz sin un navegador completo.
Lightpanda es opcional y separado. Instálalo desde su README, pon lightpanda en tu PATH, y Anyfetch lo usa para las páginas que lo necesitan. En nuestra prueba, MSN pasó de no tener contenido a 154,000 caracteres en 12 segundos, y Spotify de no tener contenido a 23,000 caracteres en 3 segundos. Las páginas que ya funcionan no se renderizan, por lo que siguen siendo rápidas.
| Configuración | Efecto |
|---|---|
ANYFETCH_RENDERER=off | Nunca iniciar el renderizador. |
ANYFETCH_RENDERER=/path/to/lightpanda | Usar este programa. |
Notas:
- Lightpanda hace sus propias solicitudes. No se usa junto con un proxy, y un sitio con verificación de bots puede rechazarlo.
- Una página de aplicación renderizada, como un feed o un listado, vuelve como la página completa en Markdown.
Usar un proxy
Algunos sitios rechazan direcciones de servidores en la nube sin importar cómo se vea la solicitud. Si tu agente se ejecuta en un servidor, envía Anyfetch a través de un proxy residencial. Pon una línea en ~/.config/anyfetch/proxy:
host:port:username:password
Anyfetch entonces envía cada búsqueda y recuperación a través de ese proxy HTTP. El archivo contiene la contraseña en texto plano, así que mantenlo privado: chmod 600 ~/.config/anyfetch/proxy. Elimina el archivo para volver a la conexión directa.
¿Necesitas un proxy? NobleProxy es nuestro propio servicio: IPs residenciales estáticas que solo usas tú, con ancho de banda ilimitado y soporte HTTP.
Lo que no hace
Anyfetch en sí mismo no ejecuta JavaScript, no resuelve CAPTCHAs ni inicia sesión. Una página que muestra su contenido solo después de que sus scripts se ejecutan, sin datos dentro del HTML y sin API pública, devuelve su título y descripción a menos que Lightpanda esté instalado. Lee lo que un sitio envía a un visitante por primera vez. Una página que necesita un CAPTCHA, una cuenta o una suscripción para cargarse permanece cerrada, y Anyfetch lo indica con un código de error.
¿Tu agente necesita un navegador real, con inicios de sesión y sesiones guardadas? Usa AliasMode. Es nuestro navegador antidetect gratuito y de código abierto, y tiene su propio servidor MCP para agentes.
Benchmark
Los números al principio provienen de dos scripts y un conjunto de preguntas en bench/.
-
Páginas leídas.
bench/bench.pylee cada uno de los 97 sitios enbench/sites.txtuna vez con cada herramienta. Una página cuenta como leída cuando la herramienta devuelve al menos 500 caracteres de texto y el texto no es una verificación de bots. La misma regla se aplica a cada herramienta. Anyfetch se ejecutó tres veces y leyó 73, 76 y 75 páginas; la tabla muestra la ejecución intermedia. ElWebFetchde Claude Code no se puede scriptear, así que un agente lo llamó una vez por sitio y registró si volvía contenido real. -
Tiempo y memoria.
bench/speed.pylee 10 páginas con cada programa, iniciado desde cero para cada página, e informa la mediana. -
Preguntas de investigación.
bench/tasks.jsontiene 30 preguntas. Cada una tiene una respuesta exacta y la frase en la página fuente que lo demuestra. Las páginas son de julio a octubre de 2026, por lo que un modelo no puede responder de memoria. Un agente Claude Sonnet respondió las preguntas solo con Anyfetch, y nuevamente solo con elWebSearchyWebFetchintegrados de Claude Code. Las instrucciones fueron las mismas: como máximo 8 llamadas web para cada pregunta, y la respuestaUNKNOWNcuando las herramientas no la dan. Anyfetch se ejecutó sin proxy, sin Firefox y sin Lightpanda. Cada herramienta se ejecutó dos veces, y una pregunta cuenta cuando ambas ejecuciones son correctas.
| Grupo de preguntas | Anyfetch | Herramientas integradas |
|---|---|---|
| Una página en un sitio que bloquea agentes de IA | 10 de 10 | 5 de 10 |
| Una página en un sitio abierto | 10 de 10 | 10 de 10 |
| Sin URL: buscar primero, luego leer | 10 de 10 | 10 de 10 |
En cada ejecución individual, las herramientas integradas respondieron 26 preguntas, pero no las mismas 26. Tres cosas a saber sobre esta prueba. El escritor de preguntas usó Anyfetch para verificar cada respuesta, por lo que el primer grupo solo tiene páginas que Anyfetch puede leer. Cuatro sitios más en la lista del escritor (Reuters, Bloomberg, Financial Times y Quora) no tienen pregunta, porque no pudo leer una página de artículo allí. La prueba de sitios anterior lee la página de inicio de Reuters y Bloomberg, que Anyfetch puede leer. Desde la versión 0.7.0, Anyfetch también lee páginas de artículos en Reuters y Bloomberg y las respuestas en Quora. Financial Times requiere una suscripción. Un agente de prueba de Anyfetch se detuvo después de su primera pregunta, por lo que sus 5 preguntas se ejecutaron nuevamente. Cada respuesta está en bench/results/tasks.tsv.
Los resultados por sitio están en bench/results/. Los sitios cambian sus reglas a menudo, y los resultados difieren entre redes, así que ejecútalo tú mismo:
python3 bench/bench.py anyfetch curl
pip install mcp-server-fetch && python3 bench/bench.py reference
python3 bench/speed.py /path/to/chromium
Compilar desde el código fuente
Necesitas Rust 1.98, cmake y clang (la biblioteca TLS es BoringSSL). En Windows también necesitas NASM.
cargo install --git https://github.com/aliasmode/anyfetch
Licencia
Apache-2.0