# 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 structure