Atlas / MCP servers / odiak / livesync-workers

livesync-workersCAUTION

mcp/odiak/livesync-workers

Self-hosted LiveSync-compatible backend for Obsidian with search and MCP, on Cloudflare Workers

Verdict
CAUTION
Grade
B
Trust score
87 /100
Exposed tools
11 10r · 0w · 1d
Transport
streamable-http
License
MIT
Stars
16
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

A Self-hosted LiveSync-compatible backend for Obsidian, with full-text and semantic search and an MCP server, running entirely on Cloudflare Workers.

Sync your vault from Obsidian the way you would to CouchDB, then let AI assistants (Claude, Cursor, Claude Code, ...) read and search your notes through MCP.

[](https://deploy.workers.cloudflare.com/?url=https://github.com/odiak/livesync-workers)

This is an independent project. It is not affiliated with the Self-hosted LiveSync plugin or its author. It implements the subset of the CouchDB API that the plugin uses, not CouchDB in general.

Built for Kuro. Available to everyone.

What you get

  • LiveSync endpoint (/livesync): the CouchDB-compatible API the plugin talks to. Your vault lives in a SQLite-backed Durable Object; no CouchDB server to run.
  • Search indexes, kept up to date as notes sync:
  • full-text (exact match; character bigrams for Japanese/CJK, words for ASCII) stored in R2,
  • semantic (Workers AI embeddings + Vectorize).
  • MCP endpoint (/mcp) with OAuth, exposing 11 tools:

listDirectory, listNotes, listRecentNotes, readNote, readDailyNote, searchNotes, grepNotes, vaultStatus (read), appendToDailyNote, appendToNote (append), writeNote (write, with conflict detection).

  • A small status page at / with your connection details.

Notes written through MCP are regular LiveSync revisions, so they show up in Obsidian on the next sync.

Search coverage and limits

  • Japanese, Chinese and Korean are fully supported: full-text search matches substrings (character bigrams, no dictionary), so a query like 会議室 finds it inside any word; ASCII text is matched by whole words, case- and width-insensitively.
  • Vault size: vaults of around 100 MB of Markdown are
Read from source at commit 7b51da5e7c85OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add livesync-workers -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "livesync-workers": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (11)

10 read · 0 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
appendToDailyNotereadAppend a Markdown block to the end of a daily note (created if missing). Requires the vault:append scope.
appendToNotereadAppend a Markdown block to the end of an existing note. Fails with NOT_FOUND when the note does not exist. Requires the vault:append scope.
grepNotesreadExact-match full-text search over ${label} notes (substring for Japanese/CJK, whole-word for ASCII). Whitespace-separated phrases are ANDed. Keep queries short (a few words, up to about 60 CJK characters in total). Use searchNotes for semantic queries instead.
listDirectoryreadList Markdown files and subdirectories directly under a vault-relative directory.
listNotesreadList vault-relative Markdown note paths. Response includes the total count so you can tell when results are truncated.
listRecentNotesreadList Markdown notes sorted by modification time (newest first), with mtime and size.
readDailyNotereadRead a daily note by date using Obsidian daily-notes settings when available.
readNotereadRead a Markdown note by vault-relative path.
searchNotesreadSearch indexed ${label} notes semantically.
vaultStatusreadShow vault connection state and search index progress. Useful when other tools fail or search returns nothing.
writeNotedestructiveCreate or overwrite a vault note. Overwriting an existing note requires expectedContentHash (the contentHash returned by readNote), which detects concurrent edits. Prefer appendToDailyNote/appendToNote when appending is enough. Requires the vault:write scope.
04

Trust audit

CAUTIONgrade B · trust 87/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (7 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (11)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
writeNote
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWInventory / provenance · inv.hidden_file · CWE-1104
.dev.vars.example
.dev.vars.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/livesync-workers/test/chunk-storage.test.ts:13
exec(query: string, ...args: unknown[]) {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/livesync-workers/test/livesync-vault.test.ts:185
const cursor = exec(query, ...bindings);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
worker/setup-uri.test.ts:13
new Function("window", SETUP_URI_CLIENT_SCRIPT)(window);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/livesync-workers/scripts/prepack-readme.mjs:9
const readme = readFileSync(resolve(pkgDir, "../../README.md"), "utf8").replace(
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/livesync-workers/src/livesync/handler.ts:83
const decoded = atob(header.slice("Basic ".length));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
packages/livesync-workers/src/vault/binary.ts:35
binary = atob(piece);
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
worker/setup-uri.test.ts:24
const bytes = Uint8Array.from(atob(encrypted.slice(2)), (c) => c.charCodeAt(0));
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:90
Point the client at `https://<your-worker>.workers.dev/mcp` (Streamable HTTP). It will open a browser window; sign in with `ADMIN_PASSWORD` and choose which scopes to grant:
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 7b51da5e7c85full audit observations/trust-audit/mcp-server/odiak__livesync-workers.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-117b51da5e7c85CAUTIONB87first audit
06

Questions

What is the livesync-workers MCP server?

Self-hosted LiveSync-compatible backend for Obsidian with search and MCP, on Cloudflare Workers

What tools does livesync-workers expose?

11 in total: 10 read-only, 0 that write, and 1 that can delete or overwrite (writeNote). Every one is listed on this page with its risk.

Is livesync-workers safe to connect to an agent?

With care. The audit graded it B (87/100) and found 11 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does livesync-workers need?

No credential environment variables were found in its source, so it appears to need none.

How does livesync-workers run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as livesync-workers at 0.7.0.

How current is this page?

The grade is for one exact copy of the source (7b51da5e7c85), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement