Import from Mem0
Already running on Mem0 and want to switch? We ship a converter.
Export from Mem0
mem0 export --format json > mem0-export.json(See Mem0’s export docs for the latest command.)
Run the converter
export MNEMO_URL=http://localhost:3000
export MNEMO_KEY=mns_live_xxx
npx @mnemosyne/cli import mem0-export.json \
--from mem0 \
--conflict-resolution skipimport takes the file as a positional argument; the target URL and the
workspace come from MNEMO_URL and MNEMO_KEY (the workspace is derived
from the key). The Python SDK ships the same mnemo CLI:
pip install mnemosyne-sdk
mnemo import mem0-export.json --from mem0 --conflict-resolution skipVerify
curl http://localhost:3000/v1/health \
-H "Authorization: Bearer mns_live_xxx" \
| jq '.factsLive'The number should match what you exported from Mem0.
What translates 1:1
- Mem0 facts → Mnemosyne facts (
type: "fact",attribution: "llm_generated"). - User-scoped memories → workspace scoped via
tenant:<user-id>prefix. - Metadata bag → preserved as
metadataJSONB.
What is upgraded during import
- Tags are normalised (Mem0’s space-separated → Mnemosyne’s array).
- Embeddings are recomputed with your configured embedder so they’re in the same vector space as new writes.
- Bitemporal validity is set to
valid_from = mem0.created_at,valid_to = null. Once imported, Mnemosyne’s evolving knowledge layer takes over.
What doesn’t map
Mem0 doesn’t have decisions, episodes, entities, strategies, or relations. Those fields stay empty after import and start populating as your agent uses Mnemosyne natively.
We also ship importers for Zep, Letta, and Claude memory. The
flags are the same: --from zep, --from letta, --from claude.