Encuentra la exportación de tu sistema
En el módulo 2.2, el puente leyó runtime/exemplos/agenda.csv e runtime/exemplos/erp-vendas.csv. Estos archivos imitan lo que entrega un sistema sin API: una exportación.
El primer paso es encontrar ese archivo en tu sistema. Busca en los menús opciones como «Exportar», «Informes» o «Guardar como CSV». En el ERP del cliente de Sônia, es el informe de ventas del mes, guardado en una carpeta fija.
🆕 ¿Eres nuevo aquí? Tres palabras de este módulo
- Exportación — el archivo que el sistema genera para que saques los datos de él (CSV, hoja de cálculo).
- Encabezado — la primera línea del CSV, con el nombre de cada columna. El puente usa esos nombres para encontrar los valores.
- Variable de entorno — un valor con nombre (como
PONTE_DADOS) que un programa lee al iniciarse. Sirve para cambiar la configuración sin modificar el código.
Cómo leer el diagrama: las flechas azules siempre van de izquierda a derecha. El sistema genera el archivo, el archivo cae en una carpeta y el puente (caja resaltada) lee esa carpeta. Nada vuelve al ERP: eso es lo que mantiene bajo el riesgo.
✓ Exportación que el puente puede leer fácilmente
- ✓ Primera fila con el nombre de las columnas
- ✓ Columnas separadas por comas, como en los ejemplos del kit
- ✓ Siempre se guarda en la misma carpeta, con el mismo nombre
- ✓ Números con punto decimal (
18.50)
✗ Exportación que requiere ajustes
- ✗ Separada por punto y coma (común en las hojas de cálculo brasileñas)
- ✗ Valores con coma dentro de un campo
- ✗ Filas de título o total antes del encabezado
- ✗ Nombre del archivo que cambia todos los días
💡 Por qué importa la columna de la derecha
El puente de ejemplo separa las columnas dividiendo cada línea por las comas. Si tu archivo usa punto y coma o contiene una coma dentro de un nombre, la lectura queda desordenada. No es un defecto: es un modelo sencillo. En el tema 3 le pides al agente que lo ajuste.
el archivo que sale del sistema
nombres de las columnas
el mismo lugar, el mismo nombre
del sistema al agente
Apunta la conexión a tus archivos
El puente no tiene fijada de antemano la ruta de los archivos. Al principio del server.mjs ella pregunta: ¿existe PONTE_DADOS? Si existe, lo lee de ahí. Si no, usa la carpeta runtime/exemplos/.
Esta es la línea real del archivo del 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])));
}
|| quiere decir "si no". Y la función lerCsv combina la carpeta con el nombre del archivo (agenda.csv, erp-vendas.csv). O tu exportación tiene ese nombre, o cambias el nombre en el código (tema 3).La receta R3 indica que pongas la variable en el .mcp.json, en el campo env. Así, cada vez que Claude Code activa el puente, este ya se inicia mirando tu carpeta.
Edita el .mcp.json de la raíz del kit. Hoy solo tiene command e args; agrega el campo env con la ruta de tu carpeta:
{
"mcpServers": {
"ponte-modelo": {
"command": "node",
"args": ["runtime/pontes/mcp-modelo/server.mjs"],
"env": { "PONTE_DADOS": "/caminho/da/exportacao" }
}
}
}
Cierra el claude, vuelve a abrirlo en la carpeta del kit y comprueba si el puente sigue conectado:
claude mcp list
Salida real (05/10/2026, Linux), línea del puente:
ponte-modelo: node runtime/pontes/mcp-modelo/server.mjs - ✔ Connected
✔ Connected. Cambia /caminho/da/exportacao por la ruta completa de tu carpeta, entre comillas y sin barra al final.| Situación | De dónde lee el puente |
|---|---|
Sin PONTE_DADOS | runtime/exemplos/ (Clara y Sônia inventadas) |
Con PONTE_DADOS en el env del .mcp.json | la carpeta que escribiste ahí |
En ejecución --selftest directamente en la terminal | los ejemplos (el .mcp.json solo aplica cuando el agente activa el puente) |
Qué revisar en la tabla: la última línea evita confusiones. El --selftest sigue probando el modelo con los ejemplos; quien lee tu carpeta es el puente conectado por el agente.
💡 No renombres el puente por ahora
O .claude/settings.json del kit habilita el puente por nombre, en "enabledMcpjsonServers": ["ponte-modelo"]. Si cambias el nombre en .mcp.json, cámbialo allí también, o Claude Code volverá a pedir aprobación.
cambia la carpeta leída
campo env
fijo dentro del código
claude mcp list
Cambia las columnas con ayuda del agente
Cada herramienta del puente tiene una función run(): ahí se hacen los cálculos. Y ahí están los nombres de las columnas del CSV de ejemplo. Este es el run() real de la herramienta 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 son nombres de columna del encabezado de ejemplo (data,cliente,produto,quantidade,valor_unitario). Si tu ERP lo llama de otra manera, eso es lo único que cambia.Cómo leer el diagrama: a la izquierda, un encabezado inventado de cualquier ERP; a la derecha, los nombres que espera el código. Las dos flechas iluminadas son las que se tienen en cuenta. Cambiar el nombre en el código es conectar la flecha correcta: la regla (cantidad por precio) no cambia.
No tienes que editar el código a mano. Pídele al agente, con un límite por escrito: cambiar nombres solo dentro del run(), sin crear una herramienta que escriba.
Abre claude en la carpeta del kit y pega (cambia lo 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() y de lerCsv cambiando. Si aparece una herramienta nueva o alguna escritura en un archivo, recházalo y vuelve a pedirlo.💡 Guarda la prueba anterior antes de hacer cambios
Ejecuta el --selftest una vez antes del cambio y anota el TOTAL: R$ 856.00. Después del cambio, el selftest sigue leyendo los ejemplos, que tienen los nombres antiguos, así que su total deja de ser válido. La prueba pasa a ser el cálculo manual con tus datos (tema 5).
dónde se realiza el cálculo de la cuenta
lo que cambias
lo que permanece igual
tú verificas
Mantén el puente en modo de solo lectura
El propio server.mjs incluye la regla en un comentario: "POLITICA: las dos tools solo LEEN (N4). Una tool que escribe necesita otro nivel y confirmación."
Leer es N4: el agente lo hace por su cuenta, sin avisar, porque nada cambia en el mundo. La tentación aparece enseguida. Clara querrá que el agente marca consulta, no solo enumeres horarios. Eso ya es escribir, y la receta R3 es clara: una herramienta que escribe sube a «modificar» en la POLITICA.md, N2, lo pide antes.
✓ Herramienta de lectura (N4)
- ✓
listar_horarios_livres: muestra qué está disponible - ✓
resumo_vendas: suma y agrupa - ✓ Equivocarse aquí cuesta una respuesta incorrecta, no un dato dañado
- ✓ El agente usa sin pedir permiso
✗ Herramienta que escribe (sube a N2)
- ✗ Agendar un horario para el paciente
- ✗ Registrar o corregir una venta en el archivo del ERP
- ✗ Equivocarse aquí daña los datos que usan otras personas
- ✗ Solo con pedido y «sí» cada vez
Empieza solo leyendo
Usa el puente durante algunas semanas solo para consultar. Aprenderás dónde falla sin correr riesgos.
Si necesitas escribir, cambia primero el nivel
Antes del código, la fila en CAPACIDADES.md pasa a decir «cambiar (N2)», como en el ejemplo de la agenda que viene en el archivo.
Herramienta de escritura separada
Nunca conviertas una herramienta de lectura en una que «lee y escribe». Una nueva, con un nombre que indique lo que hace, deja claro cuándo el agente va a pedirla.
⚠️ Lee lo que el agente escribió en el puente
Cuando el agente modifica el server.mjs, modifica el programa que se ejecutará cada vez que pidas algo. Busca en el antes y el después palabras como writeFileSync o appendFileSync: escriben en un archivo. En un puente de solo lectura, solo readFileSync debe aparecer.
solo, sin aviso
pide cada vez
un nombre, una acción
el único que lee sin escribir
Verifica el resumen de Sônia en persona
Un puente nuevo solo sirve después de que tú mismo hayas hecho una cuenta. No porque el código se equivoque mucho, sino porque cambiar el nombre de una columna por error no genera un error: da un número equivocado que parece correcto.
Practica con los datos de Sônia, que ya conoces. Ejecuta el selftest y vuelve a calcular el total con una calculadora.
En la terminal, dentro de la carpeta del kit:
node runtime/pontes/mcp-modelo/server.mjs --selftest
Salida 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. Ahora cierra la terminal y haz el cálculo de la tabla de abajo.| Línea de erp-vendas.csv | Cuenta | Valor |
|---|---|---|
| 01/10 · Mercado Sol · Café 500g | 10 × 18,50 | 185,00 |
| 01/10 · Padaria Lua · Azúcar 1kg | 25 × 5,20 | 130,00 |
| 02/10 · Mercado Sol · Azú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 |
Qué revisar en la tabla: por cliente, la misma cuenta da Mercado Sol 393,00 (185 + 208), Padaria Lua 352,00 (130 + 222) y Empório Mar 111,00. Al sumar los tres, 856,00 de nuevo. Cuando el puente lea los datos reales, haz lo mismo con tres o cuatro filas que puedas sumar.
Abre claude en la carpeta del kit y pega:
Use a tool resumo_vendas da ponte-modelo agrupando por cliente. Mostre a resposta da ferramenta sem arredondar e sem comentar.
💡 El cálculo a mano se convierte en tu prueba
Anota: "archivo de tal día, cliente X, valor Y". Eso es una prueba en el formato del kit, comando → salida esperada. En el módulo 3.4 entra en el goal y pasa a comprobarse automáticamente.
bastan tres líneas
el total de Sônia
número incorrecto sin error
comando → salida
Registra el puente en CAPACIDADES.md
La regla de runtime/CAPACIDADES.md aquí se aplica: el sistema sin línea no lo usa el agente. El puente solo se agrega al mapa después de tener el cálculo a mano y la fecha de la prueba.
El archivo ya incluye un ejemplo para el caso de Sônia, marcado como pendiente:
| ERP sem API | Exportação CSV diária | 6 | ler ~/erp/export/*.csv | ler (N4) | pendente |
Después de verificar la cuenta, la línea de Sônia queda así (sustituye los datos por los de tu prueba):
| ERP da distribuidora | Exportação CSV + ponte MCP | 6 | tool resumo_vendas da ponte-modelo | ler (N4) | <AAAA-MM-DD> ok |
pendente por la fecha con ok.Abre claude en la carpeta del kit y pega:
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 y mira la nueva fila en la tabla principal, con las seis columnas completas.Cómo leer el diagrama: los tres primeros pasos son técnicos; el cuarto (resaltado) es el que habilita el uso. Saltarte esa línea en el mapa es dejar que el agente use un sistema que nadie registró.
Prueba rápida (opcional): apuntaste el puente a la exportación del ERP y cambiaste las columnas. ¿Qué permite que el agente use el puente en el día a día?
sin línea, no se usa
pendiente pasa a ok
cómo llama el agente
la política de la fila
🎓 Resumen del módulo
Próximo módulo:
2.4 — Navegador con política