# MCP server for Obsidian MCP server to interact with Obsidian via the Local REST API community plugin. server for Obsidian MCP server ## Components ### Tools The server implements multiple tools to interact with Obsidian: - list_files_in_vault: Lists all files and directories in the root directory of your Obsidian vault - list_files_in_dir: Lists all files and directories in a specific Obsidian directory - get_file_contents: Return the content of a single file in your vault. - search: Search for documents matching a specified text query across all files in the vault - patch_content: Insert content into an existing note relative to a heading, block reference, or frontmatter field. - append_content: Append content to a new or existing file in the vault. - delete_file: Delete a file or directory from your vault. ### Example prompts 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. ## Requirements - Python >= 3.11 - `mcp` Python SDK `>=1.1.0,<2.0.0` (pinned in `pyproject.toml`). `mcp-obsidian` currently registers its tool handlers via the `mcp` 1.x low-level `Server` API (`@app.list_tools()` / `@app.call_tool()`), which was removed in `mcp` 2.0. Installing with an unconstrained `mcp>=2.0` will crash at import with `AttributeError: 'Server' object has no attribute 'list_tools'`. ## Configuration ### Obsidian REST API Key There are two ways to configure the environment with the Obsidian REST API Key. 1. Add to server config (preferred) ```json { "mcp-obsidian": { "command": "uvx", "args": [ "mcp-obsidian" ], "env": { "OBSIDIAN_API_KEY": "", "OBSIDIAN_HOST": "", "OBSIDIAN_PORT": "" } } } ``` Sometimes Claude has issues detecting the location of uv / uvx. You can use `which uvx` to find and paste the full path in above config in such cases. 2. Create a `.env` file in the working directory with the following required variables: ``` OBSIDIAN_API_KEY=your_api_key_here OBSIDIAN_HOST=your_obsidian_host OBSIDIAN_PORT=your_obsidian_port ``` Note: - You can find the API key in the Obsidian plugin config - Default port is 27124 if not specified - Default host is 127.0.0.1 if not specified ## Quickstart ### Install #### Obsidian REST API 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. #### Claude Desktop On MacOS: `~/Library/Application\ Support/Claude/claude_desktop_config.json` On Windows: `%APPDATA%/Claude/claude_desktop_config.json`
Development/Unpublished Servers Configuration ```json { "mcpServers": { "mcp-obsidian": { "command": "uv", "args": [ "--directory", "/mcp-obsidian", "run", "mcp-obsidian" ], "env": { "OBSIDIAN_API_KEY": "", "OBSIDIAN_HOST": "", "OBSIDIAN_PORT": "" } } } } ```
Published Servers Configuration ```json { "mcpServers": { "mcp-obsidian": { "command": "uvx", "args": [ "mcp-obsidian" ], "env": { "OBSIDIAN_API_KEY": "", "OBSIDIAN_HOST": "", "OBSIDIAN_PORT": "" } } } } ```
## Docker You can run the server in a container instead of installing `uv`/Python locally. 1. Copy `.env.example` to `.env` and fill in your Obsidian REST API key: ```bash cp .env.example .env ``` By default `OBSIDIAN_HOST` is set to `host.docker.internal`, which resolves to your host machine from inside the container (works on Linux, Mac and Windows). 2. Build the image: ```bash docker compose build ``` 3. Point your MCP client at the container. Since MCP speaks JSON-RPC over stdio, the client must run it with stdin attached and no pseudo-TTY — use `docker compose run --rm -T`, not `docker compose up`: ```json { "mcpServers": { "mcp-obsidian": { "command": "docker", "args": [ "compose", "-f", "/mcp-obsidian/docker-compose.yml", "run", "--rm", "-T", "mcp-obsidian" ] } } } ``` You can also run it manually to sanity-check the container starts: ```bash docker compose run --rm -T mcp-obsidian ``` (it will sit waiting for a JSON-RPC message on stdin; Ctrl+C to exit) ## Development ### Building To prepare the package for distribution: 1. Sync dependencies and update lockfile: ```bash uv sync ``` ### Debugging Since MCP servers run over stdio, debugging can be challenging. For the best debugging experience, we strongly recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector). You can launch the MCP Inspector via [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) with this command: ```bash 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: ```bash tail -n 20 -f ~/Library/Logs/Claude/mcp-server-mcp-obsidian.log ```