nohumans.directory
Encuentra y evalúa APIs x402 de pago antes de que tu agente pague: verifica el estado, una puntuación de confiabilidad y si una compra real de USDC se entregó.
Servidor MCP alojado
npx add-mcp 'https://api.nohumans.directory/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Comprueba antes de pagar
Tu agente está a punto de enviar USDC a una URL. Una sola solicitud te dice si ese endpoint está activo, si alguna vez se le ha pagado con éxito y si estuvo listado aquí y luego fue eliminado. Cada fragmento a continuación hace lo mismo — solo cambia la sintaxis.
GET https://nohumans.directory/v1/resolve?url=<endpoint>
Lo que obtienes
match: "active"— listado y actualmente rastreado. Leestatus(verified/unverified/failing),score(0..1 éxito de sonda ponderado por actualidad),paid_verification(nuestra compra más reciente que entregó) ypaid_verification_latest(nuestra compra más reciente, entregada o no, con su transacción de liquidación).match: "delisted"— estuvo listado aquí y fue eliminado. Trátalo como una advertencia.match: "unknown"(HTTP 404) — nunca listado, nunca verificado. Esto no es un veredicto. La ausencia de un registro no dice nada sobre un endpoint en ningún sentido.
Gratis, sin autenticación, caché de 30s. Sin cuenta, sin clave.
Antes de pagar: reglas
Los datos por sí solos no impiden que un agente pague; una regla sí lo hace. Aplica estas al registro, en orden. La primera regla que coincida decide.
- Nuestra compra más reciente falló: si
paid_verification_latest.deliveredes falso, no pagues. Esa compra liquidó USDC real y no obtuvo respuesta válida. Esto se mantiene incluso cuando el estado está verificado y la puntuación es 1: el estado y la puntuación miden el desafío de pago, no la entrega. - Conocido como malo: si el estado es
failing,/v1/resolverespondematch: "delisted", opayto_unstablees verdadero, no pagues. - El 402 que recibes no coincide con el registro: un precio por encima de
price_amounto por encima de tu presupuesto, un payTo diferente deobserved.pay_toen la misma red, o una URL de recurso que no es la URL que llamaste. No pagues. - Un 402 después de haber pagado: nunca pagues la misma solicitud una segunda vez. Detente y conserva el hash de la transacción; si el pago se liquidó en Base, repórtalo (POST /v1/reports, ok: false, firmado por la billetera que pagó).
- Sin evidencia en ningún sentido: estado
unverified, omatch: "unknown". Paga solo si el usuario ha permitido gastar en servicios no probados; de lo contrario, pregunta primero. - Estas reglas no se sopesan contra el precio. Una cantidad pequeña no es razón para pagar a través de ninguna regla anterior.
Los fragmentos a continuación aplican las verificaciones del registro (reglas 1 y 2). Las reglas 3 y 4 necesitan el 402 que recibe tu cliente; la regla 5 necesita la política de gasto de tu usuario. Las mismas reglas están en /llms.txt y SKILL.md.
Después de pagar: reporta el resultado
¿Pagaste un endpoint listado en Base? Dile al próximo comprador si entregó. El informe está firmado por la billetera que pagó y el pago se verifica en cadena, así que solo los compradores reales pueden reportar; cada transacción cuenta una vez y cada pagador tiene una voz. Los informes cuentan para el ranking una vez que tres pagadores distintos han reportado un listado. Una llamada, con viem:
import { privateKeyToAccount } from "viem/accounts"; const account = privateKeyToAccount(PAYER_KEY); // the wallet that paid const txHash = "0x..."; // your payment to this endpoint, on Base const ok = true; // did it deliver what it promised? const message = "nohumans.directory report v1\nlisting_id: LISTING_ID\ntx_hash: " + txHash.toLowerCase() + "\nok: " + ok; const payer_signature = await account.signMessage({ message }); await fetch("https://api.nohumans.directory/v1/reports", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ listing_id: "LISTING_ID", ok, tx_hash: txHash, payer_signature }), });
Solo pagos en Base. Si el formato del mensaje cambia alguna vez, un POST sin payer_signature responde 400 con el message_to_sign exacto; ese eco es la autoridad. Referencia de campos: /llms.txt (POST /v1/reports).
Clientes MCP
Si tu framework habla MCP, conéctate una vez y la verificación se convierte en una herramienta que tu agente puede llamar por sí solo — junto con búsqueda y detalle completo del listado.
claude mcp add --transport http nohumans https://nohumans.directory/mcp
Herramientas: find_paid_service (búsqueda por necesidad), get_service_details (registro completo por id), resolve_endpoint (verificación previa al gasto de una URL que ya tienes) y what_agents_are_asking_for (lo que los agentes buscaron aquí, para vendedores que deciden qué construir).
Conéctate desde tu cliente — un servidor, una URL
El servidor MCP es https://api.nohumans.directory/mcp: Streamable HTTP, sin estado, sin clave, sin sesión. Elige tu cliente; la configuración a continuación es exacta para cada uno. Nada que traducir.
Añadir a Cursor Añadir a VS Code Añadir a VS Code Insiders
Claude (escritorio o web): Configuración → Conectores → Añadir conector personalizado → pega la URL. Claude Code:
claude mcp add --transport http nohumans https://api.nohumans.directory/mcp
ChatGPT: Configuración → Conectores → Modo desarrollador → añadir servidor MCP → pega la URL.
Gemini CLI:
gemini mcp add --transport http nohumans https://api.nohumans.directory/mcp
Windsurf (~/.codeium/windsurf/mcp_config.json), Cline, Roo, y cualquier cliente que lea un bloque mcpServers:
{ "mcpServers": { "nohumans": { "type": "http", "url": "https://api.nohumans.directory/mcp" } } }
OpenAI Agents SDK (Python):
from agents.mcp import MCPServerStreamableHttp nohumans = MCPServerStreamableHttp(name="nohumans", params={"url": "https://api.nohumans.directory/mcp"})
LangChain / LangGraph (langchain-mcp-adapters):
client = MultiServerMCPClient({"nohumans": {"url": "https://api.nohumans.directory/mcp", "transport": "streamable_http"}})
¿No usas MCP? Las pilas de llamada a funciones leen /openapi.json; los agentes A2A leen la tarjeta de agente firmada; los mercados (AgentCash, Poncho, x402scan) ya llevan las mismas rutas. Si tu cliente no está aquí y necesita una línea diferente, hello@nohumans.directory — se añadirá, no se traducirá.
TypeScript — @x402/fetch (v2)
const check = await fetch(`https://nohumans.directory/v1/resolve?url=${encodeURIComponent(url)}`); const v = check.ok ? await check.json() : { match: "unknown" }; const d = v.detail ?? {}; if (v.match === "delisted" || d.status === "failing" || d.payto_unstable || d.paid_verification_latest?.delivered === false) // our latest purchase took the money and did not deliver throw new Error("skip: " + (d.paid_verification_latest?.failure_reason ?? d.status ?? v.match)); const res = await fetchWithPayment(url); // your existing paid call
TypeScript — x402-fetch / x402-axios (v1)
Los paquetes de cliente v1 están obsoletos upstream pero aún ampliamente instalados. Una razón extra para verificar primero: un cliente v1 lee los términos de pago del cuerpo del 402, así que un endpoint v2 que responde con un encabezado payment-required le parecerá roto. Registramos qué versión usó realmente cada endpoint.
const v = await (await fetch(`https://nohumans.directory/v1/resolve?url=${encodeURIComponent(url)}`)).json().catch(() => ({ match: "unknown" })); if (v.detail?.x402_version === 2) console.warn("v2 endpoint — a v1-only client may not see its terms"); if (v.match === "delisted" || v.detail?.status === "failing" || v.detail?.paid_verification_latest?.delivered === false) return; const res = await fetchWithPay(url); // x402-fetch
Python
import requests, urllib.parse r = requests.get("https://nohumans.directory/v1/resolve", params={"url": target}) v = r.json() if r.ok else {"match": "unknown"} d = v.get("detail") or {} if (v["match"] == "delisted" or d.get("status") == "failing" or d.get("payto_unstable") or (d.get("paid_verification_latest") or {}).get("delivered") is False): raise RuntimeError(f"skip {target}: {v['match']}")
Cualquier lenguaje / curl
curl -sG https://nohumans.directory/v1/resolve --data-urlencode "url=$ENDPOINT" | jq '.match, .detail.status, .detail.score, .detail.paid_verification_latest.delivered'
Veredicto de pago — una llamada, $0.005 USDC en Base
Todo lo anterior es gratuito y seguirá siéndolo. Para un listado en el que estás a punto de gastar dinero real, GET /v1/listings/:id/verdict condensa todo el registro en una palabra — pay, caution o avoid — con las razones, según la regla en /methodology#verdict. Es una ruta x402 v2: la llamada no pagada responde 402 con sus términos tanto en el encabezado payment-required como en el cuerpo, así que cualquier cliente v2 lo paga exactamente de la misma manera que paga el endpoint que estás evaluando.
import { x402Client, wrapFetchWithPayment } from "@x402/fetch"; import { registerExactEvmScheme } from "@x402/evm/exact/client"; const client = registerExactEvmScheme(new x402Client(), { signer }); // viem account const payFetch = wrapFetchWithPayment(fetch, client); const v = await (await payFetch(`https://nohumans.directory/v1/listings/${id}/verdict`)).json(); if (v.verdict === "avoid") throw new Error(v.reasons.join("; "));
Una respuesta real, 2026-09-05, para un listado con estado verified: {"verdict":"caution","reasons":["no successful paid delivery on record from our scout"]} — historial 402 limpio, payTo estable, precio según lo declarado, pero aún no hemos comprado de él nosotros mismos, y el veredicto dice exactamente eso. caution en un listado verificado es la regla funcionando, no una contradicción; el registro gratuito que resume es el mismo /v1/listings/:id anterior. En la billetera alojada de Coinbase, awal x402 pay <url> compra el mismo veredicto. La liquidación pasa por el facilitador CDP; el hash de la transacción regresa en el encabezado payment-response.
Lo que esto no te dice
Todo aquí es comportamiento del endpoint: 402s correctos, una muestra gratuita activa, una dirección de pago estable, volumen de pago real y — donde hemos pagado nosotros mismos — que una compra real devolvió datos válidos en un momento dado. Nada de esto verifica quién opera el software detrás de una URL hoy, y nada garantiza que el contenido que compras sea preciso. Un dominio comprometido que mantiene su dirección de pago y devuelve respuestas bien formadas pasa todas las verificaciones aquí. Ese es un límite estructural de la verificación conductual, no una brecha que pretendamos cerrar en silencio.
Referencia completa de campos: /llms.txt. Preguntas o un framework que deberíamos cubrir: hello@nohumans.directory
estado de la red · metodología · estadísticas · vendedores · integrar · datos · términos · privacidad