← Back to search

obsidian-mcp-server

cyanheads Scanned 24d ago

Obsidian Knowledge-Management MCP (Model Context Protocol) server that enables AI agents and development tools to interact with an Obsidian vault. It provides a comprehensive suite of tools for reading, writing, searching, and managing notes, tags, and fr

B
83.2 / 100

Versions

3.2.9latest
Jun 30, 2026
3.2.8
Jun 20, 2026
3.2.7
Jun 11, 2026
3.2.6
Jun 11, 2026
3.2.5
Jun 11, 2026
+ show 45 moreshow less
3.2.4
Jun 2, 2026
3.2.3
May 30, 2026
3.2.2
May 23, 2026
3.2.1
May 21, 2026
3.2.0
May 17, 2026
3.1.11
May 16, 2026
3.1.10
May 16, 2026
3.1.9
May 11, 2026
3.1.8
May 11, 2026
3.1.7
May 10, 2026
3.1.6
May 9, 2026
3.1.5
May 7, 2026
3.1.4
May 5, 2026
3.1.3
May 4, 2026
3.1.2
May 3, 2026
3.1.1
Apr 29, 2026
3.1.0
Apr 29, 2026
3.0.0
Apr 29, 2026
2.0.7
Jun 21, 2025
2.0.6
Jun 21, 2025
2.0.5
Jun 21, 2025
2.0.4
Jun 13, 2025
2.0.3
Jun 13, 2025
2.0.2
Jun 13, 2025
2.0.1
Jun 13, 2025
1.5.8
May 1, 2025
1.5.7
May 1, 2025
1.5.6
Apr 23, 2025
1.5.4
Apr 22, 2025
1.5.3
Apr 13, 2025
1.5.2
Apr 6, 2025
1.5.1
Apr 6, 2025
1.5.0
Mar 17, 2025
1.4.1
Mar 3, 2025
1.4.0
Mar 3, 2025
1.3.0
Jan 26, 2025
1.2.6
Jan 26, 2025
1.2.5
Jan 26, 2025
1.2.4
Jan 24, 2025
1.2.3
Jan 24, 2025
1.2.2
Jan 24, 2025
1.2.1
Jan 24, 2025
1.2.0
Jan 24, 2025
1.1.1
Jan 24, 2025
1.1.0
Jan 24, 2025
PermissionsTool SafetyAuthAnnotationsCode QualityStabilitySpecVuln HistoryAuthorTransparencyCommunity

Tools 14

obsidian_search_notes
annotations: verified low

notice string
readOnlyHint true idempotentHint true
obsidian_delete_note
annotations: verified low

Permanently delete a note from the vault. Asks the user to confirm before deleting — the call is answered with a confirmation request and retried with the answer. Recovery requires the local trash in Obsidian — there is no API-level undo.

path string input object output object deleted boolean
destructiveHint true
obsidian_append_to_note
annotations: verified low

Append content to a note. **Without `section`: appends to the end of the file, or creates the file if it does not exist (your content becomes the full file).** With `section`: appends to the end of that heading/block/frontmatter — use `obsidian_get_note` with `format: "document-map"` to discover available targets. A nested heading may be named either by its full `Parent::Child` path or by a bare leaf name that matches exactly one heading; a leaf shared by several headings is rejected with `ambiguous_section`. For block-reference targets, content is concatenated adjacent to the block line without inserting a separator — include a leading newline in `content` if you want one. Set `createTargetIfMissing` to bring the target section into existence rather than failing when it does not exist.

path string input object output object content string
destructiveHint true
obsidian_replace_in_note
annotations: verified low

Search and replace inside a single note, literally or by regex. Replacements run in array order, each over the previous one's output, and cover the note body only unless `scope` says otherwise — the YAML frontmatter block is left byte-identical by default, because a prose edit that lands in a scalar can silently invalidate the whole block. Use for edits that don't fit `obsidian_patch_note`'s structural targets — e.g., body-wide find-and-replace. Prefer `obsidian_manage_frontmatter` for typed edits to a single property.

path string input object output object search string bodyCount number
destructiveHint true
obsidian_manage_frontmatter
annotations: verified low

Get, set, or delete a single frontmatter key on a note, atomically. `set` requires a JSON-typed `value` (string, number, boolean, array, or object).

key string path string input object value unknown exists boolean output object operation literal currentSizeInBytes number previousSizeInBytes number
destructiveHint true
obsidian_patch_note
annotations: verified low

Edit a heading, block reference, or frontmatter field in place — append to, prepend to, or replace the target\'s body. Use `obsidian_get_note` with `format: "document-map"` to discover available targets first. A nested heading may be named either by its full `Parent::Child` path or by a bare leaf name that matches exactly one heading; a leaf shared by several headings is rejected with `ambiguous_section`.

path string input object output object previousSizeInBytes number
destructiveHint true
obsidian_execute_command
annotations: verified low

Execute an Obsidian command by ID (from `obsidian_list_commands`). Behaviour depends on the command — some are destructive (delete file, close vault), some open UI. Commands run with the same authority as a user invoking them from the keyboard.

input object output object executed boolean commandId string
openWorldHint true destructiveHint true
obsidian_get_note
annotations: mismatch low

Read a note from the vault — by path, the active file, or a periodic note. Choose a `format` projection: raw body, full object, structural document map, or a single section.

path string tags array input object format literal output object content string
readOnlyHint true idempotentHint true
obsidian_open_in_ui
annotations: verified low

Open a file in the Obsidian app UI. By default fails when the path does not exist; the `failIfMissing` flag controls the open-or-create behavior. Opening an existing file needs read access; opening a missing one creates it, so that case needs write access to the path.

path string input object opened boolean output object
openWorldHint true idempotentHint true destructiveHint false
obsidian_write_note
annotations: verified low

Create or overwrite a note. With `section`, replaces just that heading/block/frontmatter section in place — use `obsidian_get_note` with `format: "document-map"` to discover available targets. A nested heading may be named either by its full `Parent::Child` path or by a bare leaf name that matches exactly one heading; a leaf shared by several headings is rejected with `ambiguous_section`. Whole-file writes fail with `file_exists` against an existing note unless `overwrite: true` — for in-place edits, prefer `obsidian_patch_note` (sections), `obsidian_append_to_note` (append), or `obsidian_replace_in_note` (find-and-replace). For heading sections, `content` is the new body; the heading line is preserved automatically.

path string input object output object
idempotentHint true destructiveHint true
obsidian_list_tags
annotations: verified low

List the vault's tags with usage counts, ordered by count descending and capped at \

count number input object limit number output object nameRegex string
readOnlyHint true idempotentHint true
obsidian_manage_tags
annotations: verified low

Add, remove, or list a note's tags. Defaults to the frontmatter `tags:` array — set `location` to `inline` or `both` to mutate the note body. `add` ensures the tag is present in the requested location(s); `remove` strips it; `both` reconciles across both representations. Inline `#tag` detection skips code spans (fenced and inline), link spans (`[[...]]`, `[text](...)`, `[text][ref]`) so a heading anchor, block anchor, or wikilink alias is never read as a tag or rewritten by a removal, and a hash escaped as `\\#`; a `#` inside an HTML comment or a math span is still counted. Inline-location additions append the new tag at end-of-file. `list` ignores the input `tags` array.

path string tags array input object inline array output object applied array operation literal frontmatter array previousSizeInBytes number
destructiveHint true
obsidian_list_notes
annotations: mismatch low

List notes and subdirectories at a vault path. Defaults to the vault root when \

path string depth number files number input object output object entries number nameRegex string directories number
readOnlyHint true idempotentHint true
obsidian_list_commands
annotations: verified low

List the Obsidian command-palette commands available in the active vault, with their IDs and display names. Filter to a subset with the optional `nameRegex` matched against the display name.

id string input object output object nameRegex string
readOnlyHint true idempotentHint true

Permissions 3

network medium
Server uses network capabilities via: fetch()
shell high
Server uses shell capabilities via: child_process, spawn(), spawnSync()
env_vars low
Server uses env_vars capabilities via: process.env

Scan Findings 39

info
Tool 'obsidian_search_notes' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_delete_note' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_append_to_note' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_replace_in_note' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_manage_frontmatter' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_patch_note' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_execute_command' annotations are consistent annotation_checker · 80%
medium
Tool 'obsidian_get_note' claims readOnly but schema suggests write operation annotation_checker · 70%
info
Tool 'obsidian_open_in_ui' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_write_note' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_list_tags' annotations are consistent annotation_checker · 80%
info
Tool 'obsidian_manage_tags' annotations are consistent annotation_checker · 80%
medium
Tool 'obsidian_list_notes' claims readOnly but schema suggests write operation annotation_checker · 70%
info
Tool 'obsidian_list_commands' annotations are consistent annotation_checker · 80%
info
Sandbox failed to start for behavioral verification behavioral_verifier · 100%
info
package.json metadata manifest_parser · 100%
info
Tool: obsidian_search_notes manifest_parser · 75%
info
Tool: obsidian_delete_note manifest_parser · 75%
info
Tool: obsidian_append_to_note manifest_parser · 75%
info
Tool: obsidian_replace_in_note manifest_parser · 75%
info
Tool: obsidian_manage_frontmatter manifest_parser · 75%
info
Tool: obsidian_patch_note manifest_parser · 75%
info
Tool: obsidian_execute_command manifest_parser · 75%
info
Tool: obsidian_get_note manifest_parser · 75%
info
Tool: obsidian_open_in_ui manifest_parser · 75%
info
Tool: obsidian_write_note manifest_parser · 75%
info
Tool: obsidian_list_tags manifest_parser · 75%
info
Tool: obsidian_manage_tags manifest_parser · 75%
info
Tool: obsidian_list_notes manifest_parser · 75%
info
Tool: obsidian_list_commands manifest_parser · 75%
info
Transport: streamable-http manifest_parser · 80%
info
Required env vars (6) manifest_parser · 80%
info
Sandbox failed to start for output poisoning scan output_poisoning · 100%
medium
Permission: network access detected permission_analyzer · 70%
high
Permission: shell access detected permission_analyzer · 95%
low
Permission: env_vars access detected permission_analyzer · 90%
info
SBOM generated: 14 components sbom_generator · 100%
high
Hardcoded Password found in cyanheads-obsidian-mcp-server-5d8f55d/framework-skills/api-utils/references/security.md secret_scanner · 65%
medium
No build provenance detected (SLSA L0) slsa_assessor · 90%