MemoraEu

Capa de memoria personal para asistentes de IA. Almacena, busca y recuerda preferencias, decisiones y hechos, disponible desde cualquier cliente compatible con MCP.

Documentación

Servidor MemoraEU

PyPI memoraeu-mcp PyPI memoraeu License: AGPL v3 Python 3.11+ MCP compatible smithery badge Hosted in EU


🇫🇷 Français · 🇬🇧 English


Francés

MemoraEU le da a tu IA una memoria persistente y cifrada — soberana, zero-knowledge, alojada en Europa. Compatible con Claude, Cursor, Windsurf, ChatGPT, GitHub Copilot, n8n vía MCP. Autoalojamiento gratuito (AGPL v3) o cloud gestionado en la UE

Qué hace

MemoraEU es un servidor de memoria autoalojable para asistentes de IA. Implementa el Model Context Protocol (MCP) para que cualquier cliente MCP (Claude, Cursor, Windsurf, ChatGPT, GitHub Copilot, n8n…)

  • Búsqueda semántica impulsada por Qdrant + embeddings (Ollama o Mistral)
  • Multi-usuario / multi-org con autenticación JWT
  • Transportes MCP: Legacy SSE (Cursor, curl) + HTTP Streamable (claude.ai, Copilot, n8n)
  • Hechos temporales con períodos de validez
  • Cifrado zero-knowledge AES-256-GCM en el lado del cliente (memoraeu-mcp)
  • RGPD nativo: endpoints de exportación / eliminación / historial integrados
  • Fusión inteligente: detección y fusión de memorias similares mediante LLM (Mistral/Ollama)

Inicio rápido

☁️ Opción A — Cloud gestionado (cero configuración)

# Installer le client MCP
uvx memoraeu-mcp

# Ajouter dans votre config Claude Desktop :
# Server URL : https://api.memoraeu.com/mcp/sse
# Clé API sur : https://app.memoraeu.com

🏠 Opción B — Autoalojamiento (gratuito, AGPL v3)

git clone https://github.com/pquattro/memoraeu-server
cd memoraeu-server
cp .env.example .env   # remplir MEMORAEU_SECRET, MEMORAEU_SALT, MISTRAL_API_KEY
docker compose up -d
# API disponible sur http://localhost:8000
# Docs : http://localhost:8000/docs
# Serveur MCP : http://localhost:8000/mcp/sse

Configuración

Toda la configuración se realiza mediante variables de entorno (ver .env.example)

VariablePor defectoDescripción
JWT_SECRET—Requerido. Mínimo 32 caracteres.
REGISTRATION_OPENtruePermitir nuevos registros
EMBED_PROVIDERollamaollama o mistral
EMBED_MODELnomic-embed-textNombre del modelo de embedding
EMBED_URLhttp://localhost:11434URL base de Ollama
MISTRAL_API_KEY—Requerido si EMBED_PROVIDER=mistral
QDRANT_URLhttp://qdrant:6333URL de la instancia de Qdrant
SQLITE_PATH/data/memoraeu.dbRuta de la base de datos SQLite
MCP_ALLOWED_HOSTSlocalhost,127.0.0.1,localhost:8000,127.0.0.1:8000Hosts aceptados en /mcp/ (protección contra DNS rebinding). Añade tu propio dominio si expones el servidor, de lo contrario las solicitudes se rechazan con 421.
MCP_ALLOWED_ORIGINShttp://localhost,http://127.0.0.1,https://claude.aiOrígenes aceptados en /mcp/. Un Origin ausente es aceptado (llamadas servidor a servidor).

Conecta tu cliente MCP

Claude Desktop / Cursor / Windsurf (Legacy SSE)

{
  "mcpServers": {
    "memoraeu": {
      "url": "http://localhost:8000/mcp/sse",
      "headers": { "Authorization": "Bearer VOTRE_CLE_API" }
    }
  }
}

claude.ai (HTTP Streamable, requiere una URL pública + OAuth) Ver la documentación

Mistral AI (conectores beta — La Plateforme)

connector = client.beta.connectors.create(
    name="memoraeu",
    server="https://api.memoraeu.com/mcp/sse?token=meu-sk-••••",
)

⚠️ Beta — discovery y SSE probados, ejecución de herramientas en proceso de despliegue por Mistral. ⚠️ Desde la 1.4.0, POST /mcp/sse ya no acepta el token en la query string. Si tu conector utiliza el transporte HTTP Streamable, pasa la clave mediante el encabezado Authorization: Bearer. El ?token= anterior solo sigue siendo válido para el transporte SSE legacy (GET /mcp/sse).

¿Por qué MemoraEU?

MemoraEUOtros (ej: mem0)
Código abierto✅ AGPL v3✅ (core)
Alojado en la UE✅ OVH Francia❌ EE. UU.
Zero-knowledge✅ AES-256-GCM lado cliente❌
Autoalojable✅ Docker Compose✅
MCP nativo✅ stdio + SSE + HTTP Streamable❌
Conectores Mistral✅ compatible (beta)
OAuth 2.0 PKCE✅❌
Grafo de conocimiento temporal✅❌
Endpoints RGPD✅ nativos⚠️ parcial

Autoalojamiento vs Cloud

AutoalojadoMemoraEU Cloud
InstalaciónDocker ComposeRegistro, eso es todo
Ubicación de los datosTu servidorUE (OVH, Francia)
EmbeddingsOllama (local)
ActualizacionesManualesAutomáticas
PrecioGratuito (AGPL)

Arquitectura

Claude Desktop / Claude Code                 claude.ai · Cursor · Windsurf · ChatGPT
         │                                              │
         │ stdio (MCP)  memoraeu-mcp (uvx)
         ▼                                              │ OAuth 2.0 PKCE
  memoraeu_mcp/main.py                                 │
         │                                              ▼
         ├── Mistral API  ←── embeddings locaux   api/main.py  (FastAPI)
         │                    (avant chiffrement)
         │ HTTP + Bearer token                          ├── POST /mcp/sse   ← HTTP Streamable
         │ [contenu chiffré AES-256-GCM + vecteur]     ├── GET  /mcp/sse   ← SSE legacy
         ▼                                              ├── /oauth/*        ← PKCE
   api/main.py  (FastAPI)
         ├── Qdrant          ← recherche vectorielle
         ├── SQLite (memories)
         └── SQLite (facts)

Stack:

  • FastAPI
  • Qdrant — base de datos vectorial (Docker)
  • Mistral AI
  • MCP
  • SQLite — persistencia de metadatos
  • AES-256-GCM + PBKDF2-SHA256 (210k iteraciones)

Flujo zero-knowledge

VariableRol
MEMORAEU_API_KEYAutenticación HTTP — token Bearer enviado en cada solicitud
MEMORAEU_SECRETContraseña — entrada PBKDF2 para derivar la clave AES localmente
MEMORAEU_SALTSalt KDF único por cuenta, generado en el registro
MISTRAL_API_KEYClave Mistral del lado del cliente — embeddings calculados antes del cifrado
remember()
  texte clair
    → PBKDF2(SECRET, SALT, 210k)
    → Mistral embed(texte clair)
    → AES-256-GCM(texte, clé)
    → POST /memories { blob chiffré, vecteur }  ← le serveur ne voit que l'opaque

Instalar como paquete Python

pip install memoraeu

Con los embeddings de Mistral:

pip install "memoraeu[mistral]"

Cumplimiento RGPD

EndpointMétodoDescripción
/gdpr/statusGETEstadísticas de los datos almacenados
/gdpr/exportGETExportación JSON completa (Art. 20)
/gdpr/delete-accountDELETEPurga irreversible Qdrant + SQLite (Art. 17)
/me/gdpr-historyGETHistorial de operaciones RGPD

Registro de administración filtrable por organización y fecha:

GET /gdpr/admin/log?org_id=...&date_from=YYYY-MM-DD
X-Admin-Key: <MEMORAEU_ADMIN_KEY>

Cómo funciona

Almacenar una memoria

Texte en clair
  → [LOCAL] Mistral compresse si > 300 caractères
  → [LOCAL] Mistral génère un vecteur d'embedding
  → [LOCAL] PBKDF2(SECRET, SALT, 210k itérations)
  → [LOCAL] AES-256-GCM(texte)
  → POST /memories { blob chiffré, vecteur }
  → [SERVEUR] similarité vectorielle → skip si > 94% doublon
  → [SERVEUR] SQLite ← métadonnées  |  Qdrant ← vecteur
  → Le serveur ne voit jamais le texte en clair.

Recuperar una memoria

Requête texte (ex. "projet principal")
  → [LOCAL] Mistral génère le vecteur de la requête
  → POST /memories/search { vecteur, limit: 3 }
  → [SERVEUR] Qdrant cosine similarity → top-N blobs chiffrés
  → [LOCAL] AES-256-GCM déchiffre → texte en clair
  → Claude reçoit le contexte. Le serveur n'a vu qu'un vecteur.

Memoria automática (modo MCP stdio)

El servidor MCP está diseñado para funcionar sin intervención manual. Las descripciones de las herramientas recall y remember instruyen a Claude para que las llame automáticamente — recall en el primer mensaje de cada sesión, remember cada vez que una información merece ser retenida. En la primera llamada a recall, el system prompt completo se inyecta en el contexto.


Contribuir

MemoraEU es de código abierto (AGPL v3)

git clone https://github.com/pquattro/memoraeu-server
cd memoraeu-server
python -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env  # configurer votre .env local
uvicorn api.main:app --reload

Mantén las PRs enfocadas — una funcionalidad o corrección por PR.

Áreas donde la ayuda es más útil: SDK JavaScript/TypeScript, aplicación móvil, integraciones MCP adicionales, traducciones.

Licencia

AGPL v3 — Copyright (c)

Si ejecutas una versión modificada como servicio de red, debes poner el código fuente a disposición de tus usuarios.


Inglés

MemoraEU le da a tu IA una memoria persistente y cifrada — soberana, zero-knowledge, alojada en Europa. Funciona con Claude, Cursor, Windsurf, ChatGPT, GitHub Copilot, n8n vía MCP. Autoalójalo gratis (AGPL v3) o usa el cloud gestionado en la UE

Qué hace

MemoraEU es un servidor de memoria autoalojable para asistentes de IA. Implementa el Model Context Protocol (MCP) para que cualquier cliente compatible con MCP (Claude, Cursor, Windsurf, ChatGPT, GitHub Copilot, n8n…) smithery badge

  • Búsqueda semántica impulsada por Qdrant + embeddings (Ollama o Mistral)
  • Multi-usuario / multi-org con autenticación JWT
  • Transportes MCP: Legacy SSE (Cursor, curl) + HTTP Streamable (claude.ai, Copilot, n8n)
  • Hechos temporales con períodos de validez
  • Cifrado zero-knowledge AES-256-GCM en el lado del cliente (memoraeu-mcp)
  • RGPD nativo: endpoints integrados de exportación / eliminación / historial
  • Fusión inteligente: detección de memorias similares y fusión impulsada por LLM (Mistral/Ollama)

Inicio rápido

☁️ Opción A — Cloud gestionado (cero configuración)

# Install the MCP client
uvx memoraeu-mcp

# Add to your Claude Desktop config:
# Server URL: https://api.memoraeu.com/mcp/sse
# Get your API key at: https://app.memoraeu.com

🏠 Opción B — Autoalojamiento (gratuito, AGPL v3)

git clone https://github.com/pquattro/memoraeu-server
cd memoraeu-server
cp .env.example .env   # fill MEMORAEU_SECRET, MEMORAEU_SALT, MISTRAL_API_KEY
docker compose up -d
# API running at http://localhost:8000
# Docs: http://localhost:8000/docs
# MCP server: http://localhost:8000/mcp/sse

Configuración

Toda la configuración se realiza mediante variables de entorno (ver .env.example)

VariablePor defectoDescripción
JWT_SECRET—Requerido. Mínimo 32 caracteres.
REGISTRATION_OPENtruePermitir el registro de nuevos usuarios
EMBED_PROVIDERollamaollama o mistral
EMBED_MODELnomic-embed-textNombre del modelo de embedding
EMBED_URLhttp://localhost:11434URL base de Ollama
MISTRAL_API_KEY—Requerido si EMBED_PROVIDER=mistral
QDRANT_URLhttp://qdrant:6333URL de la instancia de Qdrant
SQLITE_PATH/data/memoraeu.dbRuta de la base de datos SQLite
MCP_ALLOWED_HOSTSlocalhost,127.0.0.1,localhost:8000,127.0.0.1:8000Hosts aceptados en /mcp/ (protección contra DNS rebinding). Añade tu propio dominio si expones el servidor, de lo contrario las solicitudes se rechazan con 421.
MCP_ALLOWED_ORIGINShttp://localhost,http://127.0.0.1,https://claude.aiOrígenes aceptados en /mcp/. Un Origin ausente es aceptado (llamadas servidor a servidor).

Conecta tu cliente MCP

Claude Desktop / Cursor / Windsurf (Legacy SSE)

{
  "mcpServers": {
    "memoraeu": {
      "url": "http://localhost:8000/mcp/sse",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

claude.ai (HTTP Streamable, requiere URL pública + OAuth) Ver documentación

Mistral AI (conectores beta — La Plateforme)

connector = client.beta.connectors.create(
    name="memoraeu",
    server="https://api.memoraeu.com/mcp/sse?token=meu-sk-••••",
)

⚠️ Beta — discovery y SSE probados, ejecución de herramientas en proceso de despliegue por Mistral. ⚠️ Desde la 1.4.0, POST /mcp/sse ya no acepta el token como parámetro de consulta. Si tu conector utiliza el transporte HTTP Streamable, pasa la clave mediante el encabezado Authorization: Bearer. El ?token= anterior solo sigue siendo válido para el transporte SSE legacy (GET /mcp/sse).

¿Por qué MemoraEU?

MemoraEUOtros (ej: mem0)
Código abierto✅ AGPL v3✅ (core)
Alojado en la UE✅ OVH Francia❌ EE. UU.
Zero-knowledge✅ AES-256-GCM lado cliente❌
Autoalojable✅ Docker Compose✅
MCP nativo✅ stdio + SSE + HTTP Streamable❌
Conectores Mistral✅ compatible (beta)
OAuth 2.0 PKCE✅❌
Grafo de conocimiento temporal✅❌
Endpoints RGPD✅ nativos⚠️ parcial

Autoalojamiento vs Cloud

AutoalojadoMemoraEU Cloud
ConfiguraciónDocker ComposeRegístrate, listo
Ubicación de los datosTu servidorUE (OVH, Francia)
EmbeddingsOllama (local)
ActualizacionesManualesAutomáticas
PrecioGratuito (AGPL)

Arquitectura

Claude Desktop / Claude Code                 claude.ai · Cursor · Windsurf · ChatGPT
         │                                              │
         │ stdio (MCP)  memoraeu-mcp (uvx)
         ▼                                              │ OAuth 2.0 PKCE
  memoraeu_mcp/main.py                                 │
         │                                              ▼
         ├── Mistral API  ←── local embeddings    api/main.py  (FastAPI)
         │                    (before encryption)
         │ HTTP + Bearer token                          ├── POST /mcp/sse   ← HTTP Streamable
         │ [AES-256-GCM ciphertext + vector]           ├── GET  /mcp/sse   ← SSE legacy
         ▼                                              ├── /oauth/*        ← PKCE
   api/main.py  (FastAPI)
         ├── Qdrant          ← vector search
         ├── SQLite (memories)
         └── SQLite (facts)

Stack:

  • FastAPI
  • Qdrant — base de datos vectorial (Docker)
  • Mistral AI
  • MCP
  • SQLite — persistencia de metadatos
  • AES-256-GCM + PBKDF2-SHA256 (210k iteraciones)

Flujo zero-knowledge

VariableRol
MEMORAEU_API_KEYAutenticación HTTP — token Bearer enviado con cada solicitud
MEMORAEU_SECRETContraseña — entrada PBKDF2 para derivar la clave AES localmente
MEMORAEU_SALTSalt KDF por cuenta, generado en el registro
MISTRAL_API_KEYClave Mistral del lado del cliente — embeddings calculados antes del cifrado
remember()
  plaintext
    → PBKDF2(SECRET, SALT, 210k)
    → Mistral embed(plaintext)
    → AES-256-GCM(plaintext, key)
    → POST /memories { ciphertext, vector }  ← server only sees opaque blobs

Instalar como paquete Python

pip install memoraeu

Con los embeddings de Mistral:

pip install "memoraeu[mistral]"

Cumplimiento RGPD

EndpointMétodoDescripción
/gdpr/statusGETEstadísticas de los datos almacenados
/gdpr/exportGETExportación JSON completa (Art. 20)
/gdpr/delete-accountDELETEPurga irreversible Qdrant + SQLite (Art. 17)
/me/gdpr-historyGETHistorial de operaciones RGPD

Registro de administración filtrable por organización y fecha:

GET /gdpr/admin/log?org_id=...&date_from=YYYY-MM-DD
X-Admin-Key: <MEMORAEU_ADMIN_KEY>

Cómo funciona

Almacenar una memoria

Plaintext
  → [LOCAL] Mistral compresses if > 300 chars
  → [LOCAL] Mistral generates an embedding vector
  → [LOCAL] PBKDF2(SECRET, SALT, 210k iterations)
  → [LOCAL] AES-256-GCM(plaintext)
  → POST /memories { encrypted blob, vector }
  → [SERVER] vector similarity check → skip if > 94% duplicate
  → [SERVER] SQLite ← metadata  |  Qdrant ← vector
  → Server never sees plaintext. Ever.

Recuperar una memoria

Text query (e.g. "main project")
  → [LOCAL] Mistral generates query embedding
  → POST /memories/search { vector, limit: 3 }
  → [SERVER] Qdrant cosine similarity → top-N encrypted blobs
  → [LOCAL] AES-256-GCM decrypt → plaintext
  → Claude receives context. Server only ever saw a vector.

Memoria automática (modo MCP stdio)

El servidor MCP está diseñado para funcionar sin intervención manual. Las descripciones de las herramientas recall y remember instruyen a Claude para que las llame automáticamente — recall en el primer mensaje de cada sesión, remember cada vez que una información merece ser retenida. En la primera llamada a recall, el system prompt completo se inyecta en el contexto de Claude.


Contribuir

MemoraEU es de código abierto (AGPL v3)

git clone https://github.com/pquattro/memoraeu-server
cd memoraeu-server
python -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env  # configure your local .env
uvicorn api.main:app --reload

Por favor, mantén las PRs enfocadas — una funcionalidad o corrección por PR.

Las áreas donde más se agradece la ayuda: SDK de JavaScript/TypeScript, aplicación móvil, integraciones adicionales de clientes MCP, traducciones.

Licencia

AGPL-3.0 — Copyright (C)

Si ejecutas una versión modificada como servicio de red, debes poner el código fuente a disposición de tus usuarios.