Atlas / MCP servers / bitbonsai / MCPVault

MCPVaultBLOCK

mcp/bitbonsai/mcpvault

A lightweight Model Context Protocol (MCP) server for safe Obsidian vault access

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
19 12r · 5w · 2d
Transport
—
License
MIT
Stars
1,685
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://mcptoplist.com/server/glama%2Fbitbonsai%2Fmcpvault)

A local MCP server that lets compatible clients read, search, and edit notes in an Obsidian vault. MCPVault works directly with vault files, restricts file operations to the configured vault root, and preserves formatting for unchanged frontmatter fields.

https://mcpvault.org

Changelog

[](https://github.com/bitbonsai/mcpvault) [](https://www.npmjs.com/package/@bitbonsai/mcpvault) [](https://www.npmjs.com/package/@bitbonsai/mcpvault) [](https://github.com/sponsors/bitbonsai) [](https://ko-fi.com/bitbonsai) [](https://liberapay.com/bitbonsai/)

Supported clients

Configuration examples are available for Claude Desktop, Claude Code, ChatGPT Desktop (Enterprise+), OpenCode, Gemini CLI, OpenAI Codex, IntelliJ IDEA 2025.1+, Cursor,

Read from source at commit a4ffa150b72cOBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add mcpvault-web --env TURNSTILE_SITE_KEY=${TURNSTILE_SITE_KEY} -- npx -y mcpvault-web
claude-desktop
{
  "mcpServers": {
    "mcpvault-web": {
      "command": "npx",
      "args": [
        "-y",
        "mcpvault-web"
      ],
      "env": {
        "TURNSTILE_SITE_KEY": "${TURNSTILE_SITE_KEY}"
      }
    }
  }
}
03

Exposed tools (19)

12 read · 5 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
MCPVaultreadLocal MCP server for reading, searching, and editing notes in an Obsidian vault.
delete_notedestructiveDelete a note from the Obsidian vault (requires confirmation). Supports permanent delete, vault trash, or system trash.
get_frontmatterreadExtract frontmatter from a note without reading the content
get_note_outlinereadGet the heading structure of a note without reading its full content. Returns headings with level, text, and line number. Use this first to navigate large notes efficiently, then call read_note_lines to read only the section you need.
get_notes_inforeadGet metadata for notes without reading full content
get_vault_statsreadGet vault statistics including total notes, folders, size, and recently modified files. Useful for understanding vault scope before batch operations.
list_all_tagsreadList all tags across the vault with occurrence counts. Returns both frontmatter tags and inline #hashtags, deduplicated and sorted by frequency. Useful for discovering existing tags before creating or organizing notes.
list_directoryreadList files and directories in the vault (includes non-note filenames, while read/write tools remain note-only)
manage_tagsdestructiveAdd, remove, or list tags in a note
move_filewriteMove or rename any file in the vault (binary-safe, file-only, requires confirmation)
move_notewriteMove or rename a note in the vault
patch_notewriteEfficiently update part of a note by replacing a specific string. This is more efficient than rewriting the entire note for small changes.
read_multiple_notesreadRead multiple notes in a batch (max 10 files)
read_notereadRead a note from the Obsidian vault
read_note_linesreadRead a specific line range from a note. Use after get_note_outline to read only the section you need instead of the full file.
search_notesreadSearch for notes in the vault by content or frontmatter
shibumi-migrationreadPhase-gated MCPVault website migration to Bun + Hono + Alpine on Hetzner
update_frontmatterwriteUpdate frontmatter of a note without changing content
write_notewriteWrite a note to the Obsidian vault
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (11 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (19)

HIGHPrompt injection · prompt.persistence · CWE-94, CWE-1427
skills/obsidian/SKILL.md:126
> Settings > General > Advanced to update PATH registration. This replaces the old
Why it matters. instructs the agent to persist itself in the user's environment
HIGHPrompt injection · prompt.persistence · CWE-94, CWE-1427
skills/obsidian/SKILL.md:150
re-enable the CLI to update PATH registration."_
Why it matters. instructs the agent to persist itself in the user's environment
MEDIUMInventory / provenance · inv.binary · CWE-1104
website-shibumi/src/lib/highlight.ts
highlight.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/triage
.claude/skills/triage
Why it matters. link not followed
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/ship.ts:518
test: ["CMD", "bun", "-e", "fetch('http://127.0.0.1:3000/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/ship.ts:678
? `["CMD", "bun", "-e", "fetch('http://127.0.0.1:3000/').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]`
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/ship.ts:679
: `["CMD", "/busybox", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://127.0.0.1:3000/"]`;
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
website-shibumi/Containerfile:32
CMD wget -q -O /dev/null http://127.0.0.1:3000/healthz || exit 1
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_note, manage_tags
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/filesystem.test.ts:1303
await expect(fileSystem.readNote("folder/../../outside.md"))
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/pathfilter.test.ts:220
expect(filter.isAllowed("../../etc/passwd")).toBe(false);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
website-shibumi/test/client/fade-in-observer.test.ts:8
import { getObserverOptions, initFadeInObserver, reveal } from "../../src/client/fade-in-observer";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
website-shibumi/test/client/height-transition.test.ts:16
import { growToContent, transitionHeightAcross, type HeightTransitionContainer } from "../../src/client/height-transition";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
website-shibumi/test/client/interactive-demo.test.ts:24
import type { HeightTransitionContainer } from "../../src/client/height-transition";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
website-shibumi/test/integration/shutdown.test.ts:22
const res = await fetch(`http://127.0.0.1:${port}/healthz`);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/server, gray-matter, trash, yaml, @clack/prompts, @modelcontextprotocol/client, @types/node, tsx
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
website-shibumi/package.json
@alpinejs/csp, hono, resend, shiki, zod, @types/bun, typescript
Why it matters. 7 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
deploy/README.md:20
curl -fsSL https://shibumistack.dev/install/server | bash
INFOInventory / provenance · inv.oversize · CWE-1104
website-shibumi/public/mcp-obsidian-1-min.mp4
website-shibumi/public/mcp-obsidian-1-min.mp4
Why it matters. 1083904 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha a4ffa150b72cfull audit observations/trust-audit/mcp-server/bitbonsai__mcpvault.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12a4ffa150b72cBLOCKD69first audit
06

Questions

What is the @bitbonsai/mcpvault MCP server?

A lightweight Model Context Protocol (MCP) server for safe Obsidian vault access

What tools does @bitbonsai/mcpvault expose?

19 in total: 12 read-only, 5 that write, and 2 that can delete or overwrite (delete_note, manage_tags). Every one is listed on this page with its risk.

Is @bitbonsai/mcpvault safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @bitbonsai/mcpvault need?

It reads TURNSTILE_SITE_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (a4ffa150b72c), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement