dharmikbhesaniya/obsidian-mcp

GitHub ↗ · How this check works

Per-setup public labels: Linux / Haiku: Works · Linux / Luna: Works

Static status badge · SVG · read-only JSON. Embed with ![Coldpass status](https://coldpass.dev/badge/dharmikbhesaniya--obsidian-mcp.svg).

mcp-server

Works

README claims checked out on 2 recorded setups. Combinations not listed here were not tested.

Answers apply to each recorded setup, revision and operation. Earlier observations remain in Run details.

Tested on Linux
PlatformHaikuLuna
Linuxyesyes

Linux / Haiku 5.5: yes · Oct 23, 2026 · 41610a903a03 · claude-code / 2.1.300 (Claude Code)
Recorded operation: node dist/index.js · local stdio MCP start + initialize + tools/list

Linux / Luna: yes · Oct 23, 2026 · 41610a903a03 · codex / codex-cli 0.163.0
Recorded operation: node dist/index.js · local stdio MCP start + initialize + tools/list

Does what it says
1 of 1 claims checked out
  • The MCP server accepts a vault configuration and exposes vault inventory through its typed tools.: Real input produced the expected result: vault

    Source: The server exposes 54 strongly-typed semantic tools (with advanced CLI escape hatch gated behind `ENABLE_ADVANCED_CLI=true`), 7 direct read resources, and 7 guided prompts:

    Input: {"tool": "obsidian_list_vaults", "arguments": {}}

    Expected: obsidian_list_vaults reports one default vault with totalFiles 0.

    Command: node dist/index.js tools/call {"tool": "obsidian_list_vaults", "arguments": {}}

    Observed: vault\",\n \"totalVaults\": 1,\n \"vaults\": [\n {\n \"name\": \"vault\",\n \"path\": \"<guest-path>\",\n \"isDefault\": true,\n \"totalFiles\": 0,\n \"readOnly\": false\n }\n ]\n}"}]}

MCP
Yes, observed
Local or hosted
both local and hosted
Both a local install and a hosted service
Needs keys or browser
None seen
Maintained
Maintained
actively maintained: last commit 16 days ago; 33 commits and 1 merged PRs in 90 days; 0 open issues, 6 open PRs; no releases

Last commit Oct 20, 2026

Setup time
11 min 1 s
11 min 1 s to a working result
Issue
none found in recorded check
Examples
2 of 2 ran as expected
  • README build and test commands: command completed successfully

    Source: README.md / Local Development Setup / Installation & Build

    Input: npm run build and npm test

    Expected: Build succeeds; all 88 tests pass.

    Command: npm run build

    Observed: > [email protected] build > tsc && chmod +x dist/index.js

  • README test suite: command completed successfully

    Source: README.md / Local Development Setup / Installation & Build

    Input: npm test

    Expected: all 88 tests pass

    Command: npm test

    Observed: 39m tests/unit/bm25.test.ts (4 tests) 4ms  Test Files  10 passed (10)  Tests  88 passed (88)  Start at  03:23:26  Duration  5.60s (import 50%, tests 29%, transform 19%, worker 2%)  Isolate  10 workers spawned · ~197ms startup each (spawn + environment, per file)   at least ~1.77s faster with isolate: false — reuses workers across files instead of one per file

Evidence
README behavior checked
Agent interfaces
MCP, CLI (documented only)
MCP, CLI (documented only)

Observed interfaces were exercised by the checker. Documentation alone does not confirm compatibility.

MCP context
53 tools · about 7,770 tokens
53 tools · about 7,770 tokens

Largest returned tools/list page in these observations. Compact UTF-8 definition bytes ÷ 4, rounded up; approximate, excluding client framing and tool results. This is context size, not proof that every tool works.

Measured on linux with Luna · Oct 23, 2026 on 41610a903a03

Tested with
Codex / Luna
  • Linux: Codex / Luna · agent codex-cli 0.163.0 · Checked operation passed · Oct 23, 2026 on 41610a903a03

Each entry describes its recorded operation and source revision. Other agent clients were not tested.

Safety
No unexpected network or file activity found in these checks

No problems traced to this repository code in these checks; a short run cannot prove safety. 28 listed items (named-host connections, static matches, dependency advisories) are below and do not change this verdict.

OSV reports a known vulnerability in this dependency version. 5 distinct locations. 14 findings.

Full event, path and process lists for each observed setup:

Run details

Haiku 5.5

Native agent · Checked operation passed

Checked operation node dist/index.js · local stdio MCP start + initialize + tools/list

Agent-reported scope: Start the Obsidian MCP stdio server and read a note from a vault through obsidian_read_note

MCP server returned: obsidian-mcp · version 1.0.0.

MCP tools returned: obsidian_list_vaults, obsidian_get_vault, obsidian_list_files, obsidian_get_file_info, obsidian_read_note, obsidian_create_note, obsidian_append_note, obsidian_prepend_note, obsidian_update_note, obsidian_patch_note, obsidian_move_note, obsidian_delete_note, obsidian_search, obsidian_search_context, obsidian_read_daily_note, obsidian_append_daily_note, obsidian_prepend_daily_note, obsidian_get_properties, obsidian_get_property, obsidian_set_property, obsidian_remove_property, obsidian_list_tasks, obsidian_toggle_task, obsidian_get_backlinks, obsidian_get_links, obsidian_get_link_path, obsidian_get_orphans, obsidian_get_unresolved_links, obsidian_get_deadends, obsidian_get_tags, obsidian_get_tag_notes, obsidian_list_bases, obsidian_query_base, obsidian_get_note_context, obsidian_find_notes, obsidian_recent_changes, obsidian_list_bookmarks, obsidian_create_bookmark, obsidian_get_outline, obsidian_outline, obsidian_list_aliases, obsidian_get_aliases, obsidian_list_templates, obsidian_read_template, obsidian_word_count, obsidian_random_note, obsidian_create_unique_note, obsidian_open_note, obsidian_open_in_app, obsidian_list_plugins, obsidian_list_snippets, obsidian_list_commands, obsidian_execute_command. Tool listing does not establish authenticated tool-call success.

Run details
run
dharmikbhesaniya--obsidian-mcp-claude-haiku-5-5-1792804377406375167
date
Oct 23, 2026
time to working
331.5s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
claude-haiku-5-5
agent / version
claude-code / 2.1.300 (Claude Code)
platform
linux
reported cost
$0.017523
Recorded source
https://github.com/dharmikbhesaniya/obsidian-mcp
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "41610a903a0381e8ca799792a2f37c19df0d4f82", "url": "https://github.com/dharmikbhesaniya/obsidian-mcp"}
Test version
readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9
revision
41610a903a0381e8ca799792a2f37c19df0d4f82
Whose fault: not assigned · resolved

Safety: Review signals: 14 known vulnerability.

Review signals: 14 known vulnerability.

OSV reports a known vulnerability in this dependency version. 5 distinct locations. 14 findings.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • The Notes domain exposes obsidian_read_note, which returns a note's content from the vault: Real input produced the expected result: vault-sentinel-7731

    Source: - **Notes Domain (8 tools)**: `obsidian_read_note`, `obsidian_create_note`

    Input: {"tool": "obsidian_read_note", "arguments": {"path": "hello.md"}}

    Expected: the note body including the fixture sentinel

    Command: node dist/index.js tools/call {"tool": "obsidian_read_note", "arguments": {"path": "hello.md"}}

    Observed: vault-sentinel-7731.\\n\",\n \"revision\": \"09dc74de6897737348cfd0f13d39dc4a8fa59b98\",\n \"etag\": \"09dc74de6897737348cfd0f13d39dc4a8fa59b98\",\n \"frontmatter\": {},\n \"obsidianUri\": \"obsidian://open?vault=vault&file=hello.md\"\n}"}]}

Examples

  • Run the documented test suite (unit, integration, security): command completed successfully

    Source: README.md Local Development Setup / Installation & Build

    Input: none

    Expected: all 88 tests pass

    Command: npm test

    Observed: 10 passed (10)  Tests  88 passed (88)  Start at  01:19:02  Duration  7.84s (import 54%, tests 27%, transform 17%, worker 2%)  Import  37 modules were evaluated 55 times · 2.67s total, 54% of tracked time   ~874ms faster with isolate: false — shared modules are evaluated once per worker instead of once per file   learn more: https://vitest.dev/guide/improving-performance#test-isolation

Local or hosted: both

What the agent did

Start the Obsidian MCP stdio server and read a note from a vault through obsidian_read_note

cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat /etc/os-release | head -3 && (git -C . rev-parse HEAD 2>&1 | head -1)
cd <guest-path> && ls -la && cat README.md 2>/dev/null | head -300
cd <guest-path> && sed -n 300,700p README.md | grep -n -i -E "npm|node|test|cron|schedule|once|now|webhook|sync|loop|--|obsidian_cli" | head -80; echo ---; which node npm npx; node -v 2>&1; npm -v 2>&1; cat package.json
cd <guest-path> && git init -q && git remote add origin https://github.com/dharmikbhesaniya/obsidian-mcp && git fetch --depth 1 origin 41610a903a0381e8ca799792a2f37c19df0d4f82 2>&1 | tail -3; git reset --mixed FETCH_HEAD 2>&1 | tail -2; git rev-parse HEAD; git status --short | head
sudo -n true && echo SUDO_OK; apt-cache policy nodejs 2>/dev/null | head -3; cd <guest-path> && sed -n 100,125p README.md
sudo apt-get update -qq 2>&1 | tail -2; apt-cache policy nodejs | head -3
export NODE_USE_ENV_PROXY=1; curl -fsSL https://deb.nodesource.com/setup_22.x -o /tmp/ns_setup.sh && sudo -E bash /tmp/ns_setup.sh >/tmp/ns.log 2>&1; echo rc=$?; tail -3 /tmp/ns.log; sudo apt-get install -y -qq nodejs >/tmp/nodeinst.log 2>&1; echo rc=$?; tail -3 /tmp/nodeinst.log; node -v; npm -v
cd <guest-path> && npm ci > /tmp/npmci.log 2>&1; echo ci_rc=$?; tail -5 /tmp/npmci.log; npm run build > /tmp/build.log 2>&1; echo build_rc=$?; tail -5 /tmp/build.log; ls dist | head
cd <guest-path> && timeout 600 npm test > /tmp/test.log 2>&1; echo test_rc=$?; tail -25 /tmp/test.log
cd <guest-path> && which obsidian; echo "obsidian_rc=$?"; cat .env.example; echo ---; ls src src/adapters; grep -rn "OBSIDIAN_BIN_PATH\|spawn(\|execFile" src | head -20
cd <guest-path> && ls src/services src/tools src/adapters/obsidian; grep -rln "cliAdapter\|ObsidianCliAdapter\|\.run(" src | head; echo ---; grep -rn "name: \"obsidian_" src/tools | head -60 | awk -F'name: ' '{print $2}' | cut -c1-60 | tr '\n' ' '
cd <guest-path> && grep -n "async \w*(" src/services/vault.service.ts | head -60; echo ---; grep -n "cli\.\|this.cli" src/services/vault.service.ts | head -20; echo ---; grep -n "obsidian_list_vaults\|obsidian_create_note\|obsidian_read_note\|registerTool\|server.tool(" src/tools/index.ts | head -10
cd <guest-path> && sed -n 345,366p src/services/vault.service.ts; sed -n 192,200p src/services/vault.service.ts; ls <guest-path>; ls <guest-path> 2>/dev/null; ls /inputs 2>/dev/null; ls -la .coldpass
mkdir -p <guest-path> && printf '# Hello\n\nColdpass fixture note says: vault-sentinel-7731.\n' > <guest-path> && mkdir -p <guest-path> && cd <guest-path> && cat > client.mjs <<'EOF'
import { Client } from "<guest-path>";
import { StdioClientTransport } from "<guest-path>";
const [,, tool, argsJson] = process.argv;
const t = new StdioClientTransport({ command: "node", args: ["<guest-path>"], cwd: "<guest-path>", env: { ...process.env, OBSIDIAN_VAULT_PATH: "<guest-path>", MCP_TRANSPORT: "stdio", AUTH_ENABLED: "false" }, stderr: "ignore" });
const c = new Client({ name: "h", version: "1" });
await c.connect(t);
const r = await c.callTool({ name: tool, arguments: JSON.parse(argsJson || "{}") });
console.log(JSON.stringify(r).slice(0, 1500));
await c.close();
EOF
export NODE_PATH=<guest-path>; timeout 60 node client.mjs obsidian_read_note '{"path":"hello.md"}'; echo rc=$?
cd <guest-path> && grep -rn -i "setInterval\|cron\|schedul\|--once\|webhook\|setTimeout" src | head; echo ---; grep -n "Notes Domain (8 tools)" README.md | cut -c1-200; grep -n "The server exposes 54" README.md | cut -c1-120; grep -n "Run test suite" README.md; grep -n "Build TypeScript to dist" README.md
cd <guest-path> && python3 - <<'EOF'
import json
W="<guest-path>"
env={"OBSIDIAN_VAULT_PATH":"<guest-path>","MCP_TRANSPORT":"stdio","AUTH_ENABLED":"false"}
argv=["node","dist/index.js"]
probe={"kind":"mcp","argv":argv,"cwd":W,"env":env,"tool":"obsidian_read_note","arguments":{"path":"hello.md"},"expected_text":"vault-sentinel-7731"}
json.dump(probe,open("probe.json","w"),indent=2)
claims=[{"kind":"claim","claim":"The Notes domain exposes obsidian_read_note, which returns a note's content from the vault",
 "source":"- **Notes Domain (8 tools)**: `obsidian_read_note`, `obsidian_create_note`",
 "input":"hello.md","expected":"the note body including the fixture sentinel",
 "probe_kind":"mcp","argv":argv,"env":env,"tool":"obsidian_read_note","arguments":{"path":"hello.md"},
 "expected_text":"vault-sentinel-7731","cwd":W}]
json.dump(claims,open("claims.json","w"),indent=2)
examples=[{"kind":"example","claim":"Run the documented test suite (unit, integration, security)",
 "source":"README.md Local Development Setup / Installation & Build",
 "input":"none","expected":"all 88 tests pass","argv":["npm","test"],"cwd":W,"expected_text":"88 passed"}]
json.dump(examples,open("examples.json","w"),indent=2)
json.dump({"detected":False,"reason":"Inspected src/ for cron/schedule/--once/webhook/loop entry points: none found. The only timer is setInterval in src/transport/http.ts (session cleanup housekeeping, not a user-facing product cycle). README documents no scheduling.","checks":[]},open("cycles.json","w"),indent=2)
report={"outcome":"working","fault_owner":None,"operation":"Start the Obsidian MCP stdio server and read a note from a vault through obsidian_read_note",
 "operation_scope":"Filesystem-backed vault tools only. Node 22 installed; fixture vault at <guest-path> The Obsidian desktop CLI (OBSIDIAN_BIN_PATH) is not installed, so the ~30 CLI-backed tools (e.g. search, backlinks, daily notes, tasks, commands) were not exercised.",
 "steps":["git init; git remote add origin https://github.com/dharmikbhesaniya/obsidian-mcp; git fetch --depth 1 origin 41610a903a0381e8ca799792a2f37c19df0d4f82; git reset --mixed FETCH_HEAD",
  "sudo apt-get update; NodeSource setup_22.x; sudo apt-get install -y nodejs (Node v22.23.4, npm 10.9.9)",
  "npm ci","npm run build","npm test (88 passed)",
  "node dist/index.js with OBSIDIAN_VAULT_PATH=<guest-path> via MCP client; tool obsidian_read_note path=hello.md returned sentinel vault-sentinel-7731"],
 "deviations":["README says 'sudo apt install ... nodejs npm'; Ubuntu 24.04 apt offers only Node 18.19.1, below the required Node 20+. Installed Node 22 from NodeSource instead.",
  "README requires Obsidian Desktop v1.12+ with CLI enabled; not installed in this guest (no obsidian binary). Used the filesystem-backed read tool instead; CLI-backed tools were not exercised.",
  "No .env created; configuration passed via environment variables in probe/claims instead.",
  "Created fixture vault <guest-path> outside the checkout."],
 "stuck_step":None,"main_blocker":None,"plain_failure":None,"suggested_fix":"None for the tested path. To test the rest of the 54 tools, install Obsidian desktop with its CLI enabled and set OBSIDIAN_BIN_PATH."}
json.dump(report,open("report.json","w"),indent=2)
print("written")
EOF
ls -la; cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay; echo rc=$?
pgrep -af "obsidian|dist/index.js" || echo "no leftover server processes"
Earlier attempts (1)

Luna

Native agent · Checked operation passed

Checked operation node dist/index.js · local stdio MCP start + initialize + tools/list

Agent-reported scope: Built and started the stdio MCP server, then called obsidian_list_vaults on a temporary configured vault.

MCP server returned: obsidian-mcp · version 1.0.0.

MCP tools returned: obsidian_list_vaults, obsidian_get_vault, obsidian_list_files, obsidian_get_file_info, obsidian_read_note, obsidian_create_note, obsidian_append_note, obsidian_prepend_note, obsidian_update_note, obsidian_patch_note, obsidian_move_note, obsidian_delete_note, obsidian_search, obsidian_search_context, obsidian_read_daily_note, obsidian_append_daily_note, obsidian_prepend_daily_note, obsidian_get_properties, obsidian_get_property, obsidian_set_property, obsidian_remove_property, obsidian_list_tasks, obsidian_toggle_task, obsidian_get_backlinks, obsidian_get_links, obsidian_get_link_path, obsidian_get_orphans, obsidian_get_unresolved_links, obsidian_get_deadends, obsidian_get_tags, obsidian_get_tag_notes, obsidian_list_bases, obsidian_query_base, obsidian_get_note_context, obsidian_find_notes, obsidian_recent_changes, obsidian_list_bookmarks, obsidian_create_bookmark, obsidian_get_outline, obsidian_outline, obsidian_list_aliases, obsidian_get_aliases, obsidian_list_templates, obsidian_read_template, obsidian_word_count, obsidian_random_note, obsidian_create_unique_note, obsidian_open_note, obsidian_open_in_app, obsidian_list_plugins, obsidian_list_snippets, obsidian_list_commands, obsidian_execute_command. Tool listing does not establish authenticated tool-call success.

Run details
run
dharmikbhesaniya--obsidian-mcp-gpt-6-luna-1792811529702476731
date
Oct 23, 2026
time to working
661.0s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
gpt-6-luna
agent / version
codex / codex-cli 0.163.0
platform
linux
reported cost
not reported (not assumed free)
Recorded source
https://github.com/dharmikbhesaniya/obsidian-mcp
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "41610a903a0381e8ca799792a2f37c19df0d4f82", "url": "https://github.com/dharmikbhesaniya/obsidian-mcp"}
Test version
readme-f72312298d35d84837d4fc5f6f22b138d54d456600b5ed431e36e8f5db931dbf
revision
41610a903a0381e8ca799792a2f37c19df0d4f82
Whose fault: not assigned · resolved

Safety: Review signals: 14 known vulnerability.

Review signals: 14 known vulnerability.

OSV reports a known vulnerability in this dependency version. 5 distinct locations. 14 findings.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • The MCP server accepts a vault configuration and exposes vault inventory through its typed tools.: Real input produced the expected result: vault

    Source: The server exposes 54 strongly-typed semantic tools (with advanced CLI escape hatch gated behind `ENABLE_ADVANCED_CLI=true`), 7 direct read resources, and 7 guided prompts:

    Input: {"tool": "obsidian_list_vaults", "arguments": {}}

    Expected: obsidian_list_vaults reports one default vault with totalFiles 0.

    Command: node dist/index.js tools/call {"tool": "obsidian_list_vaults", "arguments": {}}

    Observed: vault\",\n \"totalVaults\": 1,\n \"vaults\": [\n {\n \"name\": \"vault\",\n \"path\": \"<guest-path>\",\n \"isDefault\": true,\n \"totalFiles\": 0,\n \"readOnly\": false\n }\n ]\n}"}]}

Examples

  • README build and test commands: command completed successfully

    Source: README.md / Local Development Setup / Installation & Build

    Input: npm run build and npm test

    Expected: Build succeeds; all 88 tests pass.

    Command: npm run build

    Observed: > [email protected] build > tsc && chmod +x dist/index.js

  • README test suite: command completed successfully

    Source: README.md / Local Development Setup / Installation & Build

    Input: npm test

    Expected: all 88 tests pass

    Command: npm test

    Observed: 39m tests/unit/bm25.test.ts (4 tests) 4ms  Test Files  10 passed (10)  Tests  88 passed (88)  Start at  03:23:26  Duration  5.60s (import 50%, tests 29%, transform 19%, worker 2%)  Isolate  10 workers spawned · ~197ms startup each (spawn + environment, per file)   at least ~1.77s faster with isolate: false — reuses workers across files instead of one per file

Local or hosted: both

What the agent did

Built and started the stdio MCP server, then called obsidian_list_vaults on a temporary configured vault.

pwd; vault-search 'obsidian-mcp README setup MCP tools' 2>&1; ls -la <host-path> ~/.agents/skills/i-have-adhd/SKILL.md ~/.agents/skills/ponytail/SKILL.md ~/.agents/skills/p3-mode/SKILL.md 2>&1; cat README.md; rg --files -g 'AGENTS.md' -g 'README*' -g 'package.json' -g 'pyproject.toml' -g 'requirements*.txt' -g 'uv.lock' -g 'Dockerfile' -g '*.py' -g '.github/**' | head -100; python3 --version; id -u
ls -la; find . -name AGENTS.md -o -name package.json -o -name '.env.example' -o -path './src/*' | head -100; cat package.json; git status --short --branch; node -v; npm -v; sed -n '1,200p' src/index.ts 2>/dev/null; cat .env.example 2>/dev/null
sudo -n apt-get update && sudo -n apt-get install -y nodejs npm; node -v; npm -v
node -v; npm -v; npm install; npm run build; npm test; mkdir -p <guest-path>; mkdir -p <guest-path>; test -x /usr/bin/obsidian && echo obsidian-present || echo obsidian-absent; cat src/config/config.ts
sudo -n apt-get install -y curl ca-certificates; curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -n bash -; sudo -n apt-get install -y nodejs; node -v; npm -v
npm install -g npm@10 && npm -v && npm install && npm run build && npm test
sudo -n npm install -g npm@10 && npm -v && npm install && npm run build && npm test
cat src/tools/index.ts | head; grep -R -n 'obsidian_list_vaults\|obsidian_list_files\|obsidian_read_note' src/tools | head; cat > /tmp/mcp-probe.cjs <<'EOF'
const { Client } = require('<guest-path>');
const { StdioClientTransport } = require('<guest-path>');
(async()=>{const transport=new StdioClientTransport({command:'node',args:['<guest-path>'],env:{...process.env,OBSIDIAN_VAULT_PATH:'<guest-path>',MCP_TRANSPORT:'stdio',READ_ONLY:'false',NODE_ENV:'development'}}); const c=new Client({name:'coldpass-probe',version:'1.0.0'}); await c.connect(transport); const r=await c.callTool({name:'obsidian_list_vaults',arguments:{}}); console.log(JSON.stringify(r)); await c.close();})().catch(e=>{console.error(e);process.exit(1)});
EOF
mkdir -p .coldpass/vault; node /tmp/mcp-probe.cjs
mkdir -p .coldpass; python3 - <<'PY'
import json
p='<guest-path>'
claim='The server exposes 54 strongly-typed semantic tools (with advanced CLI escape hatch gated behind `ENABLE_ADVANCED_CLI=true`), 7 direct read resources, and 7 guided prompts:'
probe={'kind':'mcp','argv':['node','dist/index.js'],'cwd':p,'env':{'OBSIDIAN_VAULT_PATH':p+'/.coldpass/vault','MCP_TRANSPORT':'stdio','READ_ONLY':'false','NODE_ENV':'development'},'tool':'obsidian_list_vaults','arguments':{},'expected_text':'"totalVaults": 1'}
open(p+'/.coldpass/probe.json','w').write(json.dumps(probe,indent=2)+'\n')
claims=[{'kind':'claim','claim':'The MCP server accepts a vault configuration and exposes vault inventory through its typed tools.','source':claim,'input':'Temporary empty vault at .coldpass/vault','expected':'obsidian_list_vaults reports one default vault with totalFiles 0.','probe_kind':'mcp','argv':['node','dist/index.js'],'tool':'obsidian_list_vaults','arguments':{},'expected_text':'"totalVaults": 1','cwd':p,'env':probe['env']}]
open(p+'/.coldpass/claims.json','w').write(json.dumps(claims,indent=2)+'\n')
open(p+'/.coldpass/examples.json','w').write(json.dumps([{'kind':'example','claim':'README build and test commands','source':'README.md / Local Development Setup / Installation & Build','input':'npm run build and npm test','expected':'Build succeeds; all 88 tests pass.','argv':['npm','run','build'],'cwd':p,'expected_text':''},{'kind':'example','claim':'README test suite','source':'README.md / Local Development Setup / Installation & Build','input':'npm test','expected':'all 88 tests pass','argv':['npm','test'],'cwd':p,'expected_text':'88 passed'}],indent=2)+'\n')
open(p+'/.coldpass/cycles.json','w').write(json.dumps({'detected':False,'reason':'Inspected README and entry points: server exposes request/response MCP tools; no product scheduler or recurring cycle was documented.','checks':[]},indent=2)+'\n')
report={'outcome':'working','fault_owner':None,'operation':'Built and started the stdio MCP server, then called obsidian_list_vaults on a temporary configured vault.','operation_scope':'Node.js 20.20.2 and npm; temporary empty vault. Obsidian Desktop/CLI was not installed, and the tested vault inventory tool does not depend on it.','steps':['Installed Node.js 20 from the NodeSource repository after Ubuntu apt supplied unsupported Node 18.','Ran npm install.','Ran npm run build.','Ran npm test: all 88 tests passed.','Started dist/index.js via documented Node entrypoint and called obsidian_list_vaults; result reported one default vault and zero files.'],'deviations':['README requires Node.js 20+; initial Ubuntu nodejs package was 18.19.1, so NodeSource Node.js 20 was installed.','npm test emitted a warning that locked vitest 5.0.3 declares Node >=22.12, but all 88 tests passed on Node 20.20.2.','README local-development setup lists Obsidian Desktop 1.12+ and its CLI as prerequisites; they were not installed in the VM.'],'stuck_step':None,'main_blocker':None,'plain_failure':None,'suggested_fix':None}
open(p+'/.coldpass/report.json','w').write(json.dumps(report,indent=2)+'\n')
PY
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
cat .coldpass/probe.json; cat .coldpass/claims.json
python3 - <<'PY'
import json
p='.coldpass/probe.json'; d=json.load(open(p)); d['expected_text']='vault'; open(p,'w').write(json.dumps(d,indent=2)+'\n')
p='.coldpass/claims.json'; d=json.load(open(p)); d[0]['expected_text']='vault'; open(p,'w').write(json.dumps(d,indent=2)+'\n')
PY
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay