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.
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.
o arquivo que sai do sistema
nomes das colunas
mesmo lugar, mesmo nome
do sistema para o agente
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:
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])));
}
|| 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.
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
✔ Connected. Troque /caminho/da/exportacao pelo caminho completo da sua pasta, entre aspas, sem barra no fim.| Situação | De onde a ponte lê |
|---|---|
Sem PONTE_DADOS | runtime/exemplos/ (Clara e Sônia de mentira) |
Com PONTE_DADOS no env do .mcp.json | a pasta que você escreveu ali |
Rodando --selftest direto no terminal | os 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.
troca a pasta lida
campo env
fixo dentro do código
claude mcp list
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:
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');
},
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.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.
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.
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).
onde a conta acontece
o que você troca
o que fica igual
você confere
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
Comece só lendo
Use a ponte por algumas semanas apenas para consultar. Você aprende onde ela erra sem risco.
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.
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.
sozinho, sem aviso
pede a cada vez
um nome, uma ação
o único que lê sem gravar
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.
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
TOTAL: R$ 856.00. Agora feche o terminal e faça a conta da tabela abaixo.| Linha do erp-vendas.csv | Conta | Valor |
|---|---|---|
| 01/10 · Mercado Sol · Café 500g | 10 × 18,50 | 185,00 |
| 01/10 · Padaria Lua · Açúcar 1kg | 25 × 5,20 | 130,00 |
| 02/10 · Mercado Sol · Açúcar 1kg | 40 × 5,20 | 208,00 |
| 03/10 · Empório Mar · Café 500g | 6 × 18,50 | 111,00 |
| 03/10 · Padaria Lua · Café 500g | 12 × 18,50 | 222,00 |
| Total | 185 + 130 + 208 + 111 + 222 | 856,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.
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.
💡 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.
três linhas bastam
o total da Sônia
número errado sem erro
comando → saída
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:
| 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 |
pendente pela data com ok.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.
runtime/CAPACIDADES.md e veja a linha nova na tabela principal, com as seis colunas preenchidas.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?
sem linha, sem uso
pendente vira ok
como o agente chama
a política da linha
🎓 Resumo do módulo
Próximo módulo:
2.4 — Navegador com política