Skip to main content
Glama
wabox32

schema-engram-mcp

by wabox32
README.md
# schema-engram-mcp

Servidor **MCP** (Model Context Protocol) que guarda la **estructura de bases de datos** (esquema: tablas, columnas, claves, índices, etc.) en un fichero **SQLite** local. Está pensado como memoria persistente **similar en espíritu a [Engrams](https://engrams.sh)** (contexto estructurado para el asistente), pero **específico para esquemas de BD**.

## Herramientas MCP

| Herramienta | Descripción |
|-------------|-------------|
| `db_schema_save` | Guarda una instantánea JSON del esquema (`workspace_id`, `connection_name`, …). |
| `db_schema_get` | Recupera la última instantánea o una por `snapshot_id`. |
| `db_schema_list` | Lista metadatos de instantáneas (sin volcar todo el JSON). |
| `db_schema_update` | Actualiza por `snapshot_id` (esquema, metadatos o renombre de workspace/conexión). |
| `db_schema_delete` | Borra una instantánea por id. |

### Forma sugerida de `schema` (JSON)

No hay un esquema obligatorio: puedes guardar lo que saques de `information_schema`, Prisma, SQLAlchemy, etc. Un ejemplo razonable:

```json
{
  "tables": [
    {
      "name": "users",
      "columns": [
        {"name": "id", "type": "uuid", "nullable": false, "primary_key": true},
        {"name": "email", "type": "text", "nullable": false}
      ],
      "foreign_keys": [],
      "indexes": [{"name": "users_email_key", "columns": ["email"], "unique": true}]
    }
  ]
}
```

## Instalación

```bash
cd /ruta/al/proyecto
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
```

## Configurar en Cursor

El servidor MCP **no usa puerto**: Cursor arranca un proceso y habla por **stdin/stdout**.

### 1. Dónde pones la configuración

| Ámbito | Fichero | Cuándo usarlo |
|--------|---------|----------------|
| **Todo Cursor** | `~/.cursor/mcp.json` | Quieres el mismo MCP en todos los proyectos. |
| **Solo este repo** | `.cursor/mcp.json` en la raíz del proyecto que abres en Cursor | Quieres dejar la config versionada o por proyecto. |

Si ya existe `mcpServers` con otros servidores, **añade** la clave `"schema-engram"` dentro de ese mismo objeto; no borres los demás.

### 2. Desde la interfaz

1. **Cursor** → **Settings** (⚙️) → busca **MCP** o **Model Context Protocol**.  
2. Ahí suele haber un enlace para editar el JSON o añadir servidores.  
3. Tras guardar, **reinicia** el MCP o Cursor si no aparece el servidor.

(El menú exacto puede variar según la versión; el fichero JSON es lo importante.)

### 3. Opción A — Python local (sin Docker)

En la máquina donde está clonado este repo:

```bash
cd /ruta/al/schema-engram-mcp
python3 -m venv .venv && source .venv/bin/activate && pip install -e .
```

En `mcp.json` (rutas **absolutas**):

```json
{
  "mcpServers": {
    "schema-engram": {
      "command": "/ruta/absoluta/schema-engram-mcp/.venv/bin/python",
      "args": [
        "-m",
        "schema_engram_mcp",
        "--sqlite",
        "/ruta/absoluta/schema-engram-mcp/data/schemas.sqlite"
      ]
    }
  }
}
```

Si no pasas `--sqlite`, el valor por defecto del programa es  
`~/.local/share/schema-engram-mcp/schemas.sqlite` (fuera de `./data`).

### 4. Opción B — Docker Compose (recomendado si ya usas Docker)

Antes: `docker compose build` en la carpeta del repo.  
En `mcp.json`, la ruta del `-f` debe ser la del **`docker-compose.yml` de este repo** (absoluta):

```json
{
  "mcpServers": {
    "schema-engram": {
      "command": "docker",
      "args": [
        "compose",
        "-f",
        "/ruta/absoluta/schema-engram-mcp/docker-compose.yml",
        "run",
        "--rm",
        "-i",
        "mcp"
      ]
    }
  }
}
```

Hay una plantilla en [`.cursor/mcp.json.example`](.cursor/mcp.json.example): cópiala a `.cursor/mcp.json` (en el proyecto que quieras) y sustituye la ruta.

### 5. Otro proyecto distinto al del MCP

Si tu app está en `/proyecto/mi-api` pero el MCP vive en `/herramientas/schema-engram-mcp`, abres **`mi-api`** en Cursor y en `mi-api/.cursor/mcp.json` pones las rutas **absolutas** al clon `schema-engram-mcp` (Python o Docker como arriba). El SQLite puede quedarse en `schema-engram-mcp/data/schemas.sqlite`.

## Variables de entorno

| Variable | Significado |
|----------|-------------|
| `SCHEMA_ENGRAM_SQLITE` | Ruta al fichero SQLite (tiene prioridad si no pasas `--sqlite`). |

## Docker Compose (recomendado)

Desde la raíz del proyecto:

```bash
docker compose build
docker compose run --rm -i mcp
```

El SQLite se guarda en **`./data/schemas.sqlite`** en tu máquina (carpeta montada en el contenedor).

La parte de Cursor + Docker detallada está en **[Configurar en Cursor](#configurar-en-cursor)**. No uses `docker compose up` para MCP: hace falta **`run ... -i`**.

### Solo Docker (sin Compose)

```bash
docker build -t schema-engram-mcp:local .
docker run -i --rm -v "$(pwd)/data:/data" schema-engram-mcp:local
```

## Limitación

Este paquete **no** conecta solo a tu PostgreSQL/MySQL: el cliente MCP (o tú) debe **obtener el esquema** con las herramientas que ya uses y llamar a `db_schema_save` con ese objeto JSON.

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: delete removes a snapshot, get retrieves one, list shows metadata without full schema, save creates a new snapshot, and update modifies an existing one. The operations map cleanly to CRUD lifecycle stages with no overlap or ambiguity.

Naming Consistency5/5

All tools follow a perfect 'db_schema_' prefix with consistent verb suffixes (delete, get, list, save, update). The naming pattern is uniform across all five tools, making them easily predictable and readable.

Tool Count5/5

With 5 tools, this server is well-scoped for managing database schema snapshots. Each tool serves a clear function in the lifecycle (list, get, save, update, delete), and no tool feels redundant or missing for the domain.

Completeness5/5

The tool set provides complete CRUD coverage for schema snapshots: list for discovery, get for retrieval, save for creation, update for modification, and delete for removal. There are no obvious gaps, and the descriptions support full lifecycle management.

Maintenance

ActivityInactive
ResponsivenessNo issues