RecipesImport from Mem0

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 skip

import 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 skip

Verify

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 metadata JSONB.

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.