PTENES
Pular para o conteúdo
MÓDULO 2.3

🏗️ A ponte do seu sistema

A ponte-modelo funciona com os arquivos de exemplo. Agora ela passa a ler a exportação do seu sistema. Você troca o CSV e os nomes das colunas, e mantém a regra: a ponte só lê.

6
Tópicos
~35
Minutos
Médio
Nível
Prático
Tipo
0 de 60%
1

Ache a exportação do seu sistema

No módulo 2.2 a ponte leu runtime/exemplos/agenda.csv e runtime/exemplos/erp-vendas.csv. Esses arquivos imitam o que um sistema sem API entrega: uma exportação.

O primeiro passo é achar esse arquivo no seu sistema. Procure nos menus por "Exportar", "Relatórios" ou "Salvar como CSV". No ERP do cliente da Sônia, é o relatório de vendas do mês, salvo numa pasta fixa.

🆕 Novo aqui? Três palavras deste módulo

  • Exportação — o arquivo que o sistema gera para você levar os dados para fora dele (CSV, planilha).
  • Cabeçalho — a primeira linha do CSV, com o nome de cada coluna. A ponte usa esses nomes para achar os valores.
  • Variável de ambiente — um valor com nome (como PONTE_DADOS) que um programa lê ao começar. Serve para mudar a configuração sem mexer no código.
🏢 ERP / agenda sem API 📄 exportação vendas.csv 📁 pasta PONTE_DADOS ponte-modelo lê o CSV e vira ferramenta do agente nenhuma seta volta para o sistema: a ponte só lê

Como ler o desenho: as setas azuis vão sempre da esquerda para a direita. O sistema gera o arquivo, o arquivo cai numa pasta e a ponte (caixa em destaque) lê essa pasta. Nada volta para o ERP: é isso que mantém o risco baixo.

✓ Exportação que a ponte lê fácil

  • ✓ Primeira linha com o nome das colunas
  • ✓ Colunas separadas por vírgula, como os exemplos do kit
  • ✓ Sempre salva na mesma pasta, com o mesmo nome
  • ✓ Números com ponto decimal (18.50)

✗ Exportação que pede ajuste

  • ✗ Separada por ponto e vírgula (comum em planilha brasileira)
  • ✗ Valores com vírgula dentro de um campo
  • ✗ Linhas de título ou total antes do cabeçalho
  • ✗ Nome do arquivo que muda todo dia

💡 Por que a coluna da direita importa

A ponte-modelo separa as colunas cortando cada linha nas vírgulas. Se o seu arquivo usa ponto e vírgula, ou tem vírgula dentro de um nome, a leitura sai torta. Não é defeito: é um modelo simples. No tópico 3 você pede ao agente para ajustar isso.

📤
Exportação

o arquivo que sai do sistema

🏷️
Cabeçalho

nomes das colunas

📁
Pasta fixa

mesmo lugar, mesmo nome

➡️
Mão única

do sistema para o agente

2

Aponte a ponte para os seus arquivos

A ponte não tem o caminho dos arquivos gravado em pedra. Logo no começo do server.mjs ela pergunta: existe PONTE_DADOS? Se existe, lê dali. Se não, usa a pasta runtime/exemplos/.

Esta é a linha real do arquivo do kit:

📄 runtime/pontes/mcp-modelo/server.mjs (trecho real)
const pastaExemplos = process.env.PONTE_DADOS || join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'exemplos');

function lerCsv(nome) {
  const [cabecalho, ...linhas] = readFileSync(join(pastaExemplos, nome), 'utf8').trim().split('\n');
  const campos = cabecalho.split(',');
  return linhas.map(l => Object.fromEntries(l.split(',').map((v, i) => [campos[i], v])));
}
O que olhar: o || quer dizer "senão". E a função lerCsv junta a pasta com o nome do arquivo (agenda.csv, erp-vendas.csv). Ou sua exportação tem esse nome, ou você troca o nome no código (tópico 3).

A receita R3 manda pôr a variável no .mcp.json, no campo env. Assim, toda vez que o Claude Code liga a ponte, ela já nasce olhando para a sua pasta.

🎯 Objetivo: a ponte ler a pasta da exportação, não os exemplos

Edite o .mcp.json da raiz do kit. Hoje ele tem só command e args; acrescente o campo env com o caminho da sua pasta:

{
  "mcpServers": {
    "ponte-modelo": {
      "command": "node",
      "args": ["runtime/pontes/mcp-modelo/server.mjs"],
      "env": { "PONTE_DADOS": "/caminho/da/exportacao" }
    }
  }
}

Feche o claude, abra de novo na pasta do kit e confira se a ponte continua ligada:

claude mcp list

Saída real (05/10/2026, Linux), linha da ponte:

ponte-modelo: node runtime/pontes/mcp-modelo/server.mjs - ✔ Connected
Como verificar: a linha termina em ✔ Connected. Troque /caminho/da/exportacao pelo caminho completo da sua pasta, entre aspas, sem barra no fim.
SituaçãoDe onde a ponte lê
Sem PONTE_DADOSruntime/exemplos/ (Clara e Sônia de mentira)
Com PONTE_DADOS no env do .mcp.jsona pasta que você escreveu ali
Rodando --selftest direto no terminalos exemplos (o .mcp.json só vale quando o agente liga a ponte)

O que olhar na tabela: a última linha evita confusão. O --selftest continua provando o modelo com os exemplos; quem lê a sua pasta é a ponte ligada pelo agente.

💡 Não renomeie a ponte por enquanto

O .claude/settings.json do kit libera a ponte pelo nome, em "enabledMcpjsonServers": ["ponte-modelo"]. Se trocar o nome no .mcp.json, troque ali também, ou o Claude Code volta a pedir aprovação.

🔀
PONTE_DADOS

troca a pasta lida

🧾
.mcp.json

campo env

📛
Nome do arquivo

fixo dentro do código

✔
Connected

claude mcp list

3

Troque as colunas com a ajuda do agente

Cada ferramenta da ponte tem uma função run(): é ali que a conta acontece. E ali estão os nomes das colunas do CSV de exemplo. Este é o run() real da ferramenta resumo_vendas:

📄 server.mjs — run() de resumo_vendas (trecho real)
run({ agrupar_por = 'cliente' } = {}) {
  const grupos = {};
  let total = 0;
  for (const r of lerCsv('erp-vendas.csv')) {
    const v = Number(r.quantidade) * Number(r.valor_unitario);
    grupos[r[agrupar_por]] = (grupos[r[agrupar_por]] || 0) + v;
    total += v;
  }
  const linhas = Object.entries(grupos).map(([k, v]) => `${k}: R$ ${v.toFixed(2)}`);
  return [...linhas, `TOTAL: R$ ${total.toFixed(2)}`].join('\n');
},
O que olhar: r.quantidade e r.valor_unitario são nomes de coluna do cabeçalho de exemplo (data,cliente,produto,quantidade,valor_unitario). Se o seu ERP chama de outro jeito, é só isso que muda.
cabeçalho do seu ERP (exemplo) o que o run() usa hoje emissao cliente item qtd preco data cliente produto quantidade valor_unitario run() qtd × preco conta igual

Como ler o desenho: à esquerda, um cabeçalho inventado de um ERP qualquer; à direita, os nomes que o código espera. As duas setas acesas são as que entram na conta. Trocar o nome no código é ligar a seta certa: a regra (quantidade vezes preço) não muda.

Você não precisa editar o código à mão. Peça ao agente, com limite escrito: só trocar nomes dentro do run(), sem criar ferramenta que escreve.

🎯 Objetivo: a ferramenta resumo_vendas ler as colunas do seu arquivo

Abra claude na pasta do kit e cole (troque o que está entre < >):

Leia runtime/pontes/mcp-modelo/server.mjs e a primeira linha do meu arquivo </caminho/da/exportacao/vendas.csv>.
Na ferramenta resumo_vendas, troque só os nomes de colunas usados em run() e o nome do arquivo em lerCsv pelos do meu arquivo.
Se o meu arquivo usar ponto e vírgula, ajuste a separação em lerCsv.
Não crie ferramenta que escreve e não mexa em listar_horarios_livres.
Antes de salvar, me mostre o antes e o depois de cada linha alterada.
Como verificar: o agente mostra só linhas de run() e de lerCsv mudando. Se aparecer uma ferramenta nova ou alguma escrita em arquivo, recuse e peça de novo.

💡 Guarde a prova antiga antes de mexer

Rode o --selftest uma vez antes da troca e anote o TOTAL: R$ 856.00. Depois da troca, o selftest continua lendo os exemplos, que têm os nomes antigos, então o total dele deixa de valer. A prova passa a ser a conta na mão com os seus dados (tópico 5).

⚙️
run()

onde a conta acontece

🔤
Nome da coluna

o que você troca

📏
A regra

o que fica igual

👀
Antes e depois

você confere

4

Mantenha a ponte só de leitura

O próprio server.mjs traz a regra num comentário: "POLITICA: as duas tools só LEEM (N4). Tool que escreve precisa de outro nível e de confirmação."

Ler é N4: o agente faz sozinho, sem aviso, porque nada muda no mundo. A tentação aparece logo. A Clara vai querer que o agente marque consulta, não só liste horário. Isso já é escrever, e a receita R3 é clara: ferramenta que escreve sobe para "alterar" na POLITICA.md, N2, pede antes.

✓ Ferramenta de leitura (N4)

  • ✓ listar_horarios_livres: mostra o que está livre
  • ✓ resumo_vendas: soma e agrupa
  • ✓ Errar aqui custa uma resposta errada, não um dado estragado
  • ✓ O agente usa sem pedir

✗ Ferramenta que escreve (sobe para N2)

  • ✗ Marcar paciente num horário da agenda
  • ✗ Lançar ou corrigir venda no arquivo do ERP
  • ✗ Errar aqui estraga o dado que outros usam
  • ✗ Só com pedido e "sim" a cada vez
1

Comece só lendo

Use a ponte por algumas semanas apenas para consultar. Você aprende onde ela erra sem risco.

2

Se precisar escrever, mude o nível primeiro

Antes do código, a linha na CAPACIDADES.md passa a dizer "alterar (N2)", como no exemplo da agenda que vem no arquivo.

3

Ferramenta de escrita separada

Nunca transforme uma ferramenta de leitura em "lê e escreve". Uma nova, com nome que diga o que faz, deixa claro quando o agente vai pedir.

⚠️ Leia o que o agente escreveu na ponte

Quando o agente mexe no server.mjs, ele mexe no programa que vai rodar toda vez que você pedir algo. Procure no antes e depois palavras como writeFileSync ou appendFileSync: elas gravam em arquivo. Numa ponte só de leitura, só readFileSync deve aparecer.

👁️
Ler = N4

sozinho, sem aviso

✍️
Escrever = N2

pede a cada vez

🧩
Ferramenta separada

um nome, uma ação

🔍
readFileSync

o único que lê sem gravar

5

Confira o resumo da Sônia na mão

Uma ponte nova só vale depois de uma conta que você mesmo fez. Não porque o código erra muito, mas porque um nome de coluna trocado errado não dá erro: dá um número errado com cara de certo.

Treine com os dados da Sônia, que você conhece. Rode o selftest e refaça o total com calculadora.

🎯 Objetivo: ver o total que a ponte calcula

No terminal, dentro da pasta do kit:

node runtime/pontes/mcp-modelo/server.mjs --selftest

Saída real (05/10/2026, Linux):

tools: 2 (listar_horarios_livres, resumo_vendas)
2026-10-06 09:00 · Dra. Ana
2026-10-06 10:00 · Dra. Ana
2026-10-06 15:00 · Dr. Bruno
TOTAL: R$ 856.00
Como verificar: a última linha é TOTAL: R$ 856.00. Agora feche o terminal e faça a conta da tabela abaixo.
Linha do erp-vendas.csvContaValor
01/10 · Mercado Sol · Café 500g10 × 18,50185,00
01/10 · Padaria Lua · Açúcar 1kg25 × 5,20130,00
02/10 · Mercado Sol · Açúcar 1kg40 × 5,20208,00
03/10 · Empório Mar · Café 500g6 × 18,50111,00
03/10 · Padaria Lua · Café 500g12 × 18,50222,00
Total185 + 130 + 208 + 111 + 222856,00

O que olhar na tabela: por cliente, a mesma conta dá Mercado Sol 393,00 (185 + 208), Padaria Lua 352,00 (130 + 222) e Empório Mar 111,00. Somando os três, 856,00 de novo. Quando a ponte ler os dados reais, faça o mesmo com três ou quatro linhas que você consegue somar.

🎯 Objetivo: comparar a resposta do agente com a sua conta

Abra claude na pasta do kit e cole:

Use a tool resumo_vendas da ponte-modelo agrupando por cliente. Mostre a resposta da ferramenta sem arredondar e sem comentar.
Como verificar: cada cliente bate com a sua conta e a última linha traz o total. Se um valor não bate, a primeira suspeita é um nome de coluna trocado errado.

💡 A conta na mão vira a sua prova

Anote: "arquivo de tal dia, cliente X, valor Y". Isso é uma prova no formato do kit, comando → saída esperada. No módulo 3.4 ela entra no goal e passa a ser conferida sozinha.

🧮
Calculadora

três linhas bastam

🎯
R$ 856,00

o total da Sônia

🔤
Coluna trocada

número errado sem erro

✅
Prova

comando → saída

6

Registre a ponte no CAPACIDADES.md

A regra do runtime/CAPACIDADES.md vale aqui: sistema sem linha não é usado pelo agente. A ponte só entra no mapa depois da conta na mão, e com a data do teste.

O arquivo já traz um exemplo para o caso da Sônia, marcado como pendente:

📄 runtime/CAPACIDADES.md — exemplo para copiar (real)
| ERP sem API                  | Exportação CSV diária   | 6 | ler ~/erp/export/*.csv          | ler (N4)        | pendente |

Depois da conta conferida, a linha da Sônia fica assim (troque pelos dados do seu teste):

| ERP da distribuidora | Exportação CSV + ponte MCP | 6 | tool resumo_vendas da ponte-modelo | ler (N4) | <AAAA-MM-DD> ok |
O que mudou: a coluna "Como o agente chama" agora diz a ferramenta, e "Testado em" troca pendente pela data com ok.
🎯 Objetivo: o agente registrar a ponte com você conferindo

Abra claude na pasta do kit e cole:

Acrescente uma linha na tabela de runtime/CAPACIDADES.md para a ponte-modelo lendo a minha exportação: via ponte local por MCP, nível 6, política ler (N4), testado em <data de hoje> ok. Não mude as outras linhas. Mostre a linha antes de salvar.
Como verificar: abra o runtime/CAPACIDADES.md e veja a linha nova na tabela principal, com as seis colunas preenchidas.
1 · exportaçãoachada 2 · PONTE_DADOSapontada 3 · contaconferida na mão 4 · CAPACIDADES.md linha com data e ok só daqui em diante o agente usa

Como ler o desenho: os três primeiros passos são técnicos; o quarto (em destaque) é o que libera o uso. Pular a linha no mapa é deixar o agente usar um sistema que ninguém registrou.

Teste rápido (opcional): você apontou a ponte para a exportação do ERP e trocou as colunas. O que libera o agente para usar a ponte no dia a dia?

🗺️
Mapa

sem linha, sem uso

📅
Data do teste

pendente vira ok

🧰
Nome da tool

como o agente chama

🔒
ler (N4)

a política da linha

🎓 Resumo do módulo

✓
Exportação é a matéria-prima — cabeçalho, vírgula, pasta fixa.
✓
PONTE_DADOS troca a pasta — no campo env do .mcp.json.
✓
Troque os nomes, não a regra — só dentro do run(), com o agente mostrando antes e depois.
✓
Ponte só lê — escrever sobe para N2 e vira outra ferramenta.
✓
Conta na mão, depois o mapa — R$ 856,00 conferido e linha com data.

Próximo módulo:

2.4 — Navegador com política