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
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)
| Variable | Por defecto | Descripción |
|---|---|---|
JWT_SECRET | — | Requerido. Mínimo 32 caracteres. |
REGISTRATION_OPEN | true | Permitir nuevos registros |
EMBED_PROVIDER | ollama | ollama o mistral |
EMBED_MODEL | nomic-embed-text | Nombre del modelo de embedding |
EMBED_URL | http://localhost:11434 | URL base de Ollama |
MISTRAL_API_KEY | — | Requerido si EMBED_PROVIDER=mistral |
QDRANT_URL | http://qdrant:6333 | URL de la instancia de Qdrant |
SQLITE_PATH | /data/memoraeu.db | Ruta de la base de datos SQLite |
MCP_ALLOWED_HOSTS | localhost,127.0.0.1,localhost:8000,127.0.0.1:8000 | Hosts 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_ORIGINS | http://localhost,http://127.0.0.1,https://claude.ai | Orí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?
| MemoraEU | Otros (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
| Autoalojado | MemoraEU Cloud | |
|---|---|---|
| Instalación | Docker Compose | Registro, eso es todo |
| Ubicación de los datos | Tu servidor | UE (OVH, Francia) |
| Embeddings | Ollama (local) | |
| Actualizaciones | Manuales | Automáticas |
| Precio | Gratuito (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
| Variable | Rol |
|---|---|
MEMORAEU_API_KEY | Autenticación HTTP — token Bearer enviado en cada solicitud |
MEMORAEU_SECRET | Contraseña — entrada PBKDF2 para derivar la clave AES localmente |
MEMORAEU_SALT | Salt KDF único por cuenta, generado en el registro |
MISTRAL_API_KEY | Clave 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
| Endpoint | Método | Descripción |
|---|---|---|
/gdpr/status | GET | Estadísticas de los datos almacenados |
/gdpr/export | GET | Exportación JSON completa (Art. 20) |
/gdpr/delete-account | DELETE | Purga irreversible Qdrant + SQLite (Art. 17) |
/me/gdpr-history | GET | Historial 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…)
- 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)
| Variable | Por defecto | Descripción |
|---|---|---|
JWT_SECRET | — | Requerido. Mínimo 32 caracteres. |
REGISTRATION_OPEN | true | Permitir el registro de nuevos usuarios |
EMBED_PROVIDER | ollama | ollama o mistral |
EMBED_MODEL | nomic-embed-text | Nombre del modelo de embedding |
EMBED_URL | http://localhost:11434 | URL base de Ollama |
MISTRAL_API_KEY | — | Requerido si EMBED_PROVIDER=mistral |
QDRANT_URL | http://qdrant:6333 | URL de la instancia de Qdrant |
SQLITE_PATH | /data/memoraeu.db | Ruta de la base de datos SQLite |
MCP_ALLOWED_HOSTS | localhost,127.0.0.1,localhost:8000,127.0.0.1:8000 | Hosts 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_ORIGINS | http://localhost,http://127.0.0.1,https://claude.ai | Orí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?
| MemoraEU | Otros (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
| Autoalojado | MemoraEU Cloud | |
|---|---|---|
| Configuración | Docker Compose | Regístrate, listo |
| Ubicación de los datos | Tu servidor | UE (OVH, Francia) |
| Embeddings | Ollama (local) | |
| Actualizaciones | Manuales | Automáticas |
| Precio | Gratuito (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
| Variable | Rol |
|---|---|
MEMORAEU_API_KEY | Autenticación HTTP — token Bearer enviado con cada solicitud |
MEMORAEU_SECRET | Contraseña — entrada PBKDF2 para derivar la clave AES localmente |
MEMORAEU_SALT | Salt KDF por cuenta, generado en el registro |
MISTRAL_API_KEY | Clave 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
| Endpoint | Método | Descripción |
|---|---|---|
/gdpr/status | GET | Estadísticas de los datos almacenados |
/gdpr/export | GET | Exportación JSON completa (Art. 20) |
/gdpr/delete-account | DELETE | Purga irreversible Qdrant + SQLite (Art. 17) |
/me/gdpr-history | GET | Historial 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.
- 🐛 Abrir un problema
- 💬 Iniciar una discusión
- 📖 Leer la documentación de la API
- ☁️ Probar la nube gestionada
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.