PTENES
MÓDULO 4.2

🗄️ Consultor de bases de datos

Crea un MCP Server que se conecta a SQLite: el modelo consulta y manipula datos en lenguaje natural.

6
Temas
45
Minutos
Intermedio
Nivel
Práctico
Tipo
1

🗄️ SQLite y Python

O SQLite es una base de datos relacional integrada: no necesita un servidor independiente en ejecución ni instalación o configuración. Toda la base de datos vive en un único archivo .db. Python ya incluye el módulo sqlite3 en la biblioteca estándar, lo que significa cero dependencias externas. Es la elección perfecta para aprender y para proyectos locales.

💎 Concepto principal

SQLite es una base de datos serverless — a diferencia de PostgreSQL o MySQL, no se ejecuta como un servicio separado. Basta con hacer import sqlite3 y usar sqlite3.connect("meu_banco.db") para crear o abrir una base de datos. Todas las operaciones SQL funcionan con normalidad: CREATE TABLE, INSERT, SELECT, UPDATE, DELETE. El archivo .db es portátil: puedes copiarlo, versionarlo y compartirlo. Para nuestro MCP Server, eso significa que no necesitamos configurar infraestructura adicional.

📊 Datos e investigación

SQLite es el la base de datos más implementada del mundo — está presente en todos los smartphones (Android e iOS lo usan internamente), en todos los navegadores (Chrome, Firefox, Safari) y en miles de millones de dispositivos IoT. Aunque es "lite", admite bases de datos de hasta 281 terabytes y procesa millones de líneas sin problemas. Para proyectos locales y prototipos, es más que suficiente.

💡 Consejo práctico

Para verificar que todo funcione, abre la terminal de Python y prueba: import sqlite3; conn = sqlite3.connect(":memory:"); print("SQLite OK!"). O :memory: crea una base de datos temporal en la memoria, perfecta para pruebas rápidas. Si se ejecuta sin errores, ya tienes todo lo que necesitas para este módulo.

2

📊 Creación de la base de datos de ejemplo

Antes de crear las tools MCP, necesitamos una base de datos con datos de ejemplo para consultar. Vamos a crear un script de Python que inicializa una tabla de productos con campos prácticos e inserta datos realistas. Esa base de datos será el "playground" que Claude explorará mediante lenguaje natural.

💎 Concepto principal

La tabla productos tendrá 5 columnas: id (INTEGER PRIMARY KEY AUTOINCREMENT), nome (TEXT NOT NULL), preco (REAL NOT NULL), categoria (TEXT NOT NULL) y estoque (INTEGER DEFAULT 0). El SQL de creación: CREATE TABLE IF NOT EXISTS produtos (...). Usa IF NOT EXISTS para que el script pueda ejecutarse varias veces sin errores. Inserta al menos 10 productos de ejemplo con categorías variadas (Electrónica, Libros, Ropa, etc.) para que las consultas sean interesantes.

📋 Pasos para crear la base de datos
Paso 1: Crear el script

Crea un archivo criar_banco.py que importa sqlite3 y define la función de inicialización de la base de datos con la tabla produtos.

Paso 2: Insertar datos de ejemplo

Usa INSERT INTO con executemany() para insertar varios productos a la vez. Incluye variedad de precios, categorías y cantidades de stock.

Paso 3: Ejecutar y verificar

Ejecuta el script (python criar_banco.py), verifica que se haya creado el archivo .db y haz un SELECT de prueba para confirmar los datos.

💡 Consejo práctico

Siempre usa conn.commit() después de operaciones de escritura (INSERT, UPDATE, DELETE) y conn.close() al finalizar. Usa el gestor de contexto with sqlite3.connect("banco.db") as conn: para garantizar que la conexión se cierre automáticamente incluso si ocurre un error. Esto previene la corrupción de datos.

3

🔍 Tool: Consultar datos

La tool de consulta es el corazón de nuestro Consultor de Base de Datos. El usuario describe lo que quiere saber en lenguaje natural — "¿qué productos cuestan más de R$50?" — y Claude lo traduce en una llamada a la tool. La tool recibe una descripción de la consulta, construye el SQL SELECT adecuado y devuelve los resultados con formato.

💎 Concepto principal

La tool consultar(query_descricao: str) recibe una descripción en lenguaje natural de lo que el usuario quiere consultar. Un enfoque seguro es ofrecer consultas predefinidas: listar todos los productos, filtrar por categoría, buscar por rango de precios, verificar el inventario. Para cada tipo de consulta, la tool construye un SQL SELECT seguro con parámetros. Los resultados se presentan en una tabla legible con el nombre, el precio, la categoría y el inventario de cada producto encontrado.

❌ NUNCA lo hagas
  • •Concatenar directamente la entrada del usuario en el SQL
  • •f"SELECT * WHERE nome = '{input}'"
  • •Ejecutar SQL arbitrario sin validación
  • •Confiar en que el modelo siempre genera SQL seguro
✅ Haz siempre
  • •Usar queries parametrizadas con placeholders (?)
  • •cursor.execute("SELECT * WHERE nome = ?", (input,))
  • •Validar y sanitizar cualquier entrada antes de usarla
  • •Limitar las operaciones a SELECT (solo lectura)
4

📝 Tool: insertar y actualizar

Además de consultar, nuestro servidor también permitirá que Claude agrega nuevos productos e actualiza datos existentes. Estas tools de escritura necesitan una validación rigurosa de los datos antes de ejecutar cualquier operación en la base de datos y siempre deben confirmar el resultado de la operación.

💎 Concepto principal

La tool inserir_produto(nome: str, preco: float, categoria: str, estoque: int = 0) valida que el precio sea positivo y que el nombre no esté vacío, después ejecuta un INSERT parametrizado. La tool atualizar_produto(id: int, nome: str = None, preco: float = None, categoria: str = None, estoque: int = None) busca el producto por ID, actualiza solo los campos proporcionados y confirma la operación. Ambas usan conn.commit() para guardar los cambios y devolver un mensaje claro de éxito o error.

💡 Consejo práctico

Siempre valida los datos antes de ejecutar el SQL. Verifica: ¿el precio es mayor que cero? ¿El nombre no está vacío? ¿El ID existe en la base de datos? ¿El inventario no es negativo? Estas validaciones simples evitan datos inconsistentes y devuelven mensajes de error útiles para que Claude se los muestre al usuario, en lugar de excepciones crípticas de la base de datos.

🚨 Alerta

Operaciones de escritura en la base de datos (INSERT, UPDATE, DELETE) son irreversibles después del commit. A diferencia del JSON, donde puedes restaurar fácilmente una versión anterior, los cambios en SQLite son permanentes. Considera implementar un mecanismo de confirmación: la tool primero muestra lo que va a hacer y solo lo ejecuta cuando el usuario confirma. Para proyectos de aprendizaje esto no es crítico, pero es una buena práctica.

5

🛡️ Seguridad: SQL Injection

SQL Injection es una de las vulnerabilidades más peligrosas en aplicaciones que usan bases de datos, y en los servidores MCP el riesgo es aún mayor porque el modelo de IA puede generar inadvertidamente entradas que exploten esta vulnerabilidad. Este tema es absolutamente crítico: entender y prevenir la inyección SQL es obligatorio para cualquier desarrollador que trabaje con bases de datos.

💎 Concepto principal

SQL Injection ocurre cuando los datos proporcionados por el usuario (o por el modelo) se insertan directamente en una cadena SQL, lo que permite ejecutar comandos SQL maliciosos. En un servidor MCP, el modelo de IA recibe la entrada del usuario y la reenvía a las tools; si el modelo envía algo como "; DROP TABLE produtos; -- como nombre de producto y la tool lo concatena directamente en SQL, el resultado es la destrucción de toda la tabla. La defensa es simple y absoluta: SIEMPRE usa consultas parametrizadas con placeholders ?.

🚨 CRÍTICO — Lee con atención

NUNCA, bajo ninguna circunstancia concatena cadenas directamente en consultas SQL. No importa si "parece seguro" o si "el modelo no enviaría eso": los modelos de IA son impredecibles y pueden generar cualquier texto, incluidos payloads de SQL Injection. Un MCP Server con SQL Injection es una puerto abierto para destruir datos. Siempre usa cursor.execute("SELECT * FROM produtos WHERE nome = ?", (nome,)) — el placeholder ? garantiza que el valor se trate como dato, nunca como código SQL.

❌ VULNERABLE — Nunca lo hagas
  • •f"SELECT * FROM produtos WHERE nome = '{nome}'"
  • •"INSERT INTO produtos VALUES ('" + nome + "')"
  • •query = "DELETE WHERE id = " + str(id)
  • •Cualquier forma de concatenación de strings con SQL
✅ SEGURO — Hazlo siempre así
  • •cursor.execute("SELECT * WHERE nome = ?", (nome,))
  • •cursor.execute("INSERT INTO ... VALUES (?, ?)", (n, p))
  • •cursor.execute("DELETE WHERE id = ?", (id,))
  • •Siempre usa placeholders (?) + tupla de valores
6

🧪 Consultas a través de Claude

Ahora viene la parte más satisfactoria: probar el Consultor de Banco de Datos con preguntas en lenguaje natural. Claude traducirá automáticamente las solicitudes del usuario en llamadas a las tools correctas y presentará los resultados de forma clara y amigable. Aquí es donde realmente brilla la magia de MCP.

💎 Concepto principal

Configura el servidor en Claude Desktop y empieza a conversar con naturalidad. Claude analizará cada solicitud, decidirá qué tool llamar y con qué parámetros, ejecutará la consulta en la base de datos y presentará los resultados en lenguaje natural. No necesitas saber SQL: el modelo hace la traducción por ti. Todo gracias al MCP, que conecta la capacidad lingüística del modelo con la potencia de la base de datos.

📋 Escenarios de prueba sugeridos
Consulta sencilla

"¿Qué productos cuestan más de R$50?" — Claude debe llamar a la tool de consulta y formatear la lista de productos con un precio superior a 50.

Inserción de producto

"Agrega un producto llamado 'Teclado Mecânico' en la categoría Eletrônicos, con un costo de R$299,90 y 15 unidades en stock." — Debe llamar a inserir_produto.

Consulta agregada

"¿Cuál es el inventario total por categoría?" — Claude debe consultar los datos y presentar un resumen agrupado por categoría.

Actualización

"Actualiza el precio del producto ID 3 a R$89,90." — Debe llamar a atualizar_produto con los parámetros correctos.

💡 Consejo práctico

Prueba preguntas cada vez más complejas para probar los límites de tu servidor: "¿Cuál es el precio promedio de los productos de la categoría Electrónicos?", "¿Qué productos tienen menos de 5 unidades en stock?", "Compara el precio promedio entre categorías". Cada pregunta revelará si tus tools son lo suficientemente expresivas o si necesitan más funcionalidades. Esto es desarrollo iterativo en la práctica.

📝 Resumen del módulo

  • ✓ SQLite es una base de datos integrada, sin servidor, que ya viene incluida en Python; es perfecta para proyectos MCP locales.
  • ✓ Creamos una base de datos de ejemplo con una tabla de productos que contiene datos variados para consultas interesantes.
  • ✓ Implementamos tools de consulta que traducen el lenguaje natural en queries SQL seguras.
  • ✓ Agregamos tools de inserción y actualización con validación de datos antes de escribir.
  • ✓ Aprendimos sobre SQL Injection y la importancia absoluta de usar consultas parametrizadas con placeholders (?).
  • ✓ Probamos el servidor completo con consultas en lenguaje natural a través de Claude Desktop.

Siguiente Módulo: 4.3 — Asistente de archivos