PR review surfaced a data-loss path: pingKey returned False on ANY exception,
so a VPN flap or DNS hiccup made Rules 1/2 (reuse existing valid key) fall
through to Rule 3 (mint new shadow), silently rotating the user's API key
and rewriting plugin-sync targets (~/.claude/settings.json, .zshrc).
Now pingKey returns False ONLY on a definitive auth failure (HTTP 401/403).
Network errors, timeouts, and 5xx responses return True so the existing key
is preferred over re-minting. Mirror change in both Python and Node.
Additional fixes from the same review pass:
- --agent-caller is now PATCHed to the backend when supplied on a Rule 1
or Rule 2 reuse path (previously silently dropped). Best-effort —
failures don't break reuse.
- bootstrap_via_backend / bootstrapViaBackend renames the `body` local on
the error path to `err_body` (no longer shadows the request payload).
Same rename in the claim flow.
- Bootstrap envelope is now validated for non-empty api_key +
default_user_id before mutation — defends against partial backend
responses silently persisting null/undefined into typed string fields.
- Stale docstrings in agent_detect.{py,ts} and bootstrap_via_backend no
longer claim env-var sniffing fills `agent_caller`; the field is
self-declared via --agent-caller only.
Tests (new file mirrored across runtimes):
- test_init_internals.py / init-internals.test.ts
- pingKey: 200/401/403/5xx/connect-error/timeout matrix
- plugin_sync.updateShellRc: trailing-newline preservation, no-create,
surrounding-content preservation, idempotency, missing-file no-op
- plugin_sync.updateClaudeSettings: no env-block creation, no
MEM0_API_KEY insertion into existing env, idempotency, malformed JSON
no-op
- Python only: bootstrap 403 "permission" → daily-limit translation
Python: 161 tests pass. Node: 112 tests pass. ruff + biome clean.
mem0 CLI
The official command-line interface for mem0 — the memory layer for AI agents. Works with the Mem0 Platform API. Available in Python and Node.js.
For AI agents: pass
--agent(or--json) on any command for structured JSON output purpose-built for tool loops — sanitized fields, no colors or spinners, errors as JSON. See Agent mode below.
Installation
npm install -g @mem0/cli
pip install mem0-cli
Both packages install a mem0 binary with identical behavior.
Quick start
# Interactive setup wizard
mem0 init
# Or login via email (get a new API key)
mem0 init --email alice@company.com
# Or authenticate with an existing API key
mem0 init --api-key m0-xxx
# Add a memory
mem0 add "I prefer dark mode and use vim keybindings" --user-id alice
# Search memories
mem0 search "What are Alice's preferences?" --user-id alice
# List all memories for a user
mem0 list --user-id alice
# Update a memory
mem0 update <memory-id> "I switched to light mode"
# Delete a memory
mem0 delete <memory-id>
Commands
| Command | Description |
|---|---|
mem0 init |
Setup wizard — login via email or configure API key manually |
mem0 add |
Add a memory from text, JSON messages, a file, or stdin |
mem0 search |
Search memories using natural language |
mem0 list |
List memories with optional filters and pagination |
mem0 get |
Retrieve a specific memory by ID |
mem0 update |
Update the text or metadata of a memory |
mem0 delete |
Delete a memory, all memories for a scope, or an entity |
mem0 import |
Bulk import memories from a JSON file |
mem0 config |
View or modify CLI configuration |
mem0 entity |
List or delete entities (users, agents, apps, runs) |
mem0 event |
Inspect background processing events (bulk deletes, large add jobs) |
mem0 status |
Verify API connection and display current project |
mem0 version |
Print the CLI version |
Run mem0 <command> --help for detailed usage on any command.
Agent mode
Pass --agent (or its alias --json) as a global flag on any command to get output designed for AI agent tool loops:
mem0 --agent search "user preferences" --user-id alice
mem0 --agent add "User prefers dark mode" --user-id alice
mem0 --agent list --user-id alice
Every command returns the same envelope shape:
{
"status": "success",
"command": "search",
"duration_ms": 134,
"scope": { "user_id": "alice" },
"count": 2,
"data": [
{ "id": "abc-123", "memory": "User prefers dark mode", "score": 0.97, "created_at": "2026-01-15", "categories": ["preferences"] }
]
}
What agent mode does differently from --output json:
- Sanitized
data: only the fields an agent needs (id, memory, score, etc.) — no internal API noise - No human output: spinners, colors, and banners are suppressed entirely
- Errors as JSON: errors go to stdout as
{"status": "error", "command": "...", "error": "..."}with a non-zero exit code
Use mem0 help --json to get the full command tree as JSON — useful for agents that need to self-discover available commands.
Output formats
Control how results are displayed with --output:
| Format | Description |
|---|---|
text |
Human-readable with colors and formatting (default) |
json |
Structured JSON for piping to jq (raw API response) |
table |
Tabular format (default for list) |
quiet |
Minimal — just IDs or status codes |
agent |
Structured JSON envelope with sanitized fields (set by --agent/--json) |
Environment variables
| Variable | Description |
|---|---|
MEM0_API_KEY |
API key (overrides config file) |
MEM0_BASE_URL |
API base URL |
MEM0_USER_ID |
Default user ID |
MEM0_AGENT_ID |
Default agent ID |
MEM0_APP_ID |
Default app ID |
MEM0_RUN_ID |
Default run ID |
MEM0_ENABLE_GRAPH |
Enable graph memory (true / false) |
Implementations
| Language | Directory | Package | Docs |
|---|---|---|---|
| TypeScript | node/ |
@mem0/cli |
README |
| Python | python/ |
mem0-cli |
README |
Documentation
Full documentation is available at docs.mem0.ai/platform/cli.
License
Apache-2.0