Skip to main content
Glama
sureshsankaran

Obsidian Tools MCP Server

README.md
# Obsidian Tools MCP Server

An extended MCP (Model Context Protocol) server for Obsidian with full CRUD operations and advanced note management capabilities.

## Features

### Core Operations
- **create_note** - Create new notes with nested folder support
- **delete_note** - Delete notes from your vault
- **update_note** - Replace entire note content
- **append_to_note** - Append content to end of notes
- **prepend_to_note** - Prepend content (respects frontmatter)
- **rename_note** - Move/rename notes

### Search & Discovery
- **read_note** - Read single note content
- **search_notes** - Search by filename (supports regex)
- **search_content** - Full-text search in note contents
- **list_folder** - List notes and subfolders

### Links & Tags
- **get_tags** - Extract all tags from a note
- **get_links** - Get all wikilinks and markdown links
- **get_backlinks** - Find notes linking to a specific note

### Advanced Operations
- **insert_at_heading** - Insert content under a specific heading
- **update_frontmatter** - Modify YAML frontmatter properties
- **create_from_template** - Create notes from templates with variable substitution

## Installation

### Prerequisites
- Node.js 18+
- An Obsidian vault

### Setup

```bash
# Clone the repository
git clone https://github.com/yourusername/obsidian-tools-mcp.git
cd obsidian-tools-mcp

# Install dependencies
npm install

# Build the project
npm run build
```

## Configuration

### For VS Code / GitHub Copilot

Add to your VS Code settings (`settings.json`):

```json
{
  "mcp": {
    "servers": {
      "obsidian-tools": {
        "command": "node",
        "args": ["/path/to/obsidian-tools-mcp/dist/index.js"],
        "env": {
          "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault"
        }
      }
    }
  }
}
```

### For Claude Desktop

Add to your Claude config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "obsidian-tools": {
      "command": "node",
      "args": ["/path/to/obsidian-tools-mcp/dist/index.js"],
      "env": {
        "OBSIDIAN_VAULT_PATH": "/path/to/your/obsidian/vault"
      }
    }
  }
}
```

### Environment Variables

| Variable | Description | Required |
|----------|-------------|----------|
| `OBSIDIAN_VAULT_PATH` | Absolute path to your Obsidian vault | Yes |

You can also pass the vault path as a command-line argument:

```bash
node dist/index.js /path/to/your/vault
```

## Usage Examples

### Create a New Note

```
Create a note at "Projects/My Project.md" with content about project planning
```

### Search and Update

```
Find all notes containing "TODO" and append a completion timestamp
```

### Template-Based Creation

```
Create a new meeting note from the template at "Templates/Meeting.md" 
with title "Q4 Planning Session"
```

### Frontmatter Management

```
Update the frontmatter of "My Note.md" to add tags: ["project", "important"]
```

## Tool Reference

### create_note
Create a new note in the vault.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path relative to vault root |
| content | string | Yes | Markdown content |
| overwrite | boolean | No | Overwrite if exists (default: false) |

### delete_note
Delete a note from the vault.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |

### update_note
Replace the entire content of a note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |
| content | string | Yes | New content |

### append_to_note
Append content to the end of a note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |
| content | string | Yes | Content to append |
| separator | string | No | Separator before content (default: "\n\n") |

### prepend_to_note
Prepend content to a note (after frontmatter if present).

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |
| content | string | Yes | Content to prepend |
| separator | string | No | Separator after content (default: "\n\n") |

### rename_note
Move or rename a note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| oldPath | string | Yes | Current path |
| newPath | string | Yes | New path |

### search_notes
Search notes by filename pattern.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| query | string | Yes | Search pattern (regex supported) |
| limit | number | No | Max results (default: 20) |

### search_content
Search for text within note contents.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| query | string | Yes | Text to search for |
| caseSensitive | boolean | No | Case sensitivity (default: false) |
| limit | number | No | Max results (default: 20) |

### get_tags
Get all tags from a note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |

### get_links
Get all internal links from a note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |

### get_backlinks
Find all notes linking to a specific note.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |

### insert_at_heading
Insert content under a specific heading.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |
| heading | string | Yes | Heading text to find |
| content | string | Yes | Content to insert |
| position | "start" \| "end" | No | Where to insert (default: "end") |

### update_frontmatter
Update YAML frontmatter properties.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| path | string | Yes | Path to the note |
| properties | object | Yes | Key-value pairs (use null to delete) |

### create_from_template
Create a note from a template.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| templatePath | string | Yes | Path to template note |
| newPath | string | Yes | Path for new note |
| variables | object | No | Template variable substitutions |

**Built-in template variables:**
- `{{date}}` - Current date (YYYY-MM-DD)
- `{{time}}` - Current time (HH:MM:SS)
- `{{datetime}}` - ISO datetime

## Development

```bash
# Watch mode for development
npm run dev

# Build
npm run build

# Run directly
npm start
```

## License

MIT

TDQS

A3.6/5.0

Scored across 16 tools

Disambiguation5/5

Every tool has a clearly distinct purpose targeting specific operations on notes or vault structure. For example, 'append_to_note' and 'prepend_to_note' handle content addition at different positions, while 'search_content' and 'search_notes' differentiate between text and name searches, avoiding overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with snake_case, such as 'create_note', 'delete_note', 'read_note', and 'update_note'. This uniformity makes the tool set predictable and easy to navigate for agents.

Tool Count5/5

With 16 tools, the server provides comprehensive coverage for Obsidian vault management, including CRUD operations, content manipulation, search, and metadata handling. This count is well-scoped for the domain, offering a rich set without being overwhelming.

Completeness5/5

The tool set offers complete lifecycle coverage for note management, including creation, reading, updating, deletion, renaming, content editing, frontmatter updates, linking, tagging, and search. No obvious gaps exist; agents can perform all essential Obsidian workflows seamlessly.

Maintenance

ActivityInactive
ResponsivenessNo issues