Crea un MCP Server que se conecta a SQLite: el modelo consulta y manipula datos en lenguaje natural.
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.
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.
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.
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.
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.
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.
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.
Usa INSERT INTO con executemany() para insertar varios productos a la vez. Incluye variedad de precios, categorías y cantidades de stock.
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.
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.
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.
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.
f"SELECT * WHERE nome = '{input}'"cursor.execute("SELECT * WHERE nome = ?", (input,))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.
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.
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.
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.
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.
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 ?.
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.
f"SELECT * FROM produtos WHERE nome = '{nome}'""INSERT INTO produtos VALUES ('" + nome + "')"query = "DELETE WHERE id = " + str(id)cursor.execute("SELECT * WHERE nome = ?", (nome,))cursor.execute("INSERT INTO ... VALUES (?, ?)", (n, p))cursor.execute("DELETE WHERE id = ?", (id,))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.
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.
"¿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.
"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.
"¿Cuál es el inventario total por categoría?" — Claude debe consultar los datos y presentar un resumen agrupado por categoría.
"Actualiza el precio del producto ID 3 a R$89,90." — Debe llamar a atualizar_produto con los parámetros correctos.
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.
Siguiente Módulo: 4.3 — Asistente de archivos