
Dando um Cérebro ao Seu App de Contabilidade: NestJS 'MCP'
Recapitulação
Vamos ser realistas: no último blog estávamos rodando um servidor MCP local no meu pc, conectando-o ao GitHub Copilot como cientistas malucos. Foi incrível. Mas foi um experimento de laboratório. O "cérebro" estava preso à minha máquina.
Então... e se construíssemos o cérebro dentro do próprio aplicativo?
O Sistema
Então aqui está a configuração. Temos três jogadores neste jogo:
O Aplicativo Web: React, Vite, Redux Toolkit. O chat vive em /magic-bookkeeping.
O Backend: NestJS, PostgreSQL, Redis. É aqui que o trabalho real acontece.
O Serviço de IA: Claude Haiku 3.5 via Requesty.AI, sentado entre eles.
O usuário diz: E aí, que itens temos?
Agente: Chama a ferramenta itemAll para verificar o inventário de itens e então pausa legal RENDERIZA um Componente UI Completo com detalhes do item! Não textos!
Também funciona para inputs em Bengali e de voz, a propósito.
O Contrato do frontend:
Isso é o que os mantém conectados.
A Camada MCP: Mas Não É Realmente MCP?
Reviravolta: chamamos de MCP, mas não é realmente o Modelo de Protocolo de Contexto. Não há stdio. Sem SSE. Sem @modelcontextprotocol/sdk. Sem JSON-RPC. Basicamente, construímos nossa própria fachada de chamada de ferramenta que se parece com a especificação de função da OpenAI, para que Claude saiba o que fazer com isso.
Como isso já era um sistema ERP pesado o suficiente, com muito código que foi escrito antes da era da IA, adaptá-lo a um servidor mcp separado não seria tão fácil, além de que também significaria que teríamos que manter outro servidor.
O Controlador (apenas dois endpoints!):
quando um usuário solicita qualquer informação pela primeira vez, list_tool listará todas as ferramentas disponíveis para o modelo de IA
call_tool é onde a mágica acontece, passamos um prompt de sistema para o serviço de IA para que ele saiba como selecionar as ferramentas para quaisquer operações específicas ou quais ferramentas chamar para, digamos, obter itens ou adicionar um novo item ao inventário.
o dto da ferramenta:
por que "qualquer" ?
Porque cada ferramenta tem uma estrutura diferente.
arguments: any é provavelmente o tipo TypeScript mais honesto já escrito.
E aqui está como as ferramentas são despachadas:
tools.json é lido do disco a cada solicitação, não é armazenado em cache. O padrão de switch significa que adicionar uma ferramenta requer editar tanto o arquivo JSON quanto este serviço. (me dê um desconto, foi a primeira vez que construí coisas assim :))
Anatomia de uma ferramenta mcp
existem dois tipos de ferramentas para este projeto
- Ferramentas de Dados
- Ferramentas de Componente as ferramentas de dados lidam com as chamadas de serviço reais e os payloads de resposta, enquanto a ferramenta de componente é usada apenas para UI generativa, que chegaremos a mais tarde.
aqui está uma ferramenta de dados declarada dentro do tools.json:
esta é a forma como lidamos com a ferramenta através do nosso serviço mcp:
O resultado é a entidade bruta retornada pelo serviço de domínio.
Agora compare com a ferramenta de componente
uma ferramenta de criar item em tools.json:
manipulador em mcp.service.ts:
A implementação de um sistema de IA em aplicativos pode transformar a forma como as empresas brasileiras gerenciam suas operações. A adaptação de ferramentas de IA como Claude pode otimizar processos e melhorar a experiência do usuário. A construção de uma camada MCP personalizada pode facilitar a integração de novas funcionalidades.










