1. Conduid
  2. Cloud
  3. Obsidian MCP Cloudflare
MCP server · Cloud

Obsidian MCP Cloudflare

Obsidian MCP for CloudFlare R2-backed Obsidian Sync used in concert with the Remotely Save plugin in the Obsidian app.

34Low

Scored a month ago · breakdown

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

From source
git clone https://github.com/dszp/obsidian-mcp-cloudflare

This 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

I know everything about Obsidian MCP Cloudflare. Ask me about installation, configuration, usage, or troubleshooting.

Security checks

6 checks have not been run yet.

Questions

About Obsidian MCP Cloudflare

How do I install Obsidian MCP Cloudflare?

No package has been published for this server, so install it from source: clone the repository and follow its README.

Is Obsidian MCP Cloudflare safe to use with an AI agent?

Its trust score is 34 out of 100 (low). Conduid hasn't run static security checks on this repository yet, so review the source yourself before granting it credentials. It has no ConduID identity yet, so agent calls to it are not receipted.

Is Obsidian MCP Cloudflare still maintained?

Conduid hasn't recorded a commit date for this repository yet. Check the repository directly for recent activity.