This release includes 1 security fix for security teams reviewing exposed deployments.
Affected surfaces
Summary
AI summaryBumped Hono to 4.12.26 fixing a high‑severity Windows path‑traversal advisory.
Full changelog
Changed
- Documentation: the README now reports the current surface (41 tools, 5 prompts, 3 resources, and 952 tests) and adds a consolidated Environment Variables reference table.
- Added a
.nvmrcpinning Node 24 so contributors and CI use the same major version declared inengines. - The license gate (
scripts/check-licenses.mjs) now explicitly allowsMPL-2.0, recording that the only MPL-2.0 packages are dev/test transitive dependencies excluded from the published package. - Refreshed dev dependencies to their latest in-range releases (
@types/node,eslint,typescript-eslint,vitest).
Fixed
- Vault path validation now rejects Windows-style
..\\traversal separators on every platform before POSIX path resolution. - Frontmatter parsing now uses the direct
js-yamldependency instead ofgray-matter, removing the vulnerable transitivejs-yaml3.x path reported bynpm audit. - Concurrent atomic-read validation now retries through short rename churn instead of surfacing transient
Path changed during validationerrors. - OpenAI embedding setup now treats blank
OBSIDIAN_EMBEDDING_API_KEYvalues as unset, falling back toOPENAI_API_KEYwhen present instead of sending a whitespace bearer token. - Permission allowlist folders now normalize config-side dot segments, so entries such as
./projectsandarchive/./logsmatch their intended vault folders. - Folder-scoped
list_notescalls now return canonical note paths when the folder argument contains.or..segments. find_unused_attachmentsnow ignores remote markdown URLs before basename matching, so links to external images do not mark local files as referenced.find_unused_attachmentsnow normalizes local markdown attachment paths with dot segments before basename matching, preventing duplicate filenames from being marked referenced together.- Vault-wide link cleanup now skips scheme-style markdown URLs such as
mailto:before alias resolution, preventing move/delete reference rewrites from editing external links that resemble note aliases. - Link graph tools now canonicalize caller-provided note paths with dot segments before basename fallback, so duplicate basenames do not make
get_backlinks,get_outlinks, orget_graph_neighborsinspect the wrong note. - Wikilink resolution now normalizes dot segments before basename fallback, preventing links such as
[[./projects/idea]]from resolving to the wrong duplicate basename. - Base
file.linksTo()andfile.hasLink()filters now strip link fragments and require folder-qualified targets to match by path before falling back to basename-only shorthand. - Base
file.inFolder()filters now normalize slash and dot segments in folder arguments before matching note paths. - Trash deletes now use no-replace semantics for the selected
.trashdestination, preventing races from overwriting a newly created trashed file. - Semantic search folder filters now normalize slash and dot segments before matching stored note paths.
- Daily-note folder settings now normalize slash and dot segments before building tool and resource paths.
- Local verification now runs Vitest with one worker by default to avoid fork-worker OOM/spawn failures on busy Windows hosts.
- Embedding provider setup now treats blank provider, model, and base-URL env vars as unset, so documented defaults still apply in empty shell or dotenv entries.
- Embedding snapshot loading now ignores malformed dimensions and malformed entry fields before rehydrating the semantic index.
- OpenAI embedding responses now reject missing, duplicate, or out-of-range row indexes before vectors are paired with input chunks.
index_vaultnow records invalid live embedding vectors as failed notes instead of aborting the whole indexing pass.index_vaultnow reportsChunks embeddedfrom chunks persisted to the semantic index, not chunks staged before a failed note writeback.search_semanticnow validates live query vectors before scoring, so malformed embedding provider responses cannot produceNaNranks or low-level cosine errors.- Embedding provider base URLs now reject embedded credentials, query strings, and fragments before provider setup, without echoing the rejected URL.
- HTTP transport now requires the actual
application/jsonmedia type for MCP POST bodies instead of acceptingContent-Typevalues that only mention it in parameters. - Global Obsidian config auto-detection now ignores non-file or oversized
obsidian.jsonfiles before parsing, preventing startup from spending unbounded memory on malformed local config data. - The
installcommand now rejects existing client config files whose JSON root ormcpServersfield is not an object, instead of crashing or reporting success without writing the server entry.
Security
- Bumped the transitively-resolved
honodependency to 4.12.26 (from 4.12.23), clearing the high-severitynpm auditadvisory GHSA-wwfh-h76j-fc44 (Windowsserve-staticpath traversal via encoded backslash) and related findings. The bump stayed within@modelcontextprotocol/sdk's existing dependency range, so no direct dependency changed.
Security Fixes
- GHSA-wwfh-h76j-fc44 — bumped transitively‑resolved hono from 4.12.23 to 4.12.26, fixing Windows serve‑static path traversal vulnerability
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.
Beta — feedback welcome: [email protected]