Skip to main content
Glama
LuanV1udes

mcp-pdv-demo

by LuanV1udes

mcp-pdv-demo

Servidor MCP (Model Context Protocol) que conecta um assistente de IA ao banco de um PDV — ponto de venda de varejo e food service.

Em vez de expor um executar_sql genérico, ele expõe perguntas de negócio: qual foi o faturamento, o que dá mais margem, o que está encalhado no estoque, se o caixa fechou certo. O modelo escolhe a ferramenta; o SQL fica do lado de cá, escrito e testado.

Banco 100% sintético, gerado por seed determinístico. Nenhum dado real de cliente.

Claude / Cursor / qualquer host MCP
        │  stdio
        ▼
   mcp-pdv-demo  ──►  Prisma  ──►  SQLite
   (6 tools de leitura + 1 de escrita, sob flag)

Rodando

npm install
npm run setup     # cria o banco e gera ~96 produtos, 90 dias, ~3.700 vendas
npm run dev       # sobe o servidor MCP no stdio

Conectando no Claude Code

claude mcp add pdv-demo -- npx tsx /caminho/para/mcp-pdv-demo/src/server.ts

Conectando no Claude Desktop

Em claude_desktop_config.json:

{
  "mcpServers": {
    "pdv-demo": {
      "command": "npx",
      "args": ["tsx", "/caminho/para/mcp-pdv-demo/src/server.ts"],
      "env": { "DATABASE_URL": "file:./pdv.db" }
    }
  }
}

Related MCP server: Business MCP Server

As ferramentas

Tool

Responde

consultar_produto

"quanto custa X", "tem X em estoque", "qual o código de X"

resumo_de_vendas

"quanto vendi em maio", "qual meu ticket médio", "quanto entrou no pix"

produtos_mais_vendidos

"o que mais vendeu", "top 10 do mês", "meus carros-chefe"

margem_por_categoria

"o que dá mais lucro" — que não é a mesma pergunta que "o que mais vende"

produtos_encalhados

"o que está parado", "quanto de capital tem preso no estoque"

fechamento_de_caixa

"fecha o caixa de ontem", "teve diferença", "sobrou ou faltou dinheiro"

ajustar_estoque

escrita — só existe se PDV_MCP_READONLY=false

Saída real

resumo_de_vendas:

**Vendas de 2026-08-01 a 2026-08-31**

- Faturamento: **R$ 136.517,91**
- Vendas concluidas: 1345
- Ticket medio: R$ 101,50
- Descontos concedidos: R$ 1.484,56
- Vendas canceladas: 37

| Forma    | Vendas | Valor        | % do total |
| -------- | ------ | ------------ | ---------- |
| PIX      | 459    | R$ 49.385,27 | 36.2%      |
| DEBITO   | 360    | R$ 36.350,09 | 26.6%      |
| CREDITO  | 336    | R$ 32.355,06 | 23.7%      |
| DINHEIRO | 190    | R$ 18.427,49 | 13.5%      |

produtos_encalhados:

5 produto(s) sem vender ha 30+ dias. Capital parado: **R$ 8.690,14**.

| Produto           | Categoria | Estoque | Custo un. | Capital parado |
| ----------------- | --------- | ------- | --------- | -------------- |
| Polenta Frita ... | Porcoes   | 100     | R$ 28,21  | R$ 2.821,00    |
| Misto Quente ...  | Lanches   | 92      | R$ 30,21  | R$ 2.779,32    |
| Creme Dental      | Higiene   | 96      | R$ 18,31  | R$ 1.757,76    |

Decisões de projeto

Dinheiro é Int em centavos, nunca Float. 0.1 + 0.2 !== 0.3 — num PDV isso vira quebra de caixa. A conversão para reais acontece só na formatação da saída.

Read-only por padrão. As tools de escrita não são apenas bloqueadas: elas não são registradas. Se PDV_MCP_READONLY não for explicitamente "false", ajustar_estoque não aparece no listTools — o modelo não pode chamar o que não sabe que existe. A decisão fica no ambiente, fora do alcance do prompt.

Preço e custo são congelados no item da venda. ItemVenda guarda precoUnitario e custoUnitario do momento da venda. Sem isso, mudar o preço de um produto reescreveria o histórico de margem — um relatório de março passaria a mentir porque o custo subiu em agosto.

A saída é markdown, não JSON. O consumidor é um modelo de linguagem. Tabela formatada com R$ e percentual gasta menos contexto e produz menos erro de leitura do que um array de objetos com valores em centavos.

Nada de executar_sql. Uma tool que aceita SQL arbitrário transfere para o modelo a responsabilidade de entender o schema, e transfere para o usuário o risco de um DELETE. Cada tool aqui é uma pergunta fechada com uma query revisada atrás.

Log vai para stderr. No transporte stdio, o stdout é o canal do protocolo — um console.log perdido corrompe a sessão inteira.

Testes

npm test

18 testes que sobem um cliente MCP real ligado ao servidor por transporte em memória — exercitam o protocolo inteiro, não as funções por dentro. Cobrem o contrato (toda tool tem descrição; a de escrita não aparece em modo leitura), a corretude dos números contra o banco, parsing de data em dois formatos, e os casos vazios.

Stack

TypeScript · MCP SDK · Prisma · SQLite · Zod · Vitest

Licença

MIT

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with SmartKasa Ukrainian POS system through natural language, managing shops, products, inventory, sales receipts, employees, and fiscal reports with full API coverage.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI to query a business database for customers, orders, and revenue using natural language through safe, well-defined tools.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables read-only access to Lightspeed X retail data (sales, inventory, products, customers) with aggregated reporting on revenue, COGS, profit, and other metrics for MCP clients like Claude.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/LuanV1udes/Mcp-Pdv-Demo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server