Sport Supplements E-commerce MCP Server
README.md
# MCP Server - Tienda de Suplementos Deportivos
Servidor [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) que conecta un LLM con una base de datos PostgreSQL de e-commerce. Permite a agentes de IA buscar productos, consultar pedidos, gestionar clientes y crear órdenes a través de herramientas estructuradas.
```
┌──────────────┐ Streamable HTTP ┌──────────────┐ SQL ┌────────────┐
│ LLM Client │◄─────────────────────►│ MCP Server │◄───────────────►│ PostgreSQL │
│ (Claude, │ JSON-RPC 2.0 │ :9333/mcp │ │ :7667 │
│ GPT, etc.) │ └──────────────┘ └────────────┘
└──────────────┘
```
## Inicio Rápido
### Requisitos previos
- [Node.js](https://nodejs.org/) 18+
- [Docker](https://www.docker.com/) y Docker Compose
### 1. Clonar e instalar
```bash
git clone https://github.com/sebastiancastillorock/mcpserverecommerce.git
cd mcpserverecommerce
npm install
```
### 2. Configurar variables de entorno
```bash
cp .env.example .env
```
El archivo `.env` contiene:
```env
MCP_HOST=0.0.0.0
MCP_PORT=9333
DATABASE_URL=postgresql://mcp_readonly:mcp_readonly_2024@localhost:7667/suplementos_db
DATABASE_ORDERS_URL=postgresql://mcp_orders:mcp_orders_2024@localhost:7667/suplementos_db
```
### 3. Levantar la base de datos
```bash
docker compose up -d
```
Esto crea la base de datos PostgreSQL con el esquema y datos de ejemplo automáticamente.
### 4. Iniciar el servidor
```bash
# Desarrollo (hot reload)
npm run dev
# Producción
npm run build && npm start
```
El servidor estará disponible en `http://localhost:9333/mcp`.
---
## Conectar tu propia base de datos
Si quieres usar este servidor con **tu propia base de datos PostgreSQL** (en lugar de la incluida con Docker), sigue estos pasos:
### Opción A: Apuntar a una base de datos existente
Solo necesitas modificar las variables de entorno en `.env`:
```env
# Conexión de solo lectura (consultas)
DATABASE_URL=postgresql://USUARIO:PASSWORD@HOST:PUERTO/NOMBRE_DB
# Conexión de escritura (crear pedidos y clientes)
DATABASE_ORDERS_URL=postgresql://USUARIO_ESCRITURA:PASSWORD@HOST:PUERTO/NOMBRE_DB
```
**Ejemplos:**
```env
# PostgreSQL local
DATABASE_URL=postgresql://mi_usuario:mi_password@localhost:5432/mi_tienda
# Servidor remoto
DATABASE_URL=postgresql://admin:secreto@db.miservidor.com:5432/ecommerce
# Servicios cloud (Supabase, Neon, Railway, etc.)
DATABASE_URL=postgresql://user:pass@db.xxxx.supabase.co:5432/postgres
```
### Opción B: Crear el esquema en tu base de datos
Si tu base de datos está vacía, ejecuta los scripts SQL incluidos para crear las tablas necesarias:
```bash
# Conectar a tu PostgreSQL y ejecutar el esquema
psql -h HOST -U USUARIO -d NOMBRE_DB -f init-db/01-schema.sql
# (Opcional) Cargar datos de ejemplo
psql -h HOST -U USUARIO -d NOMBRE_DB -f init-db/02-seed-data.sql
```
### Opción C: Adaptar el esquema a tu base de datos existente
Si ya tienes una base de datos con estructura diferente, necesitas modificar las queries SQL en `src/index.ts`. El servidor espera estas tablas:
```sql
-- Tabla de productos (catálogo)
productos (id, nombre, descripcion, precio, stock, categoria, ingredientes, marca)
-- Tabla de clientes
clientes (id, nombre, email, telefono, direccion)
-- Tabla de pedidos
pedidos (id, numero_pedido, cliente_id, estado, fecha_pedido, total, direccion_envio, notas)
-- Detalle de cada pedido
detalle_pedidos (id, pedido_id, producto_id, cantidad, precio_unitario)
```
Si tus tablas tienen otros nombres o columnas, busca las queries `SELECT`, `INSERT` y `UPDATE` en `src/index.ts` y `src/db.ts` y adáptalas a tu esquema.
### Usuarios de base de datos recomendados
Para mayor seguridad, se recomienda crear dos usuarios con permisos separados:
```sql
-- Usuario de solo lectura (para consultas)
CREATE USER mcp_readonly WITH PASSWORD 'tu_password_seguro';
GRANT CONNECT ON DATABASE tu_db TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
-- Usuario de escritura limitada (para crear pedidos)
CREATE USER mcp_orders WITH PASSWORD 'otro_password_seguro';
GRANT CONNECT ON DATABASE tu_db TO mcp_orders;
GRANT USAGE ON SCHEMA public TO mcp_orders;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_orders;
GRANT INSERT ON pedidos, detalle_pedidos, clientes TO mcp_orders;
GRANT UPDATE (stock) ON productos TO mcp_orders;
GRANT USAGE, SELECT ON SEQUENCE pedidos_id_seq, detalle_pedidos_id_seq, clientes_id_seq TO mcp_orders;
```
> Si prefieres usar un solo usuario, puedes poner la misma URL en ambas variables (`DATABASE_URL` y `DATABASE_ORDERS_URL`).
---
## Conectar un LLM al servidor
### Configuración del cliente MCP
Agrega esta configuración en tu cliente MCP (Claude Desktop, Cursor, etc.):
```json
{
"mcpServers": {
"suplementos": {
"url": "http://localhost:9333/mcp",
"transport": "streamable-http"
}
}
}
```
Si el servidor está en una máquina remota, reemplaza `localhost` con la IP o dominio del servidor.
### System prompts
El repositorio incluye prompts de sistema optimizados para agentes:
- `system-prompt.md` - Para agentes que usan las herramientas MCP
- `system-prompt-sql.md` - Para agentes con acceso SQL directo
---
## Herramientas MCP disponibles
| Herramienta | Descripción | Permisos |
|-------------|-------------|----------|
| `buscar_productos` | Buscar productos por nombre, categoría o ingredientes | Lectura |
| `obtener_producto` | Detalle completo de un producto por ID o nombre | Lectura |
| `verificar_disponibilidad` | Consultar stock de uno o varios productos | Lectura |
| `consultar_pedido` | Estado de un pedido (requiere email de verificación) | Lectura |
| `historial_cliente` | Pedidos anteriores de un cliente por email | Lectura |
| `registrar_cliente` | Crear un nuevo cliente en el sistema | Escritura |
| `crear_pedido` | Crear un pedido con validación de stock | Escritura |
Consulta [MCP-TOOLS.md](MCP-TOOLS.md) para la documentación detallada de cada herramienta con ejemplos de request/response.
---
## Endpoints HTTP
| Método | Ruta | Descripción |
|--------|------|-------------|
| `POST` | `/mcp` | Comandos MCP (JSON-RPC 2.0) |
| `GET` | `/mcp` | Stream SSE para notificaciones |
| `DELETE` | `/mcp` | Cerrar sesión MCP |
| `GET` | `/health` | Health check |
---
## Seguridad
El servidor implementa múltiples capas de seguridad:
- **Pools separados**: Usuario de solo lectura para consultas, usuario limitado para escritura
- **Anti-DoS**: Límite máximo de 50 resultados por consulta
- **Anti-IDOR**: Los pedidos requieren verificación de email del propietario
- **Anti-enumeración**: Mensajes genéricos que no revelan si un recurso existe
- **Privacy by Design**: Direcciones y teléfonos enmascarados en las respuestas
- **Transacciones atómicas**: Operaciones de escritura con rollback automático en caso de error
- **Validación de queries**: Solo se permiten sentencias `SELECT` en el pool de lectura
---
## Estructura del proyecto
```
├── src/
│ ├── index.ts # Servidor MCP + definición de herramientas
│ └── db.ts # Pools de conexión PostgreSQL
├── init-db/
│ ├── 01-schema.sql # Esquema de tablas + usuarios
│ └── 02-seed-data.sql # Datos de ejemplo (24 productos, 8 clientes, 8 pedidos)
├── docker-compose.yml # PostgreSQL containerizado
├── system-prompt.md # Prompt de sistema para agentes MCP
├── system-prompt-sql.md # Prompt de sistema para agentes SQL
├── MCP-TOOLS.md # Documentación detallada de herramientas
├── package.json
└── tsconfig.json
```
---
## Comandos útiles
```bash
npm run dev # Desarrollo con hot reload
npm run build # Compilar TypeScript
npm start # Ejecutar en producción
docker compose up -d # Iniciar PostgreSQL
docker compose down # Detener PostgreSQL
docker compose logs -f # Ver logs de la base de datos
```
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues