All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Potentially breaking:
LogSeq(...)now defaultsverify_ssl=True(wasFalse), so the safe path is the default. The bundled server is unaffected (it always setsverify_sslexplicitly from the protocol), but external code constructing the client directly against a self-signed HTTPS Logseq endpoint must now passverify_ssl=Falseexplicitly (#89)
- Tech-debt cleanup: migrate off the deprecated LanceDB
table_names(), commituv.lockfor reproducible installs, remove dead code (_get_page_properties, theremove_blockalias), and unify the duplicated list-parser logic (#89)
- HTTP/SSE transport — run the server as a networked service with
--transport http, secured by bearer-token auth (MCP_HTTP_AUTH_TOKEN). A sandboxed or remote client can now reach Logseq over the network with no filesystem mount or direct Logseq-API access, turning the namespace/tag access control into a real server-side security boundary (#69) - Per-profile multi-instance serving — run one process per profile (a shared data config file + a per-process env block of namespace/tag/token + its own port). Adds
--read-onlyto disable all write tools, and tag-on-write guards so writes can't land on a tag-excluded page (#69) - Native TLS —
--tls-cert/--tls-keyserve HTTPS directly (uvicornssl_certfile/ssl_keyfile), plus a bind guardrail that refuses non-loopback plain-HTTP binds unless you pass--insecure(#71) - New deployment guide at docs/SERVING.md — security model, the per-profile pattern, the separate
logseq-syncwriter, and TLS / reverse-proxy setup
sync_vector_dbis now inert — the vector DB is owned by a single externallogseq-syncwriter process; the tool points operators at it instead of spawning a sync (#69)
- Block-level results from
search(DB mode) andquery(tag-only profiles) are now resolved to their owning page and filtered by the namespace/tag ACL, closing cases where restricted block content could surface in block-level results (#69) - The page-exclusion set now fails closed when ACL rules are active — if it can't be built,
searchreturns an error instead of unfiltered results (#69)
- Namespace-based access control — restrict MCP tool access to specific Logseq namespaces via
LOGSEQ_INCLUDE_NAMESPACESandLOGSEQ_EXCLUDE_NAMESPACESenvironment variables (#65) - JSON output format for
queryandsearchtools — passformat=jsonto get raw result objects including block UUIDs and page identifiers for deep linking (#56) - Configurable API timeout — set
LOGSEQ_API_TIMEOUTenvironment variable to override the default 30-second timeout for Logseq API calls (#47) — thanks @thisdotrob
create_pagenow fails on existing pages instead of silently creating numbered duplicates (e.g.Page (1)); retries are safe (#59)update_pageproperty handling is now graph-type aware, correctly serializing properties for both file-mode and DB-mode graphs (#62)- Inline
key:: valueproperties are now correctly attached to their parent list item instead of being treated as top-level blocks (#61) — thanks @sehgalmayank001
See GitHub releases for earlier history.