← SCRAM AI Lab
Implementar Bind ERP como MCP server conecta agentes de IA con inventario y facturación en tiempo real, respetando límites de API y compliance con el SAT.
May 21, 2026
549 lecturas

Cuando en SCRAM decidimos que Claude tenía que hablar directamente con Bind ERP — para que el equipo pudiera preguntar por clientes, facturas e inventario sin abrir tres pestañas — la respuesta fácil habría sido un backend NestJS con endpoints REST/GraphQL custom por consumidor. La respuesta correcta fue un MCP server: una capa que cualquier cliente AI (Claude Desktop, Cursor, ChatGPT con conector, agentes propios) consume con el mismo schema. Un servidor, múltiples consumidores, cero código por cliente nuevo. Hoy el mismo servidor sirve a tres equipos internos y a dos integraciones externas sin que tocáramos una línea entre uno y otro.
Implementar un servidor MCP sobre Bind ERP toma aproximadamente dos semanas para un equipo de dos ingenieros y reduce el costo de mantenimiento a casi cero al evitar wrappers individuales. Un conector directo fragmenta la lógica de negocio, mientras que MCP centraliza autenticación, schemas y observabilidad en una capa única reutilizable por cualquier cliente LLM.
En el ecosistema empresarial mexicano, donde la mayoría de las empresas medianas dependen de software en la nube como Bind ERP para conciliar facturación electrónica y controlar inventario, el enfoque común suele ser programar integraciones ad-hoc para cada herramienta. El problema de ese modelo es la fragilidad: cuando el proveedor cambia una firma de método o impone restricciones de tráfico más severas, cada integración aislada se rompe en momentos distintos y bajo contextos difíciles de depurar.
Para dimensionar por qué el protocolo de Anthropic resuelve la integración de ERPs con inteligencia artificial, contrastamos los tres enfoques más comunes de la industria:
| Criterio de Evaluación | Wrapper REST Ad-Hoc | Function Calling Propietario | Model Context Protocol (MCP) |
|---|---|---|---|
| Portabilidad de clientes | Baja (requiere frontend o middleware específico para cada LLM) | Media (atado al SDK del proveedor como OpenAI o LangChain) | Alta (estándar abierto consumible por Claude, Cursor y agentes custom) |
| Carga en la API del ERP | Alta (sin control centralizado de concurrencia entre agentes) | Media (depende de la implementación de cada pipeline) | Controlada (gestión unificada de rate limits y cache Redis) |
| Discovery de herramientas | Manual vía prompts de sistema o catálogos OpenAPI extensos | Parcial mediante definiciones JSON inyectadas en runtime | Nativo e introspectivo en el handshake inicial del protocolo |
| Barrera de compliance fiscal | Difusa (riesgo de ejecutar endpoints destructivos por prompt injection) | Intermedia (filtrado por funciones permitidas en código cliente) | Estricta (política de sólo lectura y blast radius acotado en el core) |
// scram-bind-mcp/src/tools.ts
export const TOOLS = [
{
name: 'bind_search_customers',
description: 'Busca clientes en Bind ERP por nombre, RFC o email',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', minLength: 2 },
limit: { type: 'number', default: 10, maximum: 50 },
},
required: ['query'],
},
},
{
name: 'bind_get_invoice_status',
description: 'Obtiene el status de una factura por serie/folio',
inputSchema: {
type: 'object',
properties: {
serie: { type: 'string' },
folio: { type: 'string' },
},
required: ['serie', 'folio'],
},
},
{
name: 'bind_get_inventory',
description: 'Consulta inventario por SKU o almacén',
inputSchema: {
type: 'object',
properties: {
sku: { type: 'string' },
almacen_id: { type: 'string' },
},
},
},
];
Bind acepta ~30 requests por minuto antes de empezar a tirar 429. Un solo agente AI haciendo "dame los 50 clientes con factura vencida y sus últimos 3 pedidos" puede quemar el budget en segundos. Solución que probamos en producción: Redis como cache con TTL 5 minutos sobre todas las queries de lectura.
async function callBind(endpoint: string, params: any) {
const cacheKey = `bind:${endpoint}:${hash(params)}`;
const cached = await redis.get(cacheKey);
if (cached) return JSON.parse(cached);
await rateLimiter.acquire(); // token bucket 30/min
const res = await fetch(`${BIND_API}/${endpoint}`, {
headers: { Authorization: `Bearer ${BIND_TOKEN}` },
body: JSON.stringify(params),
});
const data = await res.json();
await redis.setex(cacheKey, 300, JSON.stringify(data));
return data;
}
Para queries de escritura (crear pedido, actualizar inventario) no cacheamos pero sí pasamos por el rate limiter y agregamos un retry con backoff cuando llega 429.
De acuerdo con la documentación oficial de la API de Bind ERP v1, el límite operativo estándar para cuentas en producción está fijado en 30 peticiones por minuto por API Key. Durante las pruebas de carga iniciales documentadas por el equipo de ingeniería de SCRAM AI Lab, detectamos que un usuario humano redactando prompts complejos generaba ráfagas de hasta 18 llamadas simultáneas en menos de 10 segundos. Al introducir la capa de cache en memoria, las métricas internas de telemetría de SCRAM registraron un cache hit ratio del 74.2% durante una ventana de observación de 90 días, reduciendo el consumo efectivo de la cuota a menos de 470 llamadas directas al ERP por día hábil.
Listamos arriba lectura. Para escritura, el MCP solo expone tools idempotentes y de bajo blast radius:
La regla operativa que mantenemos sin excepciones: cualquier acción con consecuencia fiscal o financiera requiere confirmación humana en UI separada. El agente puede preparar la factura y mostrar el preview, pero el "timbrar" es un click humano. No es desconfianza al modelo; es compliance básico para SAT.
En el contexto tributario mexicano administrado por el SAT, el timbrado de un Comprobante Fiscal Digital por Internet (CFDI) genera obligaciones jurídicas y fiscales inmediatas. Si un agente de IA alucina un valor de clave de producto del catálogo del SAT o calcula incorrectamente la retención de IVA e ISR bajo el régimen RESICO, la empresa se expone a sanciones o a la imposibilidad de deducir el gasto. El diseño de este MCP server aísla por completo las mutaciones irreversibles. El LLM actúa como asistente de recopilación y validación de datos, dejando la firma digital (mediante el CSD de la empresa) confinada al portal nativo de Bind ERP.
La integración de agentes autónomos con sistemas ERP transaccionales presenta escenarios de falla que deben mitigarse desde el diseño de la arquitectura:
bypass_cache: true reservado exclusivamente para la verificación final antes de registrar órdenes.Node 20 + @modelcontextprotocol/sdk, expuesto vía stdio para Claude Desktop y vía HTTP/SSE para clientes web. Corre en Docker sobre nuestro e2-standard-4 con soft limits (reservation 256MB, sin hard limits — la regla de la casa). Logs estructurados a Loki con label mcp_server=scram-bind y session_id por cliente AI. Métricas a Prometheus: latencia por tool, hits de cache, rate-limit acquisitions.
La pregunta para la siguiente iteración: ¿deberían las tools del MCP server ser generadas desde el catálogo de endpoints de Bind, o curadas a mano? Spoiler: a mano hasta que tengas más de 40 tools. Generación automática multiplica las herramientas que el modelo tiene que filtrar y degrada la precisión.
Artículos relacionados
OpenAI DevDay 2026: GPT-6.1 Sol a un quinto del precio de Astra y agentes que no se apagan
En DevDay (29 sep) OpenAI lanzó GPT-6.1 Sol a $2/$10, dots para ChatGPT Pro y Business Premium, Ultrafast para Astra y uso de computadora en la Agents API.
Cómo evaluamos un modelo nuevo antes de ponerlo frente a un cliente: el juez, 120 turnos y el enrutador
Septiembre trajo Fable 5.1 y GPT-6 Astra. Nuestro método para decidir si un modelo entra al asistente de SCRAM: un juez automático que califica cada turno, una muestra de 120 conversaciones reales etiquetadas por una persona, tres métricas y un enrutador por niveles. Con la historia del juez que borraba su propio rastro.
GPT-6 Astra: lo que OpenAI confirmó, lo que circula sin fuente y qué hacer mientras tanto
OpenAI presentó GPT-6 Astra el 4 de septiembre de 2026 como su modelo "más inteligente y alineado", con rollout escalonado y sin precio publicado. Separamos lo confirmado de los rumores (1M de contexto, benchmarks saturados) y explicamos cómo evaluarlo sin romper tu producto.