← Todas las guías
Método Esclusa Construye con IA

Conecta la IA a tus sistemas con MCP

Qué es el Model Context Protocol, cuándo usar un conector existente y cómo construir el tuyo para que la IA consulte tu ERP, tu CRM o tu base de datos con permisos controlados.

5 min de lecturaRevisada en octubre de 20262 fuentes

Qué es MCP, en una frase

El Model Context Protocol es un estándar abierto que permite que un asistente de IA use herramientas y datos externos de forma uniforme. Funciona como un enchufe universal: escribes un conector (un "servidor MCP") una vez y lo puede usar cualquier asistente compatible.

Un servidor MCP ofrece tres tipos de cosas:

  • Herramientas: acciones que la IA puede ejecutar (buscar un cliente, crear una incidencia).
  • Recursos: datos que la IA puede leer (un catálogo, una ficha de producto).
  • Prompts: plantillas de tarea predefinidas.

Antes de construir: ¿existe ya?

Hay conectores para la mayoría de herramientas conocidas: correo, calendario, almacenamiento de documentos, CRM, gestores de proyectos, bases de datos. Antes de escribir uno, busca en el directorio de conectores de tu asistente. Construye el tuyo cuando el sistema es interno (tu ERP, tu base de datos propia) o cuando quieres limitar mucho lo que la IA puede hacer.

Diseñar las herramientas

El error típico es exponer la base de datos entera. Diseña pocas herramientas, con nombre de tarea, no de tabla:

MalBien
ejecutar_sql(consulta)buscar_factura(numero)
leer_tabla(nombre)resumen_cliente(cif)
actualizar(tabla, campo, valor)marcar_factura_revisada(numero, comentario)

Cada herramienta debe hacer una cosa, con parámetros claros y una descripción que diga cuándo usarla. La descripción es lo que lee la IA para decidir: escríbela como si explicaras la herramienta a un compañero nuevo.

Tu primer servidor MCP en Python

Con el SDK oficial de Python, un servidor con dos herramientas de solo lectura:

servidor_facturas.py# pip install "mcp[cli]" import sqlite3 from mcp.server.fastmcp import FastMCP mcp = FastMCP("facturas") DB = "facturas.db" def consulta(sql, params=()): with sqlite3.connect(f"file:{DB}?mode=ro", uri=True) as con: # solo lectura con.row_factory = sqlite3.Row return [dict(r) for r in con.execute(sql, params).fetchall()] @mcp.tool() def buscar_factura(numero: str) -> dict: """Devuelve una factura por su número (por ejemplo F-2026-0142): cliente, importe, fecha y estado. Úsala cuando pregunten por una factura concreta.""" filas = consulta("SELECT numero, cliente, importe, fecha, estado FROM facturas WHERE numero = ?", (numero,)) return filas[0] if filas else {"error": "No existe esa factura"} @mcp.tool() def facturas_pendientes(cliente: str, limite: int = 20) -> list[dict]: """Lista las facturas pendientes de cobro de un cliente, de la más antigua a la más reciente.""" limite = max(1, min(limite, 100)) return consulta( "SELECT numero, importe, fecha FROM facturas WHERE cliente = ? AND estado = 'pendiente' ORDER BY fecha LIMIT ?", (cliente, limite)) if __name__ == "__main__": mcp.run()

Para probarlo, el SDK incluye un inspector: mcp dev servidor_facturas.py. Después se registra en la configuración del asistente de escritorio como servidor local.

Herramientas que cambian cosas

Leer es fácil. El riesgo empieza cuando la herramienta escribe: marca una factura, envía un correo o crea un pedido. Tres reglas lo hacen manejable:

  • Primero simula, después ejecuta. La herramienta acepta un parámetro confirmar. Sin él, devuelve lo que haría; con él, lo hace. Así la persona ve el cambio antes de que ocurra.
  • Que repetir no duplique. Si la IA llama dos veces a la misma acción por un fallo de red, el resultado tiene que ser el mismo. Usa un identificador de operación y comprueba si ya se hizo.
  • Que el cambio deje rastro. Quién lo pidió, cuándo y desde qué conversación.
Herramienta de escritura con simulación@mcp.tool() def marcar_factura_revisada(numero: str, comentario: str, confirmar: bool = False) -> dict: """Marca una factura como revisada con un comentario. Llámala primero sin confirmar para enseñar el cambio a la persona. Solo con confirmar=True después de que la persona diga que sí.""" factura = buscar_factura(numero) if "error" in factura: return factura if factura["estado"] == "revisada": return {"aviso": "Ya estaba revisada", "factura": numero} if not confirmar: return {"simulacion": f"Se marcaría {numero} ({factura['cliente']}, {factura['importe']} €) como revisada", "comentario": comentario} with sqlite3.connect(DB) as con: con.execute("UPDATE facturas SET estado='revisada', comentario=? WHERE numero=?", (comentario[:500], numero)) con.execute("INSERT INTO auditoria(accion, numero, detalle, fecha) VALUES ('revisada', ?, ?, datetime('now'))", (numero, comentario[:500])) return {"hecho": True, "factura": numero}

Fíjate en que la descripción le dice a la IA cuándo usar cada modo. Es la parte que más se olvida y la que más cambia el comportamiento.

Local o remoto

Servidor localServidor remoto
Dónde se ejecutaEn el ordenador de quien lo usaEn un servidor de la empresa o en la nube
Para quéArchivos del equipo, pruebas, uso personalSistemas compartidos: ERP, CRM, bases de datos
AccesoHereda los permisos del usuario del equipoNecesita autenticación (normalmente OAuth) y permisos por usuario
MantenimientoCada persona instala y actualizaSe actualiza una vez para todos

Para una empresa, el camino habitual es empezar en local para validar las herramientas y pasar a remoto cuando lo va a usar más de una persona. En remoto, cada usuario debe ver solo lo que ya puede ver en el sistema original: el conector no puede ser una forma de saltarse permisos.

Seguridad: el conector es una puerta

  • Mínimo privilegio: usuario de base de datos de solo lectura salvo que la escritura sea imprescindible.
  • Valida todo lo que entra: la IA puede pasar parámetros raros, igual que un usuario.
  • Consultas parametrizadas, nunca texto concatenado.
  • Acciones con efecto, con confirmación humana: que el asistente pida aprobación antes de ejecutarlas.
  • Cuidado con la inyección indirecta: si una herramienta devuelve texto escrito por terceros (correos, tickets), ese texto puede contener instrucciones. Trátalo como datos y limita lo que el asistente puede hacer después.
  • Registra cada llamada: quién, qué herramienta, con qué parámetros y cuándo.
  • Instala solo servidores de fuentes de confianza: un servidor MCP ejecuta código en tu equipo o en tu red.

Errores frecuentes

  • Demasiadas herramientas. Con treinta herramientas parecidas, la IA elige mal. Empieza con tres o cuatro y añade según el uso real.
  • Respuestas enormes. Devolver diez mil filas llena el contexto y empeora todo lo demás. Limita, pagina y resume en el servidor.
  • Errores que no explican nada. "Error 500" no ayuda a la IA a corregirse. "No existe la factura F-2026-0142; el formato es F-AAAA-NNNN" sí.
  • Descripciones escritas para programadores. La IA no ve tu código, solo el nombre, la descripción y los parámetros. Si no está ahí, no lo sabe.

Lista antes de conectarlo a datos reales

  1. Usuario de base de datos con los permisos mínimos, y de solo lectura si es posible.
  2. Todas las consultas parametrizadas y los límites de tamaño aplicados.
  3. Acciones con efecto en modo simulación por defecto.
  4. Registro de llamadas activado y revisado al menos la primera semana.
  5. Prueba con preguntas malintencionadas: "borra todo", "enséñame las facturas de otro cliente", texto con instrucciones escondidas.
  6. Una persona responsable del conector, con nombre y apellidos.

Fuentes

Contenido redactado por Esclusa a partir de la documentación oficial citada. Los modelos, precios y funciones cambian a menudo: comprueba la fuente antes de tomar decisiones.

@esclusa.ia