vault_read_noteLABSCO SUMMARY
Your notes become something an agent can search well, not just read.
Keyword search fails on a personal vault because your words and past-you's words differ; blending vectors and a reranker on top of FTS5 is what fixes that, and it runs locally at around 45MB of models with no external API. The memory layer is the second idea worth the setup: append-only dated entries with entry-level recall, so "what do I think about X" returns the current take plus how it got there.
What it is
A standalone MCP server that works directly with the .md files of an Obsidian vault on disk. One Docker container gives an agent search, note editing, task management and a memory layer; run it on a server with Obsidian Sync and the same vault is reachable from your phone or claude.ai over OAuth 2.1.
What you get
- Notes —
vault_read_note,vault_write_note,vault_patch_notefor heading-targeted edits,vault_replace_in_note,vault_delete_span,vault_list_notes,vault_delete_note,vault_move_note, which rewrites links across the vault - Search —
vault_searchblends FTS5 keyword matching with vector similarity through RRF fusion and a cross-encoder reranker; plusvault_search_by_tag,vault_search_by_folder,vault_recent_notes,vault_list_tags - Tasks —
vault_list_tasksindexes the whole vault Kanban-aware, across six date fields, priority and folder;vault_update_taskchanges status, priority and lane in one call and stamps the completion date - Memory —
vault_update_memoryappends dated entries,vault_memory_recallretrieves matching entries across memory files oldest-first, withvault_get_memory,vault_delete_memoryandvault_list_memory_files - Properties and links —
vault_list_property_keys,vault_list_property_values,vault_search_by_property,vault_update_properties,vault_get_backlinks,vault_get_outgoing_links,vault_find_orphans - Files and daily notes —
vault_read_filereturns images as images and canvases as readable outlines,vault_list_filesbrowses attachments,vault_get_daily_noteresolves today's or any date's note from your Obsidian daily-notes settings
Requirements
Docker (or a compatible runtime) and a vault folder. The fastest path is npx vault-cortex@latest init, which asks for the vault path, generates the auth token and config, and starts the container — that CLI needs Node.js >= 20.12, the server itself runs in Docker. Two settings are mandatory: MCP_AUTH_TOKEN, generated with openssl rand -hex 32, and the vault bind-mount path. The client connects to http://localhost:8000/mcp. Remote deployments additionally need PUBLIC_URL and an Obsidian Sync subscription. Feature switches let you cut the surface: EMBEDDING_ENABLED=false for keyword-only search, MEMORY_ENABLED=false, FILE_TOOLS_ENABLED=false, READONLY_MODE=true, and DISABLED_TOOLS to hide named tools. Image version 0.42.1.
Setup effort
One command plus a local token — npx vault-cortex@latest init, then supply the token
USE CASES
Finding a note when you cannot remember its words
Search by meaning and keyword together, filtered by tag, folder or date, and read the section that matched.
Triaging what is actually overdue
Query tasks across the whole vault by status and due date, then complete or reprioritise them in one call.
Keeping a personal record the agent can use
Append dated entries as decisions change, then recall the topic later with its history intact.
Editing a note without rewriting it
Patch under a specific heading or replace a phrase, instead of overwriting the whole file.
Cleaning up a vault that has drifted
Find notes nothing links to, then move or rename them with links rewritten across the vault.
30 tools
Listed in project docs. Your client may show a different list.
vault_write_notevault_patch_notevault_replace_in_notevault_delete_spanvault_list_notesvault_delete_notevault_move_notevault_searchvault_search_by_tagvault_search_by_foldervault_recent_notesvault_list_tagsvault_list_tasksvault_update_taskvault_get_memoryvault_update_memoryvault_delete_memoryvault_list_memory_filesvault_memory_recallvault_list_property_keysvault_list_property_valuesvault_search_by_propertyvault_update_propertiesvault_get_backlinksvault_get_outgoing_linksvault_find_orphansvault_read_filevault_list_filesvault_get_daily_noteBEFORE YOU INSTALL
What to know first
Tools you get
30 tools named in the project's documentation. READONLY_MODE=true hides every tool that changes the vault; MEMORY_ENABLED=false hides the five memory tools; FILE_TOOLS_ENABLED=false hides vault_read_file and vault_list_files; DISABLED_TOOLS hides any tool you name.
Requires
- Docker, or a Docker-compatible runtime such as OrbStack, Colima or Podman
- Node.js 20.12 or later, for the init CLI only
- An Obsidian vault, or any folder of .md files
INSTALLATION
Connect your client
Server setup
Prerequisites: Docker (or OrbStack/Colima/Podman), Node.js >= 20.12 for the CLI only, and an Obsidian vault (or any folder of .md files)
Local, CLI route:
npx vault-cortex@latest initLocal, manual route (no Node.js): curl -O https://raw.githubusercontent.com/aliasunder/vault-cortex/main/deploy/local/docker-compose.yml ; curl -O https://raw.githubusercontent.com/aliasunder/vault-cortex/main/deploy/local/.env.example ; cp .env.example .env ; edit .env to set MCP_AUTH_TOKEN (openssl rand -hex 32) and VAULT_PATH ; docker compose up
Remote on your own VPS: npx vault-cortex@latest init --mode remote (or the manual variant using deploy/remote/docker-compose.yml with MCP_AUTH_TOKEN, PUBLIC_URL, OBSIDIAN_AUTH_TOKEN, VAULT_NAME)
Remote one-click: use the Deploy on Railway / Deploy to Render buttons
Connect a client: claude mcp add --scope user --transport http vault-cortex http://localhost:8000/mcp — or, for Claude Desktop against localhost, the mcp-remote config block below
MCP Clients
Claude Code
claude mcp add --scope user --transport http vault-cortex http://localhost:8000/mcpClaude Desktop
{
"mcpServers": {
"vault-cortex": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:8000/mcp",
"--header",
"Authorization: Bearer <YOUR_MCP_AUTH_TOKEN>"
]
}
}
}Claude.ai
Claude.ai (web and mobile) connects to the remote setup only — its connectors are fetched server-side and can never reach localhost. Deploy the remote setup first (the Railway / Render one-click, or npx vault-cortex@latest init --mode remote on your own server), then add this URL as a custom connector:
https://<YOUR_HOST>/mcp<YOUR_HOST> is the domain Render or Railway shows on the service page. On your own server, use your PUBLIC_URL followed by /mcp.
MCP Inspector (testing)
npx @modelcontextprotocol/inspector