Obsidian Tools MCP Server
# 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
Scored across 16 tools
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.
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.
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.
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.