ObsidianのvaultをCLAUDE.mdにつなぐ3つの方法|symlink・同期スクリプト・部分抽出
Obsidianに書いた設計メモをClaude Codeに毎回貼り直す手間を消す。symlink・同期スクリプト・必要箇所だけ抽出する3つのつなぎ方を、Windows対応のコード付きで比較します。
Obsidianに「このプロジェクトの設計方針」を3000字くらいで書いてあるのに、Claude Codeを開くたびに同じことを口で説明している自分に気づいたんです。
しかも説明するたびに微妙に内容がブレる。Obsidian側のメモはどんどん更新しているのに、Claude Codeに渡している文脈は2週間前の口頭説明のまま。これじゃ知識ベースを持っている意味がない。
問題は「メモが足りない」ことじゃなくて、Obsidianのvault(ノートをためる保管庫)とClaude Codeが読むCLAUDE.mdが、別々の場所で生きていることでした。この記事はその2つをつなぐ「配線」の話に絞ります。毎日のメモの取り方や運用フローは別記事に分けてあるので、ここでは「どうつなぐか」だけを濃く扱います。
この記事の要点
- Claude CodeはプロジェクトのルートにあるCLAUDE.mdを毎回読む。Obsidianのvaultはそのままだと読まれない。だから両者を物理的につなぐ必要がある。
- つなぎ方は3つ。symlink(一本道で直結)/同期スクリプト(必要なメモだけコピー)/部分抽出(@importで該当ファイルだけ参照)。
- Windowsのsymlinkは管理者権限か開発者モードが要る。普通のPC利用者なら同期スクリプトか
@importが安全。 - vault全体をそのまま渡すのは事故のもと。CLAUDE.mdは200行以下を目安に、永続ルールだけを置く。
- 古い前提を消さないと、Claude Codeは2週間前の方針を律儀に守り続ける。週1の棚卸しがセット。
毎日のメモ運用そのもの(どう書きためて、どう判断を残すか)は姉妹記事のObsidianメモをCLAUDE.mdに変える運用にまとめました。この記事は「つなぐ仕組み」担当です。
まず仕組みを1枚で理解する
つなぎ方を選ぶ前に、Claude Code側のルールを押さえておくと迷いません。Claude Codeは公式ドキュメント(How Claude remembers your project)のとおり、起動時にいくつかの場所からCLAUDE.mdを読み込みます。プロジェクトでよく使うのはこの2か所です。
| 場所 | パス | 役割 |
|---|---|---|
| プロジェクト | ./CLAUDE.md または ./.claude/CLAUDE.md | チームで共有する規約。gitに入れる。 |
| ユーザー | ~/.claude/CLAUDE.md | 全プロジェクト共通の個人設定。 |
Obsidianのvaultは、この一覧のどこにも入っていません。だから何もしなければ永遠に読まれない。やることは単純で、vaultのどこかにある「Claude Codeに渡したい中身」を、上のどれかのパスに届けるだけです。その届け方が3通りある、というのが今日の本題です。
ひとつ大事な前提を先に言うと、CLAUDE.mdは「絶対に守られる設定」ではありません。公式も「context(文脈)であって強制ではない」と書いています。つまり長く書くほど薄まる。だから3つのどの方法を選んでも、渡すのは永続ルールだけ・200行以下という原則は共通です。
方法1: symlink で直結する(一番シンプル)
vault内のファイルをCLAUDE.mdとして「同じ実体」に見せるのがsymlink(シンボリックリンク)です。ファイルをコピーするんじゃなくて、CLAUDE.mdという名前から実体のメモへ一本道を通すイメージ。vault側を編集すれば、Claude Codeが読むCLAUDE.mdも同時に最新になります。コピー忘れが構造的に起きません。
macOS / Linux なら一行です。ln -s は公式ドキュメントでもAGENTS.mdをつなぐ例として紹介されている、由緒正しいやり方です。
# vault内のプロジェクト設計メモを、プロジェクトのCLAUDE.mdとして直結する
ln -s ~/ObsidianVault/projects/myapp.md ~/code/myapp/CLAUDE.md
ただしWindowsには落とし穴があります。symlinkの作成には管理者権限か「開発者モード」が必要で、普通の状態だと作れません。PowerShellで作るならこうです。
# 開発者モードONか、管理者権限のPowerShellで実行する
New-Item -ItemType SymbolicLink `
-Path "C:\code\myapp\CLAUDE.md" `
-Target "C:\Users\me\ObsidianVault\projects\myapp.md"
symlinkが向いているのは、「1つのvaultファイル=1プロジェクトの規約」がきれいに対応する場合です。逆に、複数のメモから一部ずつ寄せ集めたいときや、Windowsで権限を上げたくないときは、次の同期スクリプトのほうが楽です。
方法2: 同期スクリプトで必要なメモだけ集める
現実のvaultって、1ファイルに全部まとまってはいないですよね。「コーディング規約」「禁止事項」「デプロイ手順」が別々のノートに散らばっている。これを1本のCLAUDE.mdに束ねたいなら、必要なファイルだけ拾って結合する小さなスクリプトを書きます。
ここでのコツは、Obsidianのメモにマーカーを仕込んでおくこと。**僕は規約として残したい段落の前後を<!-- claude:start -->と<!-- claude:end -->で挟んでいます。**こうすると、私的なブレストや下書きは混ぜず、「Claude Codeに見せると決めた部分」だけを抽出できます。
そのまま動かせるNode.jsのスクリプトがこれです。指定したノートから挟まれた部分だけを抜き出して、CLAUDE.mdを組み立てます。
// sync-claude-md.mjs : Obsidianの指定ノートから "claude:start〜end" の部分だけ集めてCLAUDE.mdを作る
import { readFile, writeFile } from "node:fs/promises";
import path from "node:path";
const VAULT = "/Users/me/ObsidianVault"; // 自分のvaultの絶対パスに変える
const OUT = "./CLAUDE.md";
// 集めたいノート(vaultからの相対パス)。順番がそのまま見出しの並びになる
const NOTES = [
"projects/myapp/conventions.md",
"projects/myapp/forbidden.md",
"projects/myapp/deploy.md",
];
// <!-- claude:start --> 〜 <!-- claude:end --> に挟まれた部分だけ抜き出す
function extractMarked(text) {
const re = /<!--\s*claude:start\s*-->([\s\S]*?)<!--\s*claude:end\s*-->/g;
const blocks = [];
let m;
while ((m = re.exec(text)) !== null) blocks.push(m[1].trim());
return blocks.join("\n\n");
}
const sections = [];
for (const note of NOTES) {
const full = await readFile(path.join(VAULT, note), "utf8");
const marked = extractMarked(full);
if (marked) sections.push(marked);
else console.warn(`マーカーなし(スキップ): ${note}`);
}
const header = `<!-- 自動生成: Obsidian vault から同期。直接編集せず元ノートを直すこと -->\n`;
const body = sections.join("\n\n---\n\n");
await writeFile(OUT, `${header}\n${body}\n`, "utf8");
console.log(`CLAUDE.md を更新しました(${sections.length}件のノートから)`);
実行はこれだけ。
node sync-claude-md.mjs
毎回手で叩くのが面倒なら、コミット前に走らせる手もあります。package.jsonに登録しておけば、npm run sync:claudeの一発です。Obsidian側のメモを直す→同期→コミット、という流れが固定されると、文脈のズレがほぼ消えます。
この方法の良いところは、「見せる」「見せない」を段落単位で自分が決められること。クライアント名や個人的な愚痴メモが混じる心配がありません。symlinkみたいに権限の壁もないので、Windowsでもそのまま動きます。
方法3: @import でvaultのファイルを参照する
3つ目は、コピーも結合もせず、CLAUDE.mdから別ファイルを「参照」させる方法です。Claude CodeのCLAUDE.mdは@path/to/fileという記法で他のファイルを読み込めます。公式ドキュメントによると、相対パスは「importを書いたファイルの位置」を基準に解決され、参照先は起動時にまとめて文脈へ展開されます。
たとえばこう書きます。
# このプロジェクトのルール
技術スタックと禁止事項は別ファイルにまとめています。
- 規約: @docs/conventions.md
- 禁止事項: @../ObsidianVault/projects/myapp/forbidden.md
vault側のファイルを直接@で指せるので、symlinkを張らなくても中身を引っぱれます。ただし注意点が2つ。1つ目、参照先も結局すべて起動時に読み込まれるので、巨大ファイルを指すと文脈を食いつぶします。importは「整理」には効くけど「軽量化」にはなりません。2つ目、プロジェクト外のファイルを初めて参照すると、Claude Codeが承認ダイアログを出します。そこで拒否すると以後importが無効になるので、最初の一回だけ意識しておきましょう。
importが向くのは、「規約は別ファイルで管理したいが、ファイルは分けたまま見通しよく束ねたい」ケースです。逆に言えば、vaultのメモにそのままClaude Code宛ての文章が書いてあることが前提になります。下書きと混在しているなら、方法2の抽出のほうが安全です。
3つのつなぎ方、どれを選ぶ?
迷ったらこの表で決めてください。僕の結論を先に言うと、普段は方法2(同期スクリプト+マーカー)が一番事故らないです。symlinkは対応がきれいなときだけ、importは規約が初めから整っているときだけ。
| 方法 | 更新の手間 | 抜き出し | Windows | 向いている人 |
|---|---|---|---|---|
| symlink | 自動(編集即反映) | できない(丸ごと) | 権限が要る | 1ファイル=1規約が対応する人 |
| 同期スクリプト | node一発 | 段落単位でできる | そのまま動く | メモが散らばっている人 |
| @import | 自動(参照) | ファイル単位 | そのまま動く | 規約が既に整っている人 |
どれを選んでも共通の鉄則があります。vault全体をそのまま渡さない。 CLAUDE.mdは200行以下が目安で、超えると指示の通りが落ちます。永続ルール(コマンド、禁止事項、ディレクトリ構成、「常にXする」系)だけを置き、手順が長いものや一部のフォルダでしか効かないものは入れない。このあたりの「何を書かないか」はCLAUDE.mdは何を書かないかで決まるに詳しくまとめてあります。
僕がやらかした失敗3つ
正直に書くと、最初のセットアップは全部やらかしました。
ひとつ目は、vaultをまるごとsymlinkしたこと。「全部見せれば賢く動くだろう」と思って、200ファイル入ったフォルダを丸ごとつないだら、Claude Codeが半年前のボツ企画メモを「これが方針ですね」と真顔で守り始めました。文脈は多いほど良いわけじゃない。むしろノイズが増えるだけでした。
ふたつ目は、**同期したことを忘れて自動生成されたCLAUDE.mdを直接編集したこと。**次に同期スクリプトを走らせた瞬間、僕の手編集はきれいに上書きされて消えました。だから今は冒頭に「直接編集せず元ノートを直すこと」というコメントを必ず入れています(上のスクリプトにも入れてあります)。
みっつ目は、**棚卸しをサボったこと。**Obsidian側で「やっぱりこの規約やめよう」と決めても、同期し直さなければCLAUDE.mdには古い方針が残ったまま。Claude Codeはそれを律儀に守ります。今は週1回、元ノートを見直して同期を回す、を固定にしています。
よくある質問
Q. ObsidianのvaultとClaude Codeのプロジェクトフォルダは同じ場所にすべき?
A. しなくて大丈夫です。むしろ別々のほうが普通です。symlinkや@importでvaultの絶対パスを指せば、離れた場所のメモでもCLAUDE.mdに届きます。同期スクリプトならvaultのパスを変数で指定するだけです。
Q. vault全部をCLAUDE.mdに入れたらダメ? A. やめたほうがいいです。CLAUDE.mdは長いほど守られにくくなり、公式も200行以下を目安にと書いています。下書きや古いメモまで渡すと、Claude Codeが古い前提で動きます。渡すのは永続ルールだけに絞ってください。
Q. Windowsでsymlinkが作れません。
A. symlinkの作成には管理者権限か開発者モードが要ります。上げたくないなら方法2(同期スクリプト)か方法3(@import)を使ってください。どちらも普通の権限でそのまま動きます。
Q. CLAUDE.mdとAGENTS.mdの両方を使いたい。
A. Claude Codeが読むのはCLAUDE.mdだけです。AGENTS.mdを併用しているなら、CLAUDE.mdの先頭に@AGENTS.mdと書いてimportすれば、両方のツールが同じ中身を読めます。
Q. 毎回のメモの取り方や運用ルールはどこで学べる? A. この記事は「つなぎ方」専門なので、日々どうメモを書きためてClaude Codeに渡す判断を残すかは、姉妹記事のObsidianメモをCLAUDE.mdに変える運用を読んでください。
実際に試した結果
3つ全部を自分のプロジェクトで試して、最終的に落ち着いたのは「方法2(マーカー付き同期スクリプト)+週1棚卸し」でした。
symlinkは更新が自動で気持ちいいんですが、vault側のメモに下書きが混ざるとそのまま漏れるのが怖い。importは整った規約ファイルがあれば最高ですが、僕のvaultは思いつきメモと規約がごちゃ混ぜだったので、結局「見せる部分だけ抜く」抽出が一番性に合っていました。
効果はわかりやすくて、Claude Codeを開いて最初に方針を説明する時間がほぼゼロになりました。説明のたびに内容がブレることもなくなった。ズレが出たときも「あ、同期し忘れた」とすぐ原因が特定できます。賢いプロンプトを毎回打ち込むより、vaultとCLAUDE.mdを一本つないでおくほうが、結局ずっと速いというのが今の実感です。
権限まわりやコミット前の検証をもう一段ちゃんとしたい人は、痛点別に設定例を並べたCLAUDE.md×権限の実用レシピが地続きで役に立ちます。手を動かす前の足場づくりとして、教材一覧もどうぞ。
無料PDF: Claude Code はじめてのチートシート
まずは無料PDFで基本コマンドと最初の使い方をまとめて確認してください。登録後はそのままテンプレート集や導入相談にも進めます。
スパムは送りません。登録情報は厳重に管理します。
Claude Codeを仕事で使える形にしませんか?
無料PDFで基礎を固めたあと、すぐ使えるテンプレート集で試し、必要なら業務自動化や導入相談まで進められます。
この記事を書いた人
Masa
Claude Codeの実務活用、導入設計、収益導線改善を検証しているエンジニア。10言語の技術メディアを運営中。
関連書籍・参考図書
この記事のテーマに関連する書籍を楽天ブックスで探せます。
※ 当サイトは楽天市場のアフィリエイトプログラムに参加しています。上記リンクから商品をご購入いただくと、運営者に紹介料が支払われる場合があります。
関連記事
バグに遭遇した時の動き方: 観察→再現→切り分け→記録→報告のランブック
不具合に当たったとき、何から手をつけるか。観察・再現・切り分け・記録・報告の順に動くランブックを、Claude Codeに渡せる形で具体例とコード付きで紹介。
Claude Code 権限はデプロイ前のどこで点検する? CIで機械的に止めるゲート設計
Claude Codeの権限点検は「いつ」やるかで事故率が変わる。デプロイ前のゲートをCIに組み込み、危険な操作を機械的に止める手順を、コピペで動く設定つきで紹介します。
無料PDFでメールリストを増やす導線の作り方|登録率とチェックリスト公開
無料PDF(リードマグネット)で集客しメールリストから有料教材へつなぐ導線を、claudecode-lab.comでの登録数・登録率の実数とコピペできるフォローメール込みで解説。