UsageWall
Precios en vivo de LLM como servidor MCP: seis herramientas de solo lectura para listar, comparar, estimar costos y encontrar el modelo más barato en OpenAI, Anthropic, Google, DeepSeek, Mistral, xAI y Meta.
Documentación
UsageWall
Precios de LLM en vivo como servidor MCP. Pregúntale a Claude (o a cualquier cliente MCP) "¿cuánto cuesta este prompt?" y obtén números reales de una tabla de precios verificada manualmente para cada LLM importante. Gratis, solo lectura, sin autenticación.
TL;DR
- Endpoint MCP:
https://usagewall.vercel.app/api/mcp - Documentación de instalación: usagewall.vercel.app/mcp
- API JSON de precios: usagewall.vercel.app/api/pricing
- Estado en vivo: usagewall.vercel.app/status
- Lo que viene (lista de espera): un proxy alojado con límite máximo para que un bucle descontrolado no agote tu presupuesto de IA durante la noche.
Prueba rápida:
curl -s https://usagewall.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Instalar en Claude.ai:
Configuración → Conectores → Añadir conector personalizado → pega
https://usagewall.vercel.app/api/mcp
Instalar en Claude Desktop / Cursor / Windsurf / Zed / Cline: consulta /mcp.
El servidor MCP
Seis herramientas de solo lectura, dos recursos JSON sin procesar, JSON-RPC 2.0 sobre Streamable HTTP. Cero dependencias; ~280 líneas de código; auditable en una sola sesión.
Herramientas — list_models, get_model, compare_models, estimate_cost,
cheapest_for, list_providers.
Recursos — usagewall://pricing/full, usagewall://pricing/<provider>.
Código fuente — api/mcp.js. Pruebas — tests/mcp.test.js
(18 casos). Descriptor de Smithery — smithery.yaml.
Qué más hay en este repositorio
Página de aterrizaje de lista de espera de nivel de producción para usagewall.dev, además del prototipo del proxy local. HTML estático + 5 funciones serverless de Vercel. Sin paso de compilación. Sin framework.
Stack (100% nivel gratuito)
| Capa | Servicio | Nivel gratuito |
|---|---|---|
| Alojamiento frontend | Vercel Hobby | 100GB/mes de ancho de banda |
| Base de datos | Supabase | 500MB de BD + 50k MAU |
| Confirmación por correo | Resend | 3k correos/mes, 100/día |
| Anti-bot (opcional) | Cloudflare Turnstile | 1M desafíos/mes |
| CI | GitHub Actions | 2k min/mes (privado) / ilimitado (público) |
| Dominio | Porkbun / Cloudflare | $10–15 / año (único elemento de pago) |
Estructura
usagewall/
├── public/
│ ├── index.html # Landing — hero, problem, how, why, pricing, waitlist, footer
│ ├── privacy.html # Plain-English privacy page
│ ├── styles.css # Brand: Fraunces + Switzer + JetBrains Mono, dark warm
│ ├── app.js # Vanilla form-binding, fetch to /api/waitlist
│ ├── favicon.svg
│ ├── og.svg / og.png # 1200x630 social preview
├── api/
│ ├── waitlist.js # POST signup endpoint
│ └── unsubscribe.js # GET unsubscribe with HMAC token
├── lib/
│ ├── email.js # RFC-aware email validation + throwaway block
│ └── security.js # rate limit, IP hash, HMAC tokens, safe JSON parse
├── tests/
│ ├── email.test.js # 12 unit tests
│ ├── security.test.js # 23 unit tests
│ └── api.e2e.test.js # 13 end-to-end tests with mocked req/res
├── scripts/
│ ├── validate-html.js # CSP-friendly HTML linter (no inline handlers, alt, lang, etc.)
│ └── smoke-api.js # Live HTTP smoke against waitlist handler
├── supabase/
│ └── schema.sql # waitlist table + RLS deny-all + stats view
├── launch/
│ └── COPY.md # Twitter thread, Show HN, Reddit, IndieHackers, dev.to
├── .github/workflows/
│ └── test.yml # CI: tests + HTML validation + secret-leak grep
├── vercel.json # Security headers, CSP, cache rules
├── package.json # `npm test`, `npm run smoke`, `npm run ci`
├── .env.example
└── README.md
Configuración inicial
1. Supabase
- Crea un proyecto en supabase.com (nivel gratuito).
- Editor SQL → pega
supabase/schema.sql→ ejecuta. - Configuración → API → copia
URLy la claveservice_role.
2. Genera dos secretos (obligatorio)
openssl rand -hex 32 # for IP_HASH_SALT
openssl rand -hex 32 # for UNSUBSCRIBE_SECRET
Ambos deben tener ≥32 caracteres. El manejador se niega a firmar tokens con secretos más cortos.
3. Resend (opcional pero recomendado)
- Regístrate en resend.com.
- Añade
usagewall.devcomo dominio (registros DNS a través de tu registrador). - Claves API → crea una. Cópiala.
4. Despliegue en Vercel
cd usagewall
vercel link # creates .vercel/, do not commit
vercel env add SUPABASE_URL
vercel env add SUPABASE_SERVICE_ROLE_KEY
vercel env add IP_HASH_SALT
vercel env add UNSUBSCRIBE_SECRET
vercel env add RESEND_API_KEY # optional
vercel env add RESEND_FROM # optional
vercel env add PUBLIC_URL # https://usagewall.dev
vercel env add ALLOWED_ORIGIN # https://usagewall.dev
vercel deploy --prod
5. DNS para usagewall.dev
Cómpralo en Porkbun (~$15/año por .dev). Apunta a Vercel:
- Registro A
@→76.76.21.21 - CNAME
www→cname.vercel-dns.com
Desarrollo local
cp .env.example .env.local
# Fill in at least: SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY,
# IP_HASH_SALT, UNSUBSCRIBE_SECRET
npx vercel dev
# → http://localhost:3000
Para probar sin la CLI de Vercel, usa el servidor de prueba:
npm run smoke
# Hits the handler with stubbed Supabase, prints pass/fail per case.
Pruebas
npm test # unit + E2E (48 + 13 = 61 cases, no network)
npm run validate:html # HTML structure + CSP + a11y checks
npm run smoke # live HTTP smoke vs handler with stubbed Supabase
npm run ci # all of the above
El CI se ejecuta en cada push que toque usagewall/** (consulta .github/workflows/test.yml).
Seguridad y privacidad
- Sin IPs sin procesar almacenadas. Solo los primeros 64 bits de
HMAC-SHA256(ip, IP_HASH_SALT). - Sin PII en los registros de producción. Las direcciones de correo se redactan a
email_domainúnicamente. - CSP en meta + cabeceras.
default-src 'self', scripts solo desde el propio origen. - Precarga HSTS. Todo TLS, sin opción de exclusión.
- Tokens de baja firmados con HMAC. No se necesita búsqueda en BD para verificar.
- Campo honeypot en cada formulario: invisible para humanos, irresistible para bots.
- Límite de tasa 5 solicitudes/min por hash de IP (en memoria; Turnstile se encarga del resto).
- Límite de cuerpo 8KB en la API.
safeJsonParsenunca lanza errores. - GitHub Actions fija las acciones al SHA del commit + busca secretos filtrados.
Lee public/privacy.html para la política orientada al usuario.
Objetivos de validación (5 días)
| Día | Acción | Canal |
|---|---|---|
| 0 | Comprar dominio + desplegar | — |
| 1 | Hilo en Twitter (consulta launch/COPY.md) | X / Twitter |
| 2 | Show HN + Reddit (×3 subreddits) | HN, r/SaaS, r/SideProject, r/IndieHackers |
| 3 | Publicación en IndieHackers | IndieHackers |
| 4 | Artículo extenso en dev.to | dev.to |
| 5 | Medir | — |
IR si ≥100 correos y ≥1 respuesta preguntando "¿cuándo puedo pagar?" NO-IR si <30 correos después del hilo de lanzamiento.
Notas de marca
Esta no es la marca Baku: es UsageWall, un producto de Baku. Hereda el ADN de diseño (oscuro cálido, serifas editoriales, sin gradientes llamativos, espaciado generoso) pero vive de forma independiente con su propia identidad. El pie de página acredita a Baku.
Paleta:
- fondo
#0A0A0B(casi negro cálido) - texto
#F5F4F0(blanco roto crema) - acento
#E8DFC7(crema cálido — solo resaltados) - fondo de código
#0E0E10
Tipografía:
- Display: Fraunces 400/500, a menudo en cursiva
- Cuerpo: Switzer 400/500
- Mono: JetBrains Mono 400/500/600
Archivos que NO se deben confirmar
El .gitignore lo cubre, pero sé paranoico con:
.env,.env.local,.env.*.local.vercel/(enlace del proyecto)node_modules/
El grep del CI verifica confirmaciones accidentales de sk_live_…, re_…, sbp_….