About Obsidian MCP Cloudflare
Obsidian MCP Cloudflare is an MCP server in the Cloud category: obsidian MCP for CloudFlare R2-backed Obsidian Sync used in concert with the Remotely Save plugin in the Obsidian app.
Install
git clone https://github.com/dszp/obsidian-mcp-cloudflareThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Tools (23)
backfill_ids(dryRun?, limit?, prefix?)Scan the vault and mint a nanoid `id:` for any note missing one. Default `dryRun: true`. Returns counts plus up to 10 example writes. Safe to re-run; existing ids (any scheme) are skipped
Parameters not published.
create_note(path, content)Create a new note. If the supplied content has no `id:` in frontmatter, a 21-char nanoid is minted and injected as the first field (don't pre-generate one yourself); a caller-supplied id is honored verbatim. Returns JSON `{path, etag, id, permalink}`. Failure: `exists`
Parameters not published.
create_upload_link(target_note?, subfolder?, filename?, max_files?, ttl_minutes?)Mint a short-lived, single-use web link the **user taps** to upload file(s) straight to the vault (bypassing the tool-call payload limit) — the way to handle real photos/large images, especially from mobile. With `filename`: deterministic single-file link (returns the exact `dest_path` to poll). Without: batch link for up to `max_files`. Returns JSON `{upload_url, expires_at, landing_dir, multiple, …}` — `landing_dir` is the folder uploads land in, so a batch upload is found via `list_attachments` scoped to it (no whole-vault scan); `dest_path` only in deterministic mode. Failure: `upload_disabled`
Parameters not published.
delete_attachment(path)Delete an attachment. Idempotent. Only allowlisted extensions (so a note can't be deleted via this tool). Failure: `disallowed_extension`
Parameters not published.
delete_note(path)Delete a note from the vault. Idempotent
Parameters not published.
generate_permalink(path)Returns JSON `{path, permalink, kind}` where `kind` is `"id"` (rename-stable, frontmatter-id lookup) or `"path"` (fragile fallback for un-id'd notes — run `backfill_ids` to upgrade). Failures: `not_found`, `permalink_disabled`
Parameters not published.
head_attachment(path)Metadata only — JSON `{path, size, content_type, etag, uploaded}`. Use to check `size` before a `read_attachment`. Failure: `not_found`
Parameters not published.
list_attachments(prefix?, limit?, cursor?)List non-`.md` objects. Returns JSON `{items, cursor}`; `cursor` paginates. Empty `prefix` lists the whole vault
Parameters not published.
list_backlinks(target)Find notes that contain a `[[target]]` wikilink (parallel R2 fan-out)
Parameters not published.
list_notesList all `.md` files in the vault
Parameters not published.
Show all 23 tools
list_tagsAggregate all tags across the vault, frontmatter + inline `#tags` (parallel R2 fan-out)
Parameters not published.
move_attachment(from_path, to_path, overwrite?, update_embeds?)Move/rename an attachment server-side (R2 copy+delete — works for large files). Both paths allowlisted. By default rewrites the embed in **every** note that referenced the old path (links follow the file across one or many notes); `update_embeds: false` moves bytes only. Ordering is copy → rewrite → **delete-old-last**, so the only irreversible step runs after the rewrites succeed; if a rewrite fails the move rolls back (best-effort — R2 has no cross-object transaction) and returns `embed_rewrite_failed` with nothing committed, rather than stranding a half-move. Returns JSON `{from, to, embed_markdown, etag, size, content_type, notes_modified, referrers_unchanged}` — `notes_modified` are the rewritten notes; `referrers_unchanged` are notes that link the file by bare filename (`![[name.ext]]`), left as-is because Obsidian resolves those by name regardless of folder. Failures: `same_path`, `not_found`, `exists`, `disallowed_extension`, `embed_rewrite_failed`
Parameters not published.
move_note(from_path, to_path)Move or rename a note and rewrite every wikilink across the vault that pointed to the old path, preserving aliases, heading anchors, block refs, embeds, and full-path forms. Wikilinks inside fenced code blocks and inline code spans are not rewritten. Failure reasons: `not_found`, `exists`, `same_path`
Parameters not published.
parse_frontmatter(path)Returns JSON `{frontmatter, permalink}` — the parsed YAML object plus the note's short HTTP permalink. Failure: `not_found`. (For a full read, `read_note` now returns `frontmatter` too; use this when you want metadata without the body payload.)
Parameters not published.
patch_frontmatter(path, set?, unset?)Set/unset top-level frontmatter fields at the line level — untouched fields, key order, and comments are preserved. `set` values are scalars or inline scalar arrays. `id` is immutable (`id_immutable`); an id is ensured on write. Prefer over `patch_note` for metadata. Returns JSON `{path, etag, id, permalink, changed_keys, removed_keys}`. Failures: `not_found`, `no_op`, `id_immutable`, `unsupported_block_value` (a targeted field holds a multi-line/block value — edit by hand via `replace_note`)
Parameters not published.
patch_note(path, old_str, new_str, replace_all?)Targeted in-place edit; `old_str` must be unique unless `replace_all: true`. Returns JSON `{path, etag, count, id, permalink}`. Failures: `not_found`, `anchor_not_found`, `ambiguous`, `no_op`
Parameters not published.
periodic_note_append(period, date?, content)Append a line to the periodic note for `period` (creating it if absent). Returns JSON `{path, id}`. Failure: `period_not_configured`
Parameters not published.
periodic_note_get_or_create(period, date?)Create or fetch the periodic note for `period` (`daily`/`weekly`/`monthly`/`quarterly`/`yearly`) covering today (or the given `YYYY-MM-DD` anchor, bucketed into the containing week/month/quarter/year). Creates with the cadence's H1 + a fresh id. Returns JSON `{path, created, id}`. Failure: `period_not_configured`
Parameters not published.
read_attachment(path)Read an attachment. Image types return an MCP `image` content block + JSON metadata; non-image types return one JSON block with the base64 in `data_base64`. Only allowlisted extensions. Failures: `not_found`, `disallowed_extension`
Parameters not published.
read_note(path)Returns the raw markdown as the first content block. A second JSON block `{permalink?, frontmatter}` always follows — `frontmatter` is the parsed YAML object (empty `{}` if none); `permalink` is present only when `PERMALINK_BASE_URL` is set. `content[0]` is byte-unchanged. Failure: `not_found`
Parameters not published.
replace_body(path, body)Replace the body of a note while preserving the frontmatter byte-for-byte. Returns JSON `{path, etag, id, permalink}`. Failures: `not_found`, `malformed_frontmatter`
Parameters not published.
search_notes(query, limit?)Case-insensitive substring search across note bodies and file paths (DO-SQLite index). Query must be ≈48 bytes or fewer (a DO-SQLite `LIKE` limit); longer → `query_too_long`
Parameters not published.
upload_attachment_url(source_url, filename?, target_note?, subfolder?, overwrite?, dest_path?)Fetch an HTTPS asset server-side and store it. Host must be in `ATTACHMENT_FETCH_HOST_ALLOWLIST` (**default-closed** — empty allowlist rejects every host with `host_not_allowed`); also SSRF-guarded (HTTPS only, no IP-literal/loopback hosts), all re-validated across redirects, size-capped, HTML rejected. Any failure is terminal (nothing written). Same return shape. Failures: `invalid_url`, `insecure_url`, `host_not_allowed`, `disallowed_host`, `too_many_redirects`, `fetch_failed`, `html_response`, `too_large`, `no_extension_inferable`, `disallowed_extension`, `exists`
Parameters not published.
Ask AI
Ask AI about Obsidian MCP Cloudflare
Powered by Claude · Grounded in docs
Security checks
6 checks have not been run yet.