MCP server for semantic search over markdown vaults
Project description
memex-md-mcp
You like Obsidian? Your LLM will love it too.
Memex: Vannevar Bush's 1945 concept of a "memory extender" - a device for storing and retrieving personal knowledge. The conceptual ancestor of personal wikis and second brains.
MCP server for semantic search over markdown vaults. Give your LLM persistent memory across sessions—its own knowledge base to grow, document findings, model your preferences, and recall past work.
Quick Start
claude mcp add memex -- uvx --from 'memex-md-mcp==1.*' memex-md-mcp
Then ask Claude to help configure your vaults - it has mcp_info() which explains everything. Or manually edit your settings (see Configuration below).
Version note: The above pins to the latest 1.x release for stability. For bleeding edge, use memex-md-mcp@latest—but watch the repo for releases, since major bumps may require deleting your index (~/.local/share/memex-md-mcp/memex.db).
What This Does
Memex gives Claude read access to your markdown vaults. It creates a local index at ~/.local/share/memex-md-mcp/memex.db and logs to ~/.local/share/memex-md-mcp/memex.log. The index contains:
- Full-text search index (FTS5) for keyword matching
- Embeddings (google/embeddinggemma-300m) for semantic similarity
- Wikilink graph for backlink queries
- Extracted frontmatter (aliases, tags)
On each query, memex checks file mtimes and re-indexes any changed files.
Note: Initial indexing requires embedding computation. Example: ~3800 notes took ~7 minutes on an RTX 3070 Ti. Subsequent queries only re-index changed files and are fast.
Hidden directories (.obsidian, .trash, .git, etc.) are excluded from indexing.
Writing to notes happens through Claude Code's normal file tools.
Configuration
Add to ~/.claude/mcp.json (global) or .mcp.json (per-project):
{
"mcpServers": {
"memex": {
"command": "uvx",
"args": ["memex-md-mcp@latest"],
"env": {
"MEMEX_VAULTS": "/home/user/knowledge:/home/user/project/docs"
}
}
}
}
Multiple vault paths are colon-separated. Project .mcp.json overrides global config entirely (no merging), so list all vaults you need.
Tools
search(query?, keywords?, vault?, limit=5, page=1, concise=True) — semantic search over vaults.
query: Describe what you're looking for in natural language. Use 1-3 sentences, question format works well. If omitted, runs FTS-only mode with keywords.keywords: Optional list of exact terms to boost. Required if query is omitted.page: Page number for pagination (1-indexed).concise: Returns only paths by default. Useconcise=Falsefor full content.
search("What authentication approach did we decide on? I remember we discussed OAuth.")
search("How does the caching layer handle invalidation?", keywords=["Redis", "TTL"])
search(keywords=["PostgreSQL"]) # FTS-only mode
explore(note_path, vault, concise=False) — graph traversal from a note.
Returns outlinks (what it references), backlinks (what references it), and semantically similar notes not yet linked. Includes full content of the explored note (not neighbors). Outlinks include image embeds (![[image.png]])—use Read tool to view them.
explore("architecture/api-design.md", "/home/user/project/docs")
Typical workflow: search() to find entry points → explore() promising results to read content + see connections.
mcp_info() — returns this README.
Workflow Integration
Add to your project's CLAUDE.md (adapt paths to your setup):
# Memex MCP
You have access to markdown vaults via memex. Use them to find past work, discover connections, and document knowledge that helps future sessions.
Vaults:
- /home/max/repos/github/MaxWolf-01/claude-global-knowledge — Your global knowledge: cross-project learnings, user preferences, workflow insights
- ./agent — /{knowledge, tasks} Project-specific: architecture decisions, conventions, debugging patterns, task files
Search tips:
- Use 1-3 sentence questions, not keywords: "How does the auth flow handle token refresh?" beats "auth token refresh"
- Mention key terms explicitly in your query
- For exact term lookup, use keywords parameter with a focused query
- For precise "find this exact file/string" needs, use grep/rg instead — memex is for exploration
Workflow: search() returns paths by default (concise) → explore() promising results to read content + see connections → Build context before implementation.
For structured task management and knowledge archiving that leverage memex, see /task and /archive — example workflows for autonomous, parallel (multi-clauded), yet reliable and verifiable work.
For using this workflow, I also recommend turning off auto-compaction (you save soo much context) and increasing MAX_MCP_OUTPUT_TOKENS": "50000" from the default 25k in your claude settings.
Benchmarks
Performance:
- For now mostly my own vibes, still developing a proper workflow around this.
- So far I only tested semantic and FTS search in isolation on my 3.8k note Obsidian vault to tune it.
Speed:
- Initial indexing: ~7 minutes for ~3800 notes (RTX 3070 Ti)
- Subsequent queries: ~instant
Development
uv sync
make check # ruff + ty
make test # pytest
make release-patch # 0.2.6 -> 0.2.7, tag, push
make release-minor # 0.2.6 -> 0.3.0
make release-major # 0.2.6 -> 1.0.0
Roadmap
- More thorough benchmarking
- Ignore patterns?
- Include workflow examples as skills? Currently I use them as slash commands. Claude 5/6 might be autonomous enough to apply them directly, and grow a memex vault largely unsupervised.
- Actually, a step towards that will probably be agents managing other agents with this workflow.
- Also see https://github.com/anthropics/claude-code/issues/13115
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file memex_md_mcp-1.1.2.tar.gz.
File metadata
- Download URL: memex_md_mcp-1.1.2.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f9a7177ab1a77e8b517e937cceaec2b643eda582fddc05953c4854fa5ea0643
|
|
| MD5 |
1418a0bf3f492976f7ab4268e048a77d
|
|
| BLAKE2b-256 |
50dec8f1f14c34f5b871b42554d5723d7508f6a10f7e473e54d4e4f4d137d4e8
|
File details
Details for the file memex_md_mcp-1.1.2-py3-none-any.whl.
File metadata
- Download URL: memex_md_mcp-1.1.2-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e6c840b89728b37baaf584ce87e8815fd0834219285b8038a82c8d4652b5058
|
|
| MD5 |
69925857355495b37dda9d8a8a1656e2
|
|
| BLAKE2b-256 |
54675ae02a9613882725866f9163f8e7fab6a7608faee9c6280db73a24277b47
|