Obsidianでミニマムな自作プラグインを動かす

Obsidianを使っています。定期的に「自作プラグインを作りたい」と思います。で技術的なことを調べて試作を作って動かし、それをメモするの忘れます。そして再び「自作プラグインを作りたい」と思って調べ直すことをしています。もう3回目です。

ちょっと良い加減、調べ直すの嫌なので、ミニマムなハンズオンかつ私が動作確認済みのものをここに書いておきます。次はこの上に積み上げる形で進めていきたい。

概要

サンプルプラグインの挙動はこうです。

  • Obsidianで左側のメニューにボタンが表示される。
  • これを押すと、開いてるノートのプロパティに何か書き込む。

将来的に何がやりたいかというと、ノートの内容をLLMに渡してプロパティを自動生成させたいです。とりあえずLLM部分はなんとでもなるので一旦、Obsidian部分を作ります。

以下を動かしました。

Claudeによると、Obsidianプラグインの最小構成は manifest.json と main.js の2ファイルだけとのことです。で、ビルド不要のプレーンJSで作る、いちばん手数の少ない手順とのこと。

以下の手順を動かしたところ、実際に動きました。

手順

  1. Vaultの .obsidian/plugins/ 配下にフォルダを作ります。
    1. 例: <Vault>/.obsidian/plugins/my-prop-button/
  2. そのフォルダに manifest.jsonmain.js を作ります。
    1. コードは末尾に記載します。
  3. Obsidianで自作プラグインを有効化します。
    1. まず、設定 → コミュニティプラグイン で制限モードをオフにする。再起動。
    2. プラグイン一覧に出てくる「My Prop Button」を有効化する。
  4. 左のリボンに鉛筆アイコンが出るので、ノートを開いた状態でクリックする。
    1. ノートのフロントマターに reviewed: 2026-06-11T... が書き込まれる

なお、正式なプラグインを作る場合は、この最小版で動きを確認した後に公式の obsidian-sample-plugin テンプレートへ移行するのがオススメとのこと。

公式の開発ドキュメントはこちら

付録

manifest.json

{
  "id": "my-prop-button",
  "name": "My Prop Button",
  "version": "0.0.1",
  "minAppVersion": "1.4.0",
  "description": "開いているノートのプロパティに書き込むサンプル",
  "author": "me",
  "isDesktopOnly": false
}
Code language: JSON / JSON with Comments (json)

main.js

const { Plugin, Notice } = require("obsidian");

module.exports = class MyPropButtonPlugin extends Plugin {
  async onload() {
    // 左サイドのリボンにボタンを追加
    this.addRibbonIcon("pencil", "プロパティに書き込む", async () => {
      await this.writeProperty();
    });

    // コマンドパレットからも実行できるようにしておく(任意)
    this.addCommand({
      id: "write-property",
      name: "開いているノートのプロパティに書き込む",
      callback: async () => {
        await this.writeProperty();
      },
    });
  }

  async writeProperty() {
	// 今開いているノートのファイルを取得
    const file = this.app.workspace.getActiveFile();
    if (!file) {
      new Notice("ノートが開かれていません");
      return;
    }

    // フロントマター(プロパティ)を安全に編集するAPI
    await this.app.fileManager.processFrontMatter(file, (fm) => {
      fm["reviewed"] = new Date().toISOString();
      // 例: fm["status"] = "done"; や fm["count"] = (fm["count"] ?? 0) + 1; など
    });

    new Notice(`${file.basename} に書き込みました`);
  }

  onunload() {}
};
Code language: JavaScript (javascript)

類似投稿