This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Affected surfaces
Summary
AI summaryAtomic writes and parallel vault scans improve crash resilience and latency for large note collections.
Full changelog
Production hardening pass ahead of broader adoption. Every mutating path now survives crash/kill mid-flight, vault-wide scans fan out with bounded concurrency, and the HTTP surface exposes the operational primitives (version, rate limiting, CORS allowlist, structured logging) that operators running this in front of real traffic need.
Highlights
- Atomic writes on every mutating tool (
create_note,append,prepend,update_frontmatter, canvas mutations). Staged tmp file +rename— crashes, kills, or OOMs mid-write can no longer leave a truncated note. WindowsEPERM/EBUSY/EACCESfrom briefly-locked targets are retried with linear backoff; POSIX surfaces permission errors immediately. create_noteexclusive mode uses OS-levelwxso an out-of-process writer (Obsidian itself, a sync client, a second MCP server) can't slip between the existence check and the write.- Parallel vault scans.
search_notesand theobsidian://tagsresource fan out 8-way viamapConcurrentinstead of sequentially awaiting each read. Order-of-magnitude latency drops on 10K+ note vaults. Score ties break by path for deterministic output. - HTTP rate limiting. New
--rate-limit=<n>flag — sliding-window per-IP limiter with IPv4-mapped-IPv6 normalization. Returns429 Too Many Requests+Retry-After: 60./healthand/versionare exempt. - CORS allowlist. New
--allow-origin=<csv>flag.Vary: Originis always set when an allowlist is configured so shared caches never pin one origin's response to another origin's request. GET /versionendpoint for rollout auditing./healthnow also includes the package version.- HTTP request timeout of 2 minutes for POST only. Long-lived SSE GET streams are exempt so valid idle clients aren't reaped.
- Structured logger with
LOG_LEVEL(debug/info/warn/error/silent) andLOG_FORMAT(text/json) env vars. All logs go to stderr — stdio transport on stdout stays protocol-clean. - Process supervision.
uncaughtExceptionexits 1 so systemd/Docker/npx supervisors restart cleanly;unhandledRejectionlogs without killing the process. CLI-only — library embedders aren't affected.
Fixed
- Data-loss race on concurrent writes:
fs.writeFiletruncates-then-writes left notes partially written under crash/OOM/kill. Atomic tmp+rename rules this out. - Windows
fs.renameEPERM when another handle has the target open for read — now retried transparently. search_notesleaked relative note paths to stderr on read failure. Removed.search_notestie-break was non-deterministic under parallel scan. Stable secondary sort by path.
Docs
- New Usage section with a realistic Claude Desktop transcript showing multi-tool orchestration.
- New Troubleshooting section covering the first issues new users hit.
--host=0.0.0.0promoted to a proper[!WARNING]callout with four concrete mitigations.- Table of contents, consistent heading case, CHANGELOG-backed "What's New" summary.
Tests
- 153 → 173 tests. Covers atomic-write invariants, concurrent-mutation races, cross-process exclusive-create, CORS allowlist +
Vary: Origin, per-IP rate limiting, logger levels/modes, and the new endpoints. Test harness now binds to port 0 and reads the real port fromhttpServer.address()to eliminate the pickPort collision flakes.
Full diff: v1.4.1...v1.5.0
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About rps321321/obsidian-mcp-pro
Feature-complete Obsidian vault MCP server with 23 tools and 3 resources. Full-text search, note CRUD, frontmatter queries, tag management, backlinks, graph traversal (BFS up to 5 hops), orphan/broken link detection, and canvas support. Auto-detects vault, path traversal protection, MIT licensed.
Related context
Beta — feedback welcome: [email protected]