Turbo Quant Memory MCP Server
A local-first MCP server that gives AI coding agents persistent, searchable project memory, a knowledge graph, an encrypted secrets vault, and multi-agent workspace coordination.
Write & curate notes —
remember_notestoreslesson/decision/pattern/handoffnotes with tags, provenance, source refs and tier overrides;promote_note,deprecate_note,list_scopesmanage lifecycle.Retrieve compactly —
semantic_searchruns hybrid dense-vector + BM25 search fused with RRF (filterable by tier and source type), returning ~220-char cards;hydrateloads full content on demand;recent_contextis a query-free "where did I leave off" bootstrap.Build a knowledge graph —
link_entities,unlink_entities,get_related_entitiesconnect notes, files and issues via URIs.Manage projects —
list_projects,select_project,bind_project,unbind_project,set_project_labelsto reuse one project's memory from other folders.Index docs —
index_pathsregisters Markdown directories (honoring.tqmemoryignore).Store secrets safely —
set_secret,get_secret,list_secrets,delete_secretin a project-scoped AES-256-GCM vault that is never indexed or searchable.Coordinate multiple agents —
announce_work,finish_work,workspace_statusshow peers and overlapping work;file_historyandrestore_filejournal and roll back text-file changes.Check health & savings —
health,self_test,server_info(token-savings stats),lint_knowledge_base.
Integrates with Git working trees to give multiple agents sharing the same repository a shared view of sessions, announced work and recent file changes; respects .gitignore when watching and recording text-file versions for later restore.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Turbo Quant Memory MCP Server search memory for previous decisions on logging"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Demo
Related MCP server: Sugar
The problem
A long session accumulates hard-won detail about why the code is the way it is. Then the context compacts and it is gone. Next session the agent re-reads the same files, re-derives the same conclusions, and bills you for the same tokens again.
CLAUDE.md does not scale past a few dozen lines, and it cannot answer "what did we decide about X, and why?".
Turbo Quant Memory is an MCP server that gives the agent a persistent, searchable store it writes to while it works — decisions, lessons, patterns, session handoffs — plus a compact index of your Markdown. Retrieval returns ~220-character result cards rather than whole documents; the agent loads full content only when a card is not enough.
Why this one
Turbo Quant Memory | mem0 / OpenMemory | MCP | |
Where your data lives | your disk, always | vendor cloud or self-host | your disk |
Your data leaves the host | never | yes, unless self-hosted | never |
Retrieval | hybrid BM25 + dense vector, RRF-fused | dense vector | exact graph lookup |
What a search returns | compact cards, hydrate on demand | full memories | full nodes |
Knowledge graph | yes — with lifecycle + linting | no | yes |
Non-English content | Cyrillic exact-match out of the box | varies | n/a |
Measures its own savings | yes — | no | no |
Price | free, MIT | paid tiers | free |
No HTTP client, no telemetry, no phone-home. Verify it yourself — this returns nothing:
grep -rnE '^[[:space:]]*(import|from)[[:space:]]+(requests|httpx|aiohttp|urllib3)\b' src/To be precise about the one exception: on first run fastembed downloads the embedding model (~0.22 GB) from Hugging Face. After that the server runs fully offline. Your notes, code and secrets are never transmitted anywhere — there is nothing in the package that could send them.
Install
Let your agent install it
Paste this into Claude Code, Codex, Gemini CLI, Cursor or Antigravity:
Install and configure the Turbo Quant Memory MCP server for this workspace from https://github.com/Lexus2016/turbo_quant_memory — follow the README, register the
tqmemoryserver, runturbo-memory-mcp skill install, run the health check, and index this project.
skill install copies an operating manual into every agent skill directory on the machine, so every future session already knows how to use the memory without being told.
Or install it yourself
uv tool install turbo-quant-memoryUpgrading from 0.27.x or earlier? The distribution was renamed in 0.28.0, so
uv tool upgrade turbo-memory-mcp no longer resolves — run
uv tool install --force turbo-quant-memory once, and uv tool upgrade turbo-quant-memory afterwards. The turbo-memory-mcp command itself is
unchanged, so client configs keep working.
Then register the server with your client:
claude mcp add --scope project tqmemory -- turbo-memory-mcp serve # Claude Code
codex mcp add tqmemory -- turbo-memory-mcp serve # Codex
gemini mcp add tqmemory turbo-memory-mcp serve # Gemini CLICursor, OpenCode, Antigravity and other clients → CLIENT_INTEGRATIONS.md. Hermes runs MCP through a systemd gateway → docs/hermes.md.
📈 It measures its own savings — see for yourself
Turbo Quant Memory doesn't just claim to save tokens — every install keeps a running tally you can read anytime with server_info() (field usage_stats.headline). The savings are yours to verify, not ours to promise.
Live snapshot from a real developer instance (v0.28.2):
What the memory did | Number |
🔢 Input tokens saved (cumulative) | ≈ 2,640,000 and counting |
🔁 Retrievals served | 2,280 searches + 280 deep hydrations |
📉 Average saved per retrieval | ≈ 1,200 tokens |
📚 Knowledge under management | 237 active notes + 763 indexed code blocks |
🛡️ Integrity | 0 corrupted records · 0 pending migrations |
These are one machine's cumulative numbers, not a synthetic benchmark — your own counter starts at zero and grows as your agent works. Run
server_info()on your install to see your real figure.
What it does
Typed notes.
decision,lesson,pattern,handoff— each stored with tags, provenance and a knowledge-graph link to the file or issue it is about.Tiered memory.
durable(decisions, patterns) andreference(indexed docs) are searched by default;episodic(session handoffs) stays out of the way until you ask for it, so yesterday's noise never buries an architectural decision.Hybrid retrieval. A dense vector lane leads; a BM25 lane rescues exact terms — function names, file paths, IDs — fused with Reciprocal Rank Fusion. Cyrillic and other non-English terms match exactly, case- and accent-insensitive, with no configuration.
Knowledge graph. Directed, timestamped relations between notes, files and issues. Search results carry the linked context inline, so the agent does not need a second lookup.
Human notes outrank agent notes. Anything you explicitly asked to remember is flagged
human-explicitand ranks above the agent's own observations at equal relevance.Encrypted secrets vault. Project-scoped, AES-256-GCM, structurally unreachable from search. → docs/secrets-vault.md
Runs on a small machine. The default embedder is ONNX via fastembed — no PyTorch, ~0.22 GB model, comfortable on 2 GB of RAM.
Several agents, one project — automatically. Agents working in the same git working tree see each other's sessions, announced work and recent file changes; while two or more of them share the tree, changes to text files are recorded so they can be restored. No setup.
Full technical detail → docs/features.md
Several agents in one project
If you run more than one agent in the same working tree, tqmemory connects them automatically. There is nothing to configure.
Agents see each other.
workspace_statuslists the active sessions, what each one announced it is working on (announce_work,finish_work) and which files changed recently. A session that made no tqmemory call for 30 minutes is listed underidle_sessionsinstead: it is not an active peer and its announced areas are left out ofoverlaps. Other tqmemory responses carry a shortworkspacenote only when something new has happened, and never for a lone session.healthandserver_infoalways include a workspace diagnostics block.Changes are recorded. While two or more sessions share a git working tree, the watcher records new versions of text files it sees change (up to 1 MiB each, skipping anything matched by
.gitignoreor.tqmemoryignore). Several quick writes in a row can be merged into one version.file_historylists the versions andrestore_filebrings one back; the restore is itself undoable. The same is available from a terminal:turbo-memory-mcp files logandturbo-memory-mcp files restore.Limits. Versions are recorded only while two or more sessions share a git working tree. The journal never runs outside a git working tree, in your home directory or at a filesystem root. Defaults: 1 MiB per file, a 256 MiB per-project size target and 14 days of retention. Recorded versions stay recoverable for 14 days; past that, or when the project is over its size target, the oldest are removed. The newest version of each file changed in the last 24 hours is never dropped for size. These defaults are set by
TQMEMORY_JOURNAL_MAX_FILE_BYTES,TQMEMORY_JOURNAL_MAX_BYTESandTQMEMORY_JOURNAL_RETENTION_DAYS; the size limit is a target, not a hard maximum.
This is partial protection, not a guarantee that every change is saved. It does not block writes: two agents can still overwrite each other's work, and tqmemory can only show it and help you recover. Agents that never call tqmemory see nothing. It works on one computer only. To turn it off, set TQMEMORY_WORKSPACE_DISABLE=1.
Reuse one project's memory from another folder
For a temporary choice without a folder binding, call list_projects() and then select_project(project_id="<id>"). The current MCP connection uses that project's memory immediately. select_project() resets to automatic detection. Selection does not rewrite the project's original root or index local files. An explicit TQMEMORY_PROJECT_ID must not conflict with the selected ID.
list_projects() shows saved project IDs, names, display labels, original roots, and bound folders. The terminal equivalent is turbo-memory-mcp projects. To use an existing project's memory from a new folder, call bind_project(project_id="<id>", path="/absolute/new/folder"). The binding persists locally, and the current MCP connection switches to that folder immediately. server_info() confirms the resolved project. set_project_labels(project_id, labels=[...]) changes display labels; labels never determine identity. unbind_project(path="/absolute/new/folder") removes the exact binding.
Only existing project IDs can be bound. A binding does not index files in the new folder; call index_paths separately when you want that. Bindings are exact folders, so a nested repository is not silently captured. If a folder is replaced or its recorded Git origin changes, access fails until you explicitly rebind it. An explicit TQMEMORY_PROJECT_ID environment override still takes precedence.
Memory calls follow the selected folder; workspace_status, file_history, and restore_file still describe the MCP process's original working tree.
When restoring a storage snapshot on another machine, project notes, global notes, labels, and encrypted secrets move with the storage root. Local folder bindings contain the old machine's absolute paths; use select_project by ID and rebind folders on the new machine when needed. The secrets vault also requires its original passphrase or keyring key.
Automatic index maintenance
The primary storage-owning MCP process checks retrieval indexes immediately after startup and every six hours while it runs. It optimizes tables that have unindexed full-text rows or versions older than seven days. Work runs in the background under each project's in-process write lock; requests for that project may briefly receive a busy response while optimization holds the lock. Independent standalone or CLI writers are not covered by this lock; an optimization conflict is logged and retried on a later pass. Proxy clients and uncoordinated standalone fallback processes do not run maintenance. The source Markdown and canonical JSON notes are not changed. turbo-memory-mcp index-status reports table size, version age, and full-text coverage without modifying data.
LanceDB keeps recent versions for seven days, so optimization can temporarily increase disk use on an active table. Do not delete LanceDB files manually. If an older MCP process still owns the storage, restart its clients so the new process can become the owner and start maintenance.
The first full sync of a legacy table re-embeds its rows once. Later full syncs skip unchanged rows while the embedding model, backend, and backend version remain the same. Changing any of these rebuilds the vectors on the next full sync; scheduled maintenance alone does not re-embed them.
The 29 MCP tools
Group | Tools |
Write |
|
Read |
|
Projects |
|
Graph |
|
Hygiene |
|
Vault |
|
Workspace |
|
Documentation
How to actually use the memory day to day | |
Per-client setup: Cursor, OpenCode, Antigravity, … | |
Architecture and storage format | |
Retrieval, graph, tiers, embedder, FTS language | |
Vault setup, threat model, FAQ | |
Hermes gateway setup and troubleshooting | |
Release history |
License
MIT. Copy it, modify it, fork it, ship it inside a closed-source product, sell it. Attribution is the only condition.
Languages
🇺🇸 English · 🇺🇦 Українська · 🇷🇺 Русский
Available Tools
29 toolsannounce_workC
Tell the other agents in this working tree what you are changing.
feature: short name of the work. areas: workspace-relative files or directories (globs allowed). Returns the peers whose announced areas overlap yours and recent changes inside them. Inferred writers are guesses from announced areas, never facts.
Inputs: feature (required), areas, details. Returns: object
bind_projectA
Bind a folder to an existing project and use it in this MCP session.
The folder must already exist. This does not index its files. Use the exact project_id from list_projects; labels are never identifiers.
Inputs: project_id (required), path. Returns: object
delete_secretC
Delete a project secret by exact name.
Inputs: name (required). Returns: object
deprecate_noteD
Inputs: note_id (required), scope, reason, replacement_scope, +1 more. Returns: object
file_historyA
Journaled versions of one file in this working tree, newest first.
Versions are snapshots taken while several sessions share the tree. Use restore_file with a version id to bring one back; the overwritten content is kept as a new version.
Inputs: path (required), limit. Returns: object
finish_workB
Clear the work this session announced with announce_work.
Inputs: no named parameters. Returns: object
get_secretA
Fetch a project secret by exact name.
Returns the value in a dedicated secret_value field (never in
descriptive text). Status is "ok" on hit, "missing" when
no such name exists, or "error" with setup_hint when no
master key is configured yet.
Inputs: name (required). Returns: object
healthD
Inputs: no named parameters. Returns: object
hydrateD
Inputs: scope (required), item_id (required), mode. Returns: object
index_pathsC
Register and index Markdown directories into project memory.
Supports .tqmemoryignore files (placed in project root or any indexed
directory) with glob patterns to exclude paths from indexing.
One pattern per line, # for comments. Example patterns:
workspace-* skips any directory matching the glob;
data/reports/*.md skips files matching a path pattern;
backups/ (trailing slash, as in .gitignore) skips a directory.
Agent worktrees under .claude/worktrees are skipped by default.
Inputs: mode, paths. Returns: object
link_entitiesC
Create a Knowledge Graph link between two entities.
Entities are specified using URIs:
Note: note://<note_id>
File: file://<relative_path> (relative to project root)
External: e.g. issue://BUG-404, task://TASK-101
Inputs: source_uri (required), target_uri (required), relation_type (required), scope. Returns: object
lint_knowledge_baseD
Inputs: paths, max_issues. Returns: object
list_projectsB
List saved projects with labels and explicitly bound folders.
Inputs: no named parameters. Returns: object
list_scopesD
Inputs: no named parameters. Returns: object
list_secretsA
List secret names in the active project. Never returns values.
Inputs: no named parameters. Returns: object
promote_noteD
Inputs: note_id (required). Returns: object
recent_contextA
Query-free session bootstrap: the most recently updated notes.
Call this FIRST when starting a new session or resuming after a context
compaction, when you do not yet know what to search for. Returns notes
ordered by recency (newest first), NOT by relevance — including
handoff notes (episodic tier), which a plain semantic_search hides by
default. This is the reliable "where did I leave off" entry point.
scope: 'project' (default), 'global', or 'hybrid'. Use 'hybrid' to also surface promoted cross-project knowledge. tier_filter: defaults to all tiers (so handoffs are included). Pass e.g. ["durable"] to exclude episodic session notes. format: 'json' (default); 'text' — compact plain text, one line per note with its hydrate handle (about 20% of the JSON size); 'hook' — the same text as Claude Code SessionStart hook output. Use 'hook' from a SessionStart mcp_tool hook: Claude Code shows the model only an mcp_tool hook's JSON additionalContext, never its plain text.
Inputs: limit, scope, format, tier_filter. Returns: object
remember_noteA
Store a typed project note. kind must be exactly one of: lesson, decision, pattern, handoff.
tags: 2-3 lowercase tags are strongly recommended — tags are the only way
to FILTER notes; an untagged note is reachable by semantic_search alone.
source_refs: the files / notes / issues this note is about. Pass them as
entity URIs (note://, file://<relative/path>, issue://KEY,
https://...) and they are auto-linked into the knowledge graph as
references relations, so get_related_entities can later surface them.
provenance: who originated the note. Use "human-explicit" when the USER
asked to remember something ("remember this", "save that"); "agent" for
your own observations (the default); "external-tool" for API/tool data;
"system" for automatic processes.
tier: normally derived from kind (handoff -> episodic, every other kind
-> durable). Override e.g. tier="durable" to keep a handoff in the
default-searchable set, or tier="episodic" to keep a noisy lesson out of
regular search.
After storing, connect the note with link_entities(source_uri="note://", ...) when it relates to a file, issue, or prior note — the response echoes the note's uri and hints this when the note still has no relations.
Inputs: kind (required), title (required), content (required), tags, +4 more. Returns: object
restore_fileA
Write a journaled version of one file back into the working tree.
version: a version id from file_history, or "HEAD" for the committed content. The content being overwritten is kept as a new version, so the restore can be undone.
Inputs: path (required), version (required). Returns: object
select_projectB
Select an existing project by ID for this connection; omit ID to reset.
Вибирає наявний проєкт для цього підключення; без ідентифікатора скидає вибір.
Inputs: project_id. Returns: object
self_testD
Inputs: no named parameters. Returns: object
semantic_searchA
Compact memory retrieval (dense vector + BM25, fused via RRF).
By default only the durable and reference tiers are searched, so
session handoff notes (which live in the episodic tier) are NOT
returned. To recover handoffs / session summaries pass
tier_filter=["episodic"] (or list every tier to opt everything in).
For a query-free "where did I leave off" bootstrap at session start,
prefer the recent_context tool instead.
source_filter narrows results by source type: "notes" returns only
memory notes (decisions/lessons/patterns/handoffs), "markdown" only
indexed doc blocks. In doc-heavy projects the reference blocks often
crowd notes out of the top ranks on question-shaped queries — when you
are asking "what did we decide/learn about X", pass
source_filter="notes".
Inputs: query (required), limit, scope, tier_filter, +1 more. Returns: object
server_infoD
Inputs: no named parameters. Returns: object
set_project_labelsB
Set display-only labels for an existing project id.
Inputs: labels (required), project_id (required). Returns: object
set_secretA
Store an encrypted secret in the active project's vault.
The value is encrypted with AES-256-GCM under a per-project master
key resolved from TQMEMORY_SECRETS_PASSPHRASE or the OS keyring.
Secrets are NEVER indexed, embedded, or returned via
semantic_search / hydrate. They live in
~/.turbo-quant-memory/projects/<project_id>/secrets/vault.tqv
and stay on this machine.
Inputs: name (required), value (required). Returns: object
unbind_projectB
Remove an exact folder binding; reset this session if it used it.
Inputs: path. Returns: object
unlink_entitiesB
Remove a Knowledge Graph link between two entities.
source_uri / target_uri use the same URI forms as link_entities: note://<note_id>, file://<relative/path>, issue://KEY, https://...
Inputs: source_uri (required), target_uri (required), scope, relation_type. Returns: object
workspace_statusA
Overview of the sessions sharing this working tree: peers, overlaps and recent file changes.
Call it at session start. Inferred writers are guesses from announced areas, never facts.
Peers that made no tqmemory call for a long time are listed under idle_sessions, not in
sessions, and their announced areas are left out of overlaps.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Core clusters (notes, secrets, knowledge-graph links, multi-agent work) are reasonably distinct and the richer descriptions clarify boundaries like semantic_search vs recent_context. However, several tools have no description at all (self_test, health, server_info, list_scopes, hydrate, promote_note, deprecate_note, lint_knowledge_base), and the diagnostics trio plus list_scopes/list_projects and select_project/bind_project invite confusion. select_project's description is partially non-English, further reducing clarity.
Names are overwhelmingly snake_case with a verb_noun or noun_state pattern (remember_note, link_entities, set_secret, list_secrets, index_paths, restore_file). Minor deviations are noun-only forms like health, hydrate, server_info, workspace_status, file_history, which are still readable and idiomatic. No camelCase/snake_case mixing.
29 tools is heavy and spans five subdomains (notes, secrets, projects/indexing, multi-agent coordination, file journaling, plus diagnostics). Each cluster mostly earns its place, but the three overlapping diagnostics tools (self_test, health, server_info) look like padding that inflates the surface. It borders on too many for a 'memory' server.
Coverage is strong: full secret CRUD, note lifecycle (remember/promote/deprecate) plus retrieval and KG links, project bind/unbind/label/index, and coordination with file history/restore. Gaps exist, notably no update/edit or delete operation for notes and no explicit project creation tool (only binding to an existing project_id).
Maintenance
Related MCP Connectors
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Universal memory for AI agents and tools. Save, organize and search context anywhere.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides AI coding agents with a persistent memory layer to save, recall, update, and track memories across sessions and repositories using hybrid semantic search.5MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI coding agents to read and write persistent, local-first memory across sessions and projects, with semantic search, global guidelines, and optional autonomous task execution.-
- FlicenseNot gradedqualityAmaintenanceGives AI coding agents persistent, local-first memory so they can store, semantically search, and recall decisions, preferences, error patterns, and cross-project guidelines directly during a session. It also optionally queues tasks for autonomous execution against that same memory.-
- FlicenseNot gradedqualityAmaintenanceProvides AI coding agents with a local-first persistent memory layer they can read and write during sessions, storing decisions, preferences, error patterns, and research per project or globally. Enables semantic and keyword search, formatted context recall, and cross-project guideline surfacing without API keys or cloud storage.-