MCP Memory-mesh
An MCP server that gives Claude Code persistent memory across sessions (open source, SQLite)
MemoryMesh
SQLite for AI memory. Persistent memory layer for MCP agents and coding copilots β local-first, zero cloud, works in 5 minutes.
See it in action: Claude Code remembering project decisions across sessions.
| π» Coding copilots | π€ MCP agents | π Research assistants |
|---|---|---|
| Remember architecture decisions, bugs, and preferences across sessions | Persistent memory across any MCP-compatible client | Semantic recall over your notes, papers, and docs |
Up and running in 5 minutes
pip install memorymesh-mcp
cp config.example.yaml ~/.memorymesh/config.yaml
# edit config.yaml β point at your folders
memorymesh index ~/Documents
memorymesh search "how did I configure the debounce"
Wire it into Claude Desktop. Find the config file at:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"memorymesh": {
"command": "uv",
"args": [
"run",
"--directory", "/absolute/path/to/memory-mesh",
"memorymesh", "start"
]
}
}
}
Restart Claude Desktop. The 15 tools appear automatically.
Why it exists
Every AI conversation starts from zero. Claude doesn't know which architecture decision you made last week. Cursor doesn't remember the bug you fixed yesterday. The context dies when the session ends.
Mem0 requires a cloud account. Zep needs a running server and a database. LangMem ties you to the LangChain ecosystem. None of them speak MCP natively.
MemoryMesh runs entirely on your machine. It indexes your files into a local SQLite + ChromaDB store and exposes them through 15 MCP tools. It never touches the network unless you configure a connector. Any MCP client β Claude Desktop, Cursor, your own agent β gets persistent memory with one config change.
How it works
The indexer watches your files, chunks them with format-aware parsers, and stores embeddings locally. The search engine fuses dense and sparse results, then a cross-encoder reranker scores the candidates.
ββββββββββββββββββββββββββββββββ
MCP clients ββββΆ β MemoryMesh β
(Claude Desktop, β ββββββββββββββββββββββββββ β
Cursor, agents) β β MCP Tools (FastMCP): β β
β β search_memory β β
β β list_sources β β
β β get_document β β
β β index_now β β
β ββββββββββββ¬ββββββββββββββ β
β βΌ β
β Search Engine β
β dense + BM25 β RRF β
β β β
β βββββββββββ΄βββββββββββ β
β βΌ βΌ β
β ChromaDB BM25 β
β (embeddings) (sparse) β
β β² β² β
β βββββββββ Indexer ββββ β
β β² β
β Watchdog β
ββββββββββββββββββ¬βββββββββββββββ
βΌ
Your filesystem
Indexing: file watcher detects changes β SHA-256 dedup skips unchanged files β parser (txt/md/pdf/docx/code/obsidian/email/calendar/browser) β chunker (tree-sitter for code, by-heading for markdown, recursive for text) β sentence-transformers embeddings β ChromaDB + BM25.
Search: query β query expansion (lexical variants + HyDE) β parallel dense + sparse search β Reciprocal Rank Fusion (k=60) β bge-reranker-v2-m3 reranker β top-k results with path, preview, score, and metadata.
RAG (optional): ask_memory β search_memory retrieval β Ollama generate() β grounded answer with cited sources.
What's included
MemoryMesh ships with hybrid search (dense embeddings + BM25 + RRF + cross-encoder reranker), hot/warm/cold memory tiers with configurable forgetting decay, and an episodic event timeline. 47 connectors pull data from Jira, Notion, GitHub, Slack, email, browser history, Spotify, and more. 15 MCP tools expose everything to any MCP-compatible client. A real-time file watcher re-indexes changed files within seconds, without a manual trigger.
Full feature list
| Feature | Status |
|---|---|
| Local file indexing (txt, md, code, pdf, docx) | β |
| Obsidian vault parser (frontmatter + wikilinks) | β |
| Notion HTML export parser | β |
| AI conversation exports (Claude, ChatGPT JSON) | β |
Email indexing (.mbox via stdlib) | β |
Calendar indexing (.ics / iCalendar) | β |
| Browser history (Chrome / Firefox / Brave SQLite) | β |
| Hybrid search β dense + BM25 + RRF | β |
Cross-encoder reranker (bge-reranker-v2-m3) | β |
| Query expansion β lexical variants + HyDE | β |
RAG with local LLM via Ollama (ask_memory tool) | β |
| Multi-vector summary indexing for abstract recall | β |
| MCP server β 15 tools, stdio + streamable-http | β |
| Real-time incremental indexing (watchdog + debounce) | β |
| Tree-sitter code chunking (Python, JS, TS, Go, Rustβ¦) | β |
Parent Document Retriever (extended_preview) | β |
| Cross-platform β Windows / Linux / macOS | β |
| Post-crash reconciliation | β |
| Optional OCR for scanned PDFs (Tesseract / EasyOCR) | β |
| Privacy audit log (query hashes only, no cleartext) | β |
| GitHub Actions CI (Ubuntu / Windows / macOS) | β |
| Docker + docker-compose | β |
| Per-agent permission layer (ACL + rate limiting + revocation) | β |
| Hierarchical memory (hot / warm / cold tiers + forgetting policy) | β |
Episodic memory timeline (query_timeline, record_event tools) | β |
Memory control tools (pin_memory, forget_memory) | β |
Embedding LRU cache (CachedEmbeddingProvider) | β |
Health endpoint (GET /health on :8766) | β |
Real CLIP image embeddings (memorymesh[multimodal]) | β |
Real Whisper audio transcription (memorymesh[multimodal]) | β |
Knowledge Graph β entity co-occurrence (/graph, graph_memory tool) | β |
Encryption at rest (Fernet AES-128, memorymesh keygen) | β |
REST API (11 endpoints at /api, OpenAPI docs at /api/docs) | β |
VS Code extension (extensions/vscode/) | β |
Browser extension β Manifest V3 (extensions/browser/) | β |
| 47 data source connectors (Jira, Notion, GitHub, Slack, Spotifyβ¦) | β |
| Unit + integration test suite | β |
MCP Tools
Once running, these tools are available to any MCP-compatible client:
| Tool | Description |
|---|---|
search_memory(query, top_k, mode, source) | Hybrid search over all indexed content. Returns path, preview, score, file type, source, and optional extended_preview for wider context. |
list_sources() | List all configured sources with file counts and index status. |
get_document(path, max_bytes) | Read the full content of an indexed file (up to 1 MB by default). |
index_now(path) | Force immediate re-index of a file or directory, bypassing the watcher. |
ask_memory(question, top_k, model) | RAG: retrieves relevant passages and sends them to a local Ollama model for a grounded answer. Requires Ollama running locally. |
pin_memory(chunk_id) | Pin a chunk to the hot tier β never demoted, never score-decayed. |
forget_memory(chunk_id) | Suppress a chunk from future search results without deleting the source file. |
query_timeline(since_days, event_type, limit) | Query the episodic event log: what was retrieved / indexed in the last N days? |
sync_source(source_type, dry_run) | Pull and index documents from a configured external connector (Jira, Notion, GitHubβ¦). |
get_entity(name, entity_type) | Look up a named entity (person, project, concept) and its associated chunk IDs. |
related_documents(path, top_k, exclude_self) | Find documents semantically similar to the given file path. |
search_by_date(since_days, until_days, source, limit) | Search indexed chunks by last-modified date range. |
forget_source(source, dry_run) | Remove all indexed data for a named source from the index. |
summarize_source(source, max_chunks) | Generate a brief summary of the most recent content in a source (requires Ollama). |
graph_memory(min_mentions, entity_type) | Return the entity co-occurrence knowledge graph as nodes and edges. |
All tools are backwards-compatible β new fields are added without changing existing signatures.
How MemoryMesh compares
How MemoryMesh compares to similar projects:
| Feature | MemoryMesh | LangChain | LlamaIndex | PrivateGPT | AnythingLLM | MemGPT | Haystack |
|---|---|---|---|---|---|---|---|
| MCP native | β | β | β | β | β | β | β |
| Hybrid search (dense + BM25 + RRF) | β | Partial | Partial | β | β | β | β |
| Real-time watcher + SHA-256 dedup | β | β | β | β | β | β | β |
| Post-crash reconciliation | β | β | β | β | β | β | β |
| 100% local, zero telemetry | β | β | β | β | β | β | β |
| Cross-platform (Win/Linux/Mac) | β | β | β | Partial | Partial | β | β |
| No framework dependency | β | β | β | β | β | β | β |
| Per-agent permissions | β | β | β | β | β | β | β |
MCP native means it was built for MCP from day one β not bolted on after. The 15 tools follow additive versioning β new fields are added without removing existing ones.
Per-agent permissions means per-client identity, ACL by source and operation, token-bucket rate limiting, and token revocation are built into the core β not added as middleware.
Configuration
Everything lives in config.yaml. See config.example.yaml for a fully commented reference. Key highlights:
sources:
- name: documents
path: ~/Documents
recursive: true
extensions: [.txt, .md, .pdf, .docx]
- name: projects
path: ~/Projects
recursive: true
extensions: [.py, .js, .ts, .go, .rs, .md]
- name: obsidian
path: ~/obsidian-vault
source_type: obsidian # activates wikilink + frontmatter parser
- name: emails
path: ~/Mail
source_type: email # parses .mbox files
embeddings:
model: all-MiniLM-L6-v2 # swap to paraphrase-multilingual-MiniLM-L12-v2 for PT/EN
search:
default_top_k: 10
hybrid:
enabled: true
reranker:
enabled: true # cross-encoder reranker (recommended)
model: BAAI/bge-reranker-v2-m3
query_expansion:
enabled: true
n_lexical_variants: 1
# Optional: local LLM for ask_memory tool + HyDE query expansion
ollama:
enabled: false # set true after: ollama pull llama3
model: llama3
server:
transport: stdio # stdio | streamable-http
Global ignore list protects sensitive paths by default: .env, *.key, id_rsa*, secrets/, .ssh/, .aws/, .git/, node_modules/.
Benchmarks
Benchmark results will be published here. Scripts are already in
benchmarks/and runnable locally β contributions with reproducible numbers are welcome.
bench_indexing.pyβ indexing throughput (chunks/s, MB/s) on a synthetic corpusbench_search_latency.pyβ p50/p95/p99 search latency across hybrid/dense/sparse modesbench_embedding_models.pyβ speed vs. quality comparison across three embedding models
Privacy & security
Three commitments that do not change across versions:
- No data leaves your machine. No telemetry. No external API calls unless you explicitly opt in β and even then, there is a
WARNINGin the log. - HTTP listener binds to
127.0.0.1only by default. Exposing to other interfaces requires an explicit config override. - Logs never contain document content or queries in cleartext. The audit log records query hashes, not queries.
Encryption at rest is available as of v0.8.0. Run memorymesh keygen to generate a key, then enable encryption.enabled: true in config.yaml. The SQLite metadata store can be exported as an encrypted backup with memorymesh backup.
Roadmap
| Version | Focus | Status |
|---|---|---|
| v0.1 | Core: hybrid search, 4 MCP tools, stdio transport, indexer | β shipped |
| v0.2 | CI/CD, Parent Document Retriever, Docker, security hardening | β shipped |
| v0.3 | Reranker, query expansion + HyDE, RAG (Ollama), 6 new parsers, eval framework | β shipped |
| v0.5 | Per-agent permissions (ACL/rate-limit/revocation), hot/warm/cold tiers, episodic timeline, memory control tools, embedding cache, health endpoint, CLIP/Whisper stubs | β shipped |
| v0.8 | Real CLIP+Whisper, Knowledge Graph, Encryption at rest, REST API (11 endpoints), VS Code + browser extensions, 47 connectors, 15 MCP tools | β shipped |
| v1.0 | Agent OS integration β memory layer for multi-agent systems | ~6 months |
| v2.0 | Hardware agents β ESP32/Arduino querying the hub over BLE/WiFi | ~12 months |
Full details in ROADMAP.md.
Troubleshooting
UnicodeDecodeErroron a text file β MemoryMesh tries UTF-8, UTF-8 BOM, cp1252, latin-1 in order. If a file still fails, it is logged and skipped.- Watcher doesn't fire on a network drive / WSL mount β set
watcher.use_polling: trueinconfig.yaml. - Tesseract not found β install it system-wide and ensure it is in
PATH. Windows: UB-Mannheim installer. - Embedding model mismatch after changing config β run
memorymesh reindex --all. The CLI refuses to start if the model ID stored in ChromaDB does not match the config.
Contributing
Contributions are welcome β bug reports, new connectors, integration examples, and documentation improvements all help. Open an issue to discuss before submitting a large PR.
Acknowledgements
Architecture informed by studying LlamaIndex, LangChain, PrivateGPT, AnythingLLM, MemGPT, and Haystack β understanding what each does well and what it does not. And to chroma-mcp and the MCP Python SDK for showing what MCP-native looks like in practice.
MIT. See LICENSE.
Related Servers
Music Collection MCP Server
Access and manage local music collections with advanced metadata, classification, and analytics.
HDFS MCP Server
Access and manage files on HDFS clusters using the MCP protocol, supporting operations like upload, download, move, and copy.
File System MCP Server
A server for comprehensive file and directory management on the local file system.
Filesystem MCP Server
Provides file system operations, analysis, and manipulation capabilities through a standardized tool interface.
Agent Memory
Filesystem agent memory working with consolidation Daemon on your machine
Noteit-mcp
AI prompt library + visual knowledge hub for developers
Sharepoint
Provides access to organizational SharePoint sites and files.
Filesystem MCP Server
A secure server for filesystem operations with controlled access to specified directories.
Basic Memory
Build a persistent, local knowledge base in Markdown files through conversations with LLMs.
DLIS MCP Server
Analyze and extract information from DLIS (Digital Log Interchange Standard) files, including channel data and metadata.