mcpField
O
obsidian-bases

obsidian-bases

github.com/davepoon生産性3.7k145 回インストール2 日前に更新
リポジトリ

obsidian-bases について

obsidian-basesは、Claude CodeでObsidian Basesファイルを作成・編集するスキルです。YAMLでノートのビュー、フィルター、数式、プロパティ、集計を設定できます。

主な機能

  1. 01.baseファイルの作成と編集
  2. 02テーブル、カード、リスト、マップビューの設定
  3. 03全体およびビュー別フィルターの定義
  4. 04数式プロパティと集計の計算

活用シーン

  1. 01タスクトラッカーやプロジェクトダッシュボードの作成
  2. 02プロパティやタグによるノート整理
  3. 03ノートの計算フィールド作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davepoon/buildwithclaude --skill obsidian-bases

インストール後、Claude Code で/obsidian-basesを入力して読み込まれたか確認します。

詳細

Obsidian Bases

このスキルを使うと、Claude Code でビュー、フィルター、数式、および関連するすべての設定を含む、有効な Obsidian Bases(.base ファイル)を作成・編集できます。

概要

Obsidian Bases は、Obsidian の保管庫内のノートを動的に表示するための、YAML ベースのファイルです。Base ファイルには、複数のビュー、グローバルフィルター、数式、プロパティ設定、カスタムサマリーを含めることができます。

このスキルを使用する場面

  • Obsidian でノートのデータベース風ビューを作成する
  • タスクトラッカー、読書リスト、プロジェクトダッシュボードを作成する
  • プロパティやタグを使ってノートをフィルタリング、整理する
  • 計算フィールドや数式フィールドを作成する
  • テーブル、カード、リスト、マップビューを設定する
  • Obsidian の保管庫内で .base ファイルを扱う

ファイル形式

Base ファイルは .base 拡張子を使用し、有効な YAML を含みます。Markdown のコードブロックに埋め込むこともできます。

完全なスキーマ

# Global filters apply to ALL views in the base
filters:
  # Can be a single filter string
  # OR a recursive filter object with and/or/not
  and: []
  or: []
  not: []

# Define formula properties that can be used across all views
formulas:
  formula_name: 'expression'

# Configure display names and settings for properties
properties:
  property_name:
    displayName: "Display Name"
  formula.formula_name:
    displayName: "Formula Display Name"
  file.ext:
    displayName: "Extension"

# Define custom summary formulas
summaries:
  custom_summary_name: 'values.mean().round(3)'

# Define one or more views
views:
  - type: table | cards | list | map
    name: "View Name"
    limit: 10                    # Optional: limit results
    groupBy:                     # Optional: group results
      property: property_name
      direction: ASC | DESC
    filters:                     # View-specific filters
      and: []
    order:                       # Properties to display in order
      - file.name
      - property_name
      - formula.formula_name
    summaries:                   # Map properties to summary formulas
      property_name: Average

フィルター構文

フィルターを使って結果を絞り込みます。グローバルまたはビューごとに適用できます。

フィルター構造
# Single filter
filters: 'status == "done"'

# AND - all conditions must be true
filters:
  and:
    - 'status == "done"'
    - 'priority > 3'

# OR - any condition can be true
filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

# NOT - exclude matching items
filters:
  not:
    - file.hasTag("archived")

# Nested filters
filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")
フィルター演算子
演算子説明
==等しい
!=等しくない
>より大きい
<より小さい
>=以上
<=以下
&&論理積
||論理和
!論理否定

プロパティ

3 種類のプロパティ
  1. ノートプロパティ - フロントマターから取得します:note.author または author
  2. ファイルプロパティ - ファイルのメタデータです:file.name、file.mtime など
  3. 数式プロパティ - 計算値です:formula.my_formula
ファイルプロパティのリファレンス
プロパティ型説明
file.nameStringファイル名
file.basenameString拡張子を除いたファイル名
file.pathStringファイルのフルパス
file.folderString親フォルダーのパス
file.extStringファイル拡張子
file.sizeNumberファイルサイズ(バイト)
file.ctimeDate作成日時
file.mtimeDate更新日時
file.tagsListファイル内のすべてのタグ
file.linksListファイル内の内部リンク
file.backlinksListこのファイルにリンクしているファイル
file.embedsListノート内の埋め込み
file.propertiesObjectすべてのフロントマタープロパティ
this キーワード
  • メインコンテンツ領域では、Base ファイル自体を指します
  • 埋め込まれている場合は、埋め込み元のファイルを指します
  • サイドバーでは、メインコンテンツ内でアクティブなファイルを指します

数式構文

数式はプロパティから値を計算します。formulas セクションで定義します。

formulas:
  # Simple arithmetic
  total: "price * quantity"

  # Conditional logic
  status_icon: 'if(done, "check", "pending")'

  # String formatting
  formatted_price: 'if(price, price.toFixed(2) + " dollars")'

  # Date formatting
  created: 'file.ctime.format("YYYY-MM-DD")'

  # Complex expressions
  days_old: '((now() - file.ctime) / 86400000).round(0)'

関数リファレンス

グローバル関数
関数シグネチャ説明
date()date(string): date文字列を日付に変換します
duration()duration(string): duration期間文字列を解析します
now()now(): date現在の日付と時刻を返します
today()today(): date現在の日付を返します(時刻は 00:00:00)
if()if(condition, trueResult, falseResult?)条件分岐します
min()min(n1, n2, ...): number最小の数値を返します
max()max(n1, n2, ...): number最大の数値を返します
number()number(any): number数値に変換します
link()link(path, display?): Linkリンクを作成します
list()list(element): Listすでにリストでない場合、リストでラップします
file()file(path): fileファイルオブジェクトを取得します
image()image(path): imageレンダリング用の画像を作成します
icon()icon(name): icon名前で Lucide アイコンを指定します
html()html(string): htmlHTML としてレンダリングします
escapeHTML()escapeHTML(string): stringHTML 文字をエスケープします
日付関数とフィールド

フィールド: date.year、date.month、date.day、date.hour、date.minute、date.second、date.millisecond

関数シグネチャ説明
date()date.date(): date時刻部分を削除します
format()date.format(string): stringMoment.js のパターンで書式設定します
time()date.time(): string時刻を文字列として取得します
relative()date.relative(): string人が読みやすい相対時間を取得します
isEmpty()date.isEmpty(): boolean日付の場合は常に false です
日付の演算
# Duration units: y/year/years, M/month/months, d/day/days,
#                 w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds

# Add/subtract durations
"date + \"1M\""           # Add 1 month
"date - \"2h\""           # Subtract 2 hours
"now() + \"1 day\""       # Tomorrow
"today() + \"7d\""        # A week from today

# Subtract dates for millisecond difference
"now() - file.ctime"

# Complex duration arithmetic
"now() + (duration('1d') * 2)"
文字列関数

フィールド: string.length

関数説明
contains(value)部分文字列が含まれているか確認します
containsAll(...values)すべての部分文字列が含まれているか確認します
containsAny(...values)いずれかの部分文字列が含まれているか確認します
startsWith(query)クエリで始まるか確認します
endsWith(query)クエリで終わるか確認します
isEmpty()空か、値が存在しないか確認します
lower()小文字に変換します
title()タイトルケースに変換します
trim()空白を削除します
replace(pattern, replacement)パターンを置換します
repeat(count)文字列を繰り返します
reverse()文字列を逆順にします
slice(start, end?)部分文字列を取得します
split(separator, n?)リストに分割します
数値関数
関数説明
abs()絶対値
ceil()切り上げ
floor()切り下げ
round(digits?)桁数を指定して丸めます
toFixed(precision)固定小数点表記に変換します
isEmpty()値が存在しません
リスト関数

フィールド: list.length

関数説明
contains(value)要素が存在するか確認します
containsAll(...values)すべての要素が存在するか確認します
containsAny(...values)いずれかの要素が存在するか確認します
filter(expression)条件で絞り込みます(value、index を使用)
map(expression)要素を変換します(value、index を使用)
reduce(expression, initial)単一の値に集約します(value、index、acc を使用)
flat()入れ子のリストを平坦化します
join(separator)文字列に結合します
reverse()順序を逆にします
slice(start, end?)サブリストを取得します
sort()昇順に並べ替えます
unique()重複を削除します
isEmpty()要素がありません
ファイル関数
関数説明
asLink(display?)リンクに変換します
hasLink(otherFile)ファイルへのリンクがあるか確認します
hasTag(...tags)いずれかのタグがあるか確認します
hasProperty(name)プロパティがあるか確認します
inFolder(folder)フォルダーまたはサブフォルダー内にあるか確認します

ビューの種類

テーブルビュー
views:
  - type: table
    name: "My Table"
    order:
      - file.name
      - status
      - due_date
    summaries:
      price: Sum
      count: Average
カードビュー
views:
  - type: cards
    name: "Gallery"
    order:
      - file.name
      - cover_image
      - description
リストビュー
views:
  - type: list
    name: "Simple List"
    order:
      - file.name
      - status
マップビュー

緯度・経度のプロパティと Maps プラグインが必要です。

views:
  - type: map
    name: "Locations"

デフォルトの集計数式

名前入力型説明
AverageNumber算術平均
MinNumber最小値
MaxNumber最大値
SumNumberすべての数値の合計
RangeNumber最大値 - 最小値
MedianNumber数学的な中央値
StddevNumber標準偏差
EarliestDate最も古い日付
LatestDate最も新しい日付
CheckedBooleantrue の値の数
UncheckedBooleanfalse の値の数
EmptyAny空の値の数
FilledAny空でない値の数
UniqueAny一意な値の数

完全な例

タスクトラッカーベース
filters:
  and:
    - file.hasTag("task")
    - 'file.ext == "md"'

formulas:
  days_until_due: 'if(due, ((date(due) - today()) / 86400000).round(0), "")'
  is_overdue: 'if(due, date(due) < today() && status != "done", false)'
  priority_label: 'if(priority == 1, "High", if(priority == 2, "Medium", "Low"))'

properties:
  status:
    displayName: Status
  formula.days_until_due:
    displayName: "Days Until Due"
  formula.priority_label:
    displayName: Priority

views:
  - type: table
    name: "Active Tasks"
    filters:
      and:
        - 'status != "done"'
    order:
      - file.name
      - status
      - formula.priority_label
      - due
      - formula.days_until_due
    groupBy:
      property: status
      direction: ASC
    summaries:
      formula.days_until_due: Average

  - type: table
    name: "Completed"
    filters:
      and:
        - 'status == "done"'
    order:
      - file.name
      - completed_date
読書リストベース
filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

formulas:
  reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
  status_icon: 'if(status == "reading", "reading", if(status == "done", "done", "to-read"))'
  year_read: 'if(finished_date, date(finished_date).year, "")'

properties:
  author:
    displayName: Author
  formula.status_icon:
    displayName: ""
  formula.reading_time:
    displayName: "Est. Time"

views:
  - type: cards
    name: "Library"
    order:
      - cover
      - file.name
      - author
      - formula.status_icon
    filters:
      not:
        - 'status == "dropped"'

  - type: table
    name: "Reading List"
    filters:
      and:
        - 'status == "to-read"'
    order:
      - file.name
      - author
      - pages
      - formula.reading_time
プロジェクトノートベース
filters:
  and:
    - file.inFolder("Projects")
    - 'file.ext == "md"'

formulas:
  last_updated: 'file.mtime.relative()'
  link_count: 'file.links.length'

summaries:
  avgLinks: 'values.filter(value.isType("number")).mean().round(1)'

properties:
  formula.last_updated:
    displayName: "Updated"
  formula.link_count:
    displayName: "Links"

views:
  - type: table
    name: "All Projects"
    order:
      - file.name
      - status
      - formula.last_updated
      - formula.link_count
    summaries:
      formula.link_count: avgLinks
    groupBy:
      property: status
      direction: ASC

  - type: list
    name: "Quick List"
    order:
      - file.name
      - status
デイリーノートインデックス
filters:
  and:
    - file.inFolder("Daily Notes")
    - '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'

formulas:
  word_estimate: '(file.size / 5).round(0)'
  day_of_week: 'date(file.basename).format("dddd")'

properties:
  formula.day_of_week:
    displayName: "Day"
  formula.word_estimate:
    displayName: "~Words"

views:
  - type: table
    name: "Recent Notes"
    limit: 30
    order:
      - file.name
      - formula.day_of_week
      - formula.word_estimate
      - file.mtime

ベースの埋め込み

Markdown ファイルに埋め込みます:

![[MyBase.base]]


![[MyBase.base#View Name]]

YAML の引用符のルール

  • 数式に二重引用符が含まれる場合は、単一引用符を使います:'if(done, "Yes", "No")'
  • 単純な文字列には二重引用符を使います:"My View Name"
  • 複雑な式に引用符を入れ子にする場合は、適切にエスケープします

よく使われるパターン

タグで絞り込む
filters:
  and:
    - file.hasTag("project")
フォルダーで絞り込む
filters:
  and:
    - file.inFolder("Notes")
日付範囲で絞り込む
filters:
  and:
    - 'file.mtime > now() - "7d"'
プロパティ値で絞り込む
filters:
  and:
    - 'status == "active"'
    - 'priority >= 3'
Combine Multiple Conditions
filters:
  or:
    - and:
        - file.hasTag("important")
        - 'status != "done"'
    - and:
        - 'priority == 1'
        - 'due != ""'

References

コメント