MCP para Integraciones Empresariales: Conecta tus Sistemas con IA
Model Context Protocol como capa de integracion empresarial. Como conectar CRMs, ERPs y bases de datos propias a Claude y GPT-4 sin reescribir tu stack. Con ejemplos en TypeScript.
TL;DR: El Model Context Protocol (MCP) permite que Claude y GPT-4 se conecten directamente a tus sistemas internos — CRM, ERP, base de datos propia — sin intermediarios. El patron correcto de implementacion empresarial reduce el tiempo de integracion de semanas a dias. Este post cubre arquitectura, seguridad, y ejemplos de codigo para integraciones de produccion.
Por Que MCP es la Capa de Integracion que Faltaba
Antes de MCP, conectar un asistente de IA a sistemas internos era un proyecto de meses: webhooks, middleware, parseo de respuestas en JSON arbitrario, mantenimiento de contexto entre llamadas. El resultado solian ser integraciones fragiles que se rompian con cada actualizacion del LLM.
MCP estandariza esa conexion. Define exactamente como un asistente de IA puede descubrir y usar herramientas externas, con que parametros, y como recibir respuestas estructuradas. Es la diferencia entre tener 10 adaptadores custom para cada sistema y tener un protocolo unico que todos entienden.
El protocolo fue creado por Anthropic para Claude, pero la adopcion fue mas rapida de lo esperado. OpenAI integro compatibilidad en GPT-4 en 2025. Google Gemini sigue el mismo camino. Un servidor MCP bien construido hoy funciona con los tres modelos principales.
Para desarrolladores que ya conocen el patron de distribucion de servidores MCP como herramienta de ventas, este post va un nivel mas abajo: arquitectura de produccion, seguridad, y como integrar sistemas internos complejos.
Arquitectura de un MCP Server Empresarial
Un MCP server en produccion tiene cuatro capas. Entender cada una antes de escribir una sola linea de codigo evita los errores mas costosos.
1. Transport layer
MCP soporta dos transportes: stdio (proceso local) y HTTP con SSE (Server-Sent Events). En contexto empresarial, casi siempre usas HTTP/SSE porque el servidor vive en tu infraestructura y multiples clientes se conectan a el.
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import express from "express";
const app = express();
const server = new Server(
{ name: "empresa-erp-mcp", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
app.get("/sse", async (req, res) => {
const transport = new SSEServerTransport("/messages", res);
await server.connect(transport);
});
app.post("/messages", async (req, res) => {
// handle incoming messages
});2. Tool definitions
Las herramientas son las operaciones que el asistente de IA puede ejecutar. En un contexto empresarial, cada herramienta mapea a una operacion especifica de tu sistema. El principio de minimo privilegio aplica aqui igual que en cualquier API interna.
import { z } from "zod";
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "buscar_cliente",
description: "Busca un cliente en el CRM por RUT, nombre o email",
inputSchema: {
type: "object",
properties: {
query: {
type: "string",
description: "RUT (12.345.678-9), nombre o email del cliente",
},
limit: {
type: "number",
description: "Numero maximo de resultados (default: 5, max: 20)",
default: 5,
},
},
required: ["query"],
},
},
{
name: "obtener_pedidos",
description: "Obtiene los pedidos de un cliente en un rango de fechas",
inputSchema: {
type: "object",
properties: {
cliente_id: { type: "string" },
fecha_desde: { type: "string", format: "date" },
fecha_hasta: { type: "string", format: "date" },
estado: {
type: "string",
enum: ["pendiente", "procesado", "enviado", "entregado"],
},
},
required: ["cliente_id"],
},
},
],
}));3. Tool execution layer
Aqui es donde ocurre la logica de negocio real. El handler recibe los parametros validados y ejecuta la operacion contra tu sistema.
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case "buscar_cliente": {
const { query, limit = 5 } = args as { query: string; limit?: number };
// Llamar a tu CRM o base de datos
const clientes = await crmClient.buscarCliente(query, Math.min(limit, 20));
return {
content: [
{
type: "text",
text: JSON.stringify(clientes, null, 2),
},
],
};
}
case "obtener_pedidos": {
const { cliente_id, fecha_desde, fecha_hasta, estado } = args as {
cliente_id: string;
fecha_desde?: string;
fecha_hasta?: string;
estado?: string;
};
const pedidos = await erpClient.getPedidos({
clienteId: cliente_id,
desde: fecha_desde ? new Date(fecha_desde) : undefined,
hasta: fecha_hasta ? new Date(fecha_hasta) : undefined,
estado,
});
return {
content: [{ type: "text", text: JSON.stringify(pedidos, null, 2) }],
};
}
default:
throw new Error(`Herramienta desconocida: ${name}`);
}
});4. Security layer
Esta es la capa que mas se omite en implementaciones iniciales y la que mas importa en produccion. Un MCP server empresarial expone operaciones sobre sistemas criticos. Sin los controles correctos, es una superficie de ataque.
Seguridad en MCP Servers Empresariales
Autenticacion del cliente MCP
El protocolo MCP no define autenticacion por defecto — es responsabilidad del implementador. En produccion, usa tokens JWT o API keys rotables con scope limitado.
import jwt from "jsonwebtoken";
// Middleware de autenticacion para Express
function authenticateMCP(req: express.Request, res: express.Response, next: express.NextFunction) {
const token = req.headers.authorization?.replace("Bearer ", "");
if (!token) {
return res.status(401).json({ error: "Token requerido" });
}
try {
const payload = jwt.verify(token, process.env.MCP_JWT_SECRET!) as {
sub: string;
scope: string[];
};
// El scope determina que herramientas puede usar este cliente
(req as express.Request & { mcpUser: typeof payload }).mcpUser = payload;
next();
} catch {
return res.status(401).json({ error: "Token invalido" });
}
}
app.use("/sse", authenticateMCP);
app.use("/messages", authenticateMCP);Validacion de inputs con Zod
Los parametros que llegan del asistente de IA son strings no confiables. Siempre validar con Zod antes de pasarlos a la base de datos o API interna.
const BuscarClienteSchema = z.object({
query: z.string().min(3).max(100).trim(),
limit: z.number().int().min(1).max(20).default(5),
});
case "buscar_cliente": {
const parsed = BuscarClienteSchema.safeParse(args);
if (!parsed.success) {
return {
content: [{ type: "text", text: `Parametros invalidos: ${parsed.error.message}` }],
isError: true,
};
}
// usar parsed.data con confianza
}Rate limiting y circuit breaker
Un asistente de IA puede ejecutar herramientas en loops. Sin rate limiting, un prompt mal diseñado puede saturar tu ERP con miles de llamadas.
import rateLimit from "express-rate-limit";
const mcpRateLimit = rateLimit({
windowMs: 60 * 1000, // 1 minuto
max: 100, // 100 llamadas por minuto por token
keyGenerator: (req) => {
return (req as express.Request & { mcpUser: { sub: string } }).mcpUser.sub;
},
message: { error: "Rate limit excedido. Reintenta en 1 minuto." },
});
app.use("/messages", mcpRateLimit);Descubre tu score de distribución
¿Qué tan bien distribuyes tu producto de IA?
Responde 7 preguntas en 3 minutos y obtén un diagnóstico personalizado con las estrategias exactas donde estás dejando revenue sobre la mesa.
Hacer el grader gratis →3 minutos · Resultados inmediatos · Sin tarjeta de crédito
Patrones de Integracion por Tipo de Sistema
Integracion con bases de datos SQL (PostgreSQL/MySQL)
El patron mas comun en empresas chilenas: un MCP server que expone consultas read-only sobre la base de datos de produccion. El principio es que el asistente de IA nunca escribe directamente — pasa por validaciones de negocio.
import { Pool } from "pg";
const readonlyPool = new Pool({
connectionString: process.env.DATABASE_URL_READONLY,
max: 5, // limite bajo para pool readonly
});
async function ejecutarConsultaSegura(
query: string,
params: unknown[]
): Promise<unknown[]> {
// Solo permitir SELECT — nunca UPDATE, INSERT, DELETE, DROP
const queryNormalizado = query.trim().toUpperCase();
if (!queryNormalizado.startsWith("SELECT")) {
throw new Error("Solo se permiten consultas SELECT");
}
const result = await readonlyPool.query(query, params);
return result.rows;
}Integracion con REST APIs internas
Para sistemas con API REST interna (ERP, CRM, plataforma propia), el MCP server actua como un adaptador que traduce las capacidades del LLM al vocabulario de tu API.
import axios from "axios";
class ERPClient {
private client: ReturnType<typeof axios.create>;
constructor() {
this.client = axios.create({
baseURL: process.env.ERP_API_URL,
headers: {
Authorization: `Bearer ${process.env.ERP_API_KEY}`,
"Content-Type": "application/json",
},
timeout: 10000,
});
}
async getPedidos(params: PedidoQuery): Promise<Pedido[]> {
try {
const { data } = await this.client.get("/api/v2/pedidos", { params });
return data.items;
} catch (error) {
if (axios.isAxiosError(error)) {
throw new Error(`Error ERP: ${error.response?.data?.message ?? error.message}`);
}
throw error;
}
}
}Caso de Uso: Asistente de Atencion al Cliente con MCP
Un retailer con 40 tiendas implemento un asistente de atencion al cliente que usa Claude con dos MCP servers: uno para el CRM (historial de compras, puntos, reclamos) y otro para el inventario en tiempo real.
El flujo cuando un cliente escribe "cuales son los colores disponibles del modelo X y si tengo puntos para pagarlo sin costo":
- Claude identifica que necesita dos informaciones: inventario del modelo X y puntos del cliente
- Llama a la herramienta
consultar_inventariocon SKU del modelo - Llama a la herramienta
obtener_puntos_clientecon el RUT del cliente - Genera la respuesta combinando ambas respuestas en lenguaje natural
Sin MCP, ese flujo requeria que el agente de atencion al cliente navegara entre 2-3 sistemas distintos. Con MCP, Claude lo hace en 4-6 segundos con precision del 99%.
El tiempo promedio de resolucion de consultas bajo de 4.2 minutos a 38 segundos. NPS de atencion al cliente subio 22 puntos en 60 dias.
Deploy y Observabilidad en Produccion
Containerizacion con Docker
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]Logging estructurado para debug
Los MCP servers son cajas negras para el LLM — tienes que loguear todo para depurar comportamientos inesperados del asistente.
import pino from "pino";
const logger = pino({ level: process.env.LOG_LEVEL ?? "info" });
// En cada ejecucion de herramienta:
logger.info({
tool: name,
args: sanitizedArgs, // sin datos PII
duration_ms: Date.now() - startTime,
success: true,
result_count: Array.isArray(result) ? result.length : 1,
}, "tool_executed");Preguntas Frecuentes
Cual es la diferencia entre MCP y una integracion via function calling directo?
Function calling es el mecanismo del LLM para llamar funciones. MCP es el protocolo que estandariza como esas funciones se descubren y ejecutan. Con function calling sin MCP, cada integracion es ad-hoc: el schema de funciones vive en el prompt, la ejecucion es custom, el debugging es dificil. MCP estandariza todo eso y hace que la misma integracion funcione con Claude, GPT-4 y Gemini sin cambios.
Como manejar operaciones de escritura (no solo lectura) de forma segura?
Operaciones de escritura requieren validacion adicional antes de ejecutarse. El patron recomendado: 1) La herramienta retorna un preview de lo que va a hacer ("Voy a crear un pedido con estos datos..."), 2) el asistente le muestra el preview al usuario, 3) el usuario confirma, 4) se ejecuta la escritura. Nunca ejecutar operaciones destructivas sin confirmacion explicita del usuario humano.
MCP server puede conectarse a multiples sistemas a la vez?
Si, y es el patron correcto para contextos empresariales. Un solo MCP server puede exponer herramientas de CRM, ERP, base de datos y API externa simultaneamente. El asistente de IA elige que herramienta usar segun el contexto de la conversacion. La clave es que cada herramienta este bien documentada en su campo description — de eso depende que el LLM la seleccione correctamente.
Cuanto tarda construir un MCP server empresarial?
Un servidor basico con 3-5 herramientas read-only tarda 3-5 dias para un developer con experiencia en Node.js/TypeScript. Con operaciones de escritura, validaciones complejas e integracion con sistemas legacy: 2-3 semanas. El tiempo mas largo es entender el schema de los sistemas existentes, no el codigo MCP en si.
Como testear un MCP server antes de conectarlo a produccion?
Usa el MCP Inspector — una herramienta CLI oficial que simula un cliente MCP y permite testear herramientas interactivamente. Para tests automatizados, el SDK tiene utilities de testing que permiten mockear el transporte.
Mas recursos:
- Como construir un MCP server que distribuya tu producto
- Agentes de IA para empresas: casos reales en Chile
Newsletter gratuita
AI Distribution Weekly
Cada semana: una estrategia de distribución para AI builders con ejemplos reales de LATAM. Sin spam. Cancela cuando quieras.
Artículos relacionados
MCP vs API REST: Cuando Usar Cada Uno en tus Proyectos de IA
Guia practica para developers: cuando usar Model Context Protocol vs REST APIs en proyectos de IA. Comparativa tecnica, casos de uso y decision framework con ejemplos reales.
Como Construir un Servidor MCP que Venda tu Producto
Aprende a construir un servidor MCP que convierta asistentes de IA en vendedores 24/7. Un fintech logro 150+ instalaciones en 30 dias con $0 en ads.