Skip to main content
Glama
Obsidian MCP Server

Obsidian MCP Server

by aniketbiswas

๐Ÿ—ƒ๏ธ Obsidian MCP Server

npm version MIT License Node.js MCP

Connect AI assistants like Claude to your Obsidian vault via Model Context Protocol. 40+ tools for searching, creating, and managing your notesโ€”all 100% local.


What Can You Do?

You Say

What Happens

"Search my notes for machine learning"

Searches your entire vault

"Create a meeting note for tomorrow"

Creates a formatted meeting note

"What links to my Projects note?"

Shows all backlinks

"Add to my daily note: finished the API"

Appends to today's daily note

"Find orphan notes"

Lists unconnected notes


Related MCP server: Obsidian MCP Server

Quick Start

1. Install the Obsidian Plugin

  1. Obsidian โ†’ Settings โ†’ Community plugins โ†’ Browse

  2. Search "Local REST API" โ†’ Install โ†’ Enable

  3. Settings โ†’ Local REST API โ†’ Copy your API Key

2. Install the MCP Server

Option A: Install from npm (recommended)

npm install -g @aniketbiswas/obsidian-mcp-server

Option B: Install from source

git clone https://github.com/aniketbiswas/obsidian-mcp.git
cd obsidian-mcp
npm install && npm run build
npm link  # Makes it available globally

3. Configure Claude Desktop

Edit the config file:

OS

Config Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/claude/claude_desktop_config.json

If installed via npm:

{
  "mcpServers": {
    "obsidian": {
      "command": "node",
      "args": ["node_modules/@aniketbiswas/obsidian-mcp-server/build/index.js"],
      "env": {
        "OBSIDIAN_API_KEY": "your-api-key-here"
      }
    }
  }
}

Note: If the above doesn't work (common with nvm), use full paths:

{
  "command": "/usr/local/bin/node",
  "args": ["/usr/local/lib/node_modules/@aniketbiswas/obsidian-mcp-server/build/index.js"]
}

Find your paths with: which node and npm root -g

If installed from source:

{
  "mcpServers": {
    "obsidian": {
      "command": "node",
      "args": ["/FULL/PATH/TO/obsidian-mcp-server/build/index.js"],
      "env": {
        "OBSIDIAN_API_KEY": "your-api-key-here"
      }
    }
  }
}

Windows paths: Use C:\\Users\\Name\\... or C:/Users/Name/...

4. Restart Claude Desktop

Make sure Obsidian is running, then try: "Show me my vault status"


Available Tools

vault_status ยท list_files ยท list_all_files ยท get_vault_structure ยท get_file_stats ยท delete_file

read_note ยท create_note ยท update_note ยท append_to_note ยท prepend_to_note ยท insert_under_heading ยท replace_in_note ยท delete_note ยท copy_note

search_notes ยท simple_search ยท search_by_tag ยท search_in_folder ยท find_notes_by_name ยท get_recent_notes ยท search_with_context

get_frontmatter ยท update_frontmatter ยท set_frontmatter_property ยท get_tags ยท add_tags ยท remove_tags ยท add_aliases ยท get_all_tags_in_vault

open_note ยท get_active_note ยท append_to_active_note ยท get_commands ยท execute_command ยท quick_capture

get_daily_note ยท append_to_daily_note ยท get_periodic_note ยท append_to_periodic_note ยท daily_journal_entry ยท daily_standup

get_outgoing_links ยท get_backlinks ยท find_broken_links ยท find_orphan_notes ยท add_link_to_note ยท get_link_graph_data

create_note_from_template ยท create_meeting_note ยท create_project_note ยท list_templates

Built-in: meeting ยท project ยท book ยท article ยท person ยท recipe ยท decision


Configuration

Variable

Required

Default

Description

OBSIDIAN_API_KEY

โœ…

โ€”

From Local REST API plugin

OBSIDIAN_HOST

127.0.0.1

API host

OBSIDIAN_PORT

27124

API port

OBSIDIAN_SECURE

true

Use HTTPS

OBSIDIAN_VERIFY_SSL

false

Verify SSL certificate


Troubleshooting

This is usually a PATH issue. Claude Desktop doesn't inherit your shell's PATH (especially with nvm).

Solution: Use full absolute paths in your config:

  1. Find your node path: which node

  2. Find global modules: npm root -g

  3. Update config with full paths:

{
  "mcpServers": {
    "obsidian": {
      "command": "/Users/YOU/.nvm/versions/node/v22.x.x/bin/node",
      "args": ["/Users/YOU/.nvm/versions/node/v22.x.x/lib/node_modules/@aniketbiswas/obsidian-mcp-server/build/index.js"],
      "env": {
        "OBSIDIAN_API_KEY": "your-key"
      }
    }
  }
}

Check logs: ~/Library/Logs/Claude/mcp.log (macOS)

  • Validate JSON: cat config.json | python3 -m json.tool

  • Path must be absolute (starts with / or C:\)

  • Restart Claude Desktop completely (Cmd+Q / right-click quit)

  • Windows: ensure file is .json not .json.txt

  • Obsidian must be running with Local REST API enabled

  • Test API: curl -k https://127.0.0.1:27124/ -H "Authorization: Bearer YOUR_KEY"

  • Regenerate API key if needed

Use full path: "command": "C:\\Program Files\\nodejs\\node.exe"


Development

npm run build      # Compile TypeScript
npm run dev        # Watch mode
npm run inspector  # Test tools in browser UI

Adding Tools

Create/edit files in src/tools/, then rebuild:

server.tool("my_tool", "Description", { param: z.string() }, async ({ param }) => {
  return { content: [{ type: "text", text: "Result" }] };
});

FAQ

Is it free? Yes, the Local REST API plugin is free.

Are my notes sent to the cloud? No. Everything stays local. Only your conversation with Claude goes to Anthropic (like any Claude chat).

Works with Obsidian Sync? Yes, it accesses your local vault files.


Contributing

PRs welcome! Fork โ†’ create branch โ†’ commit โ†’ open PR.


License

MIT โ€” see LICENSE


Built with MCP SDK ยท Powered by Local REST API

Available Tools

52 tools
add_aliasesA

Add aliases (alternative names) to a note's frontmatter. Aliases help find notes by different names.

Inputs: path (required), aliases (required).

add_tagsA

Add tags to a note's frontmatter. Tags are added without duplicates. Creates frontmatter if needed.

Inputs: path (required), tags (required).

append_to_active_noteA

Append content to the currently active note in Obsidian. Useful for quickly adding content to whatever note you're working on.

Inputs: content (required), ensureNewline.

append_to_daily_noteA

Append content to today's daily note. Creates the daily note if it doesn't exist.

Inputs: content (required), heading, addTimestamp.

append_to_noteA

Append content to the end of an existing note. Useful for adding new sections, logging entries, or updating lists.

Inputs: path (required), content (required), ensureNewline, createIfMissing.

append_to_periodic_noteB

Append content to a periodic note. Can append to current period's note or a specific date.

Inputs: period (required), content (required), day, year, +1 more.

copy_noteA

Copy a note to a new location in the vault. The original note is preserved.

Inputs: sourcePath (required), destinationPath (required), overwrite.

create_meeting_noteC

Create a structured meeting note with attendees, agenda, and action items.

Inputs: title (required), date, agenda, folder, +1 more.

create_noteA

Create a new note in the Obsidian vault. Can include frontmatter properties like tags, aliases, and custom fields.

Inputs: path (required), content (required), overwrite, frontmatter.

create_note_from_templateA

Create a new note using a built-in template. Available templates: meeting, project, book, article, person, recipe, decision.

Inputs: title (required), template (required), folder, customFields.

create_project_noteC

Create a structured project note with goals, tasks, and timeline.

Inputs: title (required), goals, folder, status, +2 more.

daily_journal_entryB

Add a structured journal entry to today's daily note. Creates a nicely formatted journal entry with optional sections.

Inputs: entry (required), mood, todos, gratitude, +1 more.

daily_standupA

Add a daily standup/scrum entry to today's daily note. Uses the classic standup format: yesterday, today, blockers.

Inputs: today (required), yesterday (required), blockers.

delete_fileA

Delete a file from the Obsidian vault. WARNING: This permanently removes the file. Use with caution.

Inputs: path (required), confirm (required).

delete_noteA

Delete a note from the Obsidian vault. WARNING: This permanently removes the note. Use with caution.

Inputs: path (required), confirm (required).

execute_commandA

Execute an Obsidian command by its ID. Use get_commands to find available commands and their IDs. Examples: 'app:toggle-left-sidebar', 'editor:toggle-fold'

Inputs: commandId (required).

find_notes_by_nameA

Find notes by their filename. Searches for notes whose name contains the specified text.

Inputs: name (required), exactMatch.

find_orphan_notesA

Find orphan notes - notes with no incoming links from other notes. These are notes that aren't connected to the rest of your knowledge graph.

Inputs: folder, includeUnlinked.

get_active_noteA

Get the content of the currently active (focused) note in Obsidian. Returns the note's content, path, and metadata.

Inputs: includeStats, includeContent.

get_all_tags_in_vaultA

Get a list of all unique tags used across the entire vault. Useful for understanding tag taxonomy and finding related notes.

Inputs: folder.

get_commandsA

Get a list of all available commands in Obsidian. Commands are actions that can be executed, like 'Toggle fold' or 'Export to PDF'.

Inputs: filter.

get_daily_noteA

Get the content of today's daily note. Creates the note if it doesn't exist (using Obsidian's daily notes settings). Requires Daily Notes core plugin or Periodic Notes plugin.

Inputs: includeContent.

get_file_statsA

Get statistics about files in the vault or a specific directory. Shows file counts by extension, total files, and directory counts.

Inputs: path.

get_frontmatterA

Get the frontmatter (YAML metadata) from a note. Returns all frontmatter fields including tags, aliases, and custom properties.

Inputs: path (required).

get_periodic_noteA

Get a periodic note for a specific period and date. Supports daily, weekly, monthly, quarterly, and yearly notes. Requires the Periodic Notes plugin for non-daily periods.

Inputs: period (required), day, year, month.

get_recent_notesA

Get a list of recently modified markdown notes. Useful for finding notes you've worked on recently.

Inputs: limit, folder.

get_tagsA

Get all tags from a note. Includes tags from frontmatter and inline tags (#tag) in the content.

Inputs: path (required).

get_vault_structureA

Get a tree-like structure of folders in the Obsidian vault. Useful for understanding the vault organization. Only shows directories, not individual files.

Inputs: path, maxDepth.

insert_under_headingA

Insert content under a specific heading in a note. Useful for adding content to specific sections without modifying the rest.

Inputs: path (required), content (required), heading (required), headingLevel, +1 more.

list_all_filesA

Recursively list all files in the Obsidian vault. Can start from a specific directory and filter by file extension. Useful for getting a complete view of vault structure.

Inputs: path, maxDepth, extensions.

list_filesA

List files and folders in the Obsidian vault. Can list the root directory or a specific folder. Returns names of files and directories (directories end with /).

Inputs: path.

list_templatesA

List all available built-in templates and their descriptions.

Inputs: no named parameters.

open_noteA

Open a note in the Obsidian user interface. Makes the note visible and active in Obsidian.

Inputs: path (required), newPane.

prepend_to_noteA

Prepend content to the beginning of a note (after frontmatter). Useful for adding headers, timestamps, or important notices.

Inputs: path (required), content (required), ensureNewline.

quick_captureA

Quickly capture a thought, idea, or note. Appends to a designated capture file with timestamp. Great for inbox-style note capture.

Inputs: content (required), format, captureFile, addTimestamp.

read_noteB

Read the content of a note from the Obsidian vault. Returns the full content including frontmatter, or can return parsed sections.

Inputs: path (required), includeStats, includeFrontmatter.

remove_tagsA

Remove tags from a note's frontmatter. Only removes tags from frontmatter, not inline tags.

Inputs: path (required), tags (required).

replace_in_noteB

Find and replace text in a note. Useful for making specific edits without replacing the entire content.

Inputs: find (required), path (required), replace (required), replaceAll.

search_by_tagA

Find all notes that have specific tags. Tags can be in frontmatter or inline in the content. Can search for multiple tags (notes must have all specified tags).

Inputs: tags (required), matchAll.

search_in_folderB

Search for notes within a specific folder. Combines folder path filtering with text search.

Inputs: folder (required), query, includeSubfolders.

search_notesA

Search for notes in the Obsidian vault using Obsidian's query syntax. Supports operators like: path:, file:, tag:#, content in quotes, and more. Returns matching files with relevance scores.

Inputs: query (required), limit.

search_with_contextA

Search notes and return results with content snippets/context. Useful for previewing search results without opening each note.

Inputs: query (required), limit, contextLength.

set_frontmatter_propertyA

Set a single frontmatter property in a note. Creates the property if it doesn't exist.

Inputs: key (required), path (required), value (required).

update_frontmatterA

Update frontmatter fields in a note. Can add new fields or update existing ones. Existing fields not specified are preserved.

Inputs: path (required), properties (required).

update_noteA

Update the content of an existing note in the Obsidian vault. Replaces the entire content of the note.

Inputs: path (required), content (required), updateModified, preserveFrontmatter.

vault_statusA

Check the connection to Obsidian and get server status information. Use this to verify the MCP server can communicate with Obsidian.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelogโ€ฆ

    TDQS

    B3.1/5.0

    Scored across 52 tools

    Disambiguation2/5

    Many tools have overlapping purposes: there are six different search tools (search_notes, simple_search, search_by_tag, search_in_folder, find_notes_by_name, search_with_context) and five content-edit tools (update_note, replace_in_note, insert_under_heading, append_to_note, prepend_to_note). While descriptions provide distinctions, an agent may struggle to choose the right one for a given task.

    Naming Consistency3/5

    Most tools follow a verb_noun pattern with underscores, but verbs are inconsistent (list vs. get vs. find vs. search). A few tools like daily_journal_entry, daily_standup, and quick_capture deviate from the verb-first pattern, making the naming system mixed but still readable.

    Tool Count1/5

    With 52 tools, this is far beyond the typical well-scoped range. Even for a complex application like Obsidian, the sheer number creates unnecessary cognitive load and makes tool selection more difficult. This qualifies as an extreme mismatch.

    Completeness4/5

    The toolset is highly comprehensive, covering note CRUD, advanced search, frontmatter/tag management, daily/periodic notes, templates, backlinks, graph data, and command execution. Minor gaps exist (e.g., no move/rename note, no folder creation/deletion), but these are workable.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers