Clawdi
OFFICIAL SERVERMemories, past sessions, projects and encrypted vaults from a Clawdi account, as MCP tools
Local, SQLite-backed memory and hybrid search over your markdown for coding agents
By Yoloshi Nomotomoro? (individual) JavaScript Local · stdio Knowledge and memory
48 popularity score ★ 211 ↓ 190/wk
Opens the app, which asks before it adds the server.
npm install -g clawmem
clawmem bootstrap <NOTES_DIR> --name <NAME>claude mcp add clawmem -- clawmem mcp{
"mcpServers": {
"clawmem": {
"command": "clawmem",
"args": [
"mcp"
]
}
}
}{
"mcpServers": {
"clawmem": {
"command": "clawmem",
"args": [
"mcp"
]
}
}
}{
"servers": {
"clawmem": {
"type": "stdio",
"command": "clawmem",
"args": [
"mcp"
]
}
}
}[mcp_servers.clawmem]
command = "clawmem"
args = ["mcp"]gemini mcp add --scope user clawmem clawmem -- mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/yoloshii/clawmem.git <ABSOLUTE_PATH_TO_CLONE>
cd <ABSOLUTE_PATH_TO_CLONE> && bun install
<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem bootstrap <NOTES_DIR> --name <NAME>claude mcp add clawmem -- '<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem' mcp{
"mcpServers": {
"clawmem": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem",
"args": [
"mcp"
]
}
}
}{
"mcpServers": {
"clawmem": {
"command": "<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem",
"args": [
"mcp"
]
}
}
}{
"servers": {
"clawmem": {
"type": "stdio",
"command": "<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem",
"args": [
"mcp"
]
}
}
}[mcp_servers.clawmem]
command = "<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem"
args = ["mcp"]gemini mcp add --scope user clawmem '<ABSOLUTE_PATH_TO_CLONE>/bin/clawmem' -- mcpCLAWMEM_VAULTS |
Optional: JSON map of named vaults to SQLite paths. Without it there is one vault at ~/.cache/clawmem/index.sqlite. |
|---|---|
CLAWMEM_NO_LOCAL_MODELS |
Optional: Set to true to fail instead of running models in-process with node-llama-cpp. |
CLAWMEM_HEAVY_LANE |
Optional: Set to true for the quiet-window heavy maintenance worker. Meant for the clawmem watch service. |
| Set together: embedding | |
CLAWMEM_EMBED_URL |
Optional: Embedding server address. Left unset, embedding runs in-process. |
CLAWMEM_EMBED_API_KEY secret |
Optional: Key for a cloud embedding provider. Setting it turns on cloud mode. |
| Set together: embedding wait | |
CLAWMEM_EMBED_WAIT_SEC |
Optional: Seconds clawmem embed waits for a self-hosted embedding server when no cloud key is set and local models are off. |
CLAWMEM_EMBED_WAIT_INTERVAL_MS |
Optional: Milliseconds between probes during that wait. |
CLAWMEM_EMBED_PROBE_TIMEOUT_MS |
Optional: Milliseconds one probe during that wait may take. |
| Set together: consolidation | |
CLAWMEM_ENABLE_CONSOLIDATION |
Optional: Set to true to run the consolidation worker inside the server. |
CLAWMEM_CONSOLIDATION_INTERVAL |
Optional: Consolidation worker interval in milliseconds. |
ClawMem keeps a long-term memory for coding agents on your own machine. It indexes collections of markdown (project docs, notes, research, Obsidian vaults) into a SQLite vault, stores decisions and handoffs taken from past sessions, and lets the agent search all of it with keyword (BM25), vector and combined reranked queries, plus graph lookups for causes, timelines and entity facts.
The MCP server is one of four ways in. The same vault is also fed by Claude Code hooks, a native OpenClaw memory plugin and a Hermes Agent memory provider, so what one runtime records is visible to the others. Its makers say the hooks do most of the work in Claude Code and the MCP tools are for targeted look-ups when the hooks miss something.
The stdio server is started with `clawmem mcp`. At v0.43.5 the server code (src/mcp.ts) registers 33 tools, including a `__IMPORTANT` guide tool that tells the agent which search to use. It also serves any indexed document as a `clawmem://{+path}` resource, which the README does not mention. Searches return 10 results by default (`limit`), `multi_get` caps output at 10,240 bytes by default (`maxBytes`), and `lifecycle_sweep` only previews unless `dry_run` is set to false. Embedding, query expansion and reranking run on local models through llama-server or in-process node-llama-cpp. Cloud embedding providers are an opt-in alternative.
| Runtime | Bun 1.0+ |
|---|---|
| Runs on | Linux, macOS |
| Also |
|
On Linux, install Bun with the bun.sh script rather than snap, which breaks the hooks. Windows users run it inside WSL2. Before the server is useful, create a vault with content using `clawmem bootstrap <dir> --name <name>`. Local models download on first use.
Without a GPU or llama-server, models run in-process and can fall back to CPU silently; set `CLAWMEM_NO_LOCAL_MODELS=true` to fail instead. Contradiction detection only works when a judge model is configured (`CLAWMEM_JUDGE_*`). `vault_sync` refuses directories under /etc, /root, /var, /proc, /sys, /dev and paths containing .ssh, .env, credentials, secrets, .aws or .kube. The makers warn that most zerank-2 GGUF files lack the score head and do nothing as rerankers. The heavy maintenance lane (`CLAWMEM_HEAVY_LANE`) is meant for the `clawmem watch` service, and the MCP server warns that it may never run there.
Suits a developer who wants memory for Claude Code, OpenClaw or Hermes that stays on their own machine, works over their own markdown, and needs no API key. It is most useful with the hooks installed as well as the MCP server; with any other MCP client you get the 33 tools but no automatic capture or context injection. It asks more setup than a plain notes server: Bun, an indexed vault, local models and ideally a GPU. Pick something else if you are on native Windows, want a hosted memory shared across machines without running services, or need a store that agents only read: several tools write to the vault.
23 only read, 9 change things, 1 can delete or overwrite. A ? marks an optional parameter.
__IMPORTANTmemory_retrievequery: stringmode?: enumlimit?: numbercompact?: booleanincludeInternal?: booleanvault?: stringsearchquery: stringlimit?: numberminScore?: numbercollection?: stringcompact?: booleanincludeInternal?: booleanvault?: stringvsearchquery: stringlimit?: numberminScore?: numbercollection?: stringcompact?: booleanincludeInternal?: booleanvault?: stringqueryquery: stringlimit?: numberminScore?: numbercollection?: stringcompact?: booleandiverse?: booleanintent?: stringcandidateLimit?: numberincludeInternal?: booleanvault?: stringmemory_forget deletesquery: stringconfirm?: booleanvault?: stringprofilerebuild?: booleangetfile: stringfromLine?: numbermaxLines?: numberlineNumbers?: booleanvault?: stringmulti_getpattern: stringmaxLines?: numbermaxBytes?: numberlineNumbers?: booleanvault?: stringstatusvault?: stringfind_similarfile: stringlimit?: numberincludeInternal?: booleanvault?: stringreindex changesvault?: stringindex_statsvault?: stringmemory_statscollection?: stringvault?: stringmemory_rankquery: stringlimit?: numbercollection?: stringweightProfile?: enumincludeInternal?: booleanvault?: stringsession_loglimit?: numbervault?: stringbeads_sync changesproject_path?: stringbuild_graphs changesgraph_types?: arraysemantic_threshold?: numbervault?: stringintent_searchquery: stringlimit?: numberforce_intent?: enumenable_graph_traversal?: booleanvault?: stringquery_planquery: stringlimit?: numbercompact?: booleanincludeInternal?: booleanvault?: stringfind_causal_linksdocid: stringdirection?: enumdepth?: numbervault?: stringkg_queryentity: stringas_of?: stringdirection?: enumvault?: stringmemory_evolution_statusdocid: stringlimit?: numbervault?: stringtimelinedocid: stringbefore?: numberafter?: numbersame_collection?: booleanvault?: stringmemory_pin changesquery: stringunpin?: booleanvault?: stringmemory_snooze changesquery: stringuntil?: stringvault?: stringlifecycle_statusvault?: stringlifecycle_sweep changesdry_run?: booleanvault?: stringlifecycle_restore changesquery?: stringcollection?: stringall?: booleanvault?: stringlist_vaultsvault_sync changesvault: stringcontent_root: stringpattern?: stringcollection_name?: stringdiary_write changesentry: stringtopic?: stringagent?: stringvault?: stringdiary_readlast_n?: numberagent?: stringvault?: stringclawmem://{+path}