Prototype · This site is a prototype showing 100 real servers from the official registry, not all of them yet.
PopNx MCPMCP servers for people who use AI · explained in plain words

Obsidian MCP Server

by cyanheadsversion 3.8.0i★ 702iRuns on your computer
Registry nameio.github.cyanheads/obsidian-mcp-server

Overview

Description from the maker (original English)

Read, write, search, and surgically edit Obsidian notes, tags, and frontmatter via MCP.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio, Streamable HTTP
  • Category: Docs, sheets & office work
  • You need to fill in: OBSIDIAN_API_KEY

Install

Pick the AI app you use, then copy the settings.

You need

  • npmNode.js installed (for the npx command)

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": [
        "-y",
        "obsidian-mcp-server"
      ],
      "env": {
        "OBSIDIAN_API_KEY": "your-value",
        "OBSIDIAN_BASE_URL": "your-value",
        "OBSIDIAN_VERIFY_SSL": "your-value",
        "OBSIDIAN_REQUEST_TIMEOUT_MS": "your-value",
        "OBSIDIAN_ENABLE_COMMANDS": "your-value",
        "OBSIDIAN_READ_PATHS": "your-value",
        "OBSIDIAN_WRITE_PATHS": "your-value",
        "OBSIDIAN_DENY_PATHS": "your-value",
        "OBSIDIAN_READ_ONLY": "your-value",
        "OBSIDIAN_DELETE_ELICITATION": "your-value",
        "OBSIDIAN_OMNISEARCH_URL": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add obsidian --env OBSIDIAN_API_KEY=your-value --env OBSIDIAN_BASE_URL=your-value --env OBSIDIAN_VERIFY_SSL=your-value --env OBSIDIAN_REQUEST_TIMEOUT_MS=your-value --env OBSIDIAN_ENABLE_COMMANDS=your-value --env OBSIDIAN_READ_PATHS=your-value --env OBSIDIAN_WRITE_PATHS=your-value --env OBSIDIAN_DENY_PATHS=your-value --env OBSIDIAN_READ_ONLY=your-value --env OBSIDIAN_DELETE_ELICITATION=your-value --env OBSIDIAN_OMNISEARCH_URL=your-value --env MCP_LOG_LEVEL=your-value -- npx -y obsidian-mcp-server

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "obsidian": {
      "command": "npx",
      "args": [
        "-y",
        "obsidian-mcp-server"
      ],
      "env": {
        "OBSIDIAN_API_KEY": "your-value",
        "OBSIDIAN_BASE_URL": "your-value",
        "OBSIDIAN_VERIFY_SSL": "your-value",
        "OBSIDIAN_REQUEST_TIMEOUT_MS": "your-value",
        "OBSIDIAN_ENABLE_COMMANDS": "your-value",
        "OBSIDIAN_READ_PATHS": "your-value",
        "OBSIDIAN_WRITE_PATHS": "your-value",
        "OBSIDIAN_DENY_PATHS": "your-value",
        "OBSIDIAN_READ_ONLY": "your-value",
        "OBSIDIAN_DELETE_ELICITATION": "your-value",
        "OBSIDIAN_OMNISEARCH_URL": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "obsidian": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "obsidian-mcp-server"
      ],
      "env": {
        "OBSIDIAN_API_KEY": "your-value",
        "OBSIDIAN_BASE_URL": "your-value",
        "OBSIDIAN_VERIFY_SSL": "your-value",
        "OBSIDIAN_REQUEST_TIMEOUT_MS": "your-value",
        "OBSIDIAN_ENABLE_COMMANDS": "your-value",
        "OBSIDIAN_READ_PATHS": "your-value",
        "OBSIDIAN_WRITE_PATHS": "your-value",
        "OBSIDIAN_DENY_PATHS": "your-value",
        "OBSIDIAN_READ_ONLY": "your-value",
        "OBSIDIAN_DELETE_ELICITATION": "your-value",
        "OBSIDIAN_OMNISEARCH_URL": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Values you fill in

  • OBSIDIAN_API_KEY required env
    Bearer token for the Obsidian Local REST API plugin (Settings → Community Plugins → Local REST API).
  • OBSIDIAN_BASE_URL env
    Base URL of the Obsidian Local REST API. Default: http://127.0.0.1:27123 (enable "Non-encrypted (HTTP) Server" in plugin settings). Use https://127.0.0.1:27124 for the always-on HTTPS port (self-sign…
  • OBSIDIAN_VERIFY_SSL env
    Whether to verify the TLS certificate on the Obsidian endpoint. Default false because the plugin uses a self-signed cert.
  • OBSIDIAN_REQUEST_TIMEOUT_MS env
    Per-request timeout in milliseconds.
  • OBSIDIAN_ENABLE_COMMANDS env
    Opt-in flag for the command-palette pair (obsidian_list_commands + obsidian_execute_command). Off by default — Obsidian commands are opaque and can be destructive.
  • OBSIDIAN_READ_PATHS env
    Optional comma-separated vault-relative folder allowlist for reads. Prefix-based with implicit recursion; case-insensitive; backslashes read as slashes, repeated and trailing slashes and '.' segments…
  • OBSIDIAN_WRITE_PATHS env
    Optional comma-separated vault-relative folder allowlist for writes. Same syntax as OBSIDIAN_READ_PATHS. Unset = full vault, or the read scope when reads are restricted; paths in OBSIDIAN_DENY_PATHS…
  • OBSIDIAN_DENY_PATHS env
    Optional comma-separated vault-relative paths withheld from reads and writes. Same syntax as OBSIDIAN_READ_PATHS. Wins over both allowlists; denied paths are left out of listings, search results, and…
  • OBSIDIAN_READ_ONLY env
    Global read-only kill switch. When true, every write is denied regardless of OBSIDIAN_WRITE_PATHS, and the command-palette pair is suppressed (commands can mutate). Useful for shared or public-facing…
  • OBSIDIAN_DELETE_ELICITATION env
    Opt-in delete confirmation. When true, obsidian_delete_note asks the user to confirm each delete through an elicitation round (the client must support elicitation), and HTTP startup requires a statef…
  • OBSIDIAN_OMNISEARCH_URL env
    Override URL for the Omnisearch plugin HTTP server. Unset derives from OBSIDIAN_BASE_URL host with port 51361. Required only if the Omnisearch plugin is not on the default port.
  • MCP_LOG_LEVEL env
    Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 5, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account cyanheads, which owns the repo

  • ✓ Pass

    Still maintained

    Code last changed 5 days ago

  • ✓ Pass

    Has a licence

    Uses Apache-2.0

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Needs the server’s tool list first; this check starts in the next step

Compared with others in Docs, sheets & office worki

  • More stars than 77% of the other 13 servers in this category
  • Published to the registry more recently than 77% of the other 13 servers in this category
  • Basic checks equal to or better than 100% of the other 13 servers in this category

Compared only with servers in this prototype, not the whole registry.

Common questions

Is Obsidian MCP Server safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: OBSIDIAN_API_KEY

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed 5 days ago, and the latest version (3.8.0) reached the registry 5 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.

What can I use instead?

In the same category: Agent-Native Calendar, Excel MCP Server, MCP Server for Excel

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Agent-Native Google Calendar - manage events, sync, and public booking

Runs in the cloud★ 7,620MITUpdated 2 months ago

Excel MCP Server

by haris-musa

Lets AI create and edit Excel files itself, including formulas, charts and PivotTables, without Excel installed.

Runs on your computer★ 4,276MITUpdated 5 days ago

Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.

Runs on your computer★ 847MITUpdated 2 days ago

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

obsidian-mcp-server Read, write, search, and surgically edit Obsidian vault notes, tags, and frontmatter via MCP. STDIO or Streamable HTTP. 14 Tools • 3 Resources


Overview

Your Obsidian vault, through the Local REST API plugin. Read, search, and write notes, edit a single heading, block, or frontmatter field in place, and manage tags, with folder-scoped read/write permissions built in.

Tools
ToolDescription
obsidian_get_noteRead a note as raw content, full structured form, document map, or a single section
obsidian_list_notesList notes and folders under a vault path, recursively, with extension and name filters
obsidian_list_tagsList vault tags with usage counts, most-used first
obsidian_search_notesSearch by text, JSONLogic, or BM25-ranked Omnisearch when that plugin is reachable
obsidian_write_noteCreate a note, replace one section, or overwrite a whole file with overwrite: true
obsidian_append_to_noteAppend to a note (creating it if missing) or to one heading, block, or frontmatter field
obsidian_patch_noteAppend, prepend, or replace against one heading, block reference, or frontmatter field
obsidian_replace_in_noteLiteral or regex search-replace inside one note, body-only by default
obsidian_manage_frontmatterGet, set, or delete one frontmatter key
obsidian_manage_tagsAdd, remove, or list a note's tags in frontmatter, inline, or both
obsidian_delete_notePermanently delete a note, optionally after the user confirms (OBSIDIAN_DELETE_ELICITATION)
obsidian_open_in_uiOpen a file in the Obsidian app, optionally in a new pane
obsidian_list_commandsList command-palette commands (opt-in via OBSIDIAN_ENABLE_COMMANDS)
obsidian_execute_commandRun a command-palette command by ID (opt-in via OBSIDIAN_ENABLE_COMMANDS)
Resources
ResourceDescription
obsidian://vault/{+path}A note's content, frontmatter, tags, and file metadata
obsidian://tagsEvery vault tag with its usage count, as an uncapped snapshot
obsidian://statusPlugin reachability, auth status, versions, and registered API extensions

Note and tag data are also reachable through tools (obsidian_get_note, obsidian_list_tags); obsidian://status has no tool equivalent.

Capability reference

obsidian_get_note tool
  • target is a vault path, the active file, or a periodic note (daily through yearly, optional date); format is content, full, document-map, or section, and full takes includeLinks: true for vault-internal outgoing links
  • result.format discriminates the payload; a section read that matches several headings returns the first and lists every full path in candidates
  • A path with no exact match but one case-insensitive match in its folder reads that file: result.path is the real name, requestedPath the one sent, and a notice names both

obsidian_list_notes tool
  • Walks from path (default vault root) to depth 1–20 (default 2), filtered by extension and nameRegex (≤256 chars); a folder that fails nameRegex is not walked
  • Returns entries[] (file / directory), totals, and appliedFilters; the walk stops at 1,000 entries with excluded.reason: "entry_cap", and a folder the depth limit stopped carries truncated: true
  • With OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS set, a listing holds only readable entries and the folders leading to the scope; those folders are walked and accepted as path, and a denied folder is absent at every depth

obsidian_list_tags tool
  • nameRegex (≤256 chars) and minCount narrow the set, then tags are ranked by count and capped at limit (default 200, max 10000); hierarchical parents count (work/tasks adds to work)
  • When the cap withholds tags, the response carries truncated, shown, and cap
  • With OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS set, only tags from readable notes are listed, and count is the number of readable notes carrying the tag or a tag nested under it

obsidian_search_notes tool
  • mode: "text" requires every space-separated token of query as a case-insensitive substring of the filename or body (quotes are literal), shaped by contextLength (default 100), pathPrefix, and maxMatchesPerHit (default 10); mode: "jsonlogic" evaluates a logic tree over path, content, frontmatter. , tags, and stat (plus links, backlinks, and unresolvedLinks on plugin versions that provide them, and not under OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS), with glob / regexp taking [PATTERN, VALUE]
  • result.mode discriminates the payload; every mode reports totalCount and pages via nextCursor, and a text hit clipped to maxMatchesPerHit carries truncated and totalMatches
  • mode: "omnisearch" (BM25 ranking, quoted phrases, -exclusion, path: / ext: filters) is offered only when the Omnisearch plugin answered at startup. It keeps its top 50 hits; path:, ext:, and plain terms apply before that cap, quoted phrases and -exclusion after it. truncated: true marks a result the cap may have cut, with truncatedReason cap_reached, filtered_after_cap, or read_scope; under OBSIDIAN_READ_PATHS or OBSIDIAN_DENY_PATHS it is always true, and a hit's membership and score still depend on the whole vault

obsidian_write_note tool
  • target and content, with optional section and contentType (markdown / json); a whole-file write to an existing note fails with file_exists unless overwrite: true
  • On a case-insensitive filesystem (macOS, Windows), a whole-file write to a path that differs from an existing note only in letter case fails with case_variant_exists and writes nothing; existingPath names that note when the parent folder's listing shows exactly one case match, and is omitted when several match or when a file Obsidian does not index (a dot-file) sits at the path
  • With section, replaces only that heading, block, or frontmatter field and keeps the heading line; output reports created, sectionTargeted, and the resolved sectionTarget

obsidian_append_to_note tool
  • Without section, appends to the file or creates it (created: true); with section, appends to that heading, block, or frontmatter field of an existing note, and createTargetIfMissing: true creates the section
  • A section append whose content is already at the target fails with content_preexists; block targets add no separator, so start content with a newline if you want one
  • A whole-file append to a path that differs from an existing note only in letter case fails with case_variant_exists on a case-insensitive filesystem, with existingPath naming that note when the parent folder's listing shows exactly one case match

obsidian_patch_note tool
  • operation: "append" | "prepend" | "replace" against one section of an existing note; patchOptions takes createTargetIfMissing, applyIfContentPreexists, and trimTargetWhitespace (plugin v4.x only)
  • Echoes the resolved section and operation; a repeat of content already at the target fails with content_preexists unless applyIfContentPreexists: true

obsidian_replace_in_note tool
  • replacements[] run in order, each over the previous one's output; each takes useRegex (≤1024 chars), caseSensitive (default true), wholeWord, flexibleWhitespace (literal mode only), and replaceAll (default true)
  • Returns totalReplacements and perReplacement[] with bodyCount / frontmatterCount
  • scope: "body" (default) leaves frontmatter byte-identical; "frontmatter" and "both" re-parse the YAML afterward and write nothing if it breaks (frontmatter_invalid)

obsidian_manage_frontmatter tool
  • operation: "get" | "set" | "delete" on one key; set requires a JSON-typed value
  • get returns exists and value (null when absent); set and delete return the full frontmatter after the change, and a delete against unparseable YAML fails with frontmatter_invalid without writing

obsidian_manage_tags tool
  • operation: "add" | "remove" | "list" with tags; location: "frontmatter" (default, the tags: array), "inline" (body #tag; add appends at end of file), or "both"
  • add / remove report applied, skipped, and the resulting tags; list returns frontmatter, inline, and all
  • Inline detection follows Obsidian's tag grammar: code, wikilinks, images, link destinations, HTML, and math are skipped, and %% … %% comments are read

obsidian_delete_note tool
  • Takes a target (path, active file, or periodic note) and checks it against the write scope first; a folder path fails with path_is_directory. There is no API-level undo, only Obsidian's local trash
  • The path must match exactly, letter case included, even on a case-insensitive filesystem. A different-case or extension-less spelling fails note_missing before anything is deleted, naming the near matches in suggestions
  • By default the note is deleted on the first call, with no confirmation; OBSIDIAN_WRITE_PATHS, OBSIDIAN_DENY_PATHS, and OBSIDIAN_READ_ONLY bound what it can reach
  • With OBSIDIAN_DELETE_ELICITATION=true, the first call answers with a confirmation request naming the path and byte size, and the note is deleted only after the user accepts. Declining fails with cancelled, and a client without elicitation support cannot delete
  • In that mode an answer counts only against the single-use consent record stored when the prompt was shown, bound to the c

Only the beginning is shown; read the rest in the repo

Ask PopNx