Obsidian Mcp Server
cyanheads/obsidian-mcp-server · 582 stars · TypeScript · Apache-2.0
MCP server Read, write, search, and surgically edit Obsidian vault notes, tags, and frontmatter via MCP. STDIO or Streamable HTTP.
Install
The repo has no one-line install. Follow its README.
Files
Overview
Obsidian vault notes over the Local REST API plugin. Read, search, and write notes, edit single headings, blocks, and frontmatter fields in place, and manage tags, with folder-scoped read/write permissions built in. Runs as a stdio process or a local Streamable HTTP server.
Tools
Resources
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
targetis a vaultpath, theactivefile, or aperiodicnote (dailythroughyearly, optionaldate);formatiscontent,full,document-map, orsection, andfulltakesincludeLinks: truefor vault-internal outgoing linksresult.formatdiscriminates the payload; asectionread that matches several headings returns the first and lists every full path incandidates- A
pathwith no exact match but one case-insensitive match in its folder reads that file:result.pathis the real name,requestedPaththe one sent, and anoticenames both
obsidian_list_notes tool
- Walks from
path(default vault root) todepth1–20 (default 2), filtered byextensionandnameRegex(≤256 chars); a folder that failsnameRegexis not walked - Returns
entries[](file/directory),totals, andappliedFilters; the walk stops at 1,000 entries withexcluded.reason: "entry_cap", and a folder the depth limit stopped carriestruncated: true - With
OBSIDIAN_READ_PATHSset, a listing holds only readable entries and the folders leading to the scope; those folders are walked and accepted aspath
obsidian_list_tags tool
nameRegex(≤256 chars) andminCountnarrow the set, then tags are ranked by count and capped atlimit(default 200, max 10000); hierarchical parents count (work/tasksadds towork)- When the cap withholds tags, the response carries
truncated,shown, andcap - With
OBSIDIAN_READ_PATHSset, only tags from readable notes are listed, andcountis the number of readable notes carrying the tag or a tag nested under it
obsidian_search_notes tool
mode: "text"requires every whitespace-split token ofqueryas a case-insensitive substring of the filename or body (quotes are literal), shaped bycontextLength(default 100),pathPrefix, andmaxMatchesPerHit(default 10);mode: "jsonlogic"evaluates alogictree overpath,content,frontmatter.<key>,tags, andstat, withglob/regexptaking[PATTERN, VALUE]result.modediscriminates the payload; every mode reportstotalCountand pages vianextCursor, and a text hit clipped tomaxMatchesPerHitcarriestruncatedandtotalMatchesmode: "omnisearch"(BM25 ranking, quoted phrases,-exclusion,path:/ext:filters) is offered only when the Omnisearch plugin answered at startup; its 50-hit upstream cap setstruncated: true
obsidian_write_note tool
targetandcontent, with optionalsectionandcontentType(markdown/json); a whole-file write to an existing note fails withfile_existsunlessoverwrite: true- With
section, replaces only that heading, block, or frontmatter field and keeps the heading line; output reportscreated,sectionTargeted, and the resolvedsectionTarget
obsidian_append_to_note tool
- Without
section, appends to the file or creates it (created: true); withsection, appends to that heading, block, or frontmatter field of an existing note, andcreateTargetIfMissing: truecreates the section - A section append whose content is already at the target fails with
content_preexists; block targets add no separator, so startcontentwith a newline if you want one
obsidian_patch_note tool
operation: "append" | "prepend" | "replace"against onesectionof an existing note;patchOptionstakescreateTargetIfMissing,applyIfContentPreexists, andtrimTargetWhitespace(plugin v4.x only)- Echoes the resolved
sectionandoperation; a repeat of content already at the target fails withcontent_preexistsunlessapplyIfContentPreexists: true
obsidian_replace_in_note tool
replacements[]run in order, each over the previous one's output; each takesuseRegex(≤1024 chars),caseSensitive(defaulttrue),wholeWord,flexibleWhitespace(literal mode only), andreplaceAll(defaulttrue)- Returns
totalReplacementsandperReplacement[]withbodyCount/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 onekey;setrequires a JSON-typedvaluegetreturnsexistsandvalue(nullwhen absent);setanddeletereturn the fullfrontmatterafter the change, and adeleteagainst unparseable YAML fails withfrontmatter_invalidwithout writing
obsidian_manage_tags tool
operation: "add" | "remove" | "list"withtags;location: "frontmatter"(default, thetags:array),"inline"(body#tag;addappends at end of file), or"both"add/removereportapplied,skipped, and the resultingtags;listreturnsfrontmatter,inline, andall- 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 withpath_is_directory. There is no API-level undo, only Obsidian's local trash
Facts
- Kind
- MCP server
- Repo
- cyanheads/obsidian-mcp-server
- Group
- Uncategorized
- Stars
- 582
- License
- Apache-2.0
- Language
- TypeScript
- Last push
- 2026-10-06
- Forks
- 105
- Topics
- ai-agents, ai-tools, bun, cyanheads, knowledge-base, mcp, mcp-server, model-context-protocol, note-taking, obsidian, obsidian-md, obsidian-vault, pkm, stdio, streamable-http, typescript
- 1Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 2Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k
- 3Gitmodelcontextprotocol/serversA Model Context Protocol server for Git repository interaction and automation. This server provides tools to read, search, and manipulate Git repositories via Large Language Models.85.8k
- 4Memorymodelcontextprotocol/serversA basic implementation of persistent memory using a local knowledge graph. This lets Claude remember information about the user across chats.85.8k
- 5Sequential Thinkingmodelcontextprotocol/serversAn MCP server implementation that provides a tool for dynamic and reflective problem-solving through a structured thinking process.85.8k
- 6Timemodelcontextprotocol/serversA Model Context Protocol server that provides time and timezone conversion capabilities. This server enables LLMs to get current time information and perform timezone conversions using IANA timezone names, with automatic system timezone detection.85.8k