Engram
Gives coding agents a persistent, searchable project memory stored locally in SQLite
Lets an assistant search and read your local markdown notes and docs with on-device hybrid search
By Tobias Lütke (individual) TypeScript Local · stdio Knowledge and memoryWeb search
102 popularity score ★ 31k ↓ 65k/wk
Opens the app, which asks before it adds the server.
claude mcp add qmd -- npx -y @tobilu/qmd mcp{
"mcpServers": {
"qmd": {
"command": "npx",
"args": [
"-y",
"@tobilu/qmd",
"mcp"
]
}
}
}{
"mcpServers": {
"qmd": {
"command": "npx",
"args": [
"-y",
"@tobilu/qmd",
"mcp"
]
}
}
}{
"servers": {
"qmd": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@tobilu/qmd",
"mcp"
]
}
}
}[mcp_servers.qmd]
command = "npx"
args = ["-y", "@tobilu/qmd", "mcp"]gemini mcp add --scope user qmd npx -- -y @tobilu/qmd mcpQMD_EMBED_MODEL |
Optional: Override the default embedding model (HuggingFace GGUF URI). |
|---|---|
QMD_HOST |
Optional: Bind address for the HTTP transport (default localhost). |
QMD_ALLOWED_ORIGINS |
Optional: Extra origins the HTTP server accepts besides loopback; * disables the check. |
QMD_ALLOWED_HOSTS |
Optional: Extra Host values the HTTP server accepts besides loopback and the bind address. |
QMD (Query Markup Documents) is an on-device search engine for markdown notes, meeting transcripts, documentation and knowledge bases. It combines BM25 full-text search, vector semantic search and LLM re-ranking, all running locally through node-llama-cpp with GGUF models.
You add folders as named collections with the qmd command line, optionally attach context descriptions to them, and generate embeddings. The same tool exposes an MCP server (qmd mcp) so an assistant can run typed searches (keyword, vector and HyDE sub-queries fused and reranked), fetch documents by path or docid, batch-retrieve by glob, check index status and discover metadata keys to filter on.
By default the MCP server runs over stdio as a subprocess of each client. It can also run as a long-lived HTTP server (qmd mcp --http, localhost:8181/mcp by default) so the models are loaded once and shared. It needs Node or Bun; on macOS the README asks for Homebrew SQLite. Three GGUF models are downloaded from HuggingFace on first use and cached locally.
querygetmulti_getstatusmetadata