前記事にて、「ローカルホストのDifyからObsidian(もちろんローカルにValutがある)のファイルを読み込む・検索する」ことを考えている、と書いたが、こちらがなんとか形になったので記載しておく
TL;DR
-
Obsidian Vault REST API を使う
-
composer installして設定する - .env.exampleから複製して.envファイルを用意する
-
OBSIDIAN_VAULT_PATH=ObsidianのValutへのパスを.envファイルに追記する
-
- 導入した後
php artisan serveで起動する - 「HTTPリクエスト」ノードに
http://host.docker.internal:8000/api/notes/で始まるエンドポイントを記載して呼べるようにする- 読み込みならGETリクエスト、書き込みならPOSTリクエスト+JSONで書き込みの内容をボディに設定する
思いつき
なんか色々見てるとここでもN◯teでも「Cursor+Obsidian」とか「Claude Code+Obsidian」とかでコンテキスト与えるRAG的、Zettelkasten的なものが流行ってるな~、と思ったのが6月だったか7月だったか
これを見ながら「Difyでも行けるのでは?」と思ったのがきっかけ
Dify(ローカルホスト版)にコンテキスト与えてもっといい感じのもの用意したいとはもともと考えてたが、コンテキスト自体をどうするかに迷っていた
テキストファイルのインポートは、いちいちインポートさせるのが面倒
Notion連携も試してみたが、自分のやり方だとなんかうまくいかないし、せっかくローカル版なのでローカルでやることにこだわりたい
(※個人の感想です)
で、思い当たったのがObsidianをコンテキストにすることだった
これならローカルに置いておける、Valut上のmdファイルを更新すればそのままDifyにも反映される、でなかなかいいだろうと考えた
Dify自体も7/10にv1.6.0のリリースでMCP機能ついたことだしなんとかなるんじゃないか、と思い取り掛かることにした
…が、色々とうまくいかなかった
前記事でも書いたように、コードノードでファイル読み込みさせれば取れるんじゃないか、として試したが、制限がかかってうまく読み込めない
MCP設定も少しクセがあり、CursorやClaude Code(これらでのやり方は調べればいっぱい出てくる)みたいにはいかない

DifyのMCP設定画面
…どこに「command」入れれば?
そもそも調べれば調べるほど、Dify自体は「Web上のものに対して何かやる」方に注力して作ってるんじゃないかと思えるくらいローカルに対する操作が出てこないし制限かかってる
それでも調べてなんとかたどり着いたのがObsidian Vault REST APIだった
こちらについて読んでみると、ObsidianにHTTPSインターフェースを与えてくれる、的なことが書いてある
これでObsidianの窓口になるローカルサーバ立てて、URLで読み取り・書き込みができるようになればHTTPリクエストノードで対応できるのでは?
Obsidian Vault REST API導入
これ自体は調べればすぐ出てくる
まずはgit上にあるこのAPI自体をcloneコマンドで落としてくる
で、composerから設定する
最後にenvファイル用意して自環境に合わせればOKだ
git clone https://github.com/j-shelfwood/obsidian-local-rest-api.git
cd obsidian-local-rest-api
composer install
cp .env.example .env
このようにして用意したenvファイルに対しては、末尾に
OBSIDIAN_VAULT_PATH=ObsidianのValutへのパス
を追記して、どこが自環境のObsidian Valutなのかを明記しておく( " とかで囲わなくていい)
これだけでこのAPIは機能するようになる
あとはこのディレクトリ(ルート)で
php artisan serve
すれば、ローカルホストの8000番ポート+/api/notes/とかのエンドポイントで叩けるようになる
Dify環境(ローカルホスト版、Docker上)に合わせるために
現在の自分のローカルホストDify環境だが、過去記事に書いてあるように、Docker Desktopを立て、そこに置いている構成になる
(※過去記事だと「低スペック」と書いてあるが、実はあのあとマシン自体を新調してスペックを上げてある)
この環境が祟って、そのままではHTTPリクエストノードから叩くことができなかった
リクエストノードに http://localhost:8000/api/notes/ と記載して動かしてもうまくいかない
http://127.0.0.1:8000/api/notes/も試してみたが結果は同様
原因自体は↑の通り、ローカルといってもDokcer上の環境にあるせいで、「ローカルホスト」?のURLがこうではないところにあった
ではどうすれば?
その答え自体は、Dify立てた際にモデルプロバイダーでOllamaのLLM設定した際にもうやっていた
4.4 Ollamaの設定とDifyとの連携(オプション)
Ollamaが正常に動作していることを確認したら、Difyの設定画面でOllamaをLLMプロバイダーとして追加できます:
Difyの管理画面にログイン「Settings」→「Model Providers」に移動「Add Provider」→「Ollama」を選択エンドポイントURLを設定(通常は http://localhost:11434 または http://host.docker.internal:11434)利用可能なモデルを選択(例:llama2)
まあこの通り、http://localhost でも http://127.0.0.1 でもなく、 http://host.docker.internal がこの場合正解だったというだけである
エンドポイントURLをこれに修正して一安心
…とはいかなかった
取得結果がそのまま使えない

なんだこれは
出力結果が半角部分を除きでたらめなものになっている
どうやらそのまま取得するとUnicode変換的な感じされてしまっているようだ
(curlで同じエンドポイント叩いた際も結果が同じなので、Difyの問題ではなさそう)
全部英語でObsidian書いてる人なら問題はないだろうが、あいにくと漢字文化圏に生まれてしまい2バイト文字が手放せないので、仕方ないがもうひと手間かけるようにする
変換されてるならデコードすればいいだけだ
import json
def main(input_text: str) -> dict:
result_text = json.loads(input_text)
return {
"result": result_text["content"]
}
🤖<単にjson.loadかけてやればいいのです
とAIが答えてくれたので、こんな感じのコードを「コード」ブロックに入れて、HTTPリクエストノードの出力を変換してやる

これで人にもやさしい形になった
これにて「Obsidianからの読み込み」ができるようになった
合わせて「書き込み」も実現
書き込みをやる場合のエンドポイントはローカルホストの8000番ポート+/api/notes/upsert/対象ファイルのパスになる+リクエストはPOSTで、とのことで、エンドポイントはこのように設定する
この際、書き込む内容はボディの方に設定する必要があるので、以下のように設定してやる
{
"path": "対象ファイルのパス",
"content": "書き込む内容",
"front_matter": {
まあなんか色々できるらしい(optional)
}
}
front_matterという項目があるが、これに色々設定すればいろいろできるらしいが、今のところ用はないので省略
現状ではlast_updatedのみ設定している

こんな感じ
ちなみに upsert は"update"と"insert"を合わせたものらしく、「書き込み」としては「全更新」になり、指定したパスのファイルがすでに存在していた場合は、これまでの内容は消えて新たに書き込む内容のみになってしまうとか
そのため、「追記」したい場合は「読み込み」で内容取得してからテンプレートノードで既存部分と追記部分合体してから書き込ませるとかの工夫が必要になる
なにはともあれ、これで「Obsidianからの書き込み」も同様に実現可能となった
完了:ファイルパス指定での単一ファイルへのread/writeのみ…
これで、
- 「DifyからObsidianのファイルを読み込む」
- 「DifyからObsidianのファイルを作成/更新する」
は実現できるようになった
ただ、↑にも書いてるようにあくまで「単一ファイルへの処理」「ファイルパスを指定する必要がある」という点がネックであり、できることは限定される
ここからさらに、「Valutを検索して指定の内容を拾ってくる」あたりは必要になってくる
だが、ともかく1ヶ月くらい悩んだものが実現できたので一旦はOK!
0→1ができたんで、あとは1を2とか10とか50とかにしていくだけなのでそこまで難しくないはず 10倍だぞ10倍!
