Skip to main content
Glama
japentaca

MCP PostgreSQL Read-Only Server

by japentaca
README.md
# MCP PostgreSQL Server

Un servidor MCP (Model Context Protocol) seguro para acceder a bases de datos PostgreSQL que solo permite consultas SELECT.

## 🚀 Características

- ✅ **Solo consultas SELECT**: Máxima seguridad, no permite INSERT, UPDATE, DELETE u otras operaciones peligrosas
- ✅ **Configuración desde el proyecto**: Lee la cadena de conexión desde `MCP_PG_CONNSTR` en el archivo `.env` **del proyecto que está siendo editado** (no del servidor MCP)
- ✅ **JavaScript puro**: No requiere TypeScript ni compilación
- ✅ **Manejo robusto de errores**: Logging apropiado y manejo de errores de conexión
- ✅ **Múltiples herramientas útiles**: Exploración de esquemas, listado de tablas, y consultas comunes

## 📁 Concepto importante: Separación de configuración

Este servidor MCP funciona de manera diferente a una aplicación normal:

```
📂 Tu proyecto (donde trabajas)
├── 📄 .env                    ← Aquí va MCP_PG_CONNSTR
├── 📂 src/
├── 📄 package.json
└── 📄 README.md

📂 Servidor MCP (instalado por separado)
├── 📄 index.js               ← El servidor MCP
├── 📄 package.json
└── 📄 README.md
```

**¿Por qué es así?**
- El servidor MCP es una **herramienta externa** que se conecta a tu proyecto
- Cada proyecto puede tener su propia base de datos (diferente conexión)
- El servidor MCP **lee automáticamente** el `.env` de **tu proyecto actual**
- No necesitas configurar nada en el servidor MCP, solo en tu proyecto

## 📋 Requisitos previos

- Node.js 18 o superior
- Una base de datos PostgreSQL accesible
- Acceso de lectura a la base de datos

## 🛠️ Instalación

1. **Clona o descarga el proyecto**:
```bash
git clone <repository-url>
cd postgres
```

2. **Instala las dependencias**:
```bash
npm install
```

3. **Configura las variables de entorno EN EL PROYECTO QUE ESTÁS EDITANDO**:

⚠️ **IMPORTANTE**: El archivo `.env` debe estar en la **raíz del proyecto que estás editando**, NO en la carpeta del servidor MCP.

En la raíz de tu proyecto (donde tienes tu código fuente), crea un archivo `.env`:

```bash
# En la raíz de tu proyecto (no en la carpeta del servidor MCP)
MCP_PG_CONNSTR=postgresql://usuario:contraseña@localhost:5432/basededatos
```

**Ejemplo de estructura**:
```
mi-proyecto/              ← Tu proyecto
├── .env                  ← Aquí va el archivo .env
├── src/
├── package.json
└── ...

mcp-postgres-server/      ← Servidor MCP (separado)
├── index.js
├── package.json
└── ...
```

## 🚀 Uso

### Ejecución del servidor

```bash
# Modo normal
npm start

# Modo desarrollo (con reinicio automático)
npm run dev
```

### Configuración en Claude Desktop

Para usar este servidor con Claude Desktop, agrega la siguiente configuración a tu archivo `claude_desktop_config.json`:

#### Windows:
```json
{
  "mcpServers": {
    "postgresql": {
      "command": "node",
      "args": ["C:\\ruta\\completa\\hacia\\postgres\\index.js"],
      "cwd": "C:\\ruta\\completa\\hacia\\postgres"
    }
  }
}
```

#### macOS/Linux:
```json
{
  "mcpServers": {
    "postgresql": {
      "command": "node",
      "args": ["/ruta/completa/hacia/postgres/index.js"],
      "cwd": "/ruta/completa/hacia/postgres"
    }
  }
}
```

### Ubicación del archivo de configuración:

- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

## 🔧 Herramientas disponibles

### 1. `execute_select_query`
Ejecuta consultas SELECT personalizadas.

**Parámetros**:
- `query` (string): La consulta SELECT a ejecutar
- `params` (array, opcional): Parámetros para consultas preparadas

**Ejemplo**:
```sql
SELECT * FROM usuarios WHERE edad > $1 ORDER BY nombre;
```

### 2. `list_tables`
Lista todas las tablas disponibles en la base de datos.

**Parámetros**: Ninguno

### 3. `describe_table`
Obtiene información detallada sobre las columnas de una tabla.

**Parámetros**:
- `table_name` (string): Nombre de la tabla
- `schema_name` (string, opcional): Nombre del esquema (por defecto: 'public')

### 4. `execute_common_queries`
Ejecuta consultas predefinidas útiles.

**Parámetros**:
- `query_type` (string): Uno de:
  - `database_version`: Versión de PostgreSQL
  - `current_user`: Usuario actual
  - `current_database`: Base de datos actual
  - `table_sizes`: Tamaños de las tablas

## 🔒 Seguridad

Este servidor implementa múltiples capas de seguridad:

1. **Validación de consultas**: Solo permite comandos SELECT
2. **Filtrado de patrones peligrosos**: Bloquea INSERT, UPDATE, DELETE, DROP, etc.
3. **Consultas preparadas**: Soporte para parámetros seguros
4. **Conexiones seguras**: Soporte SSL para conexiones en producción

### Consultas permitidas ✅
```sql
SELECT * FROM usuarios;
SELECT COUNT(*) FROM pedidos WHERE fecha > '2024-01-01';
SELECT u.nombre, p.total FROM usuarios u JOIN pedidos p ON u.id = p.usuario_id;
```

### Consultas bloqueadas ❌
```sql
INSERT INTO usuarios (nombre) VALUES ('nuevo');
UPDATE usuarios SET email = 'nuevo@email.com';
DELETE FROM usuarios WHERE id = 1;
DROP TABLE usuarios;
```

## 🌍 Variables de entorno

⚠️ **Ubicación importante**: Estas variables deben estar en el archivo `.env` en la **raíz del proyecto que estás editando**, no en la carpeta del servidor MCP.

| Variable | Descripción | Ubicación | Ejemplo |
|----------|-------------|-----------|---------|
| `MCP_PG_CONNSTR` | Cadena de conexión a PostgreSQL | **Proyecto editado**/.env | `postgresql://user:pass@localhost:5432/db` |
| `PORT` | Puerto para servidor HTTP (opcional) | Proyecto editado/.env | `3000` |
| `NODE_ENV` | Entorno de ejecución | Proyecto editado/.env | `production` |

## 🔄 Ejemplos de cadenas de conexión

### PostgreSQL local:
```
MCP_PG_CONNSTR=postgresql://postgres:password@localhost:5432/mydatabase
```

### PostgreSQL remoto:
```
MCP_PG_CONNSTR=postgresql://username:password@hostname:5432/database_name
```

### Con SSL:
```
MCP_PG_CONNSTR=postgresql://username:password@hostname:5432/database_name?sslmode=require
```

### Con parámetros adicionales:
```
MCP_PG_CONNSTR=postgresql://user:pass@host:5432/db?application_name=mcp-server&connect_timeout=10
```

## 🐛 Solución de problemas

### Error: "MCP_PG_CONNSTR no está definida"
- **IMPORTANTE**: El archivo `.env` debe estar en la **raíz del proyecto que estás editando**, NO en la carpeta del servidor MCP
- El servidor busca en `[directorio-de-tu-proyecto]/.env`
- Verifica que la variable `MCP_PG_CONNSTR` está definida correctamente en ese archivo
- Revisa el mensaje de error que muestra la ruta exacta donde busca el archivo

### Error de conexión a la base de datos
- Verifica que PostgreSQL está ejecutándose
- Confirma que las credenciales son correctas
- Asegúrate de que el usuario tiene permisos de lectura en las tablas

### El servidor no aparece en Claude Desktop
- Verifica que las rutas en `claude_desktop_config.json` son absolutas y correctas
- Reinicia Claude Desktop después de modificar la configuración
- Revisa los logs de error en la consola

### Problemas de permisos
```sql
-- Otorgar permisos de lectura al usuario
GRANT SELECT ON ALL TABLES IN SCHEMA public TO tu_usuario;
GRANT USAGE ON SCHEMA public TO tu_usuario;
```

## 📝 Logs y depuración

El servidor usa `console.error()` para logging, que es seguro con el transporte STDIO de MCP. Los logs incluyen:

- ✅ Confirmación de conexión exitosa a PostgreSQL
- 🔍 Consultas ejecutadas (primeros 100 caracteres)
- ❌ Errores de conexión y consultas
- 📊 Información de inicio del servidor

## 🤝 Contribución

1. Fork del repositorio
2. Crea una rama para tu feature (`git checkout -b feature/nueva-funcionalidad`)
3. Commit tus cambios (`git commit -am 'Agrega nueva funcionalidad'`)
4. Push a la rama (`git push origin feature/nueva-funcionalidad`)
5. Crea un Pull Request

## 📄 Licencia

MIT License - ver archivo [LICENSE](LICENSE) para más detalles.

## 🔗 Enlaces útiles

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Documentación de PostgreSQL](https://www.postgresql.org/docs/)
- [Claude Desktop](https://claude.ai/desktop)
- [node-postgres (pg)](https://node-postgres.com/)

## 📞 Soporte

Si encuentras algún problema o tienes sugerencias, por favor:

1. Revisa la sección de [solución de problemas](#-solución-de-problemas)
2. Busca en los [issues existentes](../../issues)
3. Crea un nuevo issue si es necesario

---

**⚠️ Recordatorio de seguridad**: Este servidor solo permite consultas SELECT para mantener la seguridad de tu base de datos. No modifica, elimina ni altera datos de ninguna manera.