Command-Line Interface
cortexdb — a fast, full-coverage CLI for the v1 memory API.
cortexdb-cli is a Click + Rich CLI that wraps the v1 HTTP API in a small, fast binary. It works against
CortexDB Cloud or any self-hosted CortexDB deployment.
pip install cortexdb-cliRequires Python 3.10+. The cortexdb-cli version line is independent of
the CortexDB server version; see
Versioning and SDK compatibility.
The happy path on CortexDB Cloud
Create an API token on your dashboard (it shows your actor and default scope too), put the four values in the environment, and go:
export CORTEXDB_URL=https://api.cortexdb.ai
export CORTEXDB_API_KEY='<your API token>'
export CORTEXDB_ACTOR=user:acct_42
export CORTEXDB_SCOPE=org:acct_42/user:acct_42
cortexdb experience "Q3 revenue: $2.4M, $10M ARR target" # store
cortexdb recall "Q3 revenue?" # retrievecortexdb init signs up anonymously instead (POST /v1/auth/signup) and persists the identity to
~/.cortexdb/state.json (mode 0600 on POSIX). That needs a server whose minter allows anonymous
signup, such as a self-hosted dev server started with CORTEX_V1_MINTER_ENABLE=1; CortexDB Cloud has it
off, since its accounts come from cortexdb.ai.
Commands
This table is a curated subset
The CLI ships more commands than are listed here. The full set also includes
audit, claims, code, compose, concepts, conflicts, and wire — run
cortexdb --help for the authoritative list. code is the Code Intelligence Plane CLI.
| Command | What it does | v1 endpoint |
|---|---|---|
cortexdb init | Anonymous signup; persist state.json | POST /v1/auth/signup |
cortexdb preflight | Read-only environment checks | GET /v1/admin/health |
cortexdb plan | What apply would do; writes nothing | (local) |
cortexdb apply / resume / status | Run onboarding, checkpointed | /v1/auth/signup, /v1/admin/ready |
cortexdb doctor | Diagnose an existing install | /v1/admin/{health,ready}, /v1/auth/whoami |
cortexdb verify | Prove write → recall → cleanup | /v1/experience, /v1/recall, /v1/forget |
cortexdb cleanup | Remove what verify/apply created | POST /v1/forget |
cortexdb experience "..." | Store a memory | POST /v1/experience |
cortexdb experience bulk file.jsonl | Bulk-load envelopes | POST /v1/experience/bulk |
cortexdb recall "..." | Stratified context pack | POST /v1/recall (holistic) |
cortexdb search "..." | Granular event hits | POST /v1/recall (granular) |
cortexdb answer "..." | Recall + LLM answer | POST /v1/answer |
cortexdb forget --memory-id ... --reason ... | Delete with audit | POST /v1/forget |
cortexdb episodes {list,get,delete} | Episode + event ops | /v1/episodes, /v1/events/{id} |
cortexdb entities {list,get,link} | Entity rollups | /v1/facts |
cortexdb facts {list,timeline} | Typed triples + bi-temporal lineage | /v1/facts, /v1/facts/timeline |
cortexdb beliefs {list,why,build} | Aggregated beliefs + provenance | /v1/beliefs* |
cortexdb understanding {list,coverage,synthesize} | Synthesized concepts | /v1/concepts, /v1/concepts/coverage, /v1/understanding/synthesize |
cortexdb scopes {list,register,members} | Hierarchical scopes | /v1/scopes* |
cortexdb auth {whoami,signup,tokens,revoke} | Identity + mint + revoke | /v1/auth* |
cortexdb policy {effective,deployment} | What can this actor do, where? | /v1/policy* |
cortexdb admin {health,usage,layers} | Diagnostics | /v1/auth/whoami, /v1/admin/layers/stats |
cortexdb admin retention {show,set,sweep,delete} | Retention rules and the expiry sweep | /v1/admin/retention, /v1/admin/retention/policies, /v1/admin/retention/sweep — see Retention & WAL |
cortexdb admin wal {status,compact} | Unified WAL census and dead-row compaction | /v1/admin/wal, /v1/admin/wal/compact |
cortexdb audit {status,verify} | Audit hash-chain integrity | /v1/audit* |
cortexdb claims / conflicts | Bi-temporal record history; contradiction detection | /v1/claims/history, /v1/conflicts |
cortexdb concepts | LLM-synthesized concepts and themes | /v1/concepts |
cortexdb code {...} | Code-plane repos, imports, bundles | /v1/code/* |
cortexdb compose | Structured markdown document from memory | POST /v1/compose |
cortexdb wire | Wire an agent harness to CortexDB, and prove it | (local) |
cortexdb import data.{json,jsonl,csv,txt} | Bulk ingest | POST /v1/experience per row (or one POST /v1/import with the server-side option) |
cortexdb export -o backup.json | Export memories | POST /v1/export |
cortexdb config {show,set} | Edit ~/.cortexdb/config.toml | (local) |
cortexdb (no args) | Interactive REPL | (wraps the above) |
cortexdb auth tokens: --scope does not confine
cortexdb auth tokens --scope PATH only says where your own auth.mint is checked; it does not
confine the token. To confine it, pass --confine CAP:PREFIX (repeatable), which is sent as the token's
scopes claim:
cortexdb auth tokens --subject agent:b --ttl 3600 --confine 'scope.read:org:acme/team:b/*'The CLI refuses a --scope value that looks like a
CAP:PREFIX entry and points you at --confine. See Auth for how scope,
scopes and caps differ.
cortexdb remember "..." is a hidden alias for experience — kept so old scripts and muscle memory
keep working.
--wait indexed and the 30-second budget
The CLI's HTTP timeout is 30 s, the same as the server's wait budget, so
cortexdb experience --wait indexed "…" against a server that can't index in time ends with the CLI's
own Request timed out. (exit code 2) after about 30 s, not the server's 408 WAIT_TIMEOUT. The write is
captured and durable either way. The CLI derives each write's idempotency_key from the scope and the
text, so re-running the same command replays that write instead of storing it twice.
Onboarding and diagnostics
Eight commands exist specifically so a coding agent can install, verify and diagnose CortexDB without guessing. They share one output envelope and one exit-code contract.
cortexdb preflight # can this machine talk to CortexDB at all?
cortexdb plan # what would apply do? (no writes)
cortexdb apply # do it, checkpointing after each stage
cortexdb resume # continue after an interruption
cortexdb doctor # why is my existing install unhappy?
cortexdb verify # prove write -> recall -> cleanup end to end
cortexdb cleanup # remove what verify/apply createdOne envelope
Every one of them emits the same document, so you parse one shape rather than eight. --json works
before or after the subcommand, and is implied when stdout is not a TTY.
{
"schema": "cortexdb.cli.diagnostic/v1",
"command": "doctor",
"ok": false,
"exit_code": 11,
"outcome": "failure",
"first_failing_stage": "authenticated",
"counts": { "pass": 4, "fail": 1, "skip": 0, "blocked": 1 },
"stages": [
{
"id": "authenticated",
"title": "Token is accepted",
"state": "fail",
"detail": "HTTP 401: token expired",
"retriable": false,
"remediation": "The token is missing, expired or revoked. Run `cortexdb init`.",
"doc_url": "https://cortexdb.ai/docs/api-reference/auth"
}
]
}Every stage that is not pass carries retriable, remediation and doc_url.
Exit codes
Branch on these instead of parsing the message:
| Code | Meaning | What to do |
|---|---|---|
0 | Everything passed | Continue |
2 | Usage error | Fix the command line |
10 | A stage failed transiently | Retry |
11 | A stage failed permanently | Act on remediation |
12 | Blocked — a prerequisite is absent, nothing was attempted | Satisfy the prerequisite |
1 | Unexpected internal error | Report the JSON |
blocked is deliberately distinct from fail: "you have no credentials" and "your credentials were
rejected" need different responses.
Stages are idempotent
Each stage probes before it acts, so a stage that is already satisfied reports skip with the reason.
Re-running a partial onboarding is safe, apply never mints a second identity, and resume is simply
apply reading the checkpoint at ~/.cortexdb/onboarding.json.
apply stops at the first failing stage rather than continuing.
verify is safe against a real deployment
verify writes one synthetic marker with ?wait=indexed, so read-your-writes is guaranteed by the
time the write returns. Everything it writes goes into a cortexdb-cli-verify leaf subtree of your
scope, and cleanup removes exactly that subtree — it cannot reach your real data. Pass --keep to
leave the marker in place for inspection.
Pipe-friendly
Auto-detects when stdout isn't a TTY and switches to JSON:
cortexdb recall "Q3 revenue" | jq .context_block
cortexdb facts list | jq '.items[] | {predicate, object}'
echo "remember this" | cortexdb experience -
cat envelopes.jsonl | cortexdb experience bulk -Force JSON any time with --json.
Configuration
Three layers, in precedence order (high to low):
- CLI flags —
--api-key,--endpoint,--actor,--scope,--profile - Environment —
CORTEXDB_API_KEY,CORTEXDB_URL,CORTEXDB_ACTOR,CORTEXDB_SCOPE - Persisted state:
~/.cortexdb/config.toml— endpoint, profile names (human-editable)~/.cortexdb/state.json— token, actor, scope, expiry (managed byinit;0600on POSIX)
state.json is not a drop-in copy to the MCP server
The CLI and connectors use ~/.cortexdb/state.json, while cortexdb-mcp reads
<APPDATA|XDG>/cortexdb-mcp/state.json — and the key names differ: the CLI writes
{ token, user_id, scope, expires_at }, the MCP server reads { token, actor, scope }. Reusing one anonymous identity across both tools means copying
the file to the other tool's path and renaming user_id ↔ actor; a straight copy leaves the MCP
server without an actor, so its calls fail the actor-vs-token check.
Also available: --config-dir (env CORTEXDB_HOME) isolates one project's identity and checkpoints
from another's — --profile alone does not.
Auth notes
Against the cloud (and any server with CORTEX_API_KEY set), authenticated requests carry both
Authorization: Bearer <token> and X-Cortex-Actor — the bearer is a PASETO v4 token, or the
CORTEX_API_KEY value itself on self-hosted servers. The CLI stamps both for you.
Local no-auth mode is opt-in
A self-hosted server started with CORTEX_INSECURE_NO_AUTH=1 serves everything as user:local —
no headers required (and /v1/admin/health / ready never need auth). Otherwise the CLI sends the
CORTEX_API_KEY value as the bearer for you; a keyless, network-exposed server auto-generates a key and
requires it.
- 401s show the specific error code (
TOKEN_EXPIRED,ACTOR_MISMATCH,INVALID_TOKEN_SIGNATURE) and the remediation: on CortexDB Cloud, a new token from your dashboard. - 403s cite the missing capability and the policy tier that denied. If a recall returns
diagnostics.readdenied, pass--diagnostics none— CortexDB Cloud tokens don't carrydiagnostics.read(the CLI defaults tonone). - On CortexDB Cloud,
402 PLAN_LIMIT_REACHEDand429 SUBTREE_RATE_LIMITEDmean a plan limit (Plans and limits). - Every authenticated response carries
X-RateLimit-Limit,X-RateLimit-Reset,X-Cortex-Token-Expires-In, andX-Cortex-Token-Expires-At;cortexdb admin usagesurfaces them.
Profiles
Run against multiple deployments by passing --profile:
cortexdb --profile prod --endpoint https://api.cortexdb.ai --api-key "$PROD_TOKEN" --actor user:acct_42 auth whoami
cortexdb --profile staging init --endpoint https://staging.cortexdb.example
cortexdb --profile staging experience "test memory"Each profile gets its own block in ~/.cortexdb/config.toml. The state.json is shared — if you need
separate identities per profile, run cortexdb auth signup --save after switching, or isolate with
--config-dir.
See also
- Python SDK — programmatic access from Python.
- TypeScript SDK — programmatic access from JS/TS.
- MCP Server — same v1 surface exposed to Claude / Cursor / VS Code Copilot.
- Auth — how tokens, actors, and capabilities fit together.