obsidian-mcp
A focused Model Context Protocol server that gives local AI clients controlled filesystem access to an Obsidian vault. It runs over stdio, works without the Obsidian application or a REST plugin, and supports read-only operation.
Use it to: search notes, read Markdown, browse folders, and optionally create, update, move, or delete notes from any stdio-capable MCP client.
Why Obsidian MCP?
- Local by design: no HTTP server, API token, or Obsidian plugin.
- Vault-contained paths: resolved paths and symbolic links cannot escape the configured vault root.
- Read-only mode: one environment variable disables every write tool.
- Small surface area: ten predictable tools backed by ordinary Markdown files.
- Fast search: uses ripgrep when available, with a pure-Python fallback.
[!CAUTION] The configured MCP client can read every Markdown note in the selected vault. Start with
OBSIDIAN_READ_ONLY=1, and review your model provider's data-handling policy before exposing sensitive notes.
Quick Start
Requirements: Python 3.11 or newer and uv.
The package is published to PyPI as trsdn-obsidian-mcp (the PyPI name
obsidian-mcp is taken by an unrelated project). The import name and the
console command stay obsidian_mcp / obsidian-mcp.
export OBSIDIAN_VAULT_PATH="/path/to/your/Obsidian vault"
export OBSIDIAN_READ_ONLY=1
# run without installing
uvx --from trsdn-obsidian-mcp obsidian-mcp
# or install it
pip install trsdn-obsidian-mcp
obsidian-mcp
The server communicates over stdio and is normally started by an MCP client, not from an interactive terminal.
Client Setup
Replace /path/to/your/Obsidian vault in the examples below.
VS Code
Add the server to .vscode/mcp.json:
{
"servers": {
"obsidian": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"trsdn-obsidian-mcp",
"obsidian-mcp"
],
"env": {
"OBSIDIAN_VAULT_PATH": "/path/to/your/Obsidian vault",
"OBSIDIAN_READ_ONLY": "1"
}
}
}
}
Claude Desktop
Add the server under mcpServers in Claude Desktop's configuration:
{
"mcpServers": {
"obsidian": {
"command": "uvx",
"args": [
"--from",
"trsdn-obsidian-mcp",
"obsidian-mcp"
],
"env": {
"OBSIDIAN_VAULT_PATH": "/path/to/your/Obsidian vault",
"OBSIDIAN_READ_ONLY": "1"
}
}
}
}
From a local checkout
git clone https://github.com/trsdn/obsidian-mcp.git
cd obsidian-mcp
uv sync --locked --no-dev
uv run obsidian-mcp
Restart the client after changing its MCP configuration.
Configuration
| Variable | Required | Default | Description |
|---|---|---|---|
OBSIDIAN_VAULT_PATH |
Yes | None | Absolute path to an existing Obsidian vault |
OBSIDIAN_READ_ONLY |
No | 0 |
Set to 1, true, or yes to disable write tools |
Read-only mode blocks write_note, append_note, move_note, and
delete_note. All paths passed to tools are relative to the configured vault.
Available Tools
| Tool | Access | Purpose |
|---|---|---|
vault_info |
Read | Return vault path, access mode, and Markdown file count |
list_notes |
Read | List Markdown files under a folder |
list_folders |
Read | List subfolders |
read_note |
Read | Read a note |
search_filename |
Read | Match text or a regular expression against note paths |
search_content |
Read | Search note bodies with text or a regular expression |
write_note |
Write | Create or overwrite a note |
append_note |
Write | Append content, creating the note when necessary |
move_note |
Write | Rename or move a note within the vault |
delete_note |
Write | Delete a note |
Security Model
Obsidian MCP trusts the local process that starts it. It does not provide authentication, user-level authorization, sandboxing, or network controls. Path validation keeps MCP tool operations inside the selected vault, but it cannot restrict another local process that already has filesystem access.
For safer operation:
- Use only MCP clients you trust.
- Start with
OBSIDIAN_READ_ONLY=1. - Consider a dedicated vault for AI-assisted workflows.
- Protect the vault with normal operating-system permissions and backups.
See SECURITY.md for the full security policy and private vulnerability reporting process.
Development
uv sync --locked --all-groups
uv run ruff check .
uv run ruff format --check .
uv run pytest --cov=obsidian_mcp --cov-fail-under=85
uv build
Tests use temporary directories and never require a real Obsidian vault. CI runs on Python 3.11, 3.12, 3.13, and 3.14.
Project
Licensed under the MIT License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file trsdn_obsidian_mcp-0.1.2.tar.gz.
File metadata
- Download URL: trsdn_obsidian_mcp-0.1.2.tar.gz
- Upload date:
- Size: 7.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99c9f2304c046a15895da0c4a2fd8dcd301d9891621806cc8575fef235e8b9ef
|
|
| MD5 |
0dafacb0462a7f90263f6a03522c3305
|
|
| BLAKE2b-256 |
cc0a40710a789ff8d1fed56f574e2dba1e55cfb5bb858beee66aa21c2c3ccb9f
|
Provenance
The following attestation bundles were made for trsdn_obsidian_mcp-0.1.2.tar.gz:
Publisher:
release.yml on trsdn/obsidian-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trsdn_obsidian_mcp-0.1.2.tar.gz -
Subject digest:
99c9f2304c046a15895da0c4a2fd8dcd301d9891621806cc8575fef235e8b9ef - Sigstore transparency entry: 2582027582
- Sigstore integration time:
-
Permalink:
trsdn/obsidian-mcp@6235dad6e4e035a22b7aee4843bc73e9d852c92d -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/trsdn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6235dad6e4e035a22b7aee4843bc73e9d852c92d -
Trigger Event:
push
-
Statement type:
File details
Details for the file trsdn_obsidian_mcp-0.1.2-py3-none-any.whl.
File metadata
- Download URL: trsdn_obsidian_mcp-0.1.2-py3-none-any.whl
- Upload date:
- Size: 8.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
602ac479225471cea6afa6e9b948888d8809e960cf374759bfe89eeac419580d
|
|
| MD5 |
0bc6f5a867bba574c9c38ac68116abac
|
|
| BLAKE2b-256 |
b812682dca5d8b82ff40cb64d606a44fa68a49b204c2916b64e4f77792635305
|
Provenance
The following attestation bundles were made for trsdn_obsidian_mcp-0.1.2-py3-none-any.whl:
Publisher:
release.yml on trsdn/obsidian-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
trsdn_obsidian_mcp-0.1.2-py3-none-any.whl -
Subject digest:
602ac479225471cea6afa6e9b948888d8809e960cf374759bfe89eeac419580d - Sigstore transparency entry: 2582027587
- Sigstore integration time:
-
Permalink:
trsdn/obsidian-mcp@6235dad6e4e035a22b7aee4843bc73e9d852c92d -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/trsdn
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6235dad6e4e035a22b7aee4843bc73e9d852c92d -
Trigger Event:
push
-
Statement type: