Obsidian MCP Server
# Obsidian MCP Server
A powerful Model Context Protocol (MCP) server for natural language interaction with your Obsidian vault. Built with TypeScript and designed for seamless integration with Claude Code and other MCP clients.
## Features
### Core Capabilities
- **Natural Language Queries**: Ask questions about your vault in plain English
- **Advanced Search**: Intelligent search with link analysis, tag hierarchies, and structural context
- **Backlink Analysis**: Find and analyze connections between notes
- **Vault Navigation**: Browse directory structure and discover notes
- **Full CRUD Operations**: Read, write, create, append, and update notes
### Advanced Intelligence Tools
- **Guided Story Path**: Generate narrative tours through linked notes
- **Note Auditing**: Find recently modified notes missing frontmatter or structure
- **Contextual Companions**: Discover related notes based on links, keywords, and recency
- **Fresh Energy**: Identify recently updated notes needing integration
- **Initiative Bridge**: Track project-specific notes with outstanding tasks
- **Pattern Echo**: Find notes that reuse specific phrasings or patterns
- **Synthesis Ready**: Detect note clusters that need summary notes
## Installation
### From Source
1. Clone the repository:
```bash
git clone https://github.com/dbmcco/obsidian-mcp.git
cd obsidian-mcp
```
2. Install dependencies:
```bash
npm install
```
3. Build the project:
```bash
npm run build
```
## Configuration
### Claude Code Setup
Add to your Claude Code MCP configuration:
```json
{
"mcpServers": {
"obsidian": {
"command": "node",
"args": ["/absolute/path/to/obsidian-mcp/dist/index.js"],
"env": {
"OBSIDIAN_VAULT_PATH": "/absolute/path/to/your/vault"
}
}
}
}
```
### Claude Desktop Setup
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"obsidian": {
"command": "node",
"args": ["/absolute/path/to/obsidian-mcp/dist/index.js"],
"env": {
"OBSIDIAN_VAULT_PATH": "/absolute/path/to/your/vault"
}
}
}
}
```
### Environment Variables
- `OBSIDIAN_VAULT_PATH`: **Required**. Absolute path to your Obsidian vault
## Available Tools
### Basic Operations
#### query_vault
Process natural language queries about your vault content.
**Example:** "What are the main themes in my project notes?"
```typescript
{
query: string,
vaultPath?: string // Optional override
}
```
#### search_notes
Search for notes by filename or content using exact text matching.
```typescript
{
searchTerm: string,
searchType: 'filename' | 'content' | 'both', // Default: 'both'
vaultPath?: string
}
```
#### intelligent_search
Advanced search with link graph analysis, tag hierarchies, and structural context weighting.
```typescript
{
query: string,
vaultPath?: string
}
```
#### list_directories
Browse vault directory structure with note counts.
```typescript
{
directoryPath?: string, // Empty string for vault root
vaultPath?: string
}
```
#### get_note
Retrieve the full content of a specific note.
```typescript
{
notePath: string, // Relative to vault root
vaultPath?: string
}
```
#### get_backlinks
Find all notes that link to a specific note with context.
```typescript
{
notePath: string,
vaultPath?: string
}
```
### Write Operations
#### write_note
Write or completely overwrite a note.
```typescript
{
notePath: string,
content: string,
vaultPath?: string
}
```
#### create_note
Create a new note with frontmatter and content.
```typescript
{
notePath: string,
title: string,
content?: string,
tags?: string[],
vaultPath?: string
}
```
#### append_to_note
Append content to an existing note.
```typescript
{
notePath: string,
content: string,
vaultPath?: string
}
```
#### update_note_section
Update a specific section identified by heading.
```typescript
{
notePath: string,
sectionHeading: string,
newContent: string,
vaultPath?: string
}
```
### Advanced Intelligence
#### guided_path
Generate a narrative tour through linked notes starting from a seed note.
```typescript
{
notePath: string,
supportingLimit?: number, // Default: 3
counterpointLimit?: number, // Default: 3
includeActionItems?: boolean, // Default: true
vaultPath?: string
}
```
**Output:** Markdown narrative with introduction, supporting threads, counterpoints, and action items.
#### audit_recent_notes
Find recently modified notes missing frontmatter or structure.
```typescript
{
hoursBack?: number, // Default: 72
limit?: number, // Default: 25
requiredFields?: string[], // Default: ['title', 'created']
requireHeadings?: boolean, // Default: false
vaultPath?: string
}
```
#### contextual_companions
Discover notes related to a topic or seed note based on links, keywords, and recency.
```typescript
{
notePath?: string, // Optional seed note
topic?: string, // Optional topic query
limit?: number, // Default: 5
vaultPath?: string
}
```
**Note:** Must provide either `notePath` or `topic`.
#### fresh_energy
Find recently updated notes lacking backlinks or outgoing links (needing integration).
```typescript
{
hoursBack?: number, // Default: 48
limit?: number, // Default: 10
minWords?: number, // Default: 80
vaultPath?: string
}
```
#### initiative_bridge
Track project/initiative-tagged notes with outstanding tasks.
```typescript
{
initiative: string, // Required: project identifier
frontmatterField?: string, // Default: 'project'
limit?: number, // Default: 10
vaultPath?: string
}
```
#### pattern_echo
Find notes that reuse specific phrasings, bullet patterns, or framework fragments.
```typescript
{
snippet: string, // Required: text pattern to find
limit?: number, // Default: 5
vaultPath?: string
}
```
#### synthesis_ready
Detect clusters of interlinked notes that lack a summary/synthesis note.
```typescript
{
minClusterSize?: number, // Default: 3
vaultPath?: string
}
```
## Example Use Cases
### Knowledge Discovery
```javascript
// Find all notes about a topic with intelligent expansion
await intelligentSearch({ query: "machine learning" });
// Discover related notes for further reading
await contextualCompanions({
topic: "neural networks",
limit: 10
});
```
### Vault Maintenance
```javascript
// Audit recent work for missing metadata
await auditRecentNotes({
hoursBack: 168, // Last week
requiredFields: ['title', 'created', 'tags']
});
// Find orphaned notes needing links
await freshEnergy({ hoursBack: 72 });
// Identify note clusters needing synthesis
await synthesisReady({ minClusterSize: 4 });
```
### Project Management
```javascript
// Track all tasks for a specific project
await initiativeBridge({
initiative: "Project Alpha",
frontmatterField: "project"
});
// Generate a narrative overview of a topic
await guidedPath({
notePath: "Projects/Project Alpha.md",
supportingLimit: 5,
includeActionItems: true
});
```
### Pattern Analysis
```javascript
// Find notes using a specific framework
await patternEcho({
snippet: "SWOT Analysis:",
limit: 10
});
```
## Development
### Scripts
- `npm run dev`: Watch mode for development
- `npm run build`: Build TypeScript to JavaScript
- `npm run start`: Start the MCP server
### Project Structure
```
obsidian-mcp/
├── src/
│ ├── index.ts # MCP server and tool definitions
│ ├── vault-manager.ts # Vault operations and intelligence
│ └── query-processor.ts # Natural language query processing
├── dist/ # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
└── README.md
```
## Technical Details
### Architecture
- **TypeScript** with strict mode enabled
- **ES Modules** (NodeNext)
- **Zod** for runtime type validation
- **gray-matter** for frontmatter parsing
- **glob** for file pattern matching
### Search Methods
The `intelligent_search` tool combines four search strategies:
1. **Direct matching**: Exact keyword matches in content/filenames
2. **Link proximity**: Notes connected via wiki-links
3. **Tag expansion**: Related notes via tag hierarchies
4. **Structural context**: Section-aware searching with relevance scoring
Results are merged, deduplicated, and ranked by relevance score.
### Performance
- No caching - all searches are real-time to avoid staleness
- Lazy loading of note content for large vaults
- Efficient glob patterns for file discovery
## Credits
Built by Braydon with Claude (Anthropic). This MCP server was developed using test-driven development principles and extensive collaboration with Claude Code.
## License
MIT License - feel free to use and modify as needed.
## Contributing
Contributions welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Make your changes with tests
4. Submit a pull request
## Troubleshooting
### "No vault path provided" error
Ensure `OBSIDIAN_VAULT_PATH` is set in your MCP configuration or environment variables.
### MCP server not connecting
- Verify the path to `dist/index.js` is absolute, not relative
- Ensure the server is built (`npm run build`)
- Check that Node.js can execute the script
### Search returns no results
- Verify vault path is correct
- Check that `.md` files exist in the vault
- Try using `list_directories` to explore the vault structureTDQS
Scored across 17 tools
Most tools have distinct purposes, such as 'create_note' for creation, 'get_note' for retrieval, and 'append_to_note' for updates, with clear boundaries. However, some overlap exists between 'search_notes' and 'intelligent_search', where the latter's advanced features might cause confusion if an agent needs basic search functionality, but descriptions help differentiate them.
The naming is mixed, with some tools using verb_noun patterns like 'create_note' and 'update_note_section', while others use more descriptive phrases like 'contextual_companions' and 'synthesis_ready'. This inconsistency makes the set less predictable, but the names remain readable and convey intent, avoiding chaotic styles.
With 17 tools, the count is slightly high but reasonable for managing an Obsidian vault, covering operations from basic CRUD to advanced analytics and workflow management. It feels comprehensive without being overwhelming, though it borders on heavy for a note-taking domain, with some tools possibly overlapping in functionality.
The tool set provides complete coverage for note management, including creation, retrieval, updating, and deletion (implied via overwrite), along with advanced features like search, linking analysis, and workflow integration. There are no obvious gaps; agents can perform full lifecycle operations and complex queries without dead ends.