mcp obsidian
MCP server to interact with Obsidian via the Local REST API community plugin.
MCP server to interact with Obsidian via the Local REST API community plugin.
MCP server to interact with Obsidian via the Local REST API community plugin.
The server implements multiple tools to interact with Obsidian:
Its good to first instruct Claude to use Obsidian. Then it will always call the tool.
The use prompts like this: - Get the contents of the last architecture call note and summarize them - Search for all files where Azure CosmosDb is mentioned and quickly explain to me the context in which it is mentioned - Summarize the last meeting notes and put them into a new note 'summary meeting.md'. Add an introduction so that I can send it via email.
There are two ways to configure the environment with the Obsidian REST API Key.
{
"mcp-obsidian": {
"command": "uvx",
"args": [
"mcp-obsidian"
],
"env": {
"OBSIDIAN_API_KEY":"<your_api_key_here>"
}
}
.env
file in the working directory with the following required variable:OBSIDIAN_API_KEY=your_api_key_here
Note: You can find the key in the Obsidian plugin config.
You need the Obsidian REST API community plugin running: https://github.com/coddingtonbear/obsidian-local-rest-api
Install and enable it in the settings and copy the api key.
On MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
On Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"mcp-obsidian": {
"command": "uv",
"args": [
"--directory",
"<dir_to>/mcp-obsidian",
"run",
"mcp-obsidian"
]
}
}
}
{
"mcpServers": {
"mcp-obsidian": {
"command": "uvx",
"args": [
"mcp-obsidian"
],
"env": {
"OBSIDIAN_API_KEY" : "<YOUR_OBSIDIAN_API_KEY>"
}
}
}
}
To prepare the package for distribution:
uv sync
Since MCP servers run over stdio, debugging can be challenging. For the best debugging experience, we strongly recommend using the MCP Inspector.
You can launch the MCP Inspector via npm
with this command:
npx @modelcontextprotocol/inspector uv --directory /path/to/mcp-obsidian run mcp-obsidian
Upon launching, the Inspector will display a URL that you can access in your browser to begin debugging.
You can also watch the server logs with this command:
tail -n 20 -f ~/Library/Logs/Claude/mcp-server-mcp-obsidian.log
[
{
"description": "Lists all files and directories that exist in a specific Obsidian directory.",
"inputSchema": {
"properties": {
"dirpath": {
"description": "Path to list files from (relative to your vault root). Note that empty directories will not be returned.",
"type": "string"
}
},
"required": [
"dirpath"
],
"type": "object"
},
"name": "obsidian_list_files_in_dir"
},
{
"description": "Lists all files and directories in the root directory of your Obsidian vault.",
"inputSchema": {
"properties": {},
"required": [],
"type": "object"
},
"name": "obsidian_list_files_in_vault"
},
{
"description": "Return the content of a single file in your vault.",
"inputSchema": {
"properties": {
"filepath": {
"description": "Path to the relevant file (relative to your vault root).",
"format": "path",
"type": "string"
}
},
"required": [
"filepath"
],
"type": "object"
},
"name": "obsidian_get_file_contents"
},
{
"description": "Simple search for documents matching a specified text query across all files in the vault. n Use this tool when you want to do a simple text search",
"inputSchema": {
"properties": {
"context_length": {
"default": 100,
"description": "How much context to return around the matching string (default: 100)",
"type": "integer"
},
"query": {
"description": "Text to a simple search for in the vault.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "obsidian_simple_search"
},
{
"description": "Insert content into an existing note relative to a heading, block reference, or frontmatter field.",
"inputSchema": {
"properties": {
"content": {
"description": "Content to insert",
"type": "string"
},
"filepath": {
"description": "Path to the file (relative to vault root)",
"format": "path",
"type": "string"
},
"operation": {
"description": "Operation to perform (append, prepend, or replace)",
"enum": [
"append",
"prepend",
"replace"
],
"type": "string"
},
"target": {
"description": "Target identifier (heading path, block reference, or frontmatter field)",
"type": "string"
},
"target_type": {
"description": "Type of target to patch",
"enum": [
"heading",
"block",
"frontmatter"
],
"type": "string"
}
},
"required": [
"filepath",
"operation",
"target_type",
"target",
"content"
],
"type": "object"
},
"name": "obsidian_patch_content"
},
{
"description": "Append content to a new or existing file in the vault.",
"inputSchema": {
"properties": {
"content": {
"description": "Content to append to the file",
"type": "string"
},
"filepath": {
"description": "Path to the file (relative to vault root)",
"format": "path",
"type": "string"
}
},
"required": [
"filepath",
"content"
],
"type": "object"
},
"name": "obsidian_append_content"
},
{
"description": "Complex search for documents using a JsonLogic query. n Supports standard JsonLogic operators plus 'glob' and 'regexp' for pattern matching. Results must be non-falsy.nn Use this tool when you want to do a complex search, e.g. for all documents with certain tags etc.n ",
"inputSchema": {
"properties": {
"query": {
"description": "JsonLogic query object. Example: {"glob": ["*.md", {"var": "path"}]} matches all markdown files",
"type": "object"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "obsidian_complex_search"
},
{
"description": "Return the contents of multiple files in your vault, concatenated with headers.",
"inputSchema": {
"properties": {
"filepaths": {
"description": "List of file paths to read",
"items": {
"description": "Path to a file (relative to your vault root)",
"format": "path",
"type": "string"
},
"type": "array"
}
},
"required": [
"filepaths"
],
"type": "object"
},
"name": "obsidian_batch_get_file_contents"
}
]