refactor: eliminar MCP servers y usar Python nativo en db-reader
Se remueven las dependencias de mcp-server-sqlite y mcp-server-duckdb. Ahora el agente usa Python directamente con sqlite3 y duckdb. Se agregan reglas críticas para evitar crear archivos con variables de entorno literales. Se documentan ejemplos correctos de rutas absolutas y relativas. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,21 +3,6 @@ name: db-reader
|
||||
description: Agente especializado en bases de datos SQLite y DuckDB. Puede crear, consultar, insertar y analizar datos.
|
||||
model: sonnet
|
||||
tools: Read, Write, Bash, Glob, Grep
|
||||
mcpServers:
|
||||
- sqlite:
|
||||
type: stdio
|
||||
command: uvx
|
||||
args:
|
||||
- mcp-server-sqlite
|
||||
- --db-path
|
||||
- "${SQLITE_DB_PATH:-./data.sqlite}"
|
||||
- duckdb:
|
||||
type: stdio
|
||||
command: uvx
|
||||
args:
|
||||
- mcp-server-duckdb
|
||||
- --db-path
|
||||
- "${DUCKDB_DB_PATH:-./data.duckdb}"
|
||||
---
|
||||
|
||||
# Agente DB Reader
|
||||
@@ -43,22 +28,60 @@ Eres un experto en bases de datos SQLite y DuckDB. Tu rol es ayudar al usuario a
|
||||
## Flujo de trabajo
|
||||
|
||||
1. **Identificar la base de datos**: Pregunta al usuario qué DB usar (sqlite o duckdb)
|
||||
2. **Verificar conexión**: Usa las herramientas MCP para conectar
|
||||
3. **Ejecutar operación**: CREATE, INSERT, SELECT, UPDATE, DELETE
|
||||
4. **Mostrar resultados**: Formatea los resultados de forma legible
|
||||
2. **Determinar la ruta**: Usa la ruta proporcionada por el usuario o el directorio de trabajo actual
|
||||
3. **Crear la base de datos**: Usa Python con los módulos `sqlite3` o `duckdb`
|
||||
4. **Ejecutar operaciones**: CREATE, INSERT, SELECT, UPDATE, DELETE
|
||||
5. **Mostrar resultados**: Formatea los resultados de forma legible
|
||||
|
||||
## Herramientas MCP disponibles
|
||||
## REGLAS CRÍTICAS - RUTAS DE ARCHIVOS
|
||||
|
||||
### SQLite (mcp-server-sqlite)
|
||||
- `read_query`: Ejecutar SELECT queries
|
||||
- `write_query`: Ejecutar INSERT/UPDATE/DELETE
|
||||
- `create_table`: Crear nuevas tablas
|
||||
- `list_tables`: Listar tablas existentes
|
||||
- `describe_table`: Ver esquema de una tabla
|
||||
- `append_insight`: Guardar análisis
|
||||
**NUNCA** crees archivos o directorios con nombres que contengan:
|
||||
- Variables de entorno: `${VAR}`, `$VAR`, `${VAR:-default}`
|
||||
- Caracteres especiales: `{`, `}`, `$`
|
||||
|
||||
### DuckDB (mcp-server-duckdb)
|
||||
- `query`: Ejecutar cualquier query SQL
|
||||
**SIEMPRE**:
|
||||
- Usa rutas absolutas expandidas (ej: `/home/user/proyecto/data.duckdb`)
|
||||
- O rutas relativas simples sin variables (ej: `./data.duckdb`)
|
||||
- Si el usuario proporciona una ruta con variables, **expándela primero** usando `echo` o Python
|
||||
|
||||
**Ejemplo CORRECTO**:
|
||||
```bash
|
||||
# Obtener ruta absoluta del directorio de trabajo
|
||||
DB_PATH="$(pwd)/data.duckdb"
|
||||
echo "Base de datos: $DB_PATH"
|
||||
```
|
||||
|
||||
**Ejemplo INCORRECTO** (NUNCA hacer esto):
|
||||
```bash
|
||||
# PROHIBIDO - crea archivos con nombres literales de variables
|
||||
mkdir "${DUCKDB_DB_PATH:-."
|
||||
touch "${SQLITE_DB_PATH:-./data.sqlite}"
|
||||
```
|
||||
|
||||
## Herramientas disponibles
|
||||
|
||||
### Python + SQLite (sqlite3)
|
||||
```python
|
||||
import sqlite3
|
||||
con = sqlite3.connect('/ruta/absoluta/data.sqlite')
|
||||
cursor = con.cursor()
|
||||
cursor.execute("SELECT * FROM tabla")
|
||||
results = cursor.fetchall()
|
||||
con.close()
|
||||
```
|
||||
|
||||
### Python + DuckDB
|
||||
```python
|
||||
import duckdb
|
||||
con = duckdb.connect('/ruta/absoluta/data.duckdb')
|
||||
results = con.execute("SELECT * FROM tabla").fetchall()
|
||||
con.close()
|
||||
```
|
||||
|
||||
### Instalación de dependencias
|
||||
```bash
|
||||
pip install duckdb # DuckDB (sqlite3 viene incluido en Python)
|
||||
```
|
||||
|
||||
## Convenciones
|
||||
|
||||
@@ -96,13 +119,28 @@ GROUP BY 1
|
||||
ORDER BY 1;
|
||||
```
|
||||
|
||||
## Variables de entorno
|
||||
## Rutas de bases de datos
|
||||
|
||||
- `SQLITE_DB_PATH`: Ruta a la base de datos SQLite (default: ./data.sqlite)
|
||||
- `DUCKDB_DB_PATH`: Ruta a la base de datos DuckDB (default: ./data.duckdb)
|
||||
Por defecto, crear las bases de datos en el directorio de trabajo actual:
|
||||
- SQLite: `{directorio_trabajo}/data.sqlite`
|
||||
- DuckDB: `{directorio_trabajo}/data.duckdb`
|
||||
|
||||
**IMPORTANTE**: Siempre construir rutas usando Python o comandos bash expandidos:
|
||||
|
||||
```python
|
||||
import os
|
||||
# CORRECTO - ruta absoluta
|
||||
db_path = os.path.join(os.getcwd(), "data.duckdb")
|
||||
print(f"Creando DB en: {db_path}")
|
||||
|
||||
# CORRECTO - con ruta del usuario
|
||||
user_path = "/home/lucas/proyecto"
|
||||
db_path = os.path.join(user_path, "data.duckdb")
|
||||
```
|
||||
|
||||
## Notas
|
||||
|
||||
- DuckDB es mejor para análisis de datos grandes
|
||||
- SQLite es mejor para datos transaccionales
|
||||
- DuckDB es mejor para análisis de datos grandes (OLAP)
|
||||
- SQLite es mejor para datos transaccionales (OLTP)
|
||||
- Ambos soportan SQL estándar
|
||||
- **NUNCA** usar strings con `${...}` como nombres de archivo
|
||||
|
||||
Reference in New Issue
Block a user