top of page

Servidor MCP para Oracle: Un Primer Paso hacia la Colaboración IA-Datos con Enfoque Humano-Céntrico

  • Foto del escritor: MAURICIO ARIAS MELO
    MAURICIO ARIAS MELO
  • 29 abr
  • 11 Min. de lectura

Introducción

En el panorama actual de la tecnología, la integración de la inteligencia artificial con bases de datos corporativas es un factor clave para impulsar la innovación. Sin embargo, lograr que modelos de IA trabajen directamente con bases de datos Oracle de gran tamaño plantea desafíos de complejidad y seguridad. En **MAWESI** creemos en una tecnología que pone lo humano en el centro, asegurando que las soluciones técnicas potencien a las personas. Con esta visión en mente, nuestro equipo ha desarrollado un servidor MCP (Model Context Protocol) para Oracle como su primera contribución open source, combinando un enfoque técnico riguroso con un estilo corporativo claro. A continuación, exploraremos los detalles de este proyecto, desde la arquitectura y las herramientas implementadas, hasta cómo se alinea con nuestra misión de acercar la IA a los datos de manera segura, estructurada y centrada en las personas.


¿Qué es el Protocolo MCP (Model Context Protocol)?

El Model Context Protocol (MCP) es un estándar abierto que permite a asistentes de IA y otras aplicaciones cliente interactuar con recursos (como bases de datos) de forma estructurada y segura. En términos sencillos, MCP define una interfaz común para que los modelos de lenguaje puedan consultar información de contexto – por ejemplo, detalles de la estructura de una base de datos o resultados de una consulta – sin necesidad de acceder directamente ni conocer los detalles internos del sistema subyacente. Esto crea una capa de abstracción que facilita la comunicación entre la IA y recursos corporativos, asegurando al mismo tiempo control y seguridad.


En el contexto de bases de datos Oracle, un servidor MCP actúa como puente: recibe peticiones en formato MCP de un modelo de IA o herramienta compatible, ejecuta las operaciones necesarias en Oracle, y devuelve la respuesta en un formato estandarizado. De esta manera, un asistente de IA puede, por ejemplo, solicitar el esquema de una tabla o ejecutar una consulta, y obtener la información sin salirse de su entorno conversacional o de desarrollo. MAWESI se suma a la comunidad de este protocolo abierto con una implementación propia enfocada en Oracle, reafirmando nuestro compromiso con soluciones interoperables y centradas en las necesidades humanas y empresariales.



Arquitectura del Servidor MCP para Oracle


Nuestro servidor MCP para Oracle ha sido diseñado con una arquitectura modular y robusta, pensando en entornos corporativos de alta exigencia. Los componentes principales son:


- Servidor MCP base: Es el núcleo de la aplicación, implementado en TypeScript utilizando el SDK de Model Context Protocol. Este servidor se identifica con un nombre y versión (por ejemplo, `"oracle-mcp-server" v0.1.0`) y expone un conjunto de *herramientas* y *recursos* conforme al estándar MCP. El servidor MCP base actúa como intérprete de las solicitudes MCP entrantes, mapeándolas a operaciones en la base de datos Oracle. Al iniciarse, registra todas las herramientas disponibles (consultas, gestión de usuarios, etc.) y prepara la información de capacidades (qué puede hacer y qué recursos ofrece).


- Pool de conexiones a Oracle: Para manejar eficientemente las operaciones contra la base de datos, el servidor utiliza un pool de conexiones Oracle. Esto significa que mantiene un conjunto de conexiones abiertas reutilizables, evitando el costo de abrir/cerrar conexiones para cada petición. En nuestra implementación, el pool se configura con parámetros optimizados para entornos típicos: un mínimo de 1 conexión y máximo de 5 conexiones simultáneas, creciendo de una en una según demanda. Además, incorpora un tiempo de espera de 60 segundos para conexiones inactivas (liberándolas automáticamente) y un timeout de cola de 60000 ms para cualquier solicitud que espere por una conexión libre. Estos valores buscan un balance entre rendimiento y conservación de recursos. A continuación podemos ver un fragmento de código de la inicialización del pool de conexiones:


```typescript
// Inicialización del pool de conexiones Oracle
pool = await oracledb.createPool({
  user: user,
  password: password,
  connectString: `${host}:${port}/${serviceName}`,
  poolMin: 1,        // Número mínimo de conexiones
  poolMax: 5,        // Número máximo de conexiones
  poolIncrement: 1,  // Nuevas conexiones a crear al saturar las existentes
  // poolTimeout: 60,   // Tiempo (s) de inactividad antes de liberar una conexión
  queueTimeout: 60000, // Tiempo (ms) máximo en cola esperando conexión
  enableStatistics: true // Habilita métricas del pool para monitoreo
});
console.log("Pool de conexiones Oracle creado con éxito");
```

- Gestión de conexiones (utilidad interna): Sobre el pool, construimos una función utilitaria `withConnection` que se encarga de simplificar y asegurar el uso de las conexiones. Esta función solicita una conexión al pool, ejecuta la operación deseada y luego garantiza la liberación adecuada de la conexión en un bloque `finally`, incluso si ocurre un error. Este patrón de diseño asegura que no queden conexiones abiertas indebidamente, contribuyendo a la estabilidad del servidor a largo plazo:


```typescript
async function withConnection<T>(callback: (connection: oracledb.Connection) => Promise<T>): Promise<T> {
  let connection: oracledb.Connection | undefined;
  try {
    connection = await pool.getConnection();
    return await callback(connection);
  } catch (err) {
    console.error("Database operation error:", err);
    throw err;  // Propaga el error para manejo externo
  } finally {
    if (connection) {
      try {
        await connection.close();
      } catch (closeErr) {
        console.error("Error al cerrar la conexión:", closeErr);
      }
    }
  }
}
```

Esta arquitectura permite que el servidor responda rápidamente a las solicitudes de la IA, manteniendo la escalabilidad al reutilizar conexiones y preservando la confiabilidad gracias al manejo cuidadoso de recursos.



Herramientas Implementadas en el Servidor MCP


Una de las fortalezas de nuestra implementación es el conjunto de herramientas MCP que ofrece para interactuar con la base de datos Oracle. Estas herramientas encapsulan operaciones comunes de administración y consulta de la base de datos, exponiéndolas de forma estandarizada a través del protocolo MCP. Actualmente, el servidor incluye las siguientes herramientas:


- `query`: Permite ejecutar consultas SQL de solo lectura (por ejemplo, sentencias `SELECT`). Esta herramienta está pensada para recuperar datos **sin modificar** la base de datos.

- `execute`: Diseñada para ejecutar sentencias de modificación de datos o estructura (DDL/DML) como `CREATE TABLE`, `INSERT`, `UPDATE`, `DELETE`, etc. Es la vía para realizar cambios en la base de datos de manera controlada.

- `check_user_exists`: Verifica si un usuario específico existe en la base de datos Oracle. Es útil antes de crear un nuevo usuario o asignar permisos, evitando intentos redundantes o errores por duplicados.

- `create_user`: Crea un nuevo usuario de base de datos Oracle con una contraseña dada, asignándole tablespaces por defecto (`USERS` para datos y `TEMP` para temporales, configurables). Internamente, antes de la creación realiza una comprobación con `check_user_exists` para asegurar que el usuario no exista ya.

- `grant_privileges`: Otorga una lista de privilegios a un usuario existente. Por ejemplo, se puede usar para conceder permisos como `CREATE SESSION` o `CREATE TABLE` a un usuario recién creado. La herramienta procesa cada privilegio individualmente y reporta cuáles se otorgaron con éxito y cuáles pudieron haber fallado (con sus errores), brindando un detalle exhaustivo.

- `get_table_data`: Recupera datos de muestra de una tabla dada, hasta un número máximo de filas especificado (por defecto 10). Esto permite a la IA obtener un vistazo del contenido de una tabla para entender mejor los datos, sin volcar toda la información. Incluye lógica para determinar automáticamente el esquema (owner) de la tabla y asegurar que no se sobrepasen límites de filas.


Cada herramienta define su esquema de entrada (*input schema*) con los parámetros necesarios (como `sql` para `query/execute`, `username` para herramientas de usuario, etc.), garantizando que las solicitudes estén bien formadas. En tiempo de ejecución, el servidor MCP recibe una petición indicando el nombre de la herramienta y los argumentos, y despacha la operación correspondiente en Oracle.



Aspectos Técnicos Destacados


Además de la arquitectura general y las herramientas ofrecidas, vale la pena resaltar algunos aspectos técnicos de implementación que aportan valor al proyecto:


- Transacciones seguras para consultas: La herramienta `query` se ejecuta envolviendo la consulta en una transacción de solo lectura. Esto significa que antes de ejecutar el `SELECT`, se establece la sesión en modo *READ ONLY*. Como medida adicional, tras obtener los datos se fuerza un `ROLLBACK` para asegurarse de que no queden transacciones abiertas ni bloqueos residuales en la base de datos. Este patrón garantiza que las operaciones de lectura no tengan efectos colaterales. Por ejemplo, en el código simplificado a continuación vemos cómo se aplica esta lógica:


  ```typescript
  return await withConnection(async (connection) => {
    try {
      await connection.execute("SET TRANSACTION READ ONLY");  // Inicio de transacción solo lectura
      const result = await connection.execute(sql, [], { maxRows: 1000 });
      return {
        content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }],
        isError: false
      };
    } finally {
      // Rollback para limpiar cualquier contexto de transacción
      try {
        await connection.execute("ROLLBACK");
      } catch (err) {
        console.error("Error durante ROLLBACK:", err);
      }
    }
  });
  ```

En este fragmento, `result.rows` contendrá hasta 1000 filas de la consulta, que luego se convierten a JSON para ser entregadas de vuelta a través del MCP. El uso de `finally` asegura el ROLLBACK ocurra siempre, independientemente de errores en la consulta.


- Autocommit para cambios y manejo de errores detallado: Para la herramienta `execute`, que realiza cambios en la base de datos, la implementación opta por habilitar el auto-commit. Esto significa que cada sentencia DDL/DML se confirma automáticamente si se ejecuta con éxito, evitando transacciones pendientes. En caso de error (por ejemplo, sintaxis incorrecta o violación de restricciones), el servidor captura la excepción y construye una respuesta estructurada con detalles del problema. Esta respuesta incluye el mensaje de error de Oracle, el código de error (`errorNum`) y hasta una sugerencia específica cuando es posible. Por ejemplo, si falla una sentencia SQL, la sugerencia genérica es "Verifique la sintaxis SQL y los permisos". Este nivel de detalle facilita que un asistente de IA (o un desarrollador) puedan diagnosticar rápidamente qué salió mal y cómo corregirlo.


- Gestión de usuarios y privilegios paso a paso: Las herramientas de administración (`create_user` y `grant_privileges`) están implementadas con cuidado para manejar casos particulares. `create_user` comprueba la existencia previa del usuario y crea la cuenta ejecutando comandos Oracle estándar (`CREATE USER` seguido de `ALTER USER` para asignar tablespace y cuota). Por su parte, `grant_privileges` valida que el usuario exista antes de otorgar derechos, y luego recorre cada privilegio de la lista aplicando `GRANT`. Cualquier fallo en un privilegio no detiene el proceso de los siguientes, de modo que se obtenga un reporte completo de qué se otorgó y qué no. Así, el servidor ofrece respuestas granulares; por ejemplo, podría indicar que de 5 privilegios solicitados, 4 se asignaron correctamente y 1 falló por falta de autorización, detallando ese único error.


- Recursos de esquema de tablas: Más allá de las herramientas activas, el servidor expone la estructura de las tablas Oracle como *recursos* accesibles vía MCP. Un recurso es esencialmente una URL estandarizada que representa un objeto, en este caso el esquema (definición) de una tabla. La forma de estos URIs es:

```

oracle://usuario@host:puerto/servicio/NOMBRE_TABLA/schema

```

Cuando un cliente (humano o IA) accede a esa URI a través de MCP, el servidor responde con la información de columnas, tipos de datos, claves primarias y foráneas de la tabla especificada. Esto enriquece el contexto que la IA puede obtener, permitiéndole comprender las relaciones de datos sin necesidad de realizar múltiples preguntas. La implementación interna construye estos recursos omitiendo información sensible (como contraseñas en la cadena de conexión) y consultando las vistas de diccionario de Oracle (`ALL_TABLES`, `ALL_TAB_COLUMNS`, etc.) según sea necesario.


En conjunto, estos aspectos técnicos aseguran que nuestro servidor MCP para Oracle no solo cumpla con su función, sino que lo haga de manera eficiente, segura y amigable para la IA que interactúe con él. Todo el código fuente está escrito en TypeScript, lo que aporta tipado estático y claridad, y está disponible públicamente en nuestro repositorio de GitHub para consulta y colaboración (ver sección de Referencias).



Consideraciones de Seguridad


La seguridad es una prioridad en cualquier entorno corporativo, y este proyecto incorpora varias medidas para garantizar un uso seguro de la base de datos Oracle a través del protocolo MCP:


- Ejecución en modo lectura cuando corresponde: Las consultas (`SELECT`) se ejecutan bajo transacciones de solo lectura, previniendo modificaciones accidentales en la base de datos al usar la herramienta `query`.

- Rollback automático: Tras cada operación de consulta o en situaciones de error, el servidor realiza un `ROLLBACK` automáticamente. Esto evita que queden cambios pendientes o transacciones abiertas, manteniendo la base de datos en un estado consistente incluso si algo falla durante la interacción.

- Exclusión de credenciales en respuestas: Las URIs y mensajes devueltos nunca incluyen la contraseña u otros datos sensibles. Por ejemplo, la construcción de la URL base para recursos utiliza `oracle://usuario@host:puerto/servicio` (omitiendo la contraseña), de modo que no se expone información de autenticación en ningún momento.

- Límites en los resultados: Se establecen topes en la cantidad de filas que una consulta puede retornar (por defecto 1000 filas para `query` y configurable vía parámetro `limit` para `get_table_data`). Estos límites protegen contra sobrecarga accidental, evitando respuestas excesivamente grandes que podrían saturar a la IA cliente o el canal de comunicación.

- Manejo de errores con orientación: Cuando ocurre un error (ya sea en una consulta malformada, un permiso denegado, o una operación DDL fallida), el servidor responde marcando el campo `isError: true` y proporcionando detalles del error. Siempre que es posible, incluye también una sugerencia de acción correctiva. Esta transparencia ayuda a los usuarios (humanos o modelos de IA supervisados por humanos) a entender la causa y tomar medidas, en lugar de dejar la falla en silencio.


Cabe destacar que, si bien el servidor permite ejecutar comandos de modificación (como crear usuarios o tablas), su uso está pensado para entornos controlados y usuarios autorizados. Recomendamos desplegarlo en redes internas seguras y, de ser necesario, extender la capa de seguridad con autenticación a nivel de la propia API MCP o restricciones adicionales según las políticas de la organización.



Interoperabilidad con Asistentes de IA (Claude, ChatGPT, Copilot, etc.)


Uno de los objetivos principales de implementar este servidor MCP es facilitar la colaboración entre asistentes de IA y bases de datos corporativas. Gracias a adherirse al estándar MCP, nuestro servidor puede integrarse *sin fricciones* con diversas herramientas de IA que soporten este protocolo.


Por ejemplo, Claude (el modelo de IA de Anthropic) puede conectarse a un servidor MCP para consultar información de la base de datos durante una conversación. Imaginemos un escenario donde un analista le pregunta a Claude: ¿Cuáles son las columnas de la tabla de ventas y algunos ejemplos de datos?. Con el servidor Oracle MCP en marcha, Claude podría invocar internamente las herramientas `get_table_data` o acceder al recurso de esquema correspondiente, y luego responder al analista con los detalles precisos. Todo esto ocurre de forma segura, ya que Claude no ejecuta SQL arbitrario por sí solo, sino que solicita al servidor MCP la acción permitida y recibe solo los datos pertinentes.


De igual forma, ChatGPT u otros asistentes compatibles podrían aprovechar esta integración. De hecho, el diseño sigue lineamientos similares a los utilizados por GitHub Copilot (especialmente en su versión Copilot for Business en VSCode) para proveer contexto de bases de datos a desarrolladores. La estandarización que ofrece MCP implica que herramientas como Copilot pueden "instalar" nuestro servidor Oracle MCP como fuente de conocimiento de base de datos, accediendo a las mismas herramientas (`query`, `get_table_data`, etc.) para ayudar al programador en tiempo real con información actualizada del esquema o datos de ejemplo.


La interoperabilidad lograda significa que no estamos creando una solución aislada, sino una que se conversa con el ecosistema de IA existente. En MAWESI, vemos esto como un puente entre la experiencia humana (por ejemplo, hacer preguntas relevantes de negocio) y la potencia de la IA conectada a datos reales. El hecho de liberar este proyecto como open source refuerza esa visión colaborativa: invitamos a la comunidad a probarlo, integrarlo con sus asistentes de preferencia, e incluso contribuir a mejorarlo.



Conclusión


La implementación de un servidor MCP para Oracle que presentamos es más que un logro técnico; es un paso significativo hacia una nueva forma de interacción entre la IA y las bases de datos corporativas. Con un tono técnico pero toques corporativos, hemos cuidado que cada detalle – desde la estructura de código en TypeScript hasta la documentación y la seguridad – refleje la excelencia y valores de MAWESI: innovación abierta, foco en las personas y soluciones confiables para la empresa.


Invitamos a desarrolladores, ingenieros de datos y entusiastas de la IA a explorar el código (disponible en nuestro [repositorio de GitHub](https://github.com/MAWESI-SAS/ORACLE_MCP)) y unirse a esta iniciativa. Creemos firmemente que la colaboración entre humanos e inteligencia artificial puede revolucionar la forma en que explotamos nuestros datos, y este proyecto sienta las bases para ello en el mundo Oracle.


_Mensaje Final:_ En MAWESI afrontamos el futuro con optimismo. Visualizamos un entorno donde los asistentes de IA trabajan codo a codo con los expertos humanos, simplificando la obtención de información y amplificando la capacidad de toma de decisiones. Al poner lo humano en el centro de la tecnología, nos aseguramos de que innovaciones como este servidor MCP no solo automaticen tareas, sino que empoderen a las personas para lograr más. El futuro de la colaboración entre IA y bases de datos corporativas es prometedor, y este es tan solo el comienzo de lo que podemos alcanzar juntos.


Comments


bottom of page