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
# 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):
{
"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):
{
"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:
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
# Watch mode for development
npm run dev
# Build
npm run build
# Run directly
npm start
License
MIT