Files
Saket Aryan bc5526f13d feat(integrations): declare which surface each client is, and its version
Nothing on the wire said which Mem0 surface made a call. Both SDKs sent only an
auth header, so the platform saw python-httpx and axios and attributed every
plugin, wrapper and direct API user to one undifferentiated bucket. Version was
unknowable, which is what gates every deprecation decision.

Three headers, and the rules on them are the point:

- X-Mem0-Source and X-Application are SET-ONCE. Whichever layer is outermost
  sets them; nothing below overwrites. A plugin wrapping the SDK keeps its own
  identity instead of being renamed by the transport underneath it.
- X-Mem0-Client is APPEND-ONLY. A plugin calling the Python SDK produces
  `mem0-plugin/0.3.1, mem0-python/2.0.19`, so neither layer can erase the other.

Deliberately not User-Agent: proxies rewrite it, and we have already met a WAF
that 403s on it.

The plugin core also hoists `source` out of metadata to the top level, which is
where the backend actually reads it. It sat in metadata, which get_event_source
never consults, so all six plugins arrived indistinguishable from a raw SDK call
no matter what they set. The harness tag stays in metadata as hook provenance.

pi-agent had PI_AGENT as a PostHog property only and never sent it on the wire.
vercel-ai-sdk sent nothing at all from its raw fetch calls.

Values must exist in the platform's EventSource enum or they bucket to OTHERS,
so integrations/AGENTS.md now states the contract and the "adding an
integration" checklist requires landing the platform value in the same week.

Pairs with mem0ai/platform#3602, which recognizes these values.

TypeScript changes are not typechecked locally — deps are not installed for
those packages. CI covers them.

Claude-Session: https://claude.ai/code/session_01C7tEmH86HAr7GoAAKCEHZb
2026-09-15 00:19:00 +05:30
..

mem0 CLI (Python)

The official command-line interface for mem0 — the memory layer for AI agents. Python implementation.

Built for AI agents. Pass --agent (or --json) as a global flag on any command to get structured JSON output optimized for programmatic consumption — sanitized fields, no colors or spinners, and errors as JSON too.

Prerequisites

  • Python 3.10+

Installation

pipx install mem0-cli

Using pip

pip install mem0-cli

Note: On macOS with Homebrew Python, pip install outside a virtual environment will fail with an externally-managed-environment error (PEP 668). Use pipx instead, or install inside a virtual environment.

Quick start

# Interactive setup wizard
mem0 init

# Or login via email
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

# Get a specific memory
mem0 get <memory-id>

# Update a memory
mem0 update <memory-id> "I switched to light mode"

# Delete a memory
mem0 delete <memory-id>

Commands

mem0 init

Interactive setup wizard. Prompts for your API key and default user ID.

mem0 init
mem0 init --api-key m0-xxx --user-id alice
mem0 init --email alice@company.com

If an existing configuration is detected, the CLI asks for confirmation before overwriting. Use --force to skip the prompt (useful in CI/CD).

mem0 init --api-key m0-xxx --user-id alice --force
Flag Description
--api-key API key (skip prompt)
-u, --user-id Default user ID (skip prompt)
--email Login via email verification code
--code Verification code (use with --email for non-interactive login)
--force Overwrite existing config without confirmation

mem0 add

Add a memory from text, a JSON messages array, a file, or stdin.

mem0 add "I prefer dark mode" --user-id alice
mem0 add --file conversation.json --user-id alice
echo "Loves hiking on weekends" | mem0 add --user-id alice
Flag Description
-u, --user-id Scope to a user
--agent-id Scope to an agent
--messages Conversation messages as JSON
-f, --file Read messages from a JSON file
-m, --metadata Custom metadata as JSON
--categories Categories (JSON array or comma-separated)
--graph / --no-graph Enable or disable graph memory extraction
-o, --output Output format: text, json, quiet

Search memories using natural language.

mem0 search "dietary restrictions" --user-id alice
mem0 search "preferred tools" --user-id alice --output json --top-k 5
Flag Description
-u, --user-id Filter by user
-k, --top-k Number of results (default: 10)
--threshold Minimum similarity score (default: 0.3)
--rerank Enable reranking
--keyword Use keyword search instead of semantic
--filter Advanced filter expression (JSON)
--graph / --no-graph Enable or disable graph in search
-o, --output Output format: text, json, table

mem0 list

List memories with optional filters and pagination.

mem0 list --user-id alice
mem0 list --user-id alice --category preferences --output json
mem0 list --user-id alice --after 2024-01-01 --page-size 50
Flag Description
-u, --user-id Filter by user
--page Page number (default: 1)
--page-size Results per page (default: 100)
--category Filter by category
--after Created after date (YYYY-MM-DD)
--before Created before date (YYYY-MM-DD)
-o, --output Output format: text, json, table

mem0 get

Retrieve a specific memory by ID.

mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789
mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789 --output json

mem0 update

Update the text or metadata of an existing memory.

mem0 update <memory-id> "Updated preference text"
mem0 update <memory-id> --metadata '{"priority": "high"}'
echo "new text" | mem0 update <memory-id>

mem0 delete

Delete a single memory, all memories for a scope, or an entire entity.

# Delete a single memory
mem0 delete <memory-id>

# Delete all memories for a user
mem0 delete --all --user-id alice --force

# Delete all memories project-wide
mem0 delete --all --project --force

# Preview what would be deleted
mem0 delete --all --user-id alice --dry-run
Flag Description
--all Delete all memories matching scope filters
--entity Delete the entity and all its memories
--project With --all: delete all memories project-wide
--dry-run Preview without deleting
--force Skip confirmation prompt

mem0 import

Bulk import memories from a JSON file.

mem0 import data.json --user-id alice

The file should be a JSON array where each item has a memory (or text or content) field and optional user_id, agent_id, and metadata fields.

mem0 config

View or modify the local CLI configuration.

mem0 config show              # Display current config (secrets redacted)
mem0 config get api_key       # Get a specific value
mem0 config set user_id bob   # Set a value

mem0 entity

List or delete entities (users, agents, apps, runs).

mem0 entity list users
mem0 entity list agents --output json
mem0 entity delete --user-id alice --force

mem0 event

Inspect background processing events created by async operations (e.g. bulk deletes, large add jobs).

# List recent events
mem0 event list

# Check the status of a specific event
mem0 event status <event-id>
Flag Description
-o, --output Output format: text, json

mem0 status

Verify your API connection and display the current project.

mem0 status

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
mem0 --agent delete --all --user-id alice --force

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)

Global flags

These flags are available on all commands:

Flag Description
--json Enable agent mode: structured JSON envelope output, no colors or spinners
--agent Alias for --json
--api-key Override the configured API key for this request
--base-url Override the configured API base URL for this request
-o, --output Set the output format

mem0 --version prints the CLI version. It is only valid before a subcommand, not after one.

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)

Environment variables take precedence over values in the config file, which take precedence over defaults.

Development

cd cli/python
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

# Run during development
python -m mem0_cli --help
mem0 add "test memory" --user-id alice

Releasing

  1. Update version in pyproject.toml
  2. Create a GitHub Release with tag cli-v<version> (e.g. cli-v0.2.1)

For a pre-release, use a beta version like 0.2.1b1 and check the pre-release checkbox.

Documentation

Full documentation is available at docs.mem0.ai/platform/cli.

License

Apache-2.0