Documentation · Visp Memory
Visp Memory docs.
From the first install to a useful next session. A guide to the local, single-repository workflow.
pip install "visp-memory[mcp,capture]"
How memory carries forward
Visp Memory stores project knowledge outside the conversation, so a coding agent can retrieve it in a later session.
It complements your agent’s instruction files: those describe how to work; memory supplies relevant history, decisions, warnings, and goals.
- 1CaptureGit history, instruction files, explicit records
- 2StoreEvents, knowledge and intent, with their origin
- 3RetrieveCandidates for the task and the files in scope
- 4CurateRelevance, trust, duplication and budget checks
- 5RecordThe reasoning worth reusing, after the work
- Capture. Initialization mines existing git history and instruction files. You or your connected agent can also record a decision, a bug fix, or a warning explicitly.
- Store with context. Memories retain their origin and project scope in a persistent local store. Events, reusable knowledge, and intentions have distinct roles.
- Retrieve for the task. Search finds candidates. A task brief combines relevant memory with evidence citations, constraints, and explicit unknowns within a token budget.
- Curate what gets injected. Automatic injection applies relevance, trust, duplication, and budget checks. It can return nothing when the evidence is weak.
- Record the outcome. Save the reasoning and discoveries worth reusing after work. New projects gain useful history only as someone records it.
Further reading: injection policy and provenance and trust.
Architecture
One memory core, several ways in.
The Python Memory facade coordinates configuration, memory layers, storage, and retrieval. The CLI and MCP server expose that core; an optional FastAPI server lets the dashboard and remote clients use it.
visp-memoryvisp-memory-mcpCLI · You, or your agent following its installed instructions, run visp-memory commands such as decision, recall and brief.
MCP · An MCP client runs visp-memory-mcp and calls tools such as memory_prepare_task and memory_record.
API · An optional FastAPI server for the dashboard and remote clients. It needs the api extra and is experimental.
Three kinds of memory

Decisions, discoveries, and bug fixes, including the reasoning behind a change.

Reusable facts, conventions, patterns, and warnings. Immutable evidence is stored apart from semantic beliefs, and a belief can’t be written without evidence from the same project.

Goals, focus, and constraints that give context to the current task. Outcome records do not make memory the authority for task completion status.
Where your data lives
SQLite is the default storage backend, and keyword search always works. Semantic search needs both an embedding provider and the Chroma vector index, so install them together: visp-memory[chroma,local-embeddings] for sentence-transformers, [chroma,ollama] for Ollama, or [chroma,openai] for OpenAI or OpenRouter. Changing the provider or model needs an index rebuild.
With VISP_MEMORY_EMBEDDING_PROVIDER=noop, search is keyword-only and nothing leaves your machine. Set it explicitly: the default, auto, tries a hosted provider first when its API key is in the environment.
Semantic search with a model you run yourself. sentence-transformers downloads its model once; Ollama processes text wherever its endpoint is, which may be another machine.
Text sent for embedding goes to the selected service. The store itself stays in SQLite on your disk.
Source references: memory core, architecture reference, and evidence contract. Use the feature status below when evaluating optional backends.
Functionality & support
What is stable today, and what is still settling.
| Capability | What you can do | Status |
|---|---|---|
| CLI & local storage | Record knowledge, search history, prepare briefs, and persist with SQLite. | Stable |
| MCP core tools | Let an agent recall, record, prepare tasks, and inspect file context. | Stable |
| Git capture & search | Seed from history; retrieve with keywords or configured embeddings. | Stable |
| Injection & auditing | Budget context, inspect provenance, and filter stale or quarantined memory. Claude Code auto-injection is also beta. | Beta |
| Shared local server | One store at ~/.visp-memory/data for several projects and agents on one machine, with a single-writer guard. | Beta |
| Dreaming & workflow reports | Preview and apply duplicate cleanup and review proposals; receive completion reports from your assistant. | Beta |
| Neo4j backend | An optional evidence graph. Needs an external service; SQLite stays the default. | Beta |
| Other hooks & UI | Codex, Cursor, Aider, and generic integrations; REST API and dashboard; ranking and coverage options; agent attribution. | Experimental |
| Teams & aggregation | Team accounts, cross-repo aggregation and ArcadeDB are outside the supported path. | Frozen |
Checked against the upstream feature status for release 0.9.0 on October 11, 2026. Use your installed command’s --help to check release-specific options.
User guide
Four steps, in order. Each one ends with something you can check.
1. Install and initialize
Use Python 3.10 or newer and run these commands from your project’s git repository. A virtual environment keeps the installation separate from system Python. The extras enable MCP and git capture.
python -m venv .venv
# macOS / Linux; Windows PowerShell: .venv\Scripts\Activate.ps1
source .venv/bin/activate
python -m pip install "visp-memory[mcp,capture]"
visp-memory init
visp-memory doctor
Initialization creates visp-memory.yaml and stores data under .visp-memory/data by default, adding the data directory to git ignores. It uses the project name as the default repository scope and seeds from history. Use visp-memory init --no-mine instead if you want an empty store, or run visp-memory demo to try capture and recall in a temporary store first.
Prefer the dashboard? Run the Docker image
The published Linux amd64 image runs the server and dashboard with persistent storage. On a fresh store, the logs print a one-use link to create your administrator account; there is no default password.
docker run -d --name visp-memory \
-p 127.0.0.1:8000:8000 \
-v visp-memory-data:/data \
-e VISP_MEMORY_EMBEDDING_PROVIDER=noop \
ghcr.io/djkeshawa/visp-memory:0.9.0
docker logs visp-memory
Then open http://127.0.0.1:8000/dashboard. The REST API and dashboard are experimental.
2. Make memory reachable by your agent
visp-memory hooks list
visp-memory hooks install claude-code --mcp # hooks, plus the MCP server in .mcp.json
visp-memory hooks install codex
visp-memory doctor
For Claude Code, --mcp merges a visp-memory server into the project’s .mcp.json without replacing your other servers. The Codex integration adds project instructions to AGENTS.md and a visp-memory-mcp entry in ~/.codex/config.toml, keeping a backup of the old file. Review the generated files and look for “Agent reachability: reachable” in the doctor output. Other targets include cursor, aider, and generic.
Connect an MCP client directly
Use the installed visp-memory-mcp executable with the project as its working directory. Replace the path below, and use your client’s equivalent working-directory setting if it does not support cwd. Ensure the executable from your virtual environment is on the client’s PATH, or supply its absolute path.
{
"mcpServers": {
"visp-memory": {
"command": "visp-memory-mcp",
"args": [],
"cwd": "/absolute/path/to/your-project",
"env": {
"VISP_MEMORY_MCP_PROFILE": "core",
"VISP_MEMORY_EMBEDDING_PROVIDER": "noop",
"VISP_MEMORY_AGENT": "your-client-name"
}
}
}
}
Restart the client, check that memory tools appear, and ask it to use memory_prepare_task before edits and memory_decision or memory_record after useful discoveries. This example uses keyword search, and VISP_MEMORY_AGENT labels what this client writes. For a shared server, see the MCP integration guide.
3. Record useful knowledge
Write concrete statements with a reason or file context. These examples illustrate a project that uses bounded API retries, one per kind of memory:
visp-memory decision "Limit API retries to three" "Avoid retry storms during outages"
visp-memory warn "src/api/client.py" "Keep retries bounded to avoid retry storms"
visp-memory record "Fixed duplicate requests after client timeouts"
visp-memory goal "Improve API resilience" --priority 2
4. Recall before changing code
Use search to explore what was recorded. Use a task brief when preparing work; its file scope and token budget keep the output focused.
visp-memory recall "API retries"
visp-memory brief "Update API retry handling" --file src/api/client.py --tokens 1200
visp-memory preview "Update API retry handling" --file src/api/client.py
visp-memory audit
recallWhat was recorded about this?Search across memory, by keyword or configured embeddings.
briefWhat should the agent know for this task?Cited task context for the files in scope, within a token budget.
previewWould automatic injection add anything, and why?Explains the injection policy’s selection or abstention.
auditWhere did this memory come from?Provenance, and whether a memory can be injected.
preview is not a preview of brief: it explains the separate automatic injection policy.preview to inspect a decision. An empty injection can be the intended outcome.A brief reports an active goal only when the task shares a topic word with it; otherwise it lists the goal under unknowns. brief and recall also take --ranking-strategy hybrid or hybrid_union, which are experimental.
After the change, record the new decision or lesson so the next session can use it.
Command reference: CLI source and upstream setup guide.
Where it helps
- Resume a feature after a break
- Record the current goal and design decisions before stopping. Prepare a brief in the next session to recover the rationale and constraints.
- Avoid repeating a bug
- Save the root cause and fix as an event, then attach a warning to the fragile area. Retrieve that file’s context before another change.
- Revisit an architectural choice
- Record what you chose, why, and alternatives with
decision --alt. Search that history before proposing a replacement. - Start on an established repository
- Mine git history to get initial context, then check the source evidence against the code. Historical commits are clues, not a guarantee that a claim is still current.
- Move between coding assistants
- Connect each assistant to the same project store through CLI instructions or MCP. Each client still needs its own integration configured.
A new repository has little history to retrieve. Start by writing decisions. Visp Memory is focused on codebase knowledge, and the current evidence does not establish that it improves an agent’s code quality. See the upstream benchmark scope and limitations.
When something is missing
- The agent never uses memory
- Run
doctor, install the appropriate hooks, and review the project instructions. For MCP, restart the client and verify its executable path and working directory. - Search or injection is empty
- Check that you are in the initialized project and correct repo scope. Try a specific query with a file path, inspect
audit, and usepreviewfor injection decisions. No injected memory can be an intentional result. - A command is refused because a server owns the data directory
- While a server runs on a store, local CLI, MCP and hook processes on that directory are refused, with a message naming the server. Switch those projects to client mode with
visp-memory connect. visp-memory[mcp]won’t install next to another tool- Since 0.9.0 the
mcpextra uses MCP SDK 2.x, so it conflicts with an environment pinned tomcp<2. Install Visp Memory in its own virtual environment. Clients on older protocol versions still connect. - A command or tool is unavailable
- Check
visp-memory --helpand the subcommand’s--help. MCP requires themcpextra; API serving requiresapi. Development-branch documentation may describe options absent from an older release.
