PayCheck

MCP/API gratuito que evalúa un dominio de comerciante, URL https o billetera 0x antes de que un agente pague (confiable/desconocido/sospechoso/bloqueado). No envía pagos.

Servidor MCP alojado

npx add-mcp 'https://paycheck.toolweather.workers.dev/mcp'

Se instala en Claude Code, Codex, Cursor y más

Documentación

PayCheck

PayCheck evalúa si un dominio, una URL https o una billetera 0x es segura para pagar antes de que un agente autónomo envíe dinero.

Forma parte de la suite Toolweather, en la misma familia que Toolweather MCP health, Upstream y SpendGate. SpendGate es para límites de gasto. PayCheck es solo la verificación de confianza del beneficiario. No envía pagos, no firma transacciones y no guarda claves de billetera. Un paquete de Toolweather puede exponer esta API más adelante con x-tw-bundle-secret y x-tw-bundle-client.

La puntuación es determinista. amount_usd, category y cualquier texto de propósito se descartan. Reformularlos no puede buscar un veredicto más favorable.

Cuándo usarlo

Llama a PayCheck una vez por beneficiario, inmediatamente antes de un pago, factura o transferencia.

  • Usa check_merchant para un dominio (api.openai.com), una URL https o una dirección 0x con 40 caracteres hexadecimales.
  • Usa get_quota para ver cuántas verificaciones gratuitas quedan hoy.
  • Usa get_api_key una vez para generar una clave pc_live_… gratuita. No lo llames en cada turno.

No uses PayCheck para enviar dinero, guardar claves ni para anular un block preguntando de nuevo con una categoría más amigable.

Puntuación (política v1)

Reglas completas, lista de permitidos y tabla de penalizaciones: GET /v1/policy (o http://127.0.0.1:8791/v1/policy localmente).

Comienza en 100 y resta penalizaciones. policy_version es "1".

SeñalResultado
Host en lista de permitidos, https, puerto 443trusted, puntuación de al menos 92
Dominio maduro que no está en la lista de permitidosunknown (nunca trusted)
La consulta de edad RDAP fallópenalización pequeña, la edad no se inventa
Edad del dominio menor a 30 díassuspicious
Edad del dominio menor a 7 díassuspicious
Edad del dominio menor a 2 díasblock
No-https, IP cruda, localhost, dirección privada, userinfo en URLblock
Lista de bloqueo, patrón de nombre fraudulento, TLD malo, typosquat de una marca permitidablock
Muchos guiones, punycode o suplantación de marcasuspicious
Billetera 0x, hex inválido o dirección quemada / ceroblock
Cualquier otra billetera 0xunknown. Sin análisis de cadena en v1

trusted es solo para la lista de permitidos publicada (alrededor de 40 hosts API conocidos de IA y desarrolladores, incluyendo openai.com, anthropic.com, stripe.com, github.com, cloudflare.com, vercel.com y supabase.com). Un dominio nuevo o aleatorio nunca se confía.

Acciones recomendadas: proceed, verify_out_of_band, require_human_review, do_not_pay.

La edad del dominio usa RDAP público (https://rdap.org). Las consultas exitosas se almacenan en caché en D1 durante 7 días. Los fallos se almacenan en caché durante 24 horas.

Nivel gratuito

LlamadorVerificaciones por día UTCPrecio
IP anónima100Gratis
Clave pc_live_… gratuita (POST /v1/keys o get_api_key)1,000Gratis
Cliente de paquete, x-tw-bundle-client es hex (16+ caracteres)1,000Gratis
Cliente de paquete, anon o anon:… (y cualquier otro id no-hex)100Gratis
Por encima del límite diariopor verificación$0.001 USDC

El mismo llamador y el mismo objetivo son idempotentes durante 60 segundos y no consumen una segunda verificación gratuita.

No facturado: get_quota, get_api_key, GET /v1/policy, GET /health, documentación y descubrimiento MCP.

La generación de claves está limitada a 10 claves por IP por día UTC. PayCheck almacena solo un hash SHA-256 de la clave.

Exceso x402

Las verificaciones por encima del límite cuestan $0.001 USDC (1000 unidades atómicas) en Base (eip155:8453), esquema exact, activo 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, facilitador https://facilitator.payai.network.

PAY_TO es la dirección receptora. Es un secreto de Worker. Si no está configurado, las llamadas por encima del límite devuelven HTTP 402 con error: "payment_not_configured" y no se cobra nada.

Autenticación de paquete: el encabezado x-tw-bundle-secret debe ser igual al secreto de Worker BUNDLE_PROXY_SECRET, y x-tw-bundle-client identifica al llamador final.

API

MétodoRuta
POST/v1/check{ "target", "amount_usd"?, "category"?, "api_key"? }
POST/v1/keysGenerar pc_live_…
GET/v1/quotaVerificaciones gratuitas restantes
GET/v1/policyPolítica de puntuación v1
GET/healthEstado
GET/openapi.jsonOpenAPI
GET/llms.txt, /llms-full.txtDocumentación para agentes
POST/mcpMCP streamable HTTP
GET/.well-known/mcp y /.well-known/mcp.jsonDescubrimiento MCP
GET/.well-known/x402Descubrimiento de pagos

Versiones del protocolo MCP: 2025-06-18 y 2025-03-26. Respuestas JSON sin estado (sin sesión). GET /mcp devuelve 405.

Herramientas:

  1. check_merchant — puede escribir historial de verificaciones. readOnlyHint: false, idempotentHint: true, openWorldHint: true, destructiveHint: false.
  2. get_quota — gratuita. readOnlyHint: true, idempotentHint: true.
  3. get_api_key — gratuita, genera una clave. No es de solo lectura. No la llames en cada turno.
curl -s -X POST http://127.0.0.1:8791/v1/check \
  -H 'content-type: application/json' \
  -d '{"target":"https://api.openai.com"}'
{
  "mcpServers": {
    "paycheck": {
      "type": "http",
      "url": "https://paycheck.toolweather.workers.dev/mcp"
    }
  }
}

Entrada stdio de Glama, después de npm run build:

node dist/stdio.js

El proceso stdio habla JSON-RPC delimitado por líneas nuevas (un objeto JSON por línea) y también acepta tramas Content-Length en la entrada. Su cuota y claves están en memoria. La persistencia de producción es el Worker.

Local

npm install
npx wrangler d1 migrations apply paycheck --local
npm run dev
npm test
npm run typecheck

npm run dev sirve la API y la página de inicio en el puerto 8791.

.dev.vars opcional (ignorado por git; ver .dev.vars.example):

# PAY_TO=0xYourReceivingAddress
# BUNDLE_PROXY_SECRET=replace-with-a-long-random-string

Despliegue

La producción vive en paycheck.toolweather.workers.dev. wrangler.toml ya tiene el D1 de producción database_id. PAY_TO y BUNDLE_PROXY_SECRET son secretos de Worker. No los pongas en [vars] ni en git.

npx wrangler d1 migrations apply paycheck --remote
npx wrangler secret put PAY_TO
npx wrangler secret put BUNDLE_PROXY_SECRET
npx wrangler deploy

Verifica el paquete sin desplegar:

npm run dry-run

Estructura

  • src/score.ts — puntuador puro, cubierto por pruebas unitarias
  • src/http.ts — rutas Hono
  • src/mcp.ts — JSON-RPC HTTP transmisible
  • src/stdio.ts — entrada stdio de Glama (dist/stdio.js)
  • migrations/ — esquema D1
  • public/ — página de inicio
  • lhm.plugin.json, glama.json — metadatos de listado de directorio

Licencia

MIT. Ver LICENSE.