Turso Cloud
Integra con bases de datos Turso para LLMs, con un sistema de autenticación de dos niveles para operaciones seguras.
Documentación
mcp-turso-cloud
Un servidor de Model Context Protocol (MCP) que proporciona integración con bases de datos Turso para LLMs. Este servidor implementa un sistema de autenticación de dos niveles para manejar operaciones tanto a nivel de organización como a nivel de base de datos, facilitando la gestión y consulta de bases de datos Turso directamente desde LLMs.
Características
🏢 Operaciones a Nivel de Organización
- Listar Bases de Datos: Ver todas las bases de datos en tu organización Turso
- Crear Base de Datos: Crear nuevas bases de datos con opciones personalizables
- Eliminar Base de Datos: Eliminar bases de datos de tu organización
- Generar Token de Base de Datos: Crear tokens de autenticación para bases de datos específicas
💾 Operaciones a Nivel de Base de Datos
- Listar Tablas: Ver todas las tablas en una base de datos específica
- Ejecutar Consulta de Solo Lectura: Ejecutar consultas SELECT y PRAGMA (operaciones de solo lectura)
- Ejecutar Consulta: Ejecutar consultas SQL potencialmente destructivas (INSERT, UPDATE, DELETE, etc.)
- Describir Tabla: Obtener información del esquema para tablas de bases de datos
- Búsqueda Vectorial: Realizar búsqueda de similitud vectorial usando extensiones vectoriales de SQLite
⚠️ IMPORTANTE: Seguridad en la Ejecución de Consultas ⚠️
Este servidor implementa una separación centrada en la seguridad entre operaciones de base de datos de solo lectura y destructivas:
- Usa
execute_read_only_querypara SELECT, WITH/VALUES de solo lectura, EXPLAIN de lecturas, y PRAGMAs de metadatos en lista permitida. - Usa
execute_querypara INSERT, UPDATE, DELETE, CREATE, DROP, PRAGMAs de mutación, y otras operaciones que modifican datos.
Las herramientas de lectura siempre solicitan credenciales de solo lectura de Turso,
incluso cuando ya hay clientes de acceso completo en caché. El endpoint de token
recibe authorization=read-only
como parámetro de consulta. Los fallos de lectura nunca recurren al acceso completo.
Los tokens y clientes se almacenan en caché por separado según el permiso y se
renuevan cuando los tokens expiran.
La validación SQL local rechaza múltiples declaraciones, PRAGMAs de mutación en la ruta de lectura, y funciones de archivo/extensión. Es una verificación de enrutamiento conservadora, no un analizador SQL completo ni un sustituto de la autorización del lado del servidor de Turso. Los nombres de PRAGMA desconocidos o entre comillas requieren la herramienta de escritura. Las declaraciones compuestas que contienen puntos y comas internos (como definiciones de disparadores) no son compatibles. Los identificadores en SQL generado se citan; los valores de datos usan enlaces.
Esta separación permite diferentes niveles de permiso y requisitos de aprobación:
- Las operaciones de solo lectura pueden aprobarse automáticamente en muchos contextos
- Las operaciones destructivas pueden requerir aprobación explícita por seguridad
¡SIEMPRE LEE Y REVISA CUIDADOSAMENTE LAS CONSULTAS SQL ANTES DE APROBARLAS! Esto es especialmente crítico para operaciones destructivas que pueden modificar o eliminar datos. Tómate el tiempo para entender qué hace cada consulta antes de permitir que se ejecute.
Sistema de Autenticación de Dos Niveles
El servidor implementa un sistema de autenticación sofisticado:
-
Autenticación a Nivel de Organización
- Usa un token de API de la Plataforma Turso
- Gestiona bases de datos y operaciones a nivel de organización
- Se obtiene a través del panel de control de Turso
-
Autenticación a Nivel de Base de Datos
- Usa tokens específicos de la base de datos
- Se generan automáticamente usando el token de organización
- Se almacenan en caché por rendimiento y se rotan según sea necesario
Configuración
Este servidor requiere configuración a través de tu cliente MCP. Aquí hay ejemplos para diferentes entornos:
Configuración de Cline/Claude Desktop
Añade esto a tu configuración MCP de Cline/Claude Desktop:
{
"mcpServers": {
"mcp-turso-cloud": {
"command": "npx",
"args": ["-y", "mcp-turso-cloud"],
"env": {
"TURSO_API_TOKEN": "your-turso-api-token",
"TURSO_ORGANIZATION": "your-organization-name",
"TURSO_DEFAULT_DATABASE": "optional-default-database"
}
}
}
}
Claude Desktop con Configuración WSL
Para entornos WSL, añade esto a tu configuración de Claude Desktop:
{
"mcpServers": {
"mcp-turso-cloud": {
"command": "wsl.exe",
"args": [
"bash",
"-c",
"TURSO_API_TOKEN=your-token TURSO_ORGANIZATION=your-org node /path/to/mcp-turso-cloud/dist/index.js"
]
}
}
}
Variables de Entorno
El servidor requiere las siguientes variables de entorno:
TURSO_API_TOKEN: Tu token de API de la Plataforma Turso (requerido)TURSO_ORGANIZATION: El nombre de tu organización Turso (requerido)TURSO_DEFAULT_DATABASE: Base de datos predeterminada a usar cuando no se especifica ninguna (opcional)TOKEN_EXPIRATION: Tiempo de expiración para tokens de base de datos generados (opcional, predeterminado: '7d')TOKEN_PERMISSION: Nivel de permiso para tokens generados (opcional, predeterminado: 'full-access')
API
El servidor implementa Herramientas MCP organizadas por categoría:
Herramientas de Organización
list_databases
Lista todas las bases de datos en tu organización Turso.
Parámetros:
limit(entero, opcional): Resultados máximos, predeterminado 1000, máximo 10000offset(entero, opcional): Resultados a omitir, predeterminado 0, máximo 1000000
Las respuestas incluyen pagination con returned_count, has_more, y
next_offset.
Ejemplo de respuesta:
{
"databases": [
{
"name": "customer_db",
"id": "abc123",
"region": "us-east",
"created_at": "2023-01-15T12:00:00Z"
},
{
"name": "product_db",
"id": "def456",
"region": "eu-west",
"created_at": "2023-02-20T15:30:00Z"
}
]
}
create_database
Crea una nueva base de datos en tu organización.
Parámetros:
name(cadena, requerido): Nombre para la nueva base de datosgroup(cadena, opcional): Grupo al que asignar la base de datosregions(cadena[], opcional): Regiones donde implementar la base de datos
Ejemplo:
{
"name": "analytics_db",
"group": "production",
"regions": ["us-east", "eu-west"]
}
delete_database
Elimina una base de datos de tu organización.
Parámetros:
name(cadena, requerido): Nombre de la base de datos a eliminar
Ejemplo:
{
"name": "test_db"
}
generate_database_token
Genera un nuevo token para una base de datos específica. La expiración se
configura a través de TOKEN_EXPIRATION; el JWT devuelto es un secreto.
Parámetros:
database(cadena, requerido): Nombre de la base de datospermission(cadena, opcional): Nivel de permiso ('full-access' o 'read-only')
Ejemplo:
{
"database": "customer_db",
"permission": "read-only"
}
Herramientas de Base de Datos
Los nombres de bases de datos se limitan a 1–64 letras, dígitos, guiones bajos o guiones. Los identificadores de tabla/columna aceptan 1–64 caracteres, excluyendo bytes nulos; la puntuación y las comillas se escapan de forma segura. Una base de datos proporcionada se convierte en el contexto actual solo después de que su operación tenga éxito.
list_tables
Lista todas las tablas en una base de datos, con metadatos de paginación.
Parámetros:
database(cadena, opcional): Nombre de la base de datos (usa el contexto si no se proporciona)limit(entero, opcional): Resultados máximos, predeterminado 1000, máximo 10000offset(entero, opcional): Resultados a omitir, predeterminado 0, máximo 1000000
Ejemplo:
{
"database": "customer_db"
}
execute_read_only_query
Ejecuta una consulta SELECT, WITH/VALUES de solo lectura, EXPLAIN de una lectura, o PRAGMA de metadatos en lista permitida contra una base de datos.
Parámetros:
query(cadena, requerido): Una declaración SQL, máximo 10000 caracteresparams(objeto, opcional): Parámetros nombrados o claves posicionales contiguas que comienzan en"1"; los valores deben ser cadenas, números finitos, booleanos o nulosdatabase(cadena, opcional): Nombre de la base de datos (usa el contexto si no se proporciona)limit(entero, opcional): Filas máximas, predeterminado 1000, máximo 10000offset(entero, opcional): Filas a omitir, predeterminado 0, máximo 1000000
Las consultas de estilo SELECT se envuelven con un límite/desplazamiento externo,
preservando cualquier límite ya presente en tu SQL. Los resultados de PRAGMA de
metadatos y EXPLAIN se dividen después de la obtención. Usa un ORDER BY
estable al paginar. Las respuestas conservan result.rows y añaden metadatos
pagination.
Las filas de resultados de consulta y los nombres de columnas tienen un presupuesto
JSON de 512 KiB. Si una fila no cabe, selecciona menos columnas o columnas más
pequeñas (por ejemplo, substr).
result.truncated y truncation_reason explican los resultados omitidos;
next_offset es nulo cuando ninguna fila cabe. Los BigInt son cadenas decimales
y los blobs son { "type": "blob", "base64": "..." }.
Ejemplo:
{
"query": "SELECT * FROM users WHERE age > ?",
"params": { "1": 21 },
"database": "customer_db"
}
execute_query
Ejecuta una consulta SQL potencialmente destructiva (INSERT, UPDATE, DELETE, CREATE, etc.) contra una base de datos.
Parámetros:
query(cadena, requerido): Una declaración de escritura, máximo 10000 caracteres; incluye PRAGMAs de mutación y escrituras con prefijo WITHparams(objeto, opcional): Mismos tipos de parámetros que la herramienta de lecturadatabase(cadena, opcional): Nombre de la base de datos (usa el contexto si no se proporciona)
Ejemplo:
{
"query": "INSERT INTO users (name, age) VALUES (?, ?)",
"params": { "1": "Alice", "2": 30 },
"database": "customer_db"
}
Las filas de resultados de escritura (como RETURNING) están limitadas a 1000
filas y al mismo presupuesto de bytes. rowsAffected permanece intacto. La
truncación no deshace la escritura: no vuelvas a ejecutar una escritura para obtener
filas omitidas.
describe_table
Obtiene información del esquema para una tabla.
Parámetros:
table(cadena, requerido): Nombre de la tabladatabase(cadena, opcional): Nombre de la base de datos (usa el contexto si no se proporciona)
Ejemplo:
{
"table": "users",
"database": "customer_db"
}
vector_search
Realiza búsqueda de similitud vectorial usando extensiones vectoriales de SQLite.
Parámetros:
table(cadena, requerido): Nombre de la tablavector_column(cadena, requerido): Columna que contiene vectoresquery_vector(número[], requerido): 1–4096 números finitoslimit(entero, opcional): Resultados máximos, predeterminado 10, máximo 1000database(cadena, opcional): Nombre de la base de datos (usa el contexto si no se proporciona)
Ejemplo:
{
"table": "embeddings",
"vector_column": "embedding",
"query_vector": [0.1, 0.2, 0.3, 0.4],
"limit": 5,
"database": "vector_db"
}
Desarrollo
Configuración
Usa Node.js 24.15.0 o más reciente y pnpm 12.5.1 (fijado en
package.json). .node-version selecciona el entorno de ejecución de desarrollo.
pnpm install
pnpm check
pnpm test
Vite+ proporciona la compilación, formato, linting, verificación de tipos y ejecutor
de pruebas a través de vite.config.ts:
pnpm build— agrupa el ejecutable y las declaraciones endist/pnpm start— ejecuta el servidor compilado con tu configuración de Tursopnpm dev— recompila ante cambios en el código fuentepnpm inspect— abre el inspector MCP contra el servidor compiladopnpm check— verifica formato, lint y tipospnpm check:fix— aplica formato y correcciones de lint seguraspnpm format/pnpm format:check— formatea o verifica el formatopnpm test— compila y ejecuta pruebas offline de SQL, permisos, tokens, manejadores MCP y CLI; no se necesitan credenciales de Turso ni acceso a bases de datos en vivo. Las pruebas de ejecución SQL usan una base de datos libSQL aislada en memoria.
Las versiones de dependencias viven en el catálogo pnpm-workspace.yaml. Las nuevas
versiones deben tener al menos dos días de antigüedad antes de instalarse.
Editores
Instala la extensión Oxc en Zed o el Vite Plus Extension
Pack en VS Code. Los .zed/settings.json y
.vscode/settings.json incluidos usan Oxfmt con la configuración de formato
compartida vite.config.ts. La configuración de Prettier ya no se usa.
Publicación
pnpm changeset
pnpm version
pnpm check
pnpm test
pnpm release
pnpm release compila y publica a través de Changesets. pnpm pack
puede verificar el paquete localmente sin publicar.
Solución de Problemas
Problemas con el Token de API
Si encuentras errores de autenticación:
- Verifica que tu token de API de Turso sea válido y tenga los permisos necesarios
- Comprueba que el nombre de tu organización sea correcto
- Asegúrate de que tu token no haya expirado
Problemas de Conexión a la Base de Datos
Si tienes problemas para conectarte a las bases de datos:
- Verifica que la base de datos exista en tu organización
- Comprueba que tu token de API tenga acceso a la base de datos
- Asegúrate de que el nombre de la base de datos esté escrito correctamente
Contribuciones
¡Las contribuciones son bienvenidas! No dudes en enviar una Solicitud de Extracción.
Licencia
Licencia MIT: consulta el archivo LICENSE para más detalles.
Agradecimientos
Construido sobre: