termal.in

← Blog

Deja que Claude Code y Cursor consulten tu base de datos (con seguridad) — la configuración MCP

· Termalin Team claude-codecursormcpdatabasetutorial

Un agente que puede leer tu base de datos responde preguntas para las que, si no, abrirías un editor de SQL. «¿Por qué cayeron los registros el martes?» «¿Qué pedidos llevan atascados en pending más de una hora?» «¿Qué hay en realidad en la tabla events?» Con capacidad de consulta, el modelo responde en segundos; sin ella, adivina. La parte útil no es el SQL —Claude Code y Cursor ambos escriben SQL bien— es darle al agente una forma de ejecutar una lectura sin entregarle tus credenciales. Ese traspaso es toda la fricción, y es lo que este artículo recorre para ambas herramientas.

Hemos escrito aparte sobre por qué pegar una cadena de conexión a una base de datos en un agente es el movimiento que no puedes deshacer (en inglés) —la credencial es acceso al portador, puede escribir y borrar igual que leer, y una vez que ha pasado por el contexto de un modelo no puedes des-compartirla. Lee eso para el modelo de seguridad; aquí lo damos por zanjado y hacemos el cableado. La versión corta: el cliente guarda la credencial, el agente obtiene una petición acotada y de solo lectura por defecto.

Lo que necesitas

  • Termalin —la app de escritorio, el plan gratis sirve. Es un cliente SSH y de base de datos con un servidor MCP integrado; ese servidor local es con el que hablará tu agente.
  • Al menos una conexión a base de datos guardada en el cliente Data de Termalin —Postgres, MySQL, SQLite, SQL Server, ClickHouse, MongoDB, Redis y más. Elige algo de bajo riesgo para la primera prueba: una réplica de analítica, una base de datos de staging, una copia.
  • Claude Code o Cursor en la misma máquina que la app. Las herramientas de base de datos conducen la app de escritorio en vivo, así que el agente y la app comparten máquina.

Una expectativa que dejar clara: para Claude Code y Cursor, el acceso a base de datos pasa por el servidor MCP local por stdio, así que el agente tiene que estar en la misma máquina que tu app de escritorio desbloqueada. (También hay una ruta alojada —el servidor MCP alojado, termal.in/mcp con un inicio de sesión para claude.ai, ChatGPT, Claude Code y Cursor, o termal.in/api/v1/mcp con una clave API, puede consultar las bases de datos de un servidor dado de alta sin contraseña, usando la propia confianza local de la base de datos del servidor, sin ninguna app de escritorio en marcha. Para las conexiones guardadas en el cliente Data de la app de escritorio, el servidor local es el que quieres.)

Paso 1 — activa el acceso del agente a los datos

Esto está desactivado por defecto, y a propósito. Abre Ajustes → Agente y activa Let agents query your databases (permitir que los agentes consulten tus bases de datos). El subtítulo deletrea la postura: desactivado por defecto, y se mantiene en solo lectura salvo que una conexión conceda acceso completo. Hasta que lo actives, cada herramienta de base de datos devuelve database access for agents is off — enable it in Settings → Agent, y punto.

Dos valores por defecto que vale la pena interiorizar antes de seguir:

  • Es un segundo opt-in, encima de la app en marcha. Activar el acceso del agente a los servidores no activa el acceso a las bases de datos —este es su propio interruptor. Nada se expone hasta que tomas la decisión.
  • Cada conexión es de solo lectura para el agente. Incluso con el interruptor maestro activado, cada consulta se comprueba antes de ejecutarse. Una escritura solo pasa si has elevado la política del agente de esa conexión concreta a acceso completo —una elección por conexión, no global. Déjala en solo lectura por ahora.

La credencial en sí nunca se mueve: el host, el puerto y la contraseña de la conexión se quedan en la bóveda de la app, y el agente solo llega a pedirle a la app en marcha que ejecute una consulta y devuelva filas. No hay cadena de conexión en un archivo de configuración que el agente —o una inyección de prompt— pueda leer.

Paso 2 — registra el servidor MCP local

Claude Code —un comando:

claude mcp add termalin -- <path>/termalin-mcp

Reemplaza <path> por donde viva el binario termalin-mcp (la app puede indicártelo). Reinicia Claude Code y recoge las herramientas.

Cursor —Cursor lee los servidores MCP de un archivo JSON: .cursor/mcp.json en la raíz de un proyecto solo para ese proyecto, o ~/.cursor/mcp.json para que el servidor esté disponible en todas partes. Para un servidor local stdio, la entrada es un comando y sus argumentos:

{
  "mcpServers": {
    "termalin": {
      "command": "<path>/termalin-mcp",
      "args": []
    }
  }
}

El archivo global es la opción sensata —el acceso a base de datos no es un asunto por repo. Reinicia Cursor (o recarga la lista de MCP en su configuración) y confirma que el servidor aparece como en marcha. Este es el mismo registro que usan el recorrido de Cursor SSH y el de Claude Code (en inglés) —un servidor, y ahora lleva las herramientas de base de datos junto a las de SSH.

Paso 3 — las herramientas, y una primera tarea de verdad

Con el servidor registrado y el interruptor activado, el agente ve cuatro herramientas de base de datos:

data_list     # tus conexiones guardadas: id, nombre, motor, y si el agente puede escribir
data_tables   # tablas / colecciones / mediciones de una conexión, con conteos de filas
data_schema   # columnas de una tabla: nombre, tipo, nullable, clave primaria
data_query    # ejecuta una consulta en el propio lenguaje de la conexión; tope por defecto 200 filas

Reflejan cómo explorarías una base de datos a mano: lista lo que está conectado, ve las tablas, describe una tabla, ejecuta la consulta. data_query habla lo que hable la conexión —SQL para los motores relacionales y ClickHouse, Cypher para Neo4j, un comando de Redis, un collection {filter} para MongoDB— y devuelve filas hasta un tope que puedes subir por llamada (maxRows), con 200 por defecto para que un agente no pueda arrastrar sin querer un millón de filas a su contexto.

Ahora dale una pregunta que harías de verdad, no una consulta de demostración:

Los registros cayeron el martes según el panel. Usando la base de datos de analítica, averigua qué pasó.

Observa al agente trabajar las herramientas en orden:

  1. data_list —encuentra tu conexión analytics, ve que el motor es Postgres, y anota que es de solo lectura para el agente.
  2. data_tables —lista las tablas, detecta signups y signup_events, y lee los conteos de filas para saber qué vale la pena consultar.
  3. data_schema sobre signups —aprende las columnas (created_at, source, status, …) y ahora sabe cómo trocear por día y por fuente.
  4. data_query —ejecuta algo como SELECT date_trunc('day', created_at) AS day, source, count(*) FROM signups WHERE created_at >= now() - interval '10 days' GROUP BY 1, 2 ORDER BY 1 y lee las filas de vuelta.

Las filas cuentan la historia —quizá una source se fue a cero el martes (un enlace de referido roto), quizá el total se mantuvo pero status = 'failed' se disparó (una caída del proveedor). Sea como sea, el agente formó su consulta a partir del esquema real, no de una suposición, y nunca sostuvo nada más que la capacidad de preguntar. Si un resultado se trunca en el tope de 200 filas, lo dice y acota la consulta en vez de forzar por más.

Dónde están los límites

Breve, porque el artículo de seguridad (en inglés) lo cubre a fondo —pero los valores por defecto en los que te apoyas:

  • Solo lectura por defecto. En los motores de la familia SQL solo pasan verbos de lectura —SELECT, SHOW, DESCRIBE, EXPLAIN, WITH, PRAGMA. En Redis, solo comandos de lectura; en MongoDB, una agregación con $out/$merge queda bloqueada; en Neo4j, CREATE/MERGE/DELETE/SET/DROP quedan bloqueados. Un modelo confundido o secuestrado obtiene una lectura, no un DROP.
  • Por conexión, no global. Tu réplica de analítica es una decisión aparte de tu primaria de producción; elevar una a acceso de escritura completo no toca la otra.
  • Se desactiva con un solo interruptor, y la app guarda la credencial —nunca se compartió nada, así que desactivarlo no deja copias ni contraseña que rotar.

Para cualquier cosa sensible, haz ambas: apunta la conexión Data a una réplica de lectura o a un rol de base de datos con mínimos privilegios y deja el agente en solo lectura. La barrera del lado del cliente atrapa los errores; el permiso de la base de datos pone el techo.

Notas por herramienta

  • Cursor pregunta antes de cada llamada a herramienta por defecto. Déjalo así para las primeras sesiones —verás cada data_query antes de que se ejecute y podrás leer el SQL que propone el agente. La aprobación automática es una comodidad para ampliar una herramienta cada vez: data_list y data_schema son seguras de dejar pasar primero, data_query la que conviene mantener en manual más tiempo.
  • Claude Code muestra cada llamada a herramienta en línea con sus argumentos, así que el texto de la consulta está en la transcripción antes de que se ejecute. Estás leyendo el SQL del agente, no fiándote de un resumen de él —y cada llamada se atribuye al agente, así que a las 2 de la madrugada puedes distinguir «esto lo leyó él» de «esto lo leí yo».

Dónde encaja Termalin

La mayoría de guías de «conecta tu agente a una base de datos» acaban en pegar una cadena de conexión en un archivo de configuración, lo que concede en silencio a un agente el mismo poder de escribir-y-borrar que tiene tu app. El cliente Data de Termalin invierte eso: la app es el custodio, el agente obtiene cuatro herramientas acotadas conducidas a través de la ventana en marcha, y toda la capacidad es de solo lectura hasta que decides lo contrario y se desactiva con un solo interruptor. Es la misma idea de custodia que aplicamos al acceso SSH para agentes (en inglés) y a qué es en realidad un servidor MCP (en inglés) —una base de datos es solo la versión donde una escritura mala se mide en filas. Empieza con una conexión, mantenla en solo lectura, y pregunta algo real antes de plantearte ampliar nada.


Termalin es un cliente SSH y de base de datos gratis y multiplataforma con un servidor MCP integrado y una política de agente por conexión — descárgalo, o lee cómo maneja las credenciales de forma segura.

Pruébalo en un host.

Termalin es un cliente SSH rápido para ti y para tus agentes.

Plan gratuito · 14 días de Pro de prueba · precios