MCP Usuarios DB
MCP Usuarios DB
Sistema de gestión de usuarios con PostgreSQL, expuesto de tres formas:
Servidor MCP — integración con ChatGPT/OpenAI (herramientas de función)
API REST — Flask + Gunicorn
App web — HTML/CSS/JS con búsqueda por voz (Whisper + TTS)
Todo corre en un solo docker-compose.yml con base de datos compartida.
Arquitectura
┌─────────────────────────────────────────────────────────────┐
│ docker-compose.yml │
├──────────────┬──────────────────┬───────────────────────────┤
│ postgres │ mcp-server │ mcp-api │
│ PostgreSQL │ app/server.py │ app/api.py │
│ :5433 │ (MCP + OpenAI) │ Flask + web/static │
│ │ │ :5001 │
└──────┬───────┴────────┬─────────┴───────────┬───────────────┘
│ │ │
└────────────────┴─────────────────────┘
usuarios_dbEstructura del proyecto
mcp-db/
├── app/
│ ├── __init__.py
│ ├── api.py # API REST Flask + rutas de voz
│ ├── i18n.py # Mensajes API ES/EN
│ ├── database.py # Conexión PostgreSQL y CRUD
│ ├── models.py # Modelos Usuario y EstadisticasUsuarios
│ ├── server.py # Servidor MCP para ChatGPT
│ └── voice.py # Whisper, TTS e interpretación de comandos
├── web/static/
│ ├── i18n.js # Traducciones ES/EN
│ ├── index.html # Interfaz web
│ ├── style.css # Estilos
│ ├── script.js # Lógica UI (búsqueda, crear, stats)
│ └── voice.js # Grabación, permisos micrófono, voz
├── db/
│ ├── init.sql # Esquema tabla usuarios
│ └── seed.sql # ~1000 usuarios de prueba
├── docker-compose.yml # postgres + mcp-server + mcp-api
├── Dockerfile # Imagen MCP server
├── Dockerfile-web # Imagen API web
├── requirements.txt # Deps MCP (openai, psycopg2)
├── requirements-web.txt # Deps web (flask, gunicorn, openai)
├── .env.example # Variables de entorno de ejemplo
└── README.mdRequisitos
Configuración
Clona el repositorio:
git clone https://github.com/hmmatus/mcp-db.git
cd mcp-dbCrea el archivo
.envdesde el ejemplo:
cp .env.example .envEdita
.envy agrega tu clave de OpenAI:
OPENAI_API_KEY=sk-tu-clave-aquiLas variables de PostgreSQL ya están configuradas en docker-compose.yml para Docker. Para desarrollo local fuera de Docker usa DB_PORT=5433.
Ejecutar con Docker
Levantar todos los servicios:
docker compose up -dSolo base de datos y API web:
docker compose up -d postgres mcp-apiVer logs:
docker compose logs -f mcp-apiDetener:
docker compose downURLs y puertos
Servicio | URL / Puerto | Descripción |
Web + API | Interfaz y REST API | |
PostgreSQL | localhost:5433 | BD (usuario: |
MCP server | (stdin, sin puerto HTTP) | Para integración con Cursor/IDE |
Nota macOS: el puerto 5000 suele estar ocupado por AirPlay. La API web usa 5001 en el host.
API REST
Base: http://localhost:5001/api
Método | Ruta | Descripción |
GET |
| Listar usuarios |
GET |
| Usuario por ID |
POST |
| Crear usuario |
PUT |
| Actualizar usuario |
DELETE |
| Borrado lógico |
GET |
| Buscar por email |
GET |
| Buscar por nombre |
GET |
| Buscar por ciudad |
GET |
| Buscar por edad |
GET |
| Estadísticas globales |
GET |
| Health check |
POST |
| Audio → texto (Whisper) |
POST |
| Interpretar comando de voz |
POST |
| Texto → audio (TTS) |
Respuesta estándar:
{
"exito": true,
"lang": "en",
"datos": {},
"error": null,
"cantidad": 10,
"mensaje": "User created"
}Idioma (ES / EN)
Web: botones ES | EN en la barra de navegación
API: parámetro
?lang=eno headerAccept-Language: en
Ejemplo:
curl -s "http://localhost:5001/api/usuarios?limite=2&lang=en"Probar desde terminal
Base URL: http://localhost:5001
Añade &lang=en para respuestas en inglés.
Health
curl -s http://localhost:5001/health
curl -s "http://localhost:5001/health?lang=en"Listar usuarios
curl -s "http://localhost:5001/api/usuarios?limite=5&offset=0"
curl -s "http://localhost:5001/api/usuarios?limite=5&lang=en"Usuario por ID
curl -s http://localhost:5001/api/usuarios/1Buscar por email
curl -s "http://localhost:5001/api/search/email?email=pilar.flores5993@empresa.com&lang=en"Buscar por nombre (parcial)
curl -s "http://localhost:5001/api/search/nombre?nombre=Juan&limite=10"
curl -s "http://localhost:5001/api/search/nombre?nombre=Juan&limite=10&lang=en"Buscar por ciudad
curl -s "http://localhost:5001/api/search/ciudad?ciudad=San%20Salvador&limite=10"
curl -s "http://localhost:5001/api/search/ciudad?ciudad=San%20Salvador&lang=en"Buscar por rango de edad
curl -s "http://localhost:5001/api/search/edad?edad_minima=25&edad_maxima=35"Estadísticas
curl -s http://localhost:5001/api/estadisticas
curl -s "http://localhost:5001/api/estadisticas?lang=en"Crear usuario
curl -s -X POST http://localhost:5001/api/usuarios \
-H "Content-Type: application/json" \
-H "Accept-Language: en" \
-d '{"nombre":"Test User","email":"test.user@example.com","edad":30,"ciudad":"San Salvador"}'Actualizar usuario
curl -s -X PUT http://localhost:5001/api/usuarios/1 \
-H "Content-Type: application/json" \
-d '{"ciudad":"Santa Ana"}'Eliminar usuario (borrado lógico)
curl -s -X DELETE "http://localhost:5001/api/usuarios/999&lang=en"Comando de voz (texto → acción)
# Interpretar comando en inglés
curl -s -X POST "http://localhost:5001/api/voice/procesar-comando?lang=en" \
-H "Content-Type: application/json" \
-d '{"comando":"Search users in San Salvador","lang":"en"}'
# Interpretar comando en español
curl -s -X POST http://localhost:5001/api/voice/procesar-comando \
-H "Content-Type: application/json" \
-d '{"comando":"Busca usuarios en San Salvador"}'PostgreSQL directo (psql)
# Conectar
psql -h localhost -p 5433 -U mcpuser -d usuarios_db
# Dentro de psql:
SELECT id, nombre, email, ciudad FROM usuarios LIMIT 5;
SELECT * FROM usuarios WHERE LOWER(ciudad) LIKE '%san salvador%' LIMIT 10;
SELECT COUNT(*) FROM usuarios WHERE activo = true;
SELECT ciudad, COUNT(*) FROM usuarios GROUP BY ciudad ORDER BY count DESC LIMIT 10;Formato JSON legible (opcional)
curl -s "http://localhost:5001/api/estadisticas?lang=en" | python3 -m json.toolApp web
Abre http://localhost:5001 en el navegador.
Secciones
Voz — mantén presionado el micrófono, habla un comando, escucha la respuesta
Inicio — últimos usuarios registrados
Buscar — por email, nombre, ciudad o rango de edad
Crear — formulario de nuevo usuario
Estadísticas — totales, edad promedio, ciudades y países
Comandos de voz — Español
"Busca usuarios en San Salvador"
"Dame los usuarios entre 25 y 35 años"
"Busca a Juan"
"Crea un usuario llamado Carlos con email carlos@mail.com"
"Cuántos usuarios hay en total?"
"Elimina el usuario 5"
Voice commands — English
"Search users in San Salvador"
"Show users between 25 and 35 years old"
"Search for Juan"
"Create a user named Carlos with email carlos@mail.com"
"How many users are there in total?"
"Delete user 5"
Al entrar, la app solicita permiso de micrófono. Usa ES | EN en el navbar para cambiar idioma.
Servidor MCP (ChatGPT)
El servicio mcp-server ejecuta python -m app.server y expone herramientas OpenAI para consultar y modificar usuarios.
Requiere OPENAI_API_KEY en .env. Se usa con clientes MCP compatibles (Cursor, Claude Desktop, etc.).
docker compose up -d mcp-server
docker attach mcp-server # modo interactivoDesarrollo local (sin Docker)
API web
pip install -r requirements-web.txt
export DB_HOST=localhost DB_PORT=5433 DB_USER=mcpuser DB_PASSWORD=mcppassword DB_NAME=usuarios_db
export OPENAI_API_KEY=sk-...
python -m app.apiSolo PostgreSQL en Docker
docker compose up -d postgresBase de datos
Tabla usuarios:
Campo | Tipo |
id | SERIAL PK |
nombre | VARCHAR(100) |
VARCHAR(100) UNIQUE | |
edad | INTEGER |
ciudad, pais | VARCHAR(100) |
telefono | VARCHAR(20) |
activo | BOOLEAN (default true) |
created_at, updated_at | TIMESTAMP |
Conectar con psql:
psql -h localhost -p 5433 -U mcpuser -d usuarios_db
# password: mcppasswordVariables de entorno
Variable | Descripción | Default (Docker) |
| Clave OpenAI (MCP + voz) | — |
| Host PostgreSQL |
|
| Puerto PostgreSQL |
|
| Usuario BD |
|
| Contraseña BD |
|
| Nombre BD |
|
Licencia
MIT