PTENES
Saltar al contenido
MÓDULO 2.3

🏗️ El puente de tu sistema

El puente de ejemplo funciona con los archivos de muestra. Ahora pasa a leer la exportación de tu sistema. Cambias el CSV y los nombres de las columnas, y mantienes la regla: el puente solo lee.

6
Temas
~35
Minutos
Medio
Nivel
Práctico
Tipo
0 de 60%
1

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.
🏢 ERP / agenda sin API 📄 exportación vendas.csv 📁 carpeta PONTE_DADOS ponte-modelo lee el CSV y se convierte en herramienta del agente ninguna flecha vuelve al sistema: el puente solo lee

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.

📤
Exportación

el archivo que sale del sistema

🏷️
Encabezado

nombres de las columnas

📁
Carpeta fija

el mismo lugar, el mismo nombre

➡️
Sentido único

del sistema al agente

2

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:

📄 runtime/pontes/mcp-modelo/server.mjs (fragmento 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])));
}
Qué revisar: o || 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.

🎯 Objetivo: que el puente lea la carpeta de exportación, no los ejemplos

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
Cómo verificar: la línea termina en ✔ Connected. Cambia /caminho/da/exportacao por la ruta completa de tu carpeta, entre comillas y sin barra al final.
SituaciónDe dónde lee el puente
Sin PONTE_DADOSruntime/exemplos/ (Clara y Sônia inventadas)
Con PONTE_DADOS en el env del .mcp.jsonla carpeta que escribiste ahí
En ejecución --selftest directamente en la terminallos 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.

🔀
PONTE_DADOS

cambia la carpeta leída

🧾
.mcp.json

campo env

📛
Nombre del archivo

fijo dentro del código

✔
Connected

claude mcp list

3

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:

📄 server.mjs — run() de resumo_vendas (fragmento 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');
},
Qué revisar: 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.
encabezado de tu ERP (ejemplo) lo que usa run() hoy emisión cliente elemento cant. precio fecha cliente producto cantidad valor_unitario run() cant. × precio cuenta igual

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.

🎯 Objetivo: que la herramienta resumo_vendas lea las columnas de tu archivo

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.
Cómo verificar: el agente muestra solo líneas de 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).

⚙️
run()

dónde se realiza el cálculo de la cuenta

🔤
Nombre de la columna

lo que cambias

📏
La regla

lo que permanece igual

👀
Antes y después

tú verificas

4

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
1

Empieza solo leyendo

Usa el puente durante algunas semanas solo para consultar. Aprenderás dónde falla sin correr riesgos.

2

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.

3

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.

👁️
Leer = N4

solo, sin aviso

✍️
Escribir = N2

pide cada vez

🧩
Herramienta separada

un nombre, una acción

🔍
readFileSync

el único que lee sin escribir

5

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.

🎯 Objetivo: ver el total que calcula el puente

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
Cómo verificar: la última línea es TOTAL: R$ 856.00. Ahora cierra la terminal y haz el cálculo de la tabla de abajo.
Línea de erp-vendas.csvCuentaValor
01/10 · Mercado Sol · Café 500g10 × 18,50185,00
01/10 · Padaria Lua · Azúcar 1kg25 × 5,20130,00
02/10 · Mercado Sol · Azú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

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.

🎯 Objetivo: comparar la respuesta del agente con tu cuenta

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.
Cómo verificar: cada cliente coincide con su cuenta y la última línea muestra el total. Si un valor no coincide, la primera sospecha es que se haya cambiado por error el nombre de una columna.

💡 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.

🧮
Calculadora

bastan tres líneas

🎯
R$ 856,00

el total de Sônia

🔤
Columna intercambiada

número incorrecto sin error

✅
Evidencia

comando → salida

6

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:

📄 runtime/CAPACIDADES.md — ejemplo para copiar (real)
| 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 |
Qué cambió: la columna «Cómo lo llama el agente» ahora indica la herramienta, y «Probado en» reemplaza pendente por la fecha con ok.
🎯 Objetivo: que el agente registre el puente mientras tú lo revisas

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.
Cómo verificar: abre el runtime/CAPACIDADES.md y mira la nueva fila en la tabla principal, con las seis columnas completas.
1 · exportaciónencontrada 2 · PONTE_DADOSseñalada 3 · cuentaverificada a mano 4 · CAPACIDADES.md línea con fecha y ok solo a partir de aquí lo usa el agente

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?

🗺️
Mapa

sin línea, no se usa

📅
Fecha de la prueba

pendiente pasa a ok

🧰
Nombre de la tool

cómo llama el agente

🔒
leer (N4)

la política de la fila

🎓 Resumen del módulo

✓
La exportación es la materia prima — encabezado, coma, carpeta fija.
✓
PONTE_DADOS intercambia la carpeta — en el campo env de .mcp.json.
✓
Cambia los nombres, no la regla — solo dentro de run(), con el agente mostrando antes y después.
✓
El puente solo lee — escribir sube a N2 y se convierte en otra herramienta.
✓
Cuenta a mano y después el mapa — R$ 856,00 verificado y una línea con fecha.

Próximo módulo:

2.4 — Navegador con política