Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
MCP server and Rust SDK for Obsidian vaults
TurboVault turns an Obsidian vault into an MCP-backed knowledge system. It reads `.md` and `.ofm` notes, builds links and search indexes, and exposes tools for search, graph analysis, batch edits, SQL queries, and vault health checks. The same workspace also gives you modular Rust crates if you want to build your own tools on top of the core logic.
Builders who want an agent to work directly with their Obsidian notes.
You can search, analyze, and update a vault through your agent instead of doing it by hand.
What it does
MCP tool server
Exposes 74 tools for reading, writing, moving, searching, and analyzing vault content.
Rust SDK crates
Provides modular crates for parsing, graph analysis, vault management, batch operations, SQL queries, and export.
Multi-vault support
Lets you register vaults at startup or add them later and switch the active vault at runtime.
Graph and search analysis
Finds backlinks, hub notes, dead ends, related notes, duplicates, and broken links.
Atomic writes and batches
Supports hash-checked edits, batch operations, and Git-backed atomic writes.
OFM support
Understands Obsidian-flavored Markdown features like wikilinks, embeds, tags, tasks, callouts, and frontmatter.
How to get it
- 1From source
git clone https://github.com/epistates/turbovault.git cd turbovault make release # Binary: ./target/release/turbovault
- 2Run
turbovault --vault /path/to/your/vault --profile production
- 3Start the server without a vault
turbovault --profile production
- 4Once connected to Claude
You: "Add my vault at ~/Documents/Notes" Claude: [Calls add_vault("personal", "~/Documents/Notes")] You: "Search for machine learning notes" Claude: [Uses search() across the indexed vault] You: "What are my most important notes?" Claude: [Uses get_hub_notes() to find key concepts]
README
TurboVault
The ultimate Rust SDK and high-performance MCP server for Obsidian-flavored Markdown (.ofm) and standard .md vaults.
TurboVault is a dual-purpose toolkit designed for both developers and users. It provides a robust, modular Rust SDK for building applications that consume markdown directories, and a full-featured MCP server that works out of the box with Claude and other AI agents.
Two Ways to Use TurboVault
1. As a Rust SDK (For Developers)
Build your own applications, search engines, or custom MCP servers using our modular crates. TurboVault handles the heavy lifting of parsing .md and .ofm files, building knowledge graphs, and managing multi-vault environments.
- Modular Architecture: Use only what you need (Parser, Graph, Search, etc.).
- High Performance: Sub-100ms operations for most tasks.
- Extensible: Easily build your own specialized MCP servers on top of our core logic.
- SOTA Standards: Fully supports Obsidian-flavored Markdown (wikilinks, embeds, callouts).
2. As a Ready-to-Use MCP Server (For Users)
Transform your Obsidian vault into an intelligent knowledge system immediately. Connect TurboVault to Claude Desktop or any MCP-compatible client to gain 74 specialized tools for your notes.
- Zero Coding Required: Install the binary and point it at your vault.
- 74 Specialized Tools: Searching, link analysis, atomic Git-backed writes, SQL frontmatter queries, health checks, and more.
- Multi-Vault Support: Switch between personal and work notes seamlessly at runtime.
Core Crates (The SDK)
TurboVault is a modular system composed of specialized crates. You can depend on individual components to build your own tools:
| Crate | Purpose | Docs |
|---|---|---|
| turbovault-core | Core models, MultiVault management & types | |
| turbovault-parser | High-speed .md & .ofm parser | |
| turbovault-graph | Link graph analysis & relationship discovery | |
| turbovault-vault | Vault management, file I/O & atomic writes | |
| turbovault-tools | 74 MCP tool implementations | |
| turbovault-plugin-api | Stable facade, provider contract & bounded hooks for compiled-in plugins | |
| turbovault-sql | SQL frontmatter queries (GlueSQL) | |
| turbovault-batch | Validated fail-fast operation batches | |
| turbovault-export | Export & reporting (JSON/CSV/MD) | |
| turbovault | Main MCP server binary / SDK orchestrator |
Why TurboVault?
Unlike basic note readers, TurboVault understands your vault's knowledge structure:
- Full-text search across all notes with BM25 ranking
- Link graph analysis to discover relationships, hubs, orphans, and cycles
- Vault intelligence with health scoring and automated recommendations
- Validated operation batches for fewer round trips and fail-fast execution
- Multi-vault support with instant context switching
- Runtime vault addition — no vault required at startup, add them as needed
Powered by TurboMCP
TurboVault is built on TurboMCP, a Rust framework for building production-grade MCP servers. TurboMCP provides:
- Type-safe tool definitions — Macro-driven MCP tool implementation
- Standardized request/response handling — Consistent envelope format
- Transport abstraction — HTTP, WebSocket, TCP, Unix sockets (configurable features)
- Middleware support — Logging, metrics, error handling
- Zero-copy streaming — Efficient large payload handling
This means TurboVault gets battle-tested reliability and extensibility out of the box. Want to add custom tools? TurboMCP's ergonomic macros make it straightforward.
Quick Start
Installation
From crates.io
# Minimal install (7.0 MB, STDIO only - perfect for Claude Desktop)
cargo install turbovault
# With HTTP server (~8.2 MB)
cargo install turbovault --features http
# With all cross-platform transports (~8.8 MB)
# Includes: STDIO, HTTP, WebSocket, TCP (Unix sockets only on Unix/macOS/Linux)
cargo install turbovault --features full
# With SQL frontmatter queries (adds GlueSQL-powered query_frontmatter_sql tool)
cargo install turbovault --features sql
# Binary installed to: ~/.cargo/bin/turbovault
From source:
git clone https://github.com/epistates/turbovault.git
cd turbovault
make release
# Binary: ./target/release/turbovault
Option 1: Static Vault (Recommended for Single Vault)
turbovault --vault /path/to/your/vault --profile production
Then add to ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"turbovault": {
"command": "/path/to/turbovault",
"args": ["--vault", "/path/to/your/vault", "--profile", "production"]
}
}
}
Option 2: Runtime Vault Addition (Recommended for Multiple Vaults)
Start the server without a vault:
turbovault --profile production
Then add vaults dynamically:
{
"mcpServers": {
"turbovault": {
"command": "/path/to/turbovault",
"args": ["--profile", "production"]
}
}
}
Once connected to Claude:
You: "Add my vault at ~/Documents/Notes"
Claude: [Calls add_vault("personal", "~/Documents/Notes")]
You: "Search for machine learning notes"
Claude: [Uses search() across the indexed vault]
You: "What are my most important notes?"
Claude: [Uses get_hub_notes() to find key concepts]
Atomic Git-Backed Writes
For vaults already managed by Git, enable the transactional backend in the TurboVault YAML config:
vaults:
- name: personal
path: ~/Documents/Notes
is_default: true
write_backend: git
git:
include_ignored: false
require_commit_message: false
Start with turbovault --config ~/.turbovault/config.yaml. Every mutation is
then a Git commit. Multi-operation batches build one isolated tree and advance
the branch with compare-and-swap, so a stale path aborts the entire batch and
concurrent TurboVault processes cannot interleave commit/materialization. The
backend also refuses to overwrite dirty or untracked touched paths and refuses
to reset an index containing staged changes.
What Can Claude Do?
Search & Discovery
You: "Find all notes about async Rust and show how they connect"
Claude: search() -> recommend_related() -> get_related_notes() -> explain relationships
Vault Intelligence
You: "What's the health of my vault? Any issues I should fix?"
Claude: quick_health_check() -> full_health_analysis() -> get_broken_links() -> generate fixes
Knowledge Graph Navigation
You: "What are my most important notes? Which ones are isolated?"
Claude: get_hub_notes() -> get_isolated_clusters() -> suggest connections
Structured Note Creation
You: "Create a project note for the TurboVault launch with status tracking"
Claude: list_templates() -> create_from_template() -> write auto-formatted note
Batch Content Operations
You: "Move my 'MLOps' note to 'AI/Operations' and identify links to update"
Claude: get_backlinks() -> move_note() -> edit_note() for each affected reference
Link Suggestions
You: "Based on my vault, what notes should I link this to?"
Claude: suggest_links() -> get_link_strength() -> recommend cross-references
74 MCP Tools Organized by Category
File Operations & Batch (8)
read_note— Get note content with hash for conflict detectionwrite_note— Create/overwrite notes (auto-creates directories)edit_note— Surgical edits via SEARCH/REPLACE blocksdelete_note— Safe deletion with link trackingmove_note— Rename/relocate a note; Git-backed vaults atomically rewrite incoming wikilinksmove_file— Move/rename non-note files (e.g. attachments, images)get_notes_info— Metadata for multiple notes in a single callbatch_execute— One all-or-nothing commit withwrite_backend: git; direct stays sequential
Git Fanout (4)
begin_fanout— Open an isolated worktree for parallel agent writescommit_fanout— Merge an active fanout back into its base vaultabandon_fanout— Discard a fanout without changing the base vaultlist_orphan_fanouts— Diagnose worktrees left by interrupted sessions
Metadata & Tags (3)
update_frontmatter— Patch frontmatter fields (merge or replace)get_metadata_value— Extract frontmatter values (dot notation support)manage_tags— Add, remove, or list note tags
Link Analysis (6)
get_backlinks— All notes that link TO this noteget_forward_links— All notes this note links TOget_related_notes— Multi-hop graph traversal (find non-obvious connections)get_hub_notes— Top 10 most connected notes (key concepts)get_dead_end_notes— Notes with incoming but no outgoing linksget_isolated_clusters— Disconnected subgraphs in your vault
Graph Metrics & Suggestions (3)
suggest_links— AI-powered link suggestions for a noteget_link_strength— Connection strength between notes (0.0–1.0)get_centrality_ranking— Graph centrality metrics (betweenness, closeness, eigenvector)
Search (8)
search— BM25-ranked search across all notes (<500ms on 100k notes)advanced_search— Search with tag, frontmatter, path, and limit filterssearch_by_frontmatter— Find notes by frontmatter key-value pairrecommend_related— ML-powered recommendations based on content similarityfind_notes_from_template— Find all notes using a specific templatequery_metadata— Frontmatter pattern queriesinspect_frontmatter— Schema inspection for SQL queries (feature:sql)query_frontmatter_sql— Arbitrary SQL against frontmatter via GlueSQL (feature:sql)
Semantic & Similarity (5)
semantic_search— TF-IDF semantic search with similarity scores and shared termsfind_similar_notes— Content-similar notes to a given notefind_duplicates— Near-duplicate detection (SimHash filter + TF-IDF verify)compare_notes— Similarity score, shared vocabulary, diff, and merge recommendationdiff_notes— Unified diff between two notes
Vault Health & Quality (10)
quick_health_check— Fast 0-100 health score (<100ms)full_health_analysis— Comprehensive vault audit with recommendationsget_broken_links— All links pointing to non-existent notesdetect_cycles— Circular reference chains (sometimes intentional)explain_vault— Holistic overview replacing 5+ separate callsevaluate_note_quality— Per-note quality score with improvement recommendationsvault_quality_report— Vault-wide quality assessment (worst-N notes)find_stale_notes— Notes not modified within a threshold of daysanalyze_note_grounding— Grounding primitives for a note (claims, citations, uncited flag) to feed an external LLM judgefind_ungrounded_notes— Find hallucination-risk notes that make claims but cite no source
Open Knowledge Format (4)
okf_validate— Validate the vault as an OKF v0.1 bundle (conformance + concepttypevocabulary); usable as a CI/pre-publish gategenerate_index— Generate/refreshindex.mdfiles for progressive disclosure (idempotent)append_log_entry— Append a dated entry to a directory'slog.mdupdate history (§7)visualize— Render the concept graph as a shareable, self-contained HTML file (force-directed graph + rendered notes + backlinks)
Templates & OFM (6)
list_templates— Discover available templatesget_template— Template details and required fieldscreate_from_template— Render and write templated notesget_ofm_syntax_guide— Focused Obsidian Flavored Markdown referenceget_ofm_quick_ref— Quick OFM cheat sheetget_ofm_examples— See all Obsidian Flavored Markdown features
Vault Lifecycle (8)
create_vault— Programmatically create a new vaultadd_vault— Register and auto-initialize a vault at runtimeremove_vault— Unregister vault (safe, doesn't delete files)list_vaults— All registered vaults with statusget_vault_config— Inspect vault settingsset_active_vault— Switch context between multiple vaultsget_active_vault— Current active vaultget_vault_context— Meta-tool: single call returns vault status, available tools, OFM guide
Audit & History (5)
audit_log— Chronological change log with operation IDs for rollbackaudit_stats— Audit overview: operation breakdown + snapshot disk usagediff_note_version— Diff a note against a past audited versionrollback_preview— Preview what a rollback would change (read-only)rollback_note— Undo a change by operation ID (atomic, audited)
Export (4)
export_health_report— Export vault health as JSON/CSVexport_broken_links— Export broken links with fix suggestionsexport_vault_stats— Statistics and metrics exportexport_analysis_report— Complete audit trail
Real-World Workflows
Initialize Without a Vault
# Server starts with NO vault required
response = client.call("get_vault_context")
# Returns: "No vault registered. Call add_vault() to get started."
response = client.call("add_vault", {
"name": "personal",
"path": "~/Documents/Obsidian"
})
# Auto-initializes: scans files, builds link graph, indexes for search
Multi-Vault Workflow
# Add multiple vaults
client.call("add_vault", {"name": "work", "path": "/work/notes"})
client.call("add_vault", {"name": "personal", "path": "~/notes"})
# Switch context instantly
client.call("set_active_vault", {"name": "work"})
search_results = client.call("search", {"query": "Q4 goals"})
client.call("set_active_vault", {"name": "personal"})
recommendations = client.call("recommend_related", {"path": "AI/ML.md"})
Vault Maintenance & Repair
# Quick diagnostic
health = client.call("quick_health_check")
if health["data"]["score"] < 60:
# Deep analysis if needed
full_analysis = client.call("full_health_analysis")
# Find and fix issues
broken = client.call("get_broken_links")
# Process broken links...
# Atomic bulk repair
client.call("batch_execute", {
"operations": [
{"type": "DeleteNote", "path": "old/deprecated.md"},
{"type": "MoveNote", "from": "old/notes.md", "to": "new/notes.md"},
# ... more operations
]
})
# Verify improvement
client.call("explain_vault") # Holistic view
Content Discovery
# Find what matters
hubs = client.call("get_hub_notes") # Top concepts
orphans = client.call("get_dead_end_notes") # Incomplete topics
# Deep search
results = client.call("search", {"query": "machine learning"})
# Explore relationships
related = client.call("get_related_notes", {
"path": "AI/ML.md",
"max_hops": 3
})
# Get suggestions
suggestions = client.call("suggest_links", {"path": "AI/ML.md"})
Performance Profile
| Operation | Time | Notes |
|---|---|---|
read_note | <10ms | Instant with caching |
get_backlinks, get_forward_links | <50ms | Graph lookup |
write_note | <50ms | Includes graph update |
search (10k notes) | <100ms | Tantivy BM25 |
quick_health_check | <100ms | Heuristic score |
full_health_analysis | 1–5s | Exhaustive, use sparingly |
explain_vault | 1–5s | Aggregates 5+ analyses |
| Vault initialization | 100ms–5s | Depends on vault size |
Key insight: Fast operations (<100ms) for common tasks, slower operations (1–5s) for exhaustive analysis. Claude uses smart fallbacks.
Configuration Profiles
| Profile | Use Case |
|---|---|
development | Local dev with verbose logging |
production | Production with security auditing and optimized logging |
readonly | Read-only access for safe exploration |
high-performance | Large vaults (10k+ notes) with aggressive caching |
Tool Visibility
TurboVault can reduce tools/list context by applying TurboMCP visibility rules from ~/.turbovault/config.yaml or --config:
tool_visibility:
hidden:
- full_health_analysis
- explain_vault
disabled:
- delete_note
Use hidden for advanced tools that should stay callable by exact name, disabled for tools that should fail closed, and allowed when you want an explicit allowlist. Equivalent env/CLI overrides are available via TURBOVAULT_HIDDEN_TOOLS, TURBOVAULT_DISABLED_TOOLS, TURBOVAULT_ALLOWED_TOOLS, and --hidden-tools, --disabled-tools, --allowed-tools.
SDK and Server Implementation
TurboVault is designed for two primary audiences: developers building on top of the Rust SDK and users looking for a standalone MCP server.
As a Standalone MCP Server
The quickest way to get started is using the pre-built binary. It's fully self-contained and optimized for performance:
- Link-time optimization (LTO) for maximum speed
- Configurable transports (STDIO, HTTP, WebSocket, TCP)
- Zero external dependencies (just point it at your vault)
# Build the optimized binary
cargo build --release --features full
# Run it
./target/release/turbovault --vault /path/to/vault --profile production
As a Rust SDK (Library)
The core of TurboVault is a collection of modular crates. Use them to build your own search engines, knowledge management tools, or even your own specialized MCP servers.
// Use in your own Rust projects
use turbovault_core::MultiVaultManager;
use turbovault_vault::VaultManager;
use turbovault_tools::SearchEngine;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 1. Initialize the MultiVault manager
let manager = MultiVaultManager::new();
// 2. Add and initialize a vault (scans files, builds graph)
manager.add_vault("notes", "/home/user/notes").await?;
// 3. Perform high-level operations
let vault = manager.get_vault("notes")?;
let results = vault.search("machine learning")?;
// 4. Use these components to build your own custom MCP server
// or integrate into existing Rust applications.
Ok(())
}
Each crate is published to crates.io, so you can depend on individual components or the full stack.
Architecture
Built as a modular Rust workspace:
turbovault-core — Core types, MultiVaultManager, configuration
turbovault-parser — OFM (Obsidian Flavored Markdown) parsing
turbovault-graph — Link graph analysis with petgraph
turbovault-vault — Vault operations, file I/O, atomic writes
turbovault-batch — Validated sequential batch operations
turbovault-export — JSON/CSV/Markdown export
turbovault-sql — SQL frontmatter queries (GlueSQL, feature-gated)
turbovault-tools — 74 MCP tool implementations
turbovault-plugin-api — Curated plugin facade, provider contract, event hooks
turbovault (binary) — CLI and MCP server entry point
All crates are published to crates.io for public use.
Obsidian Flavored Markdown (OFM) Support
TurboVault fully understands Obsidian's syntax:
- Wikilinks:
[[note]],[[note|alias]],[[note#section]],[[note#^block]] - Embeds:
![[image.png]],![[note]],![[note#section]] - Tags:
#tag,#parent/child/tag - Tasks:
- [ ] Task,- [x] Done - Callouts:
> [!type] Title - Frontmatter: YAML metadata with automatic parsing
- Headings: Hierarchical structure extraction
Security
- Path traversal protection — No access outside vault boundaries
- Type-safe deserialization — Rust's type system prevents injection
- Atomic writes — Temp file → atomic rename (never corrupts on failure)
- Hash-based conflict detection —
edit_notedetects concurrent modifications - File size limits — Default 10MB per file (configurable), enforced on reads and writes
- Protected directories —
.obsidian/,.git/,node_modules/, and TurboVault's own.turbovault/state are unreachable through the note APIs on both write backends - No shell execution — Zero command injection risk
- Security auditing — Detailed logs in production mode
System Requirements
- Rust: 1.90.0 or later
- OS: Linux, macOS, Windows
- Memory: 100MB base + ~80MB per 10k notes
- Disk: Negligible (index is in-memory)
Building from Source
git clone https://github.com/epistates/turbovault.git
cd turbovault
# Development build
cargo build
# Production build (optimized)
cargo build --release
# Run tests
cargo test --all
Or use the Makefile:
make build # Debug build
make release # Production build
make test # Run tests
make clean # Clean build artifacts
Documentation
Examples
Example 1: Search-Driven Organization
You: "What topics do I have the most notes on?"
Claude:
1. get_hub_notes() -> [AI, Project Management, Rust, Python]
2. For each hub:
- get_related_notes() -> related topics
- get_backlinks() -> importance/connectivity
3. Report: "Your core topics are AI (23 notes) and Rust (18 notes)"
Example 2: Vault Health Improvement
You: "My vault feels disorganized. Help me improve it."
Claude:
1. quick_health_check() -> Health: 42/100
2. full_health_analysis() -> Issues: 12 broken links, 8 orphaned notes
3. get_broken_links() -> List of specific broken links
4. suggest_links() -> AI-powered link recommendations
5. Apply fixes individually, or use batch_execute() after reviewing its fail-fast semantics
6. explain_vault() -> New health: 78/100
Example 3: Template-Based Content Creation
You: "Create project notes for Q4 initiatives"
Claude:
1. list_templates() -> "project", "task", "meeting"
2. create_from_template("project", {
"title": "Q4 Planning",
"status": "In Progress",
"deadline": "2024-12-31"
})
3. Creates structured note with auto-formatting
4. Returns path for follow-up edits
Benchmarks
M1 MacBook Pro, 10k notes, production build:
- File read: <10ms
- File write: <20ms
- Simple search: <50ms
- Graph analysis: <200ms
- Vault initialization: ~500ms
- Memory usage: ~80MB
- External-change reconciliation: ~19ms per pass, at most once per 500ms
Keeping up with edits you did not make
A vault is a shared directory. Obsidian is usually open on it, and an editor, a
git pull, or a sync client may touch it while TurboVault is running. Search,
the link graph, similarity, and vault stats are all derived from the notes, so
none of that would reach them on its own.
Before serving any of those, TurboVault compares a (size, mtime) scan against
what it last recorded and applies whatever moved. Comparing state cannot miss a
change the way filesystem notifications can, which matters most on exactly the
setups where notifications are weakest: network shares, and iCloud, Dropbox, or
Syncthing vaults, none of which report a peer's edits at all.
The pass is debounced, so a burst of tool calls costs one scan and an idle
server costs nothing. Worst-case staleness is the interval, at least 500ms and
scaled up only on a vault large enough to need it. Set
reconcile_external_changes: false to turn it off for a vault nothing else
writes.
Roadmap
- Cross-vault link resolution
- Encrypted vault support
- Collaborative locking
- WebSocket transport (beyond MCP stdio)
Contributing
Contributions welcome! Please ensure:
- All tests pass:
cargo test --all - Code formats:
cargo fmt --all - No clippy warnings:
cargo clippy --all -- -D warnings
License
MIT License - See LICENSE for details
Links
- Repository: https://github.com/epistates/turbovault
- Issues: https://github.com/epistates/turbovault/issues
- MCP Protocol: https://modelcontextprotocol.io
- Obsidian: https://obsidian.md
- Related: TurboMCP
Get started now: ./target/release/turbovault --profile production
Files in the repo
- .cargo
- .github
- crates
- docs
- tests
- .editorconfig
- .env.example
- .gitignore
- Cargo.lock
- Cargo.toml
- CHANGELOG.md
- config.example.yaml
- CONTRIBUTORS.md
- docker-compose.yml
- Dockerfile
- justfile
- LICENSE
- mutants.toml
- README.md
Discussion (0)
Ask about usage, or say what you built with itSign in to join the discussion.
No comments yet. Be the first to say what this is good for.
More connectors
High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.
Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.
Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.