crawl-census
crawl-census-client
Pregunta antes de obtener. Un cliente de sustitución que evita que tu rastreador gaste peticiones en puertas que están cerradas, y evita que se desvíe alrededor de contenido que alguien intenta vender.
Leer robots.txt responde una pregunta y oculta otras dos. Medido en 23,482 dominios por Crawl Census:
2,874 dominios permiten agentes de IA en robots.txt y luego rechazan a esos mismos agentes en el borde de la red. Un analizador ve permiso; la obtención devuelve 403. Pagas por el viaje de ida y vuelta y no obtienes nada.
208 dominios responden a un agente de IA con
HTTP 402 Payment Required. Eso es un precio, no un rechazo. Tratarlo como un bloqueo te aleja de contenido que el operador quiere venderte. Reintentar alrededor de ello toma algo por lo que están cobrando.
Sin dependencias. Sin clave requerida.
Servidor MCP
La misma medición se expone como un servidor MCP remoto, para que un agente pueda preguntar antes de obtener en lugar de después de fallar. Listado en el registro oficial de MCP como io.github.taylorsmithgg/crawl-census.
{ "mcpServers": { "crawl-census": { "url": "https://crawlcensus.com/mcp" } } }Herramienta | Respuestas |
| ¿estos dominios servirán a mi agente, lo rechazarán o le cobrarán? |
| ¿qué publica este censo sobre mi rastreador y cómo lo corrijo? |
| los hallazgos principales como registros fechados con denominadores y líneas de cita |
| la auditoría almacenada para un dominio |
| medir un dominio ahora |
| totales a nivel de corpus |
Sin autenticación para herramientas de lectura. HTTP transmisible.
Related MCP server: Maango-mcp
Instalación
npm i github:taylorsmithgg/crawl-census-client
pip install git+https://github.com/taylorsmithgg/crawl-census-clientUso
import { politeFetch } from "crawl-census-client";
const r = await politeFetch("https://example.com/", { agent: "gptbot" });
if (r.skipped) console.log(r.verdict, r.reason); // disallow | refuse | pay
else process(await r.response.text());from crawl_census import polite_fetch
r = polite_fetch("https://example.com/", agent="gptbot")
if r.skipped:
print(r.verdict, r.reason)
else:
process(r.body)La omisión se devuelve, no se lanza. Es el resultado normal para una gran parte de la web, y un bucle de rastreo debería poder contar omisiones sin un try/except alrededor de cada URL.
Dividir una cola antes de rastrearla
Una llamada por cada 1,000 dominios en lugar de una por host:
const { crawl, skip, pay, unknown } = await partition(urls, { agent: "gptbot" });p = partition(urls, agent="gptbot")
p.crawl, p.skip, p.pay, p.unknownO simplemente toma el archivo
Para un buscador que solo necesita una lista de denegación en memoria, omite las llamadas por dominio por completo:
curl https://crawlcensus.com/agents/gptbot/blocklist.txt # one domain per line, commented headerconst sync = await syncBlocklist("gptbot"); // full list once
if (sync.blocked.has(host)) skip();
setInterval(() => sync.refresh(), 3600_000); // then deltas only, a few hundred bytessync = BlocklistSync("gptbot")
if host in sync: skip()
sync.refresh() # {'added': 3, 'removed': 1, 'size': 3310, 'cursor': ...}El feed delta es https://crawlcensus.com/agents/<agent>/changes.json?since=<unix> y cada respuesta lleva next_since, por lo que un rastreador de larga duración se mantiene actualizado con unos pocos cientos de bytes por hora en lugar de volver a descargar la lista.
Ese archivo cubre solo robots.txt. El rechazo en el borde y HTTP 402 son comportamientos por petición y aún necesitan preflight o politeFetch.
Lo que un rastreo cuesta al censo
Medido, no afirmado. Veinte hosts obtenidos concurrentemente solían costar veinte llamadas preflight con un dominio cada una; el mismo host solicitado tres veces a la vez costaba tres, porque la caché solo ayuda después de que la primera búsqueda se resuelve. La asignación anónima es de 240 llamadas por hora, por lo que un rastreador alcanzaba su límite a los 240 hosts cuando una llamada cubre veinticinco.
politeFetch ahora comparte trabajo automáticamente: las búsquedas emitidas en el mismo tick salen como una llamada agrupada, y las búsquedas concurrentes para el mismo host esperan una sola petición.
patrón | antes | ahora |
20 hosts, concurrentes | 20 llamadas | 1 llamada de 20 |
1 host, 3 URLs, concurrentes | 3 llamadas | 1 llamada |
60 hosts, concurrentes | 60 llamadas | 3 llamadas (25 / 25 / 10) |
| 2 llamadas | 1 llamada |
batchSize por defecto es 25, el límite por llamada sin clave. Auméntalo con una clave Pro o Data. batchWaitMs amplía la ventana de coalescencia para concurrencia que llega en oleadas en lugar de toda a la vez; el valor predeterminado de cero se vacía en el siguiente tick.
Pagar, cuando un origen cotiza un precio
Un veredicto pay lleva el importe cuando el origen lo nombra:
const r = await politeFetch(url, { agent: "claudebot" });
if (r.verdict === "pay") console.log(r.price); // "USD 0.5", or null if none was quotedDos cosas que vale la pena saber. La mayoría de los orígenes que responden HTTP 402 no nombran ningún importe, por lo que price suele ser nulo y el acuerdo debe hacerse fuera de banda. Y el precio es por rastreador: en el corpus medido, 78 de 213 orígenes que cobran cobran a algunos agentes y sirven a otros gratis, así que pregunta con tu propio token en lugar de asumir que un dominio en la lista te cobrará.
Dos tipos de desconocido
partition divide una cola de trabajo en crawl, pay, skip, unknown y undecidable.
Los dos últimos se parecen y no lo son. unknown significa que el censo aún no ha medido ese dominio: envíalo y la siguiente pasada obtiene un veredicto real. undecidable significa que el robots.txt del sitio no permite a CrawlCensusBot, por lo que este censo nunca lo medirá — reintentar es desperdicio garantizado, y un bucle que reenvía sus desconocidos cada pasada los reenviaría para siempre. El servidor marca la diferencia con un booleano measurable; lee eso, nunca la prosa de reason.
const p = await partition(urls, { agent: "gptbot" });
await Promise.all(p.crawl.map(politeFetchOne));
if (p.unmeasured.length) await submitUnmeasured(p, { agent: "gptbot" });
// p.undecidable: read their robots.txt yourself. Asking us again cannot help.El envío es una llamada separada a propósito. Una biblioteca que hace POST silenciosamente durante lo que parece una búsqueda es un mal ciudadano, y debes elegir cuándo se gastan las posiciones de tu cola.
Omitir todo lo que no te servirá
Una lista de denegación es la mitad más pequeña. Medido contra el censo en vivo, un rastreador que omite solo los desalojos de robots aún gasta alrededor de 2,900 peticiones por pasada en dominios que lo permiten en robots.txt y lo rechazan en el borde, o que responden HTTP 402 — para PerplexityBot ese conjunto es más grande que su lista de denegación. Esas obtenciones no devuelven nada y cuestan un viaje de ida y vuelta cada una.
const skip = await syncSkipList("gptbot");
if (skip.has(host)) continue; // disallowed, refused at the edge, or priced
skip.why(host); // "disallow" | "pay" | "refuse" | null
setInterval(() => skip.refresh(), 3600_000);agente | lista de denegación | también omitible | total |
GPTBot | 3,542 | 2,944 | 6,486 |
ClaudeBot | 3,169 | 3,194 | 6,363 |
PerplexityBot | 1,128 | 3,658 | 4,786 |
Los tres conjuntos se mantienen separados internamente, por lo que un cambio mueve el que le pertenece. why() sigue la misma precedencia que preflight: un desalojo supera a un precio, porque un precio no es permiso.
Mantener una lista de denegación actualizada
syncBlocklist / BlocklistSync descargan la lista una vez y luego aplican solo lo que cambió.
La lista se sirve con la posición exacta en el feed de cambios en la que se construyó, en un encabezado x-cursor y un comentario # cursor:. Los clientes la leen y reanudan desde allí, por lo que no hay brecha entre la instantánea y la primera consulta, y no se depende de que tu reloj esté sincronizado con el del servidor. Consultar por segundo no puede expresar una posición dentro de un segundo, y un lote de rastreo escribe docenas de eventos en uno, por lo que una reanudación con granularidad de segundo puede perder el resto: medido en vivo, reanudar después del primero de tres cambios en el mismo segundo recuperó ambos hermanos por cursor y ninguno por segundo.
const sync = await syncBlocklist("gptbot"); // cursor comes from the list itself
if (sync.blocked.has(host)) skip();
setInterval(() => sync.refresh(), 3600_000); // a few hundred bytes per pollrefresh() aplica solo transiciones de robots a la lista, porque eso es de lo que está hecha la lista. Los rechazos en el borde, los nuevos precios y los cambios de llms.txt vuelven en other para que actúes por separado — una versión anterior eliminaba esos dominios de la lista de denegación, por lo que un rastreador reanudaba la obtención de exactamente lo que acababa de empezar a rechazarlo.
Veredictos
La definición autoritativa de cada veredicto — qué significa, qué obliga a hacer a un rastreador y si preguntar de nuevo podría cambiarlo — se publica como datos en /api/v1/verdicts. La lista a continuación es un resumen; si los dos alguna vez discrepan, el endpoint tiene razón y este archivo está desactualizado.
politeFetch omite disallow, refuse y pay por defecto, que es el conjunto do_not_fetch derivado del endpoint. La copia aquí es deliberada — un bucle de rastreo no debería necesitar una llamada de red para decidir — y una prueba compara los dos para que no pueda desviarse sin ser notado.
Veredicto | Significado | Comportamiento predeterminado |
| robots.txt permite a este agente, y una petición en vivo con su agente de usuario fue servida | obtener |
| robots.txt prohíbe a este agente en la raíz del sitio | omitir |
| robots.txt lo permite; el borde lo rechazó de todos modos. El permiso no es real | omitir |
| el origen respondió HTTP 402. Servirá a este agente en términos comerciales | omitir |
| no se ha medido recientemente lo suficiente para responder | obtener |
onPay: "fetch" (on_pay="fetch") anula el predeterminado de muro de pago. Es una aceptación explícita y se registra en el resultado como paidRouteOverridden para que aparezca en tus registros.
Degrada, no falla
Si el censo es inalcanzable, cada veredicto se convierte en unknown y tu rastreo procede como lo haría normalmente. Una interrupción de terceros nunca debe detener tu pipeline. Hay una prueba en vivo exactamente para esto.
Lo que publicamos sobre tu agente
const p = await agentProfile("claudebot");
// robots disallow rate, edge refusal rate, operator page, correction channelSi una cifra es incorrecta, el canal de corrección está en esa respuesta y en tu página de operador. Los hechos del registro se corrigen sin discusión; las mediciones disputadas se publican junto con la disputa y los registros de escaneo subyacentes, en lugar de enmendarse silenciosamente.
Límites
25 dominios por llamada preflight de forma anónima, 200 con una clave Pro, 1,000 con una clave Data. Pasa apiKey. Detalles en https://crawlcensus.com/for-crawlers.
Pruebas
node test.mjs se ejecuta contra el censo en vivo a propósito. El valor de este cliente es si sus veredictos coinciden con la realidad, y una prueba simulada solo afirmaría que el simulacro está de acuerdo consigo mismo.
MIT. Los datos son CC BY 4.0, atribuya como "Source: Crawl Census (crawlcensus.com)".
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceURL intelligence for AI agents. One URL in, structured security and data quality signals out across 7 dimensions. 13 tools, risk score 0-100 with 23 configurable weights.161601MIT

Maango-mcpofficial
AlicenseAqualityCmaintenanceMaango is the pre-flight check for AI agents on the web. Before an agent scrapes, summarises, trains on, or searches a site, it calls Maango and gets back whether the action is allowed for that domain, along with the reason and the policy signals that decided it.71MIT- AlicenseAqualityAmaintenanceEnables AI agents to check URL safety before fetching content, using Google Web Risk, URLhaus, PhishTank, and AI analysis to return SAFE/SUSPICIOUS/DANGEROUS verdicts.13651MIT
- AlicenseAqualityAmaintenanceEnables AI agents to check whether a public website is crawlable, understandable, and ready for AI search workflows through local-only audits of robots.txt, sitemaps, metadata, and llms.txt.3511MIT
Related MCP Connectors
Domain & company intel for AI agents: RDAP, DNS, email deliverability, tech stack. No API keys.
Domain intel for AI agents: RDAP registration, DNS, email deliverability, tech stack.
URL intelligence for AI agents and developers. 16 tools, 25 signal weights, 20 free checks.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/taylorsmithgg/crawl-census-client'
If you have feedback or need assistance with the MCP directory API, please join our Discord server