WSLからWindows-Obsidianに接続するObsidian MCP

# はじめに
Obsidian × Cursorが話題になっていたので試したくてやってみました。
途中で気づいたけどCursorからmdファイルをいい感じに編集できればいいだけでもしかしてmcpを設定しなくてもやりたいことは達成できたかもしれないということに気づいたけど時すでに遅し...

プロジェクト内のことをいろいろまとめてーって言ったら勝手にObsidianに書いてくれることを期待しようと思います

## 注意
ファイアーウォールいじったりObsidian local REST APIのBinding Hostを0.0.0.0とかにして外部公開したりしてます。セキュリティ的に問題がありそうなので設定は自己責任でお願いします

# 選んだmcpサーバー
Obsidianのmcpサーバーは執筆時点の自分が調べた限り2種類あります。

- [MarkusPfundsteinのmcpサーバー](https://github.com/MarkusPfundstein/mcp-obsidian)
- [smithery-aiのmcpサーバー](https://github.com/smithery-ai/mcp-obsidian)

今回は`MarkusPfundstein`のmcpサーバーを使います。`Obsidian local REST API`を使用してより高度な検索やファイルの読み書きができて自由度が高かったです

`smithery-ai`のmcpサーバーを最初に試してみましたが、ローカルディレクトリのファイルを読み込む方式で`read_notes`と`search_notes`の2種類しかAPIがなかったです。自分はコードで詰まったところをObsidianにまとめてもらって書き込みして欲しかったので見送りました。

ただし、こちらのほうが簡単に設定できたのでファイルが読み込めればいいだけの人はこちら推奨です。書き込み権限って怖いですしね

# 環境構築
## Windows上の操作
### Obsidian local REST APIの設定
#### pluginのinstall
設定 > Community plugins > Community plugins-Browseから「Local REST API」を検索＆インストールして有効化
一番下にLocal REST APIが表示されるのでAPI Keyなどを確認する

#### 詳細設定
WSLからの接続に必要な追加設定を行う
- `Settings`の`Enable Non-encrypted(HTTP) Server`をオンにする
    - WSLからの接続確認のためだけなので後でオフにする
- `Show advanced settings`をオンにし、`Binding Host`を`0.0.0.0`にする。これをすることでWSL側からもアクセスすることができる

### Windows FireWallの設定
WSLからWindowsホストへのアクセスは外部からのアクセスとして認識されるのでファイアーウォールの設定をしてポートを開けておく
- 「ファイアウォールの状態と確認」を開く
- Windows Defenderファイアーウォールを介したアプリまたは機能を許可
- 「許可されたアプリおよび機能」の中から`obsidian.exe`を探しチェックを入れる

## WSL上での操作
### WindowsホストのIPの確認
WSLから見たWindowsはlocalhostではなく外部接続になるのでWindows側のIPを調べておく
```
$ ip route show | grep -i default | awk '{print $3}'
```

### WSLからObsidian local REST APIの接続確認
設定しておいたhttpの方のポートでObsidian local REST APIが動かせるかどうか確認する
疎通確認が出来たらGUI上でObsidianを開いて`Enable Non-encrypted(HTTP) Server`の設定はオフにしておく
```
$ curl http://{WINDOWS_HOST_IP}:27123
```

### mcp-obsidianリポジトリのクローン
[リポジトリ](https://github.com/smithery-ai/mcp-obsidian)のREADMEを見るとuvxを使ったやり方もあるが、なぜか環境変数が設定されずHost IPがデフォルトの`127.0.0.1`を見に行ってしまったのでcloneしてローカル実行する方法をとりました。
uvも必要なのでインストールしていない人はインストールしておきましょう

```
$ git clone git@github.com:MarkusPfundstein/mcp-obsidian.git
$ cd mcp-obsidian

# ディレクトリパスをmcp.jsonに保存するので確認しておく
$ pwd
```

https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_1


### Cursor上での設定
#### mcp.jsonにmcp serverを設定
ここまででいろいろ確認したものを記載していく
```
{
  "mcpServers": {
    "mcp-obsidian": {
      "command": "uv",
      "env": {
        "OBSIDIAN_API_KEY": "{Obsidian local REST APIに書いてあるAPI_KEY}",
        "OBSIDIAN_HOST": "{WSLで確認したWindowsのIP}
      },
      "args": [
        "--directory",
        "{WSL上でクローンしたリポジトリのパス}",
        "run",
        "mcp-obsidian"
      ]
    }
  }
}
```

## 動作確認
WSL上で動いているディレクトリをCursor経由で接続し、Chatからmcp試してみてとプロンプト実行して、うまく読み込めればOKです
勝手にファイルとか作られてすごい&怖いって感じでした。消されるの怖いのでGit使おうかな

## おまけ
### smithery-aiのmcpサーバーの動かし方
wslから見たObsidianのVaultがあるパスを書いておく
※npxが使えるようにしておく
```
{
  "mcpServers": {
    "mcp-obsidian": {
      "command": "npx",
        "args": [
        "-y",
        "@smithery/cli@latest",
        "run",
        "mcp-obsidian",
        "--config",
        "\"{\\\"vaultPath\\\":\\\"/mnt/c/Users/{User名}/{ObsidianのVault名}/\\\"}\""
      ]
    }
  }
}
```

## おわりに
「xxxってタグのついたファイル探してー」とかプロンプトで投げたら情報とってきてくれていい感じでした。接続テストとか言ってテスト用ファイル作ったり消したりされたときはファイル消されていないか焦りましたけど

AIの挙動を見ているとファイル名が一番検索しやすそうだったので、内部のタグよりもディレクトリ構造やファイル名をちゃんとつけておくことがmcpからObsidianを使うコツなのかもしれないですねー

トラブルシューティングのディレクトリとか作って、プロジェクトではまったエラーとかさっとまとめて検索できる世界観になったらいいなー

## 参考文献
https://note.com/iam_shin/n/nb29cea186412

https://zenn.dev/d0ne1s/scraps/22640ebccd4e06

https://learn.microsoft.com/ja-jp/windows/wsl/networking#mirrored-mode-networking