Enables AI assistants to interact with Obsidian vaults through direct filesystem access, providing tools for reading, creating, searching, and managing notes, tags, links, images, and vault structure with persistent SQLite indexing for fast searches.
Obsidian MCP Server
๐ Version 2.0 Released!
Major improvements in v2.0:
โก 5x faster searches with persistent SQLite indexing
๐ผ๏ธ Image support - View and analyze images from your vault
๐ Powerful regex search - Find complex patterns in your notes
๐๏ธ Property search - Query by frontmatter properties (status, priority, etc.)
๐ One-command setup - Auto-configure Claude Desktop with
uvx --from obsidian-mcp obsidian-mcp-configure --vault-path /path/to/your/vault๐ Direct filesystem access - No plugins required, works offline
๐ฆ 90% less memory usage - Efficient streaming architecture
A Model Context Protocol (MCP) server that enables AI assistants like Claude to interact with your Obsidian vault. This server provides tools for reading, creating, searching, and managing notes in Obsidian through direct filesystem access with blazing-fast performance thanks to intelligent indexing.
Features
๐ Read & write notes - Full access to your Obsidian vault with automatic overwrite protection
๐ Lightning-fast search - Find notes instantly by content, tags, properties, or modification date with persistent indexing
๐ผ๏ธ Image analysis - View and analyze images embedded in notes or stored in your vault
๐ Regex power search - Use regular expressions to find code patterns, URLs, or complex text structures
๐๏ธ Property search - Query notes by frontmatter properties with operators (=, >, <, contains, exists)
๐ Browse vault - List and navigate your notes and folders by directory
๐ท๏ธ Tag management - Add, remove, and organize tags (supports hierarchical tags, frontmatter, and inline tags)
๐ Link management - Find backlinks, analyze outgoing links, and identify broken links
โ๏ธ Smart rename - Rename notes with automatic link updates throughout your vault
๐ Note insights - Get statistics like word count and link analysis
๐ฏ AI-optimized - Clear error messages and smart defaults for better AI interactions
๐ Secure - Direct filesystem access with path validation
โก Performance optimized - Persistent SQLite index, concurrent operations, and streaming for large vaults
๐ Bulk operations - Create folder hierarchies and move entire folders with all their contents
Prerequisites
Obsidian vault on your local filesystem
Python 3.10+ installed on your system
Node.js (optional, for running MCP Inspector)
Installation
Quick Install with Auto-Configuration (Claude Desktop)
New in v2.0! Configure Claude Desktop automatically with one command:
This command will:
โ Automatically find your Claude Desktop config
โ Add the Obsidian MCP server
โ Migrate old REST API configs to v2.0
โ Create a backup of your existing config
โ Work on macOS, Windows, and Linux
Manual Configuration
Locate your Obsidian vault:
Find the path to your Obsidian vault on your filesystem
Example:
/Users/yourname/Documents/MyVaultorC:\Users\YourName\Documents\MyVault
Configure your AI tool:
Edit your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "obsidian": { "command": "uvx", "args": ["obsidian-mcp"], "env": { "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault" } } } }Add to your Cursor settings:
Project-specific:
.cursor/mcp.jsonin your project directoryGlobal:
~/.cursor/mcp.jsonin your home directory
{ "mcpServers": { "obsidian": { "command": "uvx", "args": ["obsidian-mcp"], "env": { "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault" } } } }Then: Open Settings โ Cursor Settings โ Enable MCP
Edit your Windsurf config file:
Location:
~/.codeium/windsurf/mcp_config.json
{ "mcpServers": { "obsidian": { "command": "uvx", "args": ["obsidian-mcp"], "env": { "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault" } } } }Then: Open Windsurf Settings โ Advanced Settings โ Cascade โ Add Server โ Refresh
Restart your AI tool to load the new configuration.
That's it! The server will now be available in your AI tool with access to your Obsidian vault.
Note: This uses
uvxwhich automatically downloads and runs the server in an isolated environment. Most users won't need to install anything else. If you don't haveuvinstalled, you can also usepipx install obsidian-mcpand change the command to"obsidian-mcp"in the config.
Try It Out
Here are some example prompts to get started:
"Show me all notes I modified this week"
"Create a new daily note for today with my meeting agenda"
"Search for all notes about project planning"
"Read my Ideas/startup.md note"
Development Installation
Clone the repository:
git clone https://github.com/natestrong/obsidian-mcp cd obsidian-mcpSet up Python environment:
# Using pyenv (recommended) pyenv virtualenv 3.12.9 obsidian-mcp pyenv activate obsidian-mcp # Or using venv python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activateInstall dependencies:
pip install -r requirements.txtConfigure environment variables:
export OBSIDIAN_VAULT_PATH="/path/to/your/obsidian/vault"Run the server:
python -m obsidian_mcp.serverAdd to Claude Desktop (for development):
Edit your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "obsidian": { "command": "/path/to/python", "args": ["-m", "obsidian_mcp.server"], "cwd": "/path/to/obsidian-mcp", "env": { "PYTHONPATH": "/path/to/obsidian-mcp", "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault" } } } }
Project Structure
Available Tools
Note Management
read_note
Read the content and metadata of a specific note.
Parameters:
path: Path to the note (e.g., "Daily/2024-01-15.md")
Returns:
create_note
Create a new note or update an existing one.
Parameters:
path: Path where the note should be createdcontent: Markdown content of the note (consider adding tags for organization)overwrite(default:false): Whether to overwrite existing notes
Best Practices:
Add relevant tags when creating notes to maintain organization
Use
list_tagsto see existing tags and maintain consistencyTags can be added as inline hashtags (
#tag) or in frontmatter
update_note
Update the content of an existing note.
โ ๏ธ IMPORTANT: By default, this tool REPLACES the entire note content. Always read the note first if you need to preserve existing content.
Parameters:
path: Path to the note to updatecontent: New markdown content (REPLACES existing content unless using append)create_if_not_exists(default:false): Create if doesn't existmerge_strategy(default:"replace"): How to handle content"replace": Overwrites entire note content (default)"append": Adds new content to the end of existing content
Safe Update Pattern:
ALWAYS read first to preserve content
Modify the content as needed
Update with the complete new content
Or use append mode to add content to the end
edit_note_section
Edit a specific section of a note identified by a markdown heading.
Parameters:
path: Path to the note to editsection_identifier: Markdown heading that identifies the section (e.g., "## Tasks", "### Status")content: Content to insert, replace, or appendoperation(default:"insert_after"): How to edit the section"insert_after": Add content after the section heading"insert_before": Add content before the section heading"replace": Replace entire section including heading"append_to_section": Add content at the end of the section
create_if_missing(default:false): Create section if it doesn't exist
Example usage:
Use cases:
Adding items to task lists without rewriting the whole note
Updating status sections in project notes
Building up notes incrementally by section
Inserting content at precise locations
delete_note
Delete a note from the vault.
Parameters:
path: Path to the note to delete
Search and Discovery
search_notes
Search for notes containing specific text or tags.
Parameters:
query: Search query (supports Obsidian search syntax)context_length(default:100): Number of characters to show around matchesmax_results(default:50): Maximum number of results to return (1-500)
Search Syntax:
Text search:
"machine learning"Tag search:
tag:projectortag:#projectHierarchical tags:
tag:project/web(exact match)Parent search:
tag:project(finds project, project/web, project/mobile)Child search:
tag:web(finds project/web, design/web)
Path search:
path:Daily/Property search:
property:status:activeorproperty:priority:>2Combined:
tag:urgent TODO
Returns:
Property Search Examples:
property:status:active- Find notes where status = "active"property:priority:>2- Find notes where priority > 2property:author:*john*- Find notes where author contains "john"property:deadline:*- Find notes that have a deadline propertyproperty:rating:>=4- Find notes where rating >= 4property:tags:project- Find notes with "project" in their tags arrayproperty:due_date:<2024-12-31- Find notes with due dates before Dec 31, 2024
search_by_date
Search for notes by creation or modification date.
Parameters:
date_type(default:"modified"): Either "created" or "modified"days_ago(default:7): Number of days to look backoperator(default:"within"): Either "within" (last N days) or "exactly" (exactly N days ago)
Returns:
Example usage:
"Show me all notes modified today" โ
search_by_date("modified", 0, "within")"Show me all notes modified this week" โ
search_by_date("modified", 7, "within")"Find notes created in the last 30 days" โ
search_by_date("created", 30, "within")"What notes were modified exactly 2 days ago?" โ
search_by_date("modified", 2, "exactly")
search_by_regex
Search for notes using regular expressions for advanced pattern matching.
Parameters:
pattern: Regular expression pattern to search forflags(optional): List of regex flags ("ignorecase", "multiline", "dotall")context_length(default:100): Characters to show around matchesmax_results(default:50): Maximum number of results
When to use:
Finding code patterns (functions, imports, syntax)
Searching for structured data
Complex text patterns that simple search can't handle
Common patterns:
Returns:
search_by_property
Search for notes by their frontmatter property values with advanced filtering.
Parameters:
property_name: Name of the property to search forvalue(optional): Value to compare againstoperator(default:"="): Comparison operatorcontext_length(default:100): Characters of note content to include
Operators:
"=": Exact match (case-insensitive)"!=": Not equal">","<",">=","<=": Numeric/date comparisons"contains": Property value contains the search value"exists": Property exists (value parameter ignored)
Supported Property Types:
Text/String: Standard text comparison
Numbers: Automatic numeric comparison for operators
Dates: ISO format (YYYY-MM-DD) with intelligent date parsing
Arrays/Lists: Searches within array items, comparisons use array length
Legacy properties: Automatically handles
tagโtags,aliasโaliasesmigrations
Returns:
Example usage:
Find all active projects:
search_by_property("status", "active")Find high priority items:
search_by_property("priority", "2", ">")Find notes with deadlines:
search_by_property("deadline", operator="exists")Find notes by partial author:
search_by_property("author", "john", "contains")
list_notes
List notes in your vault with optional recursive traversal.
Parameters:
directory(optional): Specific directory to list (e.g., "Daily", "Projects")recursive(default:true): List all notes recursively
Returns:
list_folders
List folders in your vault with optional recursive traversal.
Parameters:
directory(optional): Specific directory to list fromrecursive(default:true): Include all nested subfolders
Returns:
Organization
create_folder
Create a new folder in the vault, including all parent folders in the path.
Parameters:
folder_path: Path of the folder to create (e.g., "Research/Studies/2024")create_placeholder(default:true): Whether to create a placeholder file
Returns:
Note: This tool will create all necessary parent folders. For example, if "Research" exists but "Studies" doesn't, it will create both "Studies" and "2024".
move_note
Move a note to a new location, optionally with a new name.
Parameters:
source_path: Current path of the notedestination_path: New path for the note (can include new filename)update_links(default:true): Update links if filename changes
Features:
Can move to a different folder:
move_note("Inbox/Note.md", "Archive/Note.md")Can move AND rename:
move_note("Inbox/Old.md", "Archive/New.md")Automatically detects if filename changes and updates all wiki-style links
No link updates needed for simple folder moves (Obsidian links work by name)
Preserves link aliases when updating
Returns:
rename_note
Rename a note and automatically update all references to it throughout your vault.
Parameters:
old_path: Current path of the notenew_path: New path for the note (must be in same directory)update_links(default:true): Automatically update all wiki-style links
Returns:
Features:
Automatically finds and updates all
[[wiki-style links]]to the renamed notePreserves link aliases (e.g.,
[[Old Name|Display Text]]โ[[New Name|Display Text]])Handles various link formats:
[[Note]],[[Note.md]],[[Note|Alias]]Shows which notes were updated for transparency
Can only rename within the same directory (use
move_noteto change directories)
move_folder
Move an entire folder and all its contents to a new location.
Parameters:
source_folder: Current folder path (e.g., "Projects/Old")destination_folder: New folder path (e.g., "Archive/Projects/Old")update_links(default:true): Update links in other notes (future enhancement)
Returns:
add_tags
Add tags to a note's frontmatter.
Parameters:
path: Path to the notetags: List of tags to add (without # prefix)
Supports hierarchical tags:
Simple tags:
["project", "urgent"]Hierarchical tags:
["project/web", "work/meetings/standup"]Mixed:
["urgent", "project/mobile", "status/active"]
update_tags
Update tags on a note - either replace all tags or merge with existing.
Parameters:
path: Path to the notetags: New tags to set (without # prefix)merge(default:false): If true, adds to existing tags. If false, replaces all tags
Perfect for AI workflows:
remove_tags
Remove tags from a note's frontmatter.
Parameters:
path: Path to the notetags: List of tags to remove
batch_update_properties
Batch update properties across multiple notes.
Parameters:
search_criteria: How to find notes - must include one of:query: Search query string (e.g., "tag:project status:active")folder: Folder path with optionalrecursiveflagfiles: Explicit list of file paths
property_updates(optional): Properties to add/update in frontmatterproperties_to_remove(optional): List of property names to removeadd_tags(optional): Tags to add (additive)remove_tags(optional): Tags to removeremove_inline_tags(default:false): Also remove tags from note body
Examples:
Returns:
get_note_info
Get metadata and statistics about a note without retrieving its full content.
Parameters:
path: Path to the note
Returns:
Image Management
read_image
View an image from your vault. Images are automatically resized to a maximum width of 800px for optimal display in Claude Desktop.
Parameters:
path: Path to the image file (e.g., "Attachments/screenshot.png")
Returns:
A resized image object that can be viewed directly in Claude Desktop
Supported formats:
PNG, JPG/JPEG, GIF, BMP, WebP
view_note_images
Extract and view all images embedded in a note.
Parameters:
path: Path to the note containing images
Returns:
Use cases:
Analyze screenshots and diagrams in your notes
Review design mockups and visual documentation
Extract visual information for AI analysis
list_tags
List all unique tags used across your vault with usage statistics.
Parameters:
include_counts(default:true): Include usage count for each tagsort_by(default:"name"): Sort by "name" or "count"include_files(default:false): Include list of file paths that contain each tag
Returns:
Note: Hierarchical tags are listed as separate entries, showing both parent and full paths.
Performance Notes:
Fast for small vaults (<1000 notes)
May take several seconds for large vaults
Uses concurrent batching for optimization
Link Management
โก Performance Note: Link management tools have been heavily optimized in v1.1.5:
84x faster link validity checking
96x faster broken link detection
2x faster backlink searches
Includes automatic caching and batch processing
find_orphaned_notes
Find notes that may need organization or cleanup based on various criteria.
Parameters:
orphan_type(default:"no_backlinks"): Criteria for identifying orphaned notes"no_backlinks": Notes with no incoming links (most common)"no_links": Notes with no incoming OR outgoing links"no_tags": Notes without any tags"no_metadata": Notes with minimal/no frontmatter properties"isolated": Notes with no links AND no tags
exclude_folders(optional): List of folders to exclude (default: ["Templates", "Archive", "Daily"])min_age_days(optional): Only include notes older than this many days
Returns:
Use cases:
Regular vault maintenance and cleanup
Finding forgotten or disconnected notes
Identifying notes that need better organization
Preparing for vault reorganization
get_backlinks
Find all notes that link to a specific note.
Parameters:
path: Path to the note to find backlinks forinclude_context(default:true): Whether to include text context around linkscontext_length(default:100): Number of characters of context to include
Returns:
Use cases:
Understanding which notes reference a concept or topic
Discovering relationships between notes
Building a mental map of note connections
get_outgoing_links
List all links from a specific note.
Parameters:
path: Path to the note to extract links fromcheck_validity(default:false): Whether to check if linked notes exist
Returns:
Use cases:
Understanding what a note references
Checking note dependencies before moving/deleting
Exploring the structure of index or hub notes
find_broken_links
Find all broken links in the vault, a specific directory, or a single note.
Parameters:
directory(optional): Specific directory to check (defaults to entire vault)single_note(optional): Check only this specific note for broken links
Returns:
Use cases:
After renaming or deleting notes
Regular vault maintenance
Before reorganizing folder structure
Testing
Running Tests
Tests create temporary vaults for isolation and don't require a running Obsidian instance.
Testing with MCP Inspector
Set your vault path:
export OBSIDIAN_VAULT_PATH="/path/to/your/vault"Run the MCP Inspector:
npx @modelcontextprotocol/inspector python -m obsidian_mcp.serverOpen the Inspector UI at
http://localhost:5173Test the tools interactively with your actual vault
Integration with Claude Desktop
For development installations, see the Development Installation section above.
Enhanced Error Handling
The server provides detailed, actionable error messages to help AI systems recover from errors:
Example Error Messages
Invalid Path:
Empty Search Query:
Invalid Date Parameters:
Troubleshooting
"Vault not found" error
Ensure the OBSIDIAN_VAULT_PATH environment variable is set correctly
Verify the path points to an existing Obsidian vault directory
Check that you have read/write permissions for the vault directory
Tags not showing up
Ensure tags are properly formatted (with or without # prefix)
Tags in frontmatter should be in YAML array format:
tags: [tag1, tag2]Inline tags should use the # prefix:
#project #urgentTags inside code blocks are automatically excluded
"File too large" error
The server has a 10MB limit for note files and 50MB for images
This prevents memory issues with very large files
Consider splitting large notes into smaller ones
"Module not found" error
Ensure your virtual environment is activated
Run from the project root:
python -m obsidian_mcp.serverVerify all dependencies are installed:
pip install -r requirements.txt
Empty results when listing notes
Specify a directory when using
list_notes(e.g., "Daily", "Projects")Root directory listing requires recursive implementation
Check if notes are in subdirectories
Tags not updating
Ensure notes have YAML frontmatter section for frontmatter tags
Frontmatter must include a
tags:field (even if empty)The server now properly reads both frontmatter tags and inline hashtags
Best Practices for AI Assistants
Preventing Data Loss
Always read before updating: The
update_notetool REPLACES content by defaultUse append mode for additions: When adding to existing notes, use
merge_strategy="append"Check note existence: Use
read_noteto verify a note exists before modifyingBe explicit about overwrites: Only use
overwrite=truewhen intentionally replacing content
Recommended Workflows
Safe note editing:
Read the existing note first
Modify the content as needed
Update with the complete new content
Adding to daily notes:
Use
merge_strategy="append"to add entries without losing existing contentUse
edit_note_sectionto add content to specific sections (like "## Tasks" or "## Notes")
Creating new notes:
Use
create_notewithoverwrite=false(default) to prevent accidental overwritesAdd relevant tags to maintain organization
Use
list_tagsto see existing tags and avoid creating duplicates
Organizing with tags:
Check existing tags with
list_tagsbefore creating new onesMaintain consistent naming (e.g., use "project" not "projects")
Use tags to enable powerful search and filtering
Security Considerations
Vault path access - The server only accesses the specified vault directory
The server validates all paths to prevent directory traversal attacks
File operations are restricted to the vault directory
Large files are rejected to prevent memory exhaustion
Path validation prevents access to system files
Development
Code Style
Uses FastMCP framework for MCP implementation
Pydantic models for type safety and validation
Modular architecture with separated concerns
Comprehensive error handling and user-friendly messages
Adding New Tools
Create tool function in appropriate module under
src/tools/Add Pydantic models if needed in
src/models/Register the tool in
src/server.pywith the@mcp.tool()decoratorInclude comprehensive docstrings
Add tests in
tests/Test with MCP Inspector before deploying
Changelog
v2.1.6 (2025-01-30)
๐ Find orphaned notes - New
find_orphaned_notestool for comprehensive vault maintenanceMultiple orphan criteria: no backlinks, no links, no tags, no metadata, or isolated notes
Configurable folder exclusions and age filtering
Returns detailed statistics including size and word count for each orphaned note
Helps identify forgotten or disconnected notes that need organization
๐ Bug fixes:
Fixed JSON string parsing for tag parameters in multiple tools
Fixed various errors in
find_orphaned_notesimplementation
v2.1.5 (2025-01-30)
๐ New find_orphaned_notes tool - Find notes that need organization
Multiple criteria: no backlinks, no links, no tags, no metadata, or isolated
Smart defaults exclude Templates, Archive, and Daily folders
Optional age filtering to exclude recent work-in-progress notes
Returns paths, reasons, and metadata for each orphaned note
v2.1.4 (2025-01-30)
๐ Enhanced default search - Search now automatically includes both filename AND content matches
Filename matches are ranked higher for intuitive "find note by name" behavior
No more need to use
path:prefix for common searchesAdded
match_typefield to distinguish filename vs content matches
๐ Fixed quote validation - Notes with quotes in filenames now work correctly
v2.1.3 (2025-01-30)
๐ท๏ธ Enhanced list_tags - Added
include_filesoption to get all files containing each tag๐ง Fixed update_tags - Properly handles bullet list YAML format without creating malformed frontmatter
๐ Batch update properties - New
batch_update_propertiestool for bulk metadata operationsUpdate any frontmatter property across multiple notes
Add/remove tags with optional inline tag removal from note body
Search by query, folder, or explicit file list
Proper YAML structure preservation
๐งน Code cleanup - Removed deprecated OBSIDIAN_REST_API_KEY references from codebase
๐ Better error messages - More actionable feedback following MCP best practices
v2.0.3 (2025-01-24)
โ๏ธ Section-based editing - New
edit_note_sectiontool for precise content insertion and updates๐ฏ Four edit operations - Insert before/after headings, replace sections, or append to section ends
๐ Smart section detection - Case-insensitive markdown heading matching with hierarchy support
๐ง Create missing sections - Optionally create sections if they don't exist
๐ Preserve note structure - Edit specific parts without rewriting entire notes
v2.0.2 (2025-01-24)
๐ฏ Simplified architecture - Removed memory index, SQLite is now the only search method
๐ Search transparency - Added metadata to search results (total_count, truncated, limit)
โ๏ธ Configurable search limits - Exposed max_results parameter (1-500, default 50)
๐งน Reduced tool clutter - Removed unnecessary index management tools
๐ Reasoning-friendly improvements - Enhanced all tools with proper Field annotations and comprehensive docstrings
๐ Better AI reasoning - Added "When to use" and "When NOT to use" sections to all tools
โก Performance notes - Added explicit performance guidance for expensive operations
๐ง Cleaner codebase - Removed ~500 lines of memory index code, reducing maintenance burden
v2.0.0 (2025-01-24)
๐ Complete architecture overhaul - Migrated from REST API to direct filesystem access
โก 5x faster searches with persistent SQLite indexing that survives between sessions
๐ผ๏ธ Image support - View and analyze images from your vault with automatic resizing
๐ Regex power search - Find complex patterns with optimized streaming
๐๏ธ Property search - Query notes by frontmatter properties with advanced operators
๐ฏ One-command setup - Auto-configure Claude Desktop with
uvx --from obsidian-mcp obsidian-mcp-configure๐ฆ 90% less memory usage - Efficient streaming architecture
๐ No plugins required - Works offline without needing Obsidian to be running
โจ Incremental indexing - Only re-indexes changed files
๐ง Migration support - Automatically detects and migrates old REST API configs
๐ท๏ธ Enhanced hierarchical tag support - Full support for Obsidian's nested tag system
Search parent tags to find all children (e.g.,
tag:projectfindsproject/web)Search child tags across any hierarchy (e.g.,
tag:webfindsproject/web,design/web)Exact hierarchical matching (e.g.,
tag:project/web)
๐ Improved metadata handling - Better alignment with Obsidian's property system
Automatic migration of legacy properties (
tagโtags,aliasโaliases)Array/list property searching (find items within arrays)
Date property comparisons with ISO format support
Numeric comparisons for array lengths
๐ AI-friendly tool definitions - Updated all tool descriptions for better LLM understanding
Added hierarchical tag examples to all tag-related tools
Enhanced property search documentation
Clearer parameter descriptions following MCP best practices
v1.1.8 (2025-01-15)
๐ง Fixed FastMCP compatibility issue that prevented PyPI package from running
๐ฆ Updated to FastMCP 2.8.1 for better stability
๐ Fixed Pydantic V2 deprecation warnings (migrated to @field_validator)
โจ Changed FastMCP initialization to use 'instructions' parameter
๐ Improved compatibility with uvx and pipx installation methods
v1.1.7 (2025-01-10)
๐ Changed default API endpoint to HTTP (
http://127.0.0.1:27123) for easier setup๐ Updated documentation to reflect HTTP as default, HTTPS as optional
๐ง Added note about automatic trailing slash handling in URLs
โจ Improved first-time user experience with zero-configuration setup
v1.1.6 (2025-01-10)
๐ Fixed timeout errors when creating or updating large notes
โก Added graceful timeout handling for better reliability with large content
๐ง Improved error reporting to prevent false failures on successful operations
v1.1.5 (2025-01-09)
โก Massive performance optimization for link management:
84x faster link validity checking
96x faster broken link detection
2x faster backlink searches
Added automatic caching and batch processing
๐ง Optimized concurrent operations for large vaults
๐ Enhanced documentation for performance considerations
v1.1.4 (2025-01-09)
๐ Added link management tools for comprehensive vault analysis:
get_backlinks- Find all notes linking to a specific noteget_outgoing_links- List all links from a note with validity checkingfind_broken_links- Identify broken links for vault maintenance
๐ง Fixed URL construction to support both HTTPS (default) and HTTP endpoints
๐ Enhanced link parsing to handle both wiki-style and markdown links
โก Optimized backlink search to handle various path formats
v1.1.3 (2025-01-09)
๐ Fixed search_by_date to properly find notes modified today (days_ago=0)
โจ Added list_folders tool for exploring vault folder structure
โจ Added create_folder tool that creates full folder hierarchies
โจ Added move_folder tool for bulk folder operations
โจ Added update_tags tool for AI-driven tag management
๐ Fixed tag reading to properly handle both frontmatter and inline hashtags
โจ Added list_tags tool to discover existing tags with usage statistics
โก Optimized performance with concurrent batching for large vaults
๐ Improved documentation and error messages following MCP best practices
๐ฏ Enhanced create_note to encourage tag usage for better organization
v1.1.2 (2025-01-09)
Fixed PyPI package documentation
v1.1.1 (2025-01-06)
Initial PyPI release
Publishing (for maintainers)
To publish a new version to PyPI:
Users can then install and run with:
Configuration
Performance and Indexing
The server now includes a persistent search index using SQLite for dramatically improved performance:
Key Features:
Instant startup - No need to rebuild index on every server start
Incremental updates - Only re-indexes files that have changed
60x faster searches - SQLite queries are much faster than scanning all files
Lower memory usage - Files are loaded on-demand rather than all at once
Configuration Options:
Set these environment variables to customize behavior:
The search index is stored in your vault at .obsidian/mcp-search-index.db.
Performance Notes
Search indexing - With persistent index, only changed files are re-indexed
Concurrent operations - File operations use async I/O for better performance
Large vaults - Incremental indexing makes large vaults (10,000+ notes) usable
Image handling - Images are automatically resized to prevent memory issues
Migration from REST API Version
If you were using a previous version that required the Local REST API plugin:
You no longer need the Obsidian Local REST API plugin - This server now uses direct filesystem access
Replace
OBSIDIAN_REST_API_KEYwithOBSIDIAN_VAULT_PATHin your configurationRemove any
OBSIDIAN_API_URLsettingsThe new version is significantly faster and more reliable
All features work offline without requiring Obsidian to be running
Contributing
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-tool)Write tests for new functionality
Ensure all tests pass
Commit your changes (
git commit -m 'Add amazing tool')Push to the branch (
git push origin feature/amazing-tool)Open a Pull Request
License
MIT License - see LICENSE file for details
Acknowledgments
Anthropic for creating the Model Context Protocol
Obsidian team for the amazing note-taking app
coddingtonbear for the original Local REST API plugin (no longer required)
dsp-ant for the FastMCP framework
This server cannot be installed
local-only server
The server can only run on the client's local machine because it depends on local resources.
Enables AI assistants to interact with Obsidian vaults through direct filesystem access, supporting note management, lightning-fast search with SQLite indexing, image analysis, tag/link management, and bulk operations.
- ๐ Version 2.0 Released!
- Features
- Prerequisites
- Installation
- Project Structure
- Available Tools
- Testing
- Integration with Claude Desktop
- Enhanced Error Handling
- Troubleshooting
- Best Practices for AI Assistants
- Security Considerations
- Development
- Changelog
- Publishing (for maintainers)
- Configuration
- Contributing
- License
- Acknowledgments