Qdrant
If your team already runs Qdrant, Recall can keep its memory there. Facts stay typed, corrections follow the same rules, and the history is kept the same way. polign_db is still the default backend and the one Recall is tested against first; a few features need it, and they are listed under What works differently.
Before you start
- Qdrant 1.10 or later, reachable over its REST port (6333 by default). Qdrant Cloud works too; you need the cluster URL and an API key.
recall0.13.0 or later:brew install polign/tap/recallorpip install polign-recall.
Run the memory server on Qdrant
-
Start Qdrant, if it is not running yet:
docker run -d -p 6333:6333 qdrant/qdrant
-
Add Recall to Claude Code as an MCP server:
claude mcp add recall \ -e RECALL_BACKEND=qdrant \ -e QDRANT_URL=http://localhost:6333 \ -- recall mcp -write
For a server that requires a key, add
-e QDRANT_API_KEY=.... Leave out-writefor a read-only connection. Other MCP hosts take the same command and variables, or the flagsrecall -backend qdrant -url http://localhost:6333 mcp -write. -
Restart Claude Code and ask it to remember something. The first write creates the collection,
recall_lexical_v1unless you pass-collection.
recall setup and the Recall plugin set up
a polign_db connection only. With Qdrant, add the MCP server yourself as in step 2.
Use it from Go
Import the backend package and open it by name:
import (
"github.com/Polign/recall"
_ "github.com/Polign/recall/backend/qdrant"
)
backend, err := recall.OpenBackend("qdrant", recall.BackendOptions{
URL: "http://localhost:6333",
APIKey: os.Getenv("QDRANT_API_KEY"),
})
client, err := recall.NewClient(recall.Config{
Backend: backend,
Collection: "team_memory",
Registry: recall.DefaultRegistry(),
Embedder: recall.LexicalEmbedder{},
})
To pick the distance metric a new collection gets, or to pass your own HTTP client,
call qdrant.New with a qdrant.Config instead. Collections that
already exist keep their settings.
What gets stored
| Recall | Qdrant |
|---|---|
| A collection | A collection of the same name, created on the first write with the first vector's size (256 for the built-in embedder) and Cosine distance |
| An event | A point whose ID is a UUIDv5 of the event ID; the event ID itself is in the payload as _recall_id |
| Event fields | Payload fields with their types kept: subject, predicate, value, confidence, observed time, source, evidence |
| Filters | Payload indexes on subject, predicate, kind and observed_ms, added when the collection is created |
Use a collection only Recall writes to. A point without _recall_id makes
reads of that collection fail instead of guessing.
What works differently
Remember, recall, forget, history, as-of reads, evidence links and audit export work the same as on polign_db. These do not:
| Feature | On Qdrant |
|---|---|
Agent resume (recall mcp -agent) | Not available. Resume takes a lease so only one process acts for an agent at a time, and Qdrant cannot grant one. recall mcp -agent refuses to start. From Go, Client.Resume with Unleased: true works if something else, such as one pod per agent, already guarantees one process per agent. |
| Keyword search | Not available. On polign_db, recall ranks with BM25 beside the vector search. On Qdrant it uses the vector search alone, which ranks exact words worse. A model embedder (-embed-url) helps with paraphrased questions but does not add keyword matching. |
| Cached reads | Not available. Every read rebuilds the current value from the fact's history, so busy facts cost more requests than on polign_db. |
Writes wait until Qdrant has applied them, so a read right after a write sees it. Recall adds no transactions of its own; concurrent writers follow Qdrant's consistency settings.
If something goes wrong
| What you see | What to do |
|---|---|
flag provided but not defined: -backend | Your recall is older than 0.13.0. Upgrade it. |
qdrant: request: ... connection refused | Qdrant is not listening at that URL. Check the port, and use the REST port (6333), not gRPC (6334). |
qdrant: HTTP 401 or 403 | Set QDRANT_API_KEY or pass -key. |
-agent needs agent leases | Expected on Qdrant. Drop -agent, or use polign_db for agents that need resume. |
| Wrong vector dimension errors | The collection was created with another embedder. Use a new -collection when you change embedders. |
Source & license
The Qdrant backend is part of Recall, open source under the Apache License 2.0, in github.com/Polign/recall. It uses Qdrant's REST API and adds no dependencies. Bug reports and pull requests go there.