This is the scoped, mechanical work deliberately left out of v1 so it can be handed to a cheaper model (in ModelForge, Claude Code, or a Sonnet session) rather than spending premium tokens on it. v1 is complete and verified without any of the below; these are additive.
mastervault-mcp-server is a TypeScript stdio MCP server that serves a
"MasterVault" (a structured Obsidian-style knowledge vault) to any MCP client,
without Obsidian. It has 9 tools across three tiers (protocol / files / delete).
The build passes (npm run build), a functional harness passes 12/12 including
path-traversal security tests, and an MCP stdio handshake exposes all 9 tools.
Read README.md first, then src/ — start at src/index.ts.
Do not change the security model in src/services/vault.ts without re-running
node test-harness.mjs and keeping all security tests green.
The mcp-builder skill asks for 10 evaluation questions in XML. Create
evaluations/eval.xml with 10 <qa_pair> entries that test whether an LLM can
use these tools to answer realistic questions about a vault. Each question must
be independent, read-only, complex (multiple tool calls), realistic, verifiable
(single string-comparable answer), and stable.
Build a small fixture vault under evaluations/fixture-vault/ with known
content so answers are deterministic. Example question shape: "Using orient then
search, what confidence value is recorded for the vault-structure seed row?" →
answer a specific string.
Format per the skill:
<evaluation>
<qa_pair>
<question>...</question>
<answer>...</answer>
</qa_pair>
</evaluation>Convert test-harness.mjs into a proper test suite (node:test or vitest). Cover:
- VaultService: read (with/without line range), list pagination, search, write, append, move (collision + overwrite paths).
- Security:
../traversal, absolute path, escaping move, null byte — all must throwPathSecurityErroror stay confined. - Tool layer: patch's zero-match and multi-match rejection; log_decision
section-aware append when the category heading is absent vs present;
stage_delete collision suffixing.
Wire it to
npm testand a.github/workflows/ci.ymlthat runs lint + build + test on push.
Add read-only git helpers as a fourth tier, mirroring ModelForge's own set:
mastervault_git_status, mastervault_git_log, mastervault_git_diff. All
readOnlyHint: true. Shell out to git -C <vaultRoot> with argument arrays
(never string interpolation — no injection surface). Guard: if the vault is not
a git repo, return an actionable message, not an error. Keep git_commit out
unless explicitly requested — writes should stay behind the existing tools.
- Add a
LICENSEfile (MIT) to matchpackage.json. - Add
.gitignore(node_modules/,dist/,*.log). - Consider publishing as an npm package so the ModelForge config can use
npx -y mastervault-mcp-server <vault>like the filesystem-server example.
- No hard-delete tool, ever.
- No shell/run_command tool (clients provide their own).
- No streamable-HTTP transport in v1 (stdio is the target for local clients like ModelForge). Add later only if a remote/multi-client use case appears; the mcp-builder TypeScript guide has the HTTP transport pattern ready to drop in.