Obsidian × MCPVault: Read a Note from Any MCP Client
Read a note from your Obsidian vault through MCPVault, from any MCP client, including a fully local LM Studio + open-model setup.
Run this workflow
CI-verified, 4/4 fixtures passing.
Intended Use
Anyone who wants their AI client to read notes from an Obsidian vault over MCP, regardless of host. MCPVault is a standard MCP server, so it works with Claude Desktop, LM Studio, or any MCP client, including 100% local open-model setups. CI verifies the host-agnostic spine: the config is valid and the note is present and readable (what read_note returns). The model-driven read_note call is fenced.
Not for
- Vaults you have not backed up
- Expecting CI to prove a specific model, GPU, or OS works, that part is host-side and community-reported, not machine-checked
The Stack
Tested Against
mcpvault@latestnode@20.xobsidian@1.7.xSide effects & data flow
- Network
- none, local only
- Writes
- ./mcp.json, ./vault/Inbox/
- Credentials
- none required
Prerequisites
- Node 20+ (MCPVault runs via npx)
- Any MCP client: Claude Desktop, or LM Studio with MCP enabled
- An Obsidian vault folder
Steps
- 1
Configure MCPVault for any MCP client, and scaffold a note
The same MCPVault block works in any MCP host: Claude Desktop or LM Studio. Point the args path at your vault folder; the reader who reported this used a Windows path. CI validates the config and drops a note for read_note to return.
cat > mcp.json <<'EOF' { "mcpServers": { "obsidian": { "command": "npx", "args": ["@bitbonsai/mcpvault@latest", "/path/to/your/Vault"], "env": {} } } } EOF node -e 'const c=JSON.parse(require("fs").readFileSync("mcp.json","utf8"));const o=c.mcpServers.obsidian;if(o.command==="npx"&&o.args.some(a=>a.indexOf("@bitbonsai/mcpvault")===0)){console.log("config OK: npx -> @bitbonsai/mcpvault")}else{console.log("BAD");process.exit(1)}' mkdir -p vault/Inbox cat > vault/Inbox/welcome.md <<'EOF' # Welcome to your vault MCPVault reads this note over MCP, from Claude Desktop or LM Studio. EOF test -s vault/Inbox/welcome.md && echo "note scaffolded: vault/Inbox/welcome.md" - 2
What CI checks: the note is present and readable (what read_note returns)
read_note is a filesystem read over MCP. CI confirms the note exists at the vault path and its title and body are readable, which is exactly the content read_note hands back. No model, no key, host-agnostic.
cat > checkread.mjs <<'EOF' import { readFileSync, existsSync } from 'node:fs'; const path = 'vault/Inbox/welcome.md'; let ok = true; function check(label, cond){ console.log(label + ': ' + (cond ? 'yes' : 'NO')); if(!cond) ok=false; } check('note exists at vault path', existsSync(path)); const t = existsSync(path) ? readFileSync(path, 'utf8') : ''; check('read_note returns the title', t.includes('# Welcome to your vault')); check('read_note returns the body', t.includes('MCPVault reads this note over MCP')); if(!ok){ console.log('mcpvault read check FAILED'); process.exit(1); } console.log('mcpvault read check OK'); EOF node checkread.mjs - 3
Ask your model to read it (the model step, not checked by CI)
In your MCP client (Claude Desktop, or LM Studio with a local model), ask it to read the note. That call routes through the model, so it is non-deterministic and fenced: CI proves the note is there and readable, never the model's phrasing.
Eval, 4 fixtures
Last passed: verified todayconfig-validcontainstimeout 30s · max $0Expected:
config OK: npx -> @bitbonsai/mcpvaultread-titlecontainstimeout 30s · max $0Expected:
read_note returns the title: yesread-okcontainstimeout 30s · max $0Expected:
mcpvault read check OKclean-exitexit_codetimeout 30s · max $0Expected:
0
Results
Community-tested on Windows with LM Studio + a local open model (Qwopus-3.5-9B-Coder, Q4_K_M); read_note confirmed working by a reader.
Did this work for you?
Our CI checks the setup runs. You tell us if the whole thing worked. Tell us straight.
Liked this workflow?
Get new verified workflows in WebAfterAI, three issues a week (Tue, Thu, Sat).