U1 · Principais

LedgerJob

SaaS multi-tenant para empresas de construção nos EUA: leads, orçamentos, projetos, faturas e agenda. O dono da empresa opera tudo conversando com um agente de IA, e as mesmas ferramentas ficam disponíveis por um servidor MCP.

Decisões técnicas

  • Uma lista única de 66 ferramentas serve ao chat interno e ao servidor MCP. Ferramenta nova aparece nos dois lugares no mesmo deploy, sem código duplicado.
  • Loop de agente próprio sobre a Responses API da OpenAI, com teto de 8 iterações por turno e resultado de ferramenta cortado em 6.000 caracteres, para uma listagem grande não estourar tokens.
  • Ação irreversível (enviar e-mail ou SMS, gastar com terceiros, apagar dados) não roda dentro do loop: vira um card que o usuário confirma. O resultado volta ao histórico para o modelo não afirmar algo que não aconteceu. No MCP, essas ferramentas levam o prefixo `IRREVERSIBLE` e as anotações `destructiveHint`/`readOnlyHint`.
  • A identidade vem da API key, nunca do modelo. A chave é guardada só como hash SHA-256 e carrega tenant, usuário e papel. O MCP age como aquele usuário, com os mesmos limites, rate limit e checagem de plano.
  • Regra de negócio fica no service, não na rota, porque o agente e o MCP não passam pelo validador HTTP. Um bug real (agendar "das 18h às 17h" pelo assistente) levou a regra para o service, com teste.
  • Desenvolvido com Claude Code; arquitetei o backend, o agente e o servidor MCP.

Resultados

  • 66 ferramentas do agente, todas expostas também via MCP; 16 exigem confirmação humana.
  • Backend com 46 módulos de domínio e 87 modelos no schema Prisma.
  • 59 arquivos de teste no backend (Vitest), com 347 casos declarados.
  • Integrado a Stripe, QuickBooks Online, Twilio, Google Calendar, EagleView, Hover e CompanyCam.

Stack

Node.jsTypeScriptExpressPrismaPostgreSQLReactOpenAI Responses APIMCP SDKStripeQuickBooks Online

O que mostra

Mostra que sei colocar um agente de IA para agir sobre dados reais de um negócio com limites claros: confirmação humana no que é irreversível e permissões herdadas do usuário.