Obsidianに調査・実装内容などをまとめてくれるClaude Agent Skills
はじめに
先日、ClaudeからAgent Skillsが発表されましたね。
sub-agentやカスタムスラッシュコマンドがある中で、使い道がないか模索していたのですが、ClaudeCodeでやりとりした内容をObsidianにまとめてくれるskillsを作ったので、共有しようと思います。
使っている様子は以下になります。
Goについて回答してもらった内容を「obsidianにまとめて」と命令したら、skillsが起動して、Obsidianにまとめてもらって出力しているところです。

気になる方は、下に実装方法と使い方を記載していますので、そのまま読み進めてください。
必要な環境
- Claude Code(Agent Skills対応版)
- Obsidian
- macOS / Linux(シェルスクリプト実行環境)
実装手順
1. ディレクトリ構成
まず、Claude Codeのスキルディレクトリに以下の構成でファイルを作成します:
skills
└── save-to-obsidian
├── scripts
│ └── save-to-obsidian.sh
├── categories.txt
└── SKILL.md
-
SKILL.md: スキルの定義ファイル(Claude Codeがスキルを認識するため) -
scripts/save-to-obsidian.sh: 実際の保存処理を行うシェルスクリプト -
categories.txt: カテゴリー定義ファイル(カスタマイズ可能)
2. スキル定義ファイル(SKILL.md)の作成
~/.claude/skills/save-to-obsidian/SKILL.md を作成し、以下の内容を記述します:
環境変数という項目がSKILL.mdの中にありますが、ここは、自身のObsidianのパスに書き換えてください。
`OBSIDIAN_DIR`: Obsidianディレクトリパス(デフォルト: ~/Workspace/Document/obsidian)
---
name: save-to-obsidian
description: 調査・実装した内容をObsidianに学習用ノートとして保存するスキル。「後で学習したい」「後で振り返り用にまとめたい」「Obsidianに保存」「学習メモとして残したい」などと言ったときに起動する。
---
# Save to Obsidian
調査・実装した内容をObsidianに学習用ノートとして保存するスキル
## 使用方法
調査・実装した内容を以下の手順で保存:
1. **コンテンツを分析**してカテゴリーとタグを決定
2. **スクリプトに引数として渡して実行**
### カテゴリー選択ロジック
コンテンツの文脈から、`categories.txt`で定義されたカテゴリーから**最適な1つ**を選択。
#### カテゴリーファイル (`categories.txt`)
カテゴリーは外部ファイルで管理され、容易に追加・削除が可能:
```txt
# Obsidian学習ノートのカテゴリー設定
# 1行1カテゴリー、#で始まる行はコメント
カテゴリー名
```
**カテゴリーの追加方法**:
1. `~/.claude/skills/save-to-obsidian/categories.txt`を編集
2. 新しい行にカテゴリー名を追加
3. スクリプトが自動的に新カテゴリーを認識
### タグ生成ロジック
コンテンツから**動的に細かいタグ**を3-5個生成:
- 具体的なAPI名、ライブラリ名
- 技術概念、パターン名
- 関連する重要なキーワード
### スクリプト呼び出し形式
```bash
bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
"<タイトル>" \
"<カテゴリー>" \
"<タグ1> <タグ2> <タグ3>" \
<<'EOF'
<マークダウン形式のコンテンツ>
EOF
```
### 実行例
```bash
# React Hooksの学習内容を保存
bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
"useStateとuseEffectによる状態管理" \
"React" \
"#Hooks #useState #useEffect #状態管理" \
<<'EOF'
## 概要
React Hooksを使った状態管理の実装パターン
## 学んだこと
- useStateの基本的な使い方
- useEffectでの副作用管理
...
EOF
```
## 機能
1. **LLMによる自動分類**: コンテンツから最適なカテゴリーを選択
2. **動的タグ生成**: コンテンツから具体的で細かいタグを自動生成
3. **適切なディレクトリ配置**: `Learning/カテゴリー名/`配下に保存
4. **意味のあるファイル名**: タイトルから生成
5. **検索最適化**: タグ付きMarkdown形式で保存
## 出力先
ファイルは以下のディレクトリ構造で保存:
```
$OBSIDIAN_DIR/Learning/
└── カテゴリー名/
```
## 実行スクリプト
`save-to-obsidian.sh`
## 環境変数
- `OBSIDIAN_DIR`: Obsidianディレクトリパス(デフォルト: ~/Workspace/Document/obsidian)
3. 保存スクリプト(save-to-obsidian.sh)の作成
~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh を作成し、以下の内容を記述します:
#!/bin/bash
# Obsidianへの学習内容保存スクリプト
# 基本設定
OBSIDIAN_DIR="/path/to/your/obsidian"
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
# スクリプトのディレクトリを取得
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CATEGORIES_FILE="$SCRIPT_DIR/../categories.txt"
# グローバル変数: カテゴリーリスト
declare -a VALID_CATEGORIES
# 関数: カテゴリーファイルを読み込む
load_categories() {
if [ ! -f "$CATEGORIES_FILE" ]; then
echo "エラー: カテゴリーファイルが見つかりません: $CATEGORIES_FILE" >&2
exit 1
fi
# コメント行と空行を除いてカテゴリーを読み込む
while IFS= read -r line || [ -n "$line" ]; do
# コメント行と空行をスキップ
[[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
VALID_CATEGORIES+=("$line")
done < "$CATEGORIES_FILE"
if [ ${#VALID_CATEGORIES[@]} -eq 0 ]; then
echo "エラー: カテゴリーファイルにカテゴリーが定義されていません" >&2
exit 1
fi
}
# 関数: カテゴリーバリデーション
validate_category() {
local category="$1"
local found=0
for valid_cat in "${VALID_CATEGORIES[@]}"; do
if [ "$category" = "$valid_cat" ]; then
found=1
break
fi
done
if [ $found -eq 1 ]; then
echo "$category"
else
echo "エラー: 無効なカテゴリーです: $category" >&2
echo "有効なカテゴリー: $(IFS=', '; echo "${VALID_CATEGORIES[*]}")" >&2
echo ""
fi
}
# 関数: ファイル名の生成
create_filename() {
local title="$1"
# タイトルからファイル名に使えない文字を除去
local safe_title
safe_title=$(echo "$title" | sed 's/[^a-zA-Z0-9ぁ-んァ-ヶー一-龠々〆〤 _-]//g' | sed 's/ /_/g')
echo "${safe_title}.md"
}
# 関数: Markdownファイルの生成
create_markdown() {
local title="$1"
local tags="$2"
local content="$3"
cat << EOF
$tags
# $title
## 概要
本日の学習内容のまとめ
## 詳細
$content
## 重要ポイント
-
## 今後の課題
-
## 参考リンク
-
## メモ
-
---
*作成日時: $TIMESTAMP*
EOF
}
# メイン処理
main() {
local title="$1"
local category="$2"
local tags="$3"
local content=""
# カテゴリーファイルを読み込む
load_categories
# 引数チェック
if [ -z "$title" ] || [ -z "$category" ] || [ -z "$tags" ]; then
echo "エラー: 引数が不足しています"
echo "使用方法: $0 <タイトル> <カテゴリー> <タグ>"
echo ""
echo "カテゴリー: $(IFS=', '; echo "${VALID_CATEGORIES[*]}")"
echo "タグ例: \"#Hooks #useState #useEffect\""
exit 1
fi
# カテゴリーのバリデーション
local validated_category
validated_category=$(validate_category "$category")
if [ -z "$validated_category" ]; then
exit 1
fi
# 標準入力から内容を読み取る
if [ ! -t 0 ]; then
content=$(cat)
else
content="ここに学習内容を記載"
fi
# ディレクトリパスの生成(Learningディレクトリ配下)
local target_dir="$OBSIDIAN_DIR/Learning/$validated_category"
# ディレクトリが存在しない場合は作成
if [ ! -d "$target_dir" ]; then
mkdir -p "$target_dir"
echo "ディレクトリを作成しました: $target_dir"
fi
# ファイル名の生成
local filename
filename=$(create_filename "$title")
local filepath="$target_dir/$filename"
# ファイルが既に存在する場合の処理
if [ -f "$filepath" ]; then
echo "警告: ファイルが既に存在します: $filepath"
read -p "上書きしますか? (y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "処理を中断しました"
exit 0
fi
fi
# Markdownファイルの生成と保存
create_markdown "$title" "$tags" "$content" > "$filepath"
# 結果の表示
echo "✅ ファイルを保存しました:"
echo " 場所: $filepath"
echo " カテゴリー: $validated_category"
echo " タグ: $tags"
# Obsidianで開くか確認(macOSの場合)
if [[ "$OSTYPE" == "darwin"* ]]; then
read -p "Obsidianで開きますか? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
open "obsidian://open?path=$filepath"
fi
fi
}
# スクリプトの実行
main "$@"
4. カテゴリー定義ファイル(categories.txt)の作成
~/.claude/skills/save-to-obsidian/categories.txt を作成し、以下の内容を記述します:
# Obsidian学習ノートのカテゴリー設定
# 1行1カテゴリー、#で始まる行はコメント
AI
React
Nextjs
TypeScript
Rust
Go
デザインパターン
フロントエンド
技術
開発手法
カスタマイズのポイント:
- 1行1カテゴリーで記述
-
#で始まる行はコメント扱い - 自分の学習分野に合わせて自由にカテゴリーを追加・削除可能
- カテゴリー名は日本語・英語どちらでも使用可能
5. スクリプトに実行権限を付与
作成したスクリプトに実行権限を付与します:
chmod +x ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh
このスキルの仕組み
LLMによる自動分類とタグ生成
このスキルの最大の特徴は、Claude Code(LLM)が調査・実装内容を分析して、最適なカテゴリーとタグを自動生成する点です。
カテゴリー選択の流れ
- Claude Codeが会話の内容を分析
-
categories.txtで定義されたカテゴリーの中から、最も適切なものを1つ選択 - 選択したカテゴリーに基づいてディレクトリを決定
タグ生成の流れ
- 会話の内容から技術的なキーワードを抽出
- 具体的なAPI名、ライブラリ名、概念、パターン名などから3-5個のタグを生成
- Obsidian内での検索性を高めるための最適なタグセットを構築
例えば、React Hooksに関する調査内容であれば:
-
カテゴリー:
React(categories.txtから選択) -
タグ:
#Hooks #useState #useEffect #状態管理 #副作用(動的生成)
スクリプトの呼び出し形式
Claude Codeは以下の形式でスクリプトを呼び出します:
bash ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh \
"<タイトル>" \
"<カテゴリー>" \
"<タグ1> <タグ2> <タグ3>" \
<<'EOF'
<マークダウン形式のコンテンツ>
EOF
使い方
基本的な使い方
Claude Codeで調査や実装を行った後、以下のフレーズで自動的にスキルが起動します:
- 「後で学習したい」
- 「後で振り返り用にまとめたい」
- 「Obsidianに保存」
- 「学習メモとして残したい」
実際の使用例
例1:React Hooksについて調査した後
ユーザー: 「この内容を後で学習できるようにObsidianに保存して」
Claude: 調査内容を分析しています...
- カテゴリー: React(categories.txtから選択)
- タグ: #Hooks #useState #useEffect #状態管理
- タイトル: React Hooksによる状態管理
Obsidianに保存します...
✅ ファイルを保存しました:
場所: ~/Workspace/Document/obsidian/Learning/React/React_Hooksによる状態管理.md
カテゴリー: React
タグ: #Hooks #useState #useEffect #状態管理
例2:TypeScriptのジェネリクスについて実装した後
ユーザー: 「今の実装内容を学習メモとして残したい」
Claude: 実装内容を分析しています...
- カテゴリー: TypeScript(categories.txtから選択)
- タグ: #Generics #型パラメータ #型推論 #型安全性
- タイトル: TypeScriptジェネリクスの実装パターン
Obsidianに保存します...
✅ ファイルを保存しました:
場所: ~/Workspace/Document/obsidian/Learning/TypeScript/TypeScriptジェネリクスの実装パターン.md
カテゴリー: TypeScript
タグ: #Generics #型パラメータ #型推論 #型安全性
生成されるMarkdownファイルの構成
保存されるファイルには、以下の構成で情報が整理されます:
#動的に生成されたタグ
# タイトル
## 概要
本日の学習内容のまとめ
## 詳細
(Claude Codeとのやりとりで得られた内容)
## 重要ポイント
-
## 今後の課題
-
## 参考リンク
-
## メモ
-
---
*作成日時: YYYY-MM-DD HH:MM:SS*
カテゴリーのカスタマイズ
categories.txtを編集することで、自分の学習分野に合わせたカテゴリーを追加できます:
例:新しいカテゴリー「機械学習」を追加する場合
# Obsidian学習ノートのカテゴリー設定
AI
React
Nextjs
TypeScript
機械学習 # 新規追加
Rust
Go
デザインパターン
フロントエンド
技術
開発手法
カテゴリーを追加すると、Claude Codeが自動的に新しいカテゴリーを認識し、適切な内容を分類してくれます。
注意点・ハマりどころ
1. categories.txtファイルの存在確認
スクリプトはcategories.txtファイルが存在しないとエラーになります。以下のエラーが出る場合は、ファイルの存在と配置を確認してください:
# エラー例
エラー: カテゴリーファイルが見つかりません: ~/.claude/skills/save-to-obsidian/categories.txt
# 解決方法
# 1. ファイルが存在するか確認
ls ~/.claude/skills/save-to-obsidian/categories.txt
# 2. 存在しない場合は作成
cat > ~/.claude/skills/save-to-obsidian/categories.txt << 'EOF'
# Obsidian学習ノートのカテゴリー設定
AI
React
TypeScript
技術
EOF
2. カテゴリーのバリデーション
スクリプトはcategories.txtに定義されていないカテゴリーを受け取ると、エラーを表示します。
Claude Codeが適切なカテゴリーを選択しますが、万が一エラーが発生した場合は:
# エラー例
エラー: 無効なカテゴリーです: Python
有効なカテゴリー: AI, React, Nextjs, TypeScript, Rust, Go, デザインパターン, フロントエンド, 技術, 開発手法
# 解決方法
# categories.txtに新しいカテゴリーを追加
echo "Python" >> ~/.claude/skills/save-to-obsidian/categories.txt
3. Obsidianディレクトリパスの確認
スクリプトのデフォルトパスは ~/Workspace/Document/obsidian にしているので、異なる場所にObsidianのVaultがあると思いますので、スクリプト内の OBSIDIAN_DIR の値を直接変更してください。
#!/bin/bash
# Obsidianへの学習内容保存スクリプト
# 基本設定
OBSIDIAN_DIR="/path/to/your/obsidian"
4. スクリプトの実行権限
スクリプトに実行権限がないと動作しません。以下のエラーが出る場合は権限を確認してください:
# 権限エラーの例
Permission denied: ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh
# 解決方法
chmod +x ~/.claude/skills/save-to-obsidian/scripts/save-to-obsidian.sh
まとめ
Claude CodeのAgent Skillsを使ってObsidianに学習内容を自動保存する仕組みを作成しました。
このスキルのメリット
- 自動分類: LLMが会話内容を理解して最適なカテゴリーを選択
- 動的タグ生成: 内容に応じて具体的で細かいタグを3-5個自動生成
- 振り返りが容易: 調査や実装の内容が構造化されたMarkdownとして残るので、後から見返しやすい
- 検索性の向上: 適切なタグが自動付与されるので、Obsidian内での検索や関連ノートの発見が簡単
- 学習の習慣化: 「Obsidianに保存して」と言うだけで記録が残るので、学習内容の記録が習慣化しやすい
-
柔軟なカスタマイズ:
categories.txtを編集するだけで、自分の学習分野に合わせたカテゴリーを追加可能
活用シーン
このスキルは以下のようなシーンで特に役立ちます:
- 技術調査: 新しいライブラリやフレームワークの調査内容を自動分類して記録
- 実装パターン: 実装時に学んだテクニックやパターンを具体的なタグ付きで保存
- トラブルシューティング: エラー解決方法やデバッグ手順を検索しやすい形で記録
- 学習記録: コードレビューや技術記事から学んだポイントを整理
- 知識の蓄積: 技術記事や公式ドキュメントの要点を構造化して保存
Claude CodeとObsidianを組み合わせることで、日々の開発で得た知識を効率的に蓄積できる環境が整いました。自動分類で柔軟で知識管理が可能になります。ぜひ試してみてください!
Discussion