UsageWall
Preços ao vivo de LLM como um servidor MCP — seis ferramentas somente leitura para listar, comparar, estimar custo e encontrar o modelo mais barato entre OpenAI, Anthropic, Google, DeepSeek, Mistral, xAI e Meta.
Documentação
UsageWall
Preços de LLM em tempo real como um servidor MCP. Pergunte ao Claude (ou a qualquer cliente MCP) "quanto custa este prompt?" e obtenha números reais de uma tabela de preços verificada manualmente para cada LLM importante. Gratuito, somente leitura, sem autenticação.
Resumo
- Endpoint MCP:
https://usagewall.vercel.app/api/mcp - Documentação de instalação: usagewall.vercel.app/mcp
- API JSON de preços: usagewall.vercel.app/api/pricing
- Status ao vivo: usagewall.vercel.app/status
- O que está por vir (lista de espera): um proxy hospedado com limite rígido para que um loop descontrolado não drene seu orçamento de IA durante a noite.
Teste rápido:
curl -s https://usagewall.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Instalar no Claude.ai:
Configurações → Conectores → Adicionar conector personalizado → cole
https://usagewall.vercel.app/api/mcp
Instalar no Claude Desktop / Cursor / Windsurf / Zed / Cline: veja /mcp.
O servidor MCP
Seis ferramentas somente leitura, dois recursos JSON brutos, JSON-RPC 2.0 sobre Streamable HTTP. Zero dependências; ~280 linhas de código; auditável em uma única leitura.
Ferramentas — list_models, get_model, compare_models, estimate_cost,
cheapest_for, list_providers.
Recursos — usagewall://pricing/full, usagewall://pricing/<provider>.
Código-fonte — api/mcp.js. Testes — tests/mcp.test.js
(18 casos). Descritor Smithery — smithery.yaml.
O que mais há neste repositório
Landing page de lista de espera em nível de produção para usagewall.dev, além do protótipo do proxy local. HTML estático + 5 funções serverless da Vercel. Sem etapa de build. Sem framework.
Stack (100% plano gratuito)
| Camada | Serviço | Plano gratuito |
|---|---|---|
| Hospedagem frontend | Vercel Hobby | 100GB/mês de banda |
| Banco de dados | Supabase | 500MB de banco + 50k MAU |
| Confirmação de e-mail | Resend | 3k e-mails/mês, 100/dia |
| Anti-bot (opcional) | Cloudflare Turnstile | 1M desafios/mês |
| CI | GitHub Actions | 2k min/mês (privado) / ilimitado (público) |
| Domínio | Porkbun / Cloudflare | US$ 10–15 / ano (único item pago) |
Estrutura
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
Configuração inicial
1. Supabase
- Crie um projeto em supabase.com (plano gratuito).
- Editor SQL → cole
supabase/schema.sql→ execute. - Configurações → API → copie
URLe a chaveservice_role.
2. Gere dois segredos (obrigatório)
openssl rand -hex 32 # for IP_HASH_SALT
openssl rand -hex 32 # for UNSUBSCRIBE_SECRET
Ambos devem ter ≥32 caracteres. O manipulador se recusa a assinar tokens com segredos mais curtos.
3. Resend (opcional, mas recomendado)
- Cadastre-se em resend.com.
- Adicione
usagewall.devcomo domínio (registros DNS via seu registrador). - Chaves de API → crie uma. Copie.
4. Deploy na 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
Compre em Porkbun (~US$ 15/ano para .dev). Aponte para a Vercel:
- Registro A
@→76.76.21.21 - CNAME
www→cname.vercel-dns.com
Desenvolvimento 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 testar sem a CLI da Vercel, use o servidor de teste:
npm run smoke
# Hits the handler with stubbed Supabase, prints pass/fail per case.
Testes
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
O CI é executado a cada push que toca em usagewall/** (veja .github/workflows/test.yml).
Segurança e privacidade
- Nenhum IP bruto armazenado. Apenas os primeiros 64 bits de
HMAC-SHA256(ip, IP_HASH_SALT). - Sem PII nos logs de produção. Endereços de e-mail são mascarados para apenas
email_domain. - CSP em meta + cabeçalhos.
default-src 'self', scripts apenas do próprio domínio. - Pré-carregamento HSTS. Todo TLS, sem opção de desativação.
- Tokens de cancelamento de inscrição assinados com HMAC. Nenhuma consulta ao banco necessária para verificar.
- Campo honeypot em todos os formulários — invisível para humanos, irresistível para bots.
- Limite de taxa de 5 req/min por hash de IP (em memória; Turnstile cuida do resto).
- Limite de corpo de 8KB na API.
safeJsonParsenunca lança erro. - GitHub Actions fixa ações no SHA do commit + verifica vazamento de segredos.
Leia public/privacy.html para a política voltada ao usuário.
Metas de validação (5 dias)
| Dia | Ação | Canal |
|---|---|---|
| 0 | Comprar domínio + deploy | — |
| 1 | Thread no Twitter (veja launch/COPY.md) | X / Twitter |
| 2 | Show HN + Reddit (×3 subreddits) | HN, r/SaaS, r/SideProject, r/IndieHackers |
| 3 | Post no IndieHackers | IndieHackers |
| 4 | Artigo longo no dev.to | dev.to |
| 5 | Medir | — |
IR se ≥100 e-mails e ≥1 resposta perguntando "quando posso pagar?" NÃO IR se <30 e-mails após o thread de lançamento.
Notas de marca
Esta não é a marca Baku — é UsageWall, um produto da Baku. Herda o DNA de design (escuro e quente, serifas editoriais, sem gradientes chamativos, espaçamento generoso), mas vive de forma independente com identidade própria. O rodapé credita a Baku.
Paleta:
- fundo
#0A0A0B(quase preto quente) - texto
#F5F4F0(off-white creme) - destaque
#E8DFC7(creme quente — apenas destaques) - fundo de código
#0E0E10
Tipografia:
- Display: Fraunces 400/500, frequentemente itálico
- Corpo: Switzer 400/500
- Mono: JetBrains Mono 400/500/600
Arquivos que NÃO devem ser commitados
O .gitignore cobre isso, mas seja paranóico sobre:
.env,.env.local,.env.*.local.vercel/(link do projeto)node_modules/
A verificação do CI procura por commits acidentais de sk_live_…, re_…, sbp_….