Skip to main content
Glama
asann3
by asann3
README.md
# obsidian-vault-mcp

ディスク上の Obsidian Vault を直接読み書きする MCP サーバー。Obsidian アプリを起動しておく必要はない。
読み書き・検索に加えて、`[[wikilink]]` のグラフ探索(バックリンク、N-hop 近傍、未解決リンク、孤立ノート)を提供する。

- TypeScript / 公式 MCP SDK v2(仕様 2026-07-28 と 2025 系の両方に対応)
- Streamable HTTP(Bearer トークン)と stdio
- Node.js 24+ で `node src/main.ts` として直接実行できる。Claude Desktop 用には依存を同梱した `.mcpb`(デスクトップ拡張)も作れる

## 使い方

### Claude Desktop(デスクトップ拡張 / ネットワークに何も公開しない)

```bash
pnpm install && pnpm pack:mcpb     # obsidian-vault-mcp.mcpb ができる
```

生成された `.mcpb` を Claude Desktop の **Settings > Extensions** にドラッグして、インストールする。設定画面で Vault のフォルダを選ぶ。
初期値は**読み取り専用**なので、書き込ませたいときは「Read-only」をオフにする(「Writable folders」で書き込めるフォルダも限定できる)。

### Claude Code(ローカル、stdio)

```bash
claude mcp add --scope user obsidian --env OBSIDIAN_VAULT_PATH=$HOME/vault --env OBSIDIAN_MCP_READONLY=1 -- node /path/to/obsidian-vault-mcp/src/main.ts --stdio
```

### Claude Code(リモートのサーバーへ HTTP で接続)

下の「サーバーへのデプロイ」を参照。

## 構成(サーバーに常駐させる場合)

```
[各端末の Obsidian] ⇄ CouchDB
                          ⇅  livesync-cli daemon(E2EE v2・パス難読化に対応)
                     /srv/vault(平文のミラー)
                          ↑ 読み書き
                     obsidian-vault-mcp  127.0.0.1:8787
                          ↑ HTTPS のリバースプロキシ(tailscale serve、Caddy など)
                   Claude Code / その他 MCP クライアント
```

MCP での書き込みは livesync-cli がファイル監視で拾い、CouchDB 経由で各端末に配信する。

## ツール

| 種別 | ツール | 内容 |
|---|---|---|
| 読み取り | `list_notes` | フォルダ内のノートを更新日時の新しい順に一覧 |
| | `read_note` | 本文を読む。見出しセクションだけ読む、ページングも可。編集用の `hash` を返す |
| | `get_note_info` | frontmatter・タグ・エイリアス・見出し構成・リンク数 |
| | `search_notes` | 全文検索(AND、大文字小文字区別なし、日本語可)または正規表現。フォルダ・タグで絞り込み |
| | `list_tags` | タグと件数 |
| グラフ | `resolve_link` | `[[リンク]]` がどのファイルに解決されるか |
| | `get_backlinks` | このノートへのリンク元と該当行。リンクされていない言及も任意で取得 |
| | `get_outgoing_links` | 発リンクとその解決先(wiki / markdown / 埋め込み / frontmatter) |
| | `graph_neighbors` | BFS で N-hop 近傍(in / out / both) |
| | `find_unresolved_links` | 存在しないノートへのリンクを、リンク先ごとにまとめる |
| | `find_orphans` | どこからもリンクされていないノート |
| 書き込み | `write_note` | 新規作成(上書きには `overwrite=true` が必要) |
| | `append_to_note` | ノート末尾、または見出しセクションの末尾に追記 |
| | `edit_section` | 見出しセクションの置換・先頭挿入・末尾挿入(`"親 > 子"` 指定可) |
| | `replace_in_note` | 完全一致の置換(出現回数が一致しなければ失敗する) |
| | `update_frontmatter` | プロパティの追加・削除(コメントや他のキーは保持) |

ノートの指定は、パス(`folder/note.md`)・ノート名(`Note Name`)・エイリアスのどれでもよい。

### 安全策

- `.obsidian/` など `.` で始まるパスは読み書きとも不可(LiveSync の認証情報を守るため)。Vault 外への脱出(`..` やシンボリックリンク)も拒否する
- 書き込めるのは `.md` だけ。`OBSIDIAN_MCP_WRITE_PATHS` でフォルダを限定できる。`CLAUDE.md` / `AGENTS.md` は常に書き込み不可
- 編集系ツールは楽観ロックを行う。読み込み後にノートが変わっていたら失敗する(`expected_hash` を渡すと `read_note` の時点を基準にできる)
- 書き込みは隠し一時ファイルに書いてから rename する(アトミック)
- 削除と移動のツールは**意図的に実装していない**。livesync-cli の `mirror` はディスク上の削除を反映せず、ファイルを復元してしまうため(削除は `livesync-cli rm` で行う)

### リンク解決のルール(Obsidian 準拠)

- `folder/Note` はパスの完全一致、なければ末尾一致
- 素の `Note` は同じフォルダ → ルートに近いもの → 浅いパスの順で優先。候補が複数あるときは `ambiguous` として列挙する
- `./` `../` は相対パスとして解決する。`#見出し` と `#^block` は subpath として保持する
- `[[エイリアス]]` はグラフ上は未解決として扱う(Obsidian と同じ)。ツール引数でノートを指定するときだけエイリアスでも引ける
- コードブロック、インラインコード、`%%コメント%%`、`<!-- -->`、`$$数式$$` の中のリンクとタグは無視する

## 開発

```bash
pnpm install
pnpm test          # ユニットテスト + HTTP 経由の e2e
pnpm typecheck
OBSIDIAN_VAULT_PATH=~/vault OBSIDIAN_MCP_READONLY=1 pnpm start
```

## サーバーへのデプロイ

以下は Debian / Ubuntu 系の Linux を想定。LiveSync の CouchDB に到達できる場所に置く。

### 1. Node.js 24 以上とユーザーの用意

```bash
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo bash - && sudo apt-get install -y nodejs git curl
sudo useradd --system --create-home --home-dir /var/lib/obsidian --shell /bin/bash obsidian
sudo mkdir -p /srv/vault && sudo chown obsidian: /srv/vault
```

### 2. livesync-cli(CouchDB から /srv/vault へのミラー)

Self-hosted LiveSync プラグインの作者(vrtmrz)が同じリポジトリ(`vrtmrz/obsidian-livesync` の `src/apps/cli`)で公開している CLI を使う(Obsidian 公式のツールではない)。`livesync-bridge` は E2EE 環境で復号に失敗する不具合が未解決なので使わない。

```bash
sudo -iu obsidian
git clone https://github.com/vrtmrz/obsidian-livesync.git ~/obsidian-livesync
cd ~/obsidian-livesync && bash src/apps/cli/deploy/install.sh --vault /srv/vault
```

他の端末の Obsidian で「Self-hosted LiveSync → Setup → Copy the current settings to a setup URI」を実行し、Setup URI を作る。それを CLI に取り込む(パスフレーズは標準入力で渡す)。

```bash
livesync-cli /srv/vault setup "obsidian://setuplivesync?settings=..."
```

- **E2EE のパスフレーズは他の端末と完全に一致させる**こと。違っていても警告なしに同期が壊れる。パス難読化も同じパスフレーズから導出される
- 最初は CouchDB への書き込みを避け、`livesync-cli /srv/vault mirror` を一回だけ実行して `/srv/vault` の中身を確認するのが安全
- 一時ファイルを確実に除外するため、`/srv/vault/.livesync/ignore` に次を書いておく

  ```
  .*.tmp
  ```

### 3. obsidian-vault-mcp

```bash
sudo git clone https://github.com/asann3/obsidian-vault-mcp.git /opt/obsidian-mcp
cd /opt/obsidian-mcp && sudo corepack enable && sudo pnpm install --prod
sudo cp deploy/obsidian-mcp.env.example /etc/obsidian-mcp.env && sudo chmod 600 /etc/obsidian-mcp.env
sudo sed -i "s/^OBSIDIAN_MCP_TOKEN=.*/OBSIDIAN_MCP_TOKEN=$(openssl rand -hex 32)/" /etc/obsidian-mcp.env
sudoedit /etc/obsidian-mcp.env                 # ALLOWED_HOSTS を公開するホスト名に
sudo cp deploy/obsidian-mcp.service /etc/systemd/system/
sudo systemctl daemon-reload && sudo systemctl enable --now obsidian-mcp
curl -s localhost:8787/healthz
```

### 4. HTTPS で公開する

サーバーは `127.0.0.1` だけで待ち受ける。TLS はリバースプロキシで終端する。Tailscale なら次のとおり。

```bash
sudo tailscale serve --bg 8787
tailscale serve status        # https://<ホスト名>/ → 127.0.0.1:8787
```

### 5. クライアント登録(Claude Code)

```bash
claude mcp add --transport http --scope user obsidian https://<ホスト名>/mcp --header "Authorization: Bearer <TOKEN>"
```

## claude.ai / スマホから使う場合

claude.ai のコネクタは、Anthropic のクラウドからサーバーに接続する。そのため、インターネットから届く URL(Tailscale Funnel など)が必要になる。認証は次のどちらか。

- **リクエストヘッダー方式(ベータ)**:コネクタの追加画面で、認証を「サインインなし」にして、`authorization: Bearer <トークン>` を登録する。このサーバーの Bearer 認証がそのまま使える。この項目が表示されないアカウントもある
- **OAuth 2.1**:未実装。`OAuthTokenVerifier` を差し替えて、PRM / AS メタデータ、PKCE、CIMD または DCR を実装する必要がある

公開するときは、読み取り専用にするか `OBSIDIAN_MCP_WRITE_PATHS` で書き込み先を絞ること。