Content
# Obsidian MCP Server
A Model Context Protocol (MCP) server that provides AI assistants with full-text search access to your Obsidian vault.
## Features
- **Full-text search** across all notes using Whoosh search engine
- **Tag-based filtering** and search
- **Frontmatter support** - extracts and indexes YAML metadata
- **Wikilink parsing** - understands Obsidian's `[[note]]` syntax
- **Real-time updates** - watches vault for changes and updates index automatically
- **No Obsidian plugins required** - works directly with filesystem
- **Fast and efficient** - pure Python implementation with optimized indexing
## Installation
### Option 1: Local Installation
1. Clone this repository:
```bash
git clone <repository-url>
cd obsidianMCP
```
2. Install dependencies:
```bash
# Basic installation
pip install -e .
# Or install from requirements
pip install -r requirements.txt
# For development (includes testing tools)
pip install -r requirements-dev.txt
# OR
pip install -e ".[dev]"
# For reproducible installs using lock files (requires uv)
uv pip sync requirements.lock # Production dependencies only
uv pip sync requirements-dev.lock # With development dependencies
```
### Option 2: Docker
1. Clone this repository:
```bash
git clone <repository-url>
cd obsidianMCP
```
2. Build the Docker image:
```bash
docker build -t obsidian-mcp-server .
```
3. Run with Docker:
```bash
docker run -it --rm \
-e OBSIDIAN_VAULT_PATH=/vault \
-v /path/to/your/obsidian/vault:/vault:ro \
-v obsidian-index:/app/index \
obsidian-mcp-server
```
Or use Docker Compose:
```bash
# Edit docker-compose.yml to set your vault path
docker-compose up -d
```
## Usage
### Environment Setup
Set the required environment variable:
```bash
export OBSIDIAN_VAULT_PATH="/path/to/your/obsidian/vault"
```
Optional environment variables:
```bash
export OBSIDIAN_INDEX_PATH="/path/to/index" # Default: vault/.obsidian-mcp-index
export OBSIDIAN_MAX_RESULTS=50 # Default: 50
export OBSIDIAN_AUTO_REBUILD_INDEX=true # Default: true
export OBSIDIAN_INCREMENTAL_UPDATE=true # Default: true
export OBSIDIAN_WATCH_CHANGES=true # Default: true
export OBSIDIAN_INCLUDE_CONTENT=true # Default: true
export OBSIDIAN_USE_POLLING_OBSERVER=false # Default: false (set to true for Docker/network drives)
```
### Running the Server
```bash
obsidian-mcp-server
```
Or with command line arguments:
```bash
obsidian-mcp-server --vault-path /path/to/vault --max-results 100
```
### Claude Desktop Integration
#### Local Installation
Add to your Claude Desktop configuration (`~/.config/claude_desktop_config.json`):
```json
{
"mcpServers": {
"obsidian": {
"command": "obsidian-mcp-server",
"env": {
"OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault"
}
}
}
}
```
#### Docker Integration
For Docker, you'll need to create a wrapper script since Claude Desktop needs to communicate via stdio. Create a script like:
```bash
#!/bin/bash
# obsidian-mcp-docker.sh
docker run -i --rm \
-e OBSIDIAN_VAULT_PATH=/vault \
-v /path/to/your/obsidian/vault:/vault:ro \
-v obsidian-index:/app/index \
obsidian-mcp-server
```
Then configure Claude Desktop to use this script:
```json
{
"mcpServers": {
"obsidian": {
"command": "/path/to/obsidian-mcp-docker.sh"
}
}
}
```
## Available Tools
### search_notes
Search through your notes using full-text search.
**Parameters:**
- `query` (required): Search query string
- `tags` (optional): Array of tags to filter by
- `limit` (optional): Maximum results (default: 10)
### get_note
Retrieve the full content of a specific note.
**Parameters:**
- `identifier` (required): Note path or title
### list_recent_notes
Get recently modified notes.
**Parameters:**
- `limit` (optional): Maximum results (default: 10)
### get_all_tags
List all available tags in the vault.
### search_by_tag
Find notes with specific tags.
**Parameters:**
- `tags` (required): Array of tags to search for
- `limit` (optional): Maximum results (default: 20)
### get_vault_stats
Get statistics about the vault and search index.
## Architecture
- **Parser** (`parser.py`): Parses markdown files and extracts frontmatter, tags, and wikilinks
- **Search Index** (`search.py`): Whoosh-based full-text search with metadata support
- **File Watcher** (`watcher.py`): Monitors vault for changes and updates index incrementally
- **MCP Server** (`server.py`): Implements the Model Context Protocol interface
- **Configuration** (`config.py`): Handles configuration from environment variables
## Development
### Running Tests
```bash
# Run all tests
pytest
# Run with coverage
pytest --cov=src/obsidian_mcp
# Generate HTML coverage report
pytest --cov=src/obsidian_mcp --cov-report=html
# Run specific test file
pytest tests/test_parser.py
```
### Code Formatting
```bash
black src/
isort src/
```
### Type Checking
```bash
mypy src/
```
## Multi-Machine Usage
**Perfect for users who sync vaults across multiple machines!**
### Intelligent Index Updates
- **Incremental updates**: Only re-indexes files that have changed since last run
- **Fast startup**: Skips full rebuild when vault hasn't changed
- **Cross-machine sync**: Works with Obsidian Sync, iCloud, Dropbox, git, etc.
### How It Works
1. **First run**: Builds complete search index
2. **Subsequent runs**: Compares file modification times
3. **Only updates changed files**: Fast startup even with large vaults
4. **Handles file moves/renames**: Maintains search accuracy
### Configuration for Multi-Machine
```bash
# Recommended settings for synced vaults
export OBSIDIAN_INCREMENTAL_UPDATE=true # Enable smart updates
export OBSIDIAN_AUTO_REBUILD_INDEX=true # Auto-rebuild if needed
export OBSIDIAN_WATCH_CHANGES=true # Real-time updates while running
```
## Troubleshooting
### Index Issues
If search results seem outdated, the server automatically rebuilds the index on startup. You can also delete the index directory to force a complete rebuild.
### Multi-Machine Sync
- Index files are local to each machine (not synced)
- Vault content is synced between machines
- Each machine maintains its own optimized index
### Permission Issues
Ensure the server has read access to your Obsidian vault directory.
### Performance
For large vaults (>10,000 notes), consider:
- Reducing `max_results` for faster queries
- Using more specific search terms
- Filtering by tags to narrow results
- Incremental updates are especially beneficial for large vaults
## License
MIT License
Connection Info
You Might Also Like
Filesystem
Node.js MCP Server for filesystem operations with dynamic access control.
Fetch
Retrieve and process content from web pages by converting HTML into markdown format.
Context 7
Context7 MCP provides up-to-date code documentation for any prompt.
context7-mcp
Context7 MCP Server provides natural language access to documentation for...
mempalace
The highest-scoring AI memory system ever benchmarked. And it's free.
chrome-devtools-mcp
Chrome DevTools for coding agents