mcpField
O
Obsidian MCP Server

Obsidian MCP Server

ローカル
npmjs.comメモリ・ナレッジ7003 日前に更新

Obsidian MCP Server について

Obsidian MCP Server は Local REST API プラグイン経由で Obsidian の保管庫に接続し、ノート、タグ、frontmatter を操作します。パス単位の読み書き制限に対応し、MCP クライアント向けに stdio と Streamable HTTP のトランスポートを備えます。

主な機能

  1. 01本文・セクション・構造化データでノートを取得
  2. 02テキスト・JSONLogic・Omnisearchで検索
  3. 03ノート内容の作成・追記・部分編集・置換
  4. 04タグとfrontmatter項目の管理
  5. 05保管庫・タグ・状態リソースの公開

活用シーン

  1. 01テキストや構造条件に合うノートの検索
  2. 02見出しやfrontmatter項目のその場での編集
  3. 03設定した保管庫パス内へのアクセス制限

MCP 対応

MCP サーバーとして、Obsidian のノート、タグ、状態を扱う 14 個のツールと 3 個のリソースを公開します。stdio と Streamable HTTP に対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": [
"-y",
"obsidian-mcp-server"
],
"env": {
"OBSIDIAN_API_KEY": "<OBSIDIAN_API_KEY>",
"OBSIDIAN_BASE_URL": "<OBSIDIAN_BASE_URL>",
"OBSIDIAN_VERIFY_SSL": "<OBSIDIAN_VERIFY_SSL>",
"OBSIDIAN_REQUEST_TIMEOUT_MS": "<OBSIDIAN_REQUEST_TIMEOUT_MS>",
"OBSIDIAN_ENABLE_COMMANDS": "<OBSIDIAN_ENABLE_COMMANDS>",
"OBSIDIAN_READ_PATHS": "<OBSIDIAN_READ_PATHS>",
"OBSIDIAN_WRITE_PATHS": "<OBSIDIAN_WRITE_PATHS>",
"OBSIDIAN_READ_ONLY": "<OBSIDIAN_READ_ONLY>",
"OBSIDIAN_DELETE_ELICITATION": "<OBSIDIAN_DELETE_ELICITATION>",
"OBSIDIAN_OMNISEARCH_URL": "<OBSIDIAN_OMNISEARCH_URL>",
"MCP_LOG_LEVEL": "<MCP_LOG_LEVEL>",
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "<MCP_HTTP_HOST>",
"MCP_HTTP_PORT": "<MCP_HTTP_PORT>",
"MCP_HTTP_ENDPOINT_PATH": "<MCP_HTTP_ENDPOINT_PATH>",
"MCP_AUTH_MODE": "<MCP_AUTH_MODE>"
}
}
}
}
起動コマンドnpx -y obsidian-mcp-server
設定が必要な環境変数
OBSIDIAN_API_KEYシークレットBearer token for the Obsidian Local REST API plugin (Settings → Community Plugins → Local REST API).
OBSIDIAN_BASE_URLBase URL of the Obsidian Local REST API. Default: http://127.0.0.1:27123 (enable "Non-encrypted (HTTP) Server" in plugin settings). Use https://127.0.0.1:27124 for the always-on HTTPS port (self-signed cert; pair with OBSIDIAN_VERIFY_SSL=false).
OBSIDIAN_VERIFY_SSLWhether to verify the TLS certificate on the Obsidian endpoint. Default false because the plugin uses a self-signed cert.
OBSIDIAN_REQUEST_TIMEOUT_MSPer-request timeout in milliseconds.
OBSIDIAN_ENABLE_COMMANDSOpt-in flag for the command-palette pair (obsidian_list_commands + obsidian_execute_command). Off by default — Obsidian commands are opaque and can be destructive.
OBSIDIAN_READ_PATHSOptional comma-separated vault-relative folder allowlist for reads. Prefix-based with implicit recursion; case-insensitive; trailing slashes normalized. Unset = full vault. Write paths are implicitly readable. Example: 'public/,projects/'.
OBSIDIAN_WRITE_PATHSOptional comma-separated vault-relative folder allowlist for writes. Same syntax as OBSIDIAN_READ_PATHS. Unset = full vault, or the read scope when reads are restricted. Example: 'projects/,scratch/'.
OBSIDIAN_READ_ONLYGlobal read-only kill switch. When true, every write is denied regardless of OBSIDIAN_WRITE_PATHS, and the command-palette pair is suppressed (commands can mutate). Useful for shared or public-facing deployments.
OBSIDIAN_DELETE_ELICITATIONOpt-in delete confirmation. When true, obsidian_delete_note asks the user to confirm each delete through an elicitation round (the client must support elicitation), and HTTP startup requires a stateful session unless OBSIDIAN_READ_ONLY=true disables the tool. Off by default — the delete runs on the first call, bounded by OBSIDIAN_WRITE_PATHS and OBSIDIAN_READ_ONLY.
OBSIDIAN_OMNISEARCH_URLOverride URL for the Omnisearch plugin HTTP server. Unset derives from OBSIDIAN_BASE_URL host with port 51361. Required only if the Omnisearch plugin is not on the default port.
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_TRANSPORT_TYPESelects the HTTP transport.
MCP_HTTP_HOSTThe hostname for the HTTP server.
MCP_HTTP_PORTThe port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.
MCP_AUTH_MODEシークレットAuthentication mode to use: 'none', 'jwt', or 'oauth'.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmobsidian-mcp-server3.7.2

ツール

12

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
formatenumはい返す投影形式。`content` — Markdown 本文そのまま。`full` — 内容に加え、解析済みの frontmatter、タグ、ファイルメタデータ。`document-map` — 見出し、ブロック ID、frontmatter フィールド名の一覧(パッチ対象の特定に使用)。`section` — 単一の見出し、ブロック、または frontmatter セクション(`section` が必要)。見出しセクションにはその見出し以下のサブツリー全体が含まれ、ネストには `Parent::Child` 構文を使用します。content | full | document-map | section
targetanyはいノートの保存場所。
sectionobjectいいえ`format` が `"section"` の場合に必須です。抽出する見出し、ブロック、または frontmatter を指定します。
section.typeenumはい名前で見出し、参照でブロック、キーで frontmatter フィールドを指定します。heading | block | frontmatter
section.targetstringはい見出し名 — 完全なパス(`"Parent::Child"`)または完全一致する見出しが 1 つだけの末端名 — 先頭のキャレットを除いたブロック参照(例:"2d9b4a"、"^2d9b4a" ではありません)、または frontmatter フィールド名。
includeLinksbooleanいいえ`format: "full"` の場合に true にすると、ノート本文から外向きの wiki リンクおよび Markdown リンクの参照を解析します。その他の形式ではスキップされます。

詳細

obsidian-mcp-server

MCP 経由で Obsidian の保管庫のノート、タグ、フロントマターを読み取り、書き込み、検索し、必要な箇所だけ編集できます。STDIO または Streamable HTTP に対応しています。

14 個のツール • 3 個のリソース

バージョン ライセンス Docker MCP SDK npm TypeScript Bun

Claude Desktop にインストール Cursor にインストール VS Code にインストール

フレームワーク


概要

Local REST API プラグインを通じて Obsidian の保管庫を操作できます。ノートの読み取り、検索、書き込み、単一の見出し・ブロック・フロントマターフィールドの直接編集、タグの管理が可能です。フォルダー単位の読み取り/書き込み権限も組み込まれています。

ツール
ツール説明
obsidian_get_noteノートを生のコンテンツ、完全な構造化形式、ドキュメントマップ、または単一セクションとして読み取ります
obsidian_list_notes拡張子と名前で絞り込みながら、保管庫のパス以下にあるノートとフォルダーを再帰的に一覧表示します
obsidian_list_tags保管庫のタグを使用回数とともに、使用頻度の高い順に一覧表示します
obsidian_search_notesテキスト、JSONLogic、またはプラグインにアクセスできる場合は BM25 で順位付けされた Omnisearch で検索します
obsidian_write_noteノートを作成するか、1 つのセクションを置き換えるか、overwrite: true でファイル全体を上書きします
obsidian_append_to_noteノート(存在しない場合は作成)または 1 つの見出し、ブロック、frontmatter フィールドに追記します
obsidian_patch_note1 つの見出し、ブロック参照、または frontmatter フィールドに追記、前置、または置換します
obsidian_replace_in_note既定では本文のみを対象に、1 つのノート内でリテラル検索または正規表現検索による置換を行います
obsidian_manage_frontmatterfrontmatter のキーを 1 つ取得、設定、または削除します
obsidian_manage_tagsfrontmatter、インライン、またはその両方で、ノートのタグを追加、削除、または一覧表示します
obsidian_delete_noteユーザーの確認後(OBSIDIAN_DELETE_ELICITATION)に削除することもでき、ノートを完全に削除します
obsidian_open_in_uiObsidian アプリでファイルを開きます。新しいペインで開くこともできます
obsidian_list_commandsコマンドパレットのコマンドを一覧表示します(OBSIDIAN_ENABLE_COMMANDS によるオプトイン)
obsidian_execute_commandID を指定してコマンドパレットのコマンドを実行します(OBSIDIAN_ENABLE_COMMANDS によるオプトイン)
リソース
リソース説明
obsidian://vault/{+path}ノートのコンテンツ、frontmatter、タグ、ファイルメタデータ
obsidian://tags使用回数を含む、保管庫内のすべてのタグの上限なしスナップショット
obsidian://statusプラグインへの到達可能性、認証ステータス、バージョン、登録済み API 拡張

ノートとタグのデータにはツール(obsidian_get_note、obsidian_list_tags)からもアクセスできます。obsidian://status に相当するツールはありません。

機能リファレンス

obsidian_get_note ツール
  • target は、保管庫の path、active ファイル、または periodic ノート(daily から yearly まで。date は任意)です。format は content、full、document-map、section のいずれかで、保管庫内のリンクを含めるには full に includeLinks: true を指定します
  • result.format がペイロードの形式を判別します。複数の見出しに一致する section の読み取りでは、最初の見出しが返され、candidates にすべての完全パスが列挙されます
  • path に完全一致するものがなく、同じフォルダー内に大文字と小文字を区別しない一致が 1 つある場合、そのファイルを読み取ります。result.path は実際の名前、requestedPath は送信された名前であり、notice に両方の名前が記載されます

obsidian_list_notes ツール
  • path(既定値は保管庫のルート)から、depth 1~20(既定値は 2)までを走査し、extension と nameRegex(256 文字以下)で絞り込みます。nameRegex に一致しないフォルダーは走査されません
  • entries[](file / directory)、totals、appliedFilters を返します。走査は 1,000 件で停止し、excluded.reason: "entry_cap" が付加されます。深さ制限に達したフォルダーには truncated: true が付加されます
  • OBSIDIAN_READ_PATHS が設定されている場合、一覧には読み取り可能なエントリーと、対象範囲に至るフォルダーのみが含まれます。それらのフォルダーも走査され、path として受け入れられます

obsidian_list_tags ツール
  • nameRegex(256 文字以下)と minCount で対象を絞り込んだ後、タグを使用回数順に並べ、limit(既定値は 200、最大 10000)で上限を設定します。階層の親タグもカウントされます(work/tasks は work に加算されます)
  • 上限によってタグが省かれる場合、レスポンスには truncated、shown、cap が含まれます
  • OBSIDIAN_READ_PATHS が設定されている場合、読み取り可能なノートに含まれるタグのみが一覧表示され、count はそのタグまたはその配下のタグを持つ読み取り可能なノートの数になります

obsidian_search_notes ツール
  • mode: "text" では、query を空白で分割したすべてのトークンが、ファイル名または本文に大文字小文字を区別せず部分文字列として含まれている必要があります(引用符はそのまま検索されます)。結果は contextLength(デフォルトは100)、pathPrefix、maxMatchesPerHit(デフォルトは10)によって整形されます。mode: "jsonlogic" では、path、content、frontmatter.<key>、tags、stat(および対応するプラグインバージョンでは links、backlinks、unresolvedLinks)を対象に logic ツリーを評価し、glob/regexp は [PATTERN, VALUE] を受け取ります
  • result.mode でペイロードの種類を判別できます。どのモードでも totalCount が報告され、nextCursor でページを取得できます。テキストの検索結果が maxMatchesPerHit で切り詰められた場合は、truncated と totalMatches が含まれます
  • mode: "omnisearch"(BM25 によるランキング、引用符で囲んだフレーズ、-exclusion、path:/ext: フィルター)は、起動時に Omnisearch プラグインから応答があった場合のみ利用できます。上流の上限は50件で、これに達すると truncated: true が設定されます

obsidian_write_note ツール
  • target と content を指定します。section と contentType(markdown/json)は省略可能です。既存ノート全体への書き込みは、overwrite: true を指定しない限り file_exists エラーになります
  • 大文字小文字を区別しないファイルシステム(macOS、Windows)では、既存ノートと文字の大小のみが異なるパスへのファイル全体の書き込みは case_variant_exists エラーになり、何も書き込まれません。親フォルダーの一覧で大文字小文字のみ異なるものが1件だけ確認できる場合、existingPath にそのノートのパスが設定されます。一致するものが複数ある場合、または Obsidian がインデックスしないファイル(ドットファイル)がそのパスにある場合は省略されます
  • section を指定すると、その見出し、ブロック、またはフロントマターのフィールドのみを置き換え、見出し行は保持します。出力には created、sectionTargeted、解決された sectionTarget が含まれます

obsidian_append_to_note ツール
  • section を指定しない場合は、ファイルに追記するか、ファイルを作成します(created: true)。section を指定すると、既存ノート内のその見出し、ブロック、またはフロントマターのフィールドに追記します。createTargetIfMissing: true を指定するとセクションが作成されます
  • セクションへの追記で、対象にすでに同じ内容がある場合は content_preexists エラーになります。ブロック対象には区切り文字が追加されないため、区切りを入れたい場合は content を改行で始めてください
  • 大文字小文字を区別しないファイルシステムでは、既存ノートと文字の大小のみが異なるパスへのファイル全体の追記は case_variant_exists エラーになります。親フォルダーの一覧で大文字小文字のみ異なるものが1件だけ確認できる場合、existingPath にそのノートのパスが設定されます

obsidian_patch_note ツール
  • 既存ノートの1つの section に対して、operation: "append" | "prepend" | "replace" を実行します。patchOptions では createTargetIfMissing、applyIfContentPreexists、trimTargetWhitespace(プラグイン v4.x のみ)を指定します
  • 解決された section と operation を返します。対象にすでにある内容を再度指定すると、applyIfContentPreexists: true を指定しない限り content_preexists エラーになります

obsidian_replace_in_note ツール
  • replacements[] は順番に実行され、それぞれ直前の置換結果を対象とします。各項目では useRegex(1024文字以下)、caseSensitive(デフォルトは true)、wholeWord、flexibleWhitespace(リテラルモードのみ)、replaceAll(デフォルトは true)を指定できます
  • totalReplacements と、bodyCount/frontmatterCount を含む perReplacement[] を返します
  • scope: "body"(デフォルト)ではフロントマターのバイト列を変更しません。"frontmatter" と "both" では置換後に YAML を再解析し、解析に失敗すると書き込みを行わず frontmatter_invalid エラーになります

obsidian_manage_frontmatter ツール
  • 1つの key に対して operation: "get" | "set" | "delete" を実行します。set では JSON 型の value が必要です
  • get は exists と value(存在しない場合は null)を返します。set と delete は変更後のフロントマター全体を返します。解析できない YAML に対する delete は、書き込みを行わず frontmatter_invalid エラーになります

obsidian_manage_tags ツール
  • operation: "add" | "remove" | "list" と tags を指定します。location: "frontmatter"(デフォルト。tags: 配列)、"inline"(本文中の #tag。add はファイル末尾に追加)、または "both" を指定できます
  • add / remove は applied、skipped、および処理後の tags を返します。list は frontmatter、inline、all を返します
  • インラインタグの検出は Obsidian のタグ構文に従います。コード、ウィキリンク、画像、リンク先、HTML、数式はスキップされ、%% … %% コメントは読み取られます

obsidian_delete_note ツール
  • target(パス、アクティブファイル、または定期ノート)を受け取り、まず書き込み範囲と照合します。フォルダーパスの場合は path_is_directory エラーになります。API レベルの元に戻す機能はなく、Obsidian のローカルのゴミ箱のみを使用できます
  • パスは、大文字と小文字を含めて完全に一致する必要があります。大文字と小文字を区別しないファイルシステムでも同様です。大文字と小文字が異なるパスや拡張子を省略したパスを指定すると、何も削除される前に note_missing エラーとなり、近似するパスが suggestions に示されます
  • デフォルトでは、最初の呼び出しで確認なしにノートが削除されます。アクセス可能な範囲は OBSIDIAN_WRITE_PATHS と OBSIDIAN_READ_ONLY によって制限されます
  • OBSIDIAN_DELETE_ELICITATION=true の場合、最初の呼び出しではパスとバイトサイズを示す確認要求が返され、ユーザーが承認した後にのみノートが削除されます。拒否すると cancelled エラーになり、エリシテーションに対応していないクライアントでは削除できません
  • このモードでは、回答はプロンプトの表示時に保存された単回使用の同意レコードに対してのみ有効です。このレコードは呼び出し元、パス、およびその時点のノートの内容に紐付けられます。事前に渡された回答や再利用された回答、ノートが変更された後の回答の場合は、代わりに新しい確認要求が表示されます
  • 同意レコードはサーバーのストレージプロバイダー(STORAGE_PROVIDER_TYPE、デフォルトは in-memory で、プロセス内のみ)に保存されます。stdio または単一の HTTP インスタンスでは機能しますが、1 つのエンドポイントの背後で複数のインスタンスを稼働させる場合は、共有プロバイダー(filesystem、supabase、または cloudflare-d1。cloudflare-kv は不可)が必要です

obsidian_open_in_ui ツール
  • path、failIfMissing(デフォルトは true)、newLeaf(分割ペインで開く)を指定します。failIfMissing: false の場合、存在しないファイルが作成されます。そのためには書き込みアクセスが必要です
  • どちらの処理が実行されたかは createdIfMissing で示されます
  • 大文字と小文字が異なる path に対し、大文字と小文字を区別しない一致が 1 件見つかった場合は、別のファイルを作成せず、そのファイルを開きます。この場合、送信されたパスは requestedPath として報告され、notice が返されます

obsidian_list_commands ツール
  • 各コマンドの表示名に対して照合する、任意の nameRegex(最大256文字)
  • id と name を含む commands[] を返します。id は obsidian_execute_command に渡します
  • OBSIDIAN_ENABLE_COMMANDS=true かつ OBSIDIAN_READ_ONLY が無効の場合のみ一覧に表示されます

obsidian_execute_command ツール
  • obsidian_list_commands から取得した commandId を指定します。executed: true を返します。未登録の ID の場合は command_unknown エラーになります
  • キーボードショートカットと同じ権限で実行されるため、一部のコマンドは破壊的な操作(ファイルの削除、保管庫を閉じるなど)を伴います。obsidian_list_commands と同じ条件で制限されます

obsidian://vault/{+path} リソース
  • {+path} は /vault/ 以降のすべてをキャプチャし、スラッシュも含みます。リテラルパスとパーセントエンコードされたパスは、同じノートに解決されます
  • obsidian_get_note に format: "full" を指定した場合と同じ形式で、path、content、frontmatter、tags、stat を返します。エラーは path_forbidden、note_missing、または path_is_directory です

obsidian://tags リソース
  • 各タグとその count を、上限なし・並べ替えなしで返します。階層タグの親も含まれます
  • OBSIDIAN_READ_PATHS が設定されている場合、読み取り可能なノートに含まれるタグのみを対象とし、obsidian_list_tags と同じ方法で数えます
  • ランキングやフィルターはありません。件数順で上限付きの一覧が必要な場合は obsidian_list_tags を使用します

obsidian://status リソース
  • status、service、authenticated、versions、manifest、apiExtensions[]。API キーが間違っていても応答し、authenticated: false を返します
  • プラグイン v5.0.2 以降では、periodic ターゲットを使用する前に、apiExtensions に local-rest-api-periodic-notes が含まれていることを確認してください

機能

@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、差し替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、OpenTelemetry トレーシングを任意で利用できる構造化ログを備えています。

Obsidian 固有の機能:

  • Obsidian Local REST API プラグイン用の型付きクライアントです。セクションへの書き込みでは、報告されたプラグインのバージョンに応じて、プラグイン v5.0 以降には markdown-patch 2.0、v4.x には 1.x を使用します
  • 見出しターゲットには、完全な Parent::Child パスまたは末端の名前を指定できます。複数の候補が曖昧な場合、書き込みは ambiguous_section とその candidates を返して拒否されます。ただし、候補がトップレベル見出しにちょうど 1 つ一致する場合を除きます。プラグイン v5.0 以降では、見出しに追加するコンテンツは空行で区切られます(リスト項目の場合は隣接するリストが継続されます)。その中の見出しはセクションのレベルより下に配置する必要があります(heading_outside_section)
  • フォルダー単位の読み取り/書き込み権限、読み取り専用スイッチ、オプトイン方式のコマンドパレットのペアを備えています(パスのポリシーを参照)。initialize 時のサーバーレベルの instructions で、アクティブなポリシーを報告します
  • obsidian_get_note と obsidian_open_in_ui は、大文字と小文字が一致しないパスを実際のファイル名で再試行します。その際、requestedPath と notice を通知し、見つからない場合は Did you mean の候補を追加します。書き込みと削除では、パスが完全一致する場合のみ対象になります
  • 正規表現の入力には上限があります(nameRegex は 256 文字、useRegex は 1024 文字)。量指定子がネストされている場合は regex_unsafe を返して拒否します
  • バックリンク専用のツールはありません。jsonlogic モードの obsidian_search_notes で {"regexp": ["\\[\\[Target Note(\\\\?\\||#|\\]\\])", {"var": "content"}]} を使うとバックリンクを検索できます。これにより、テーブル内で安全な [[Target Note\|Alias]] にも一致します

エージェント向けの出力:

  • 復旧方法を案内するエラー:定義済みのすべての失敗に reason、JSON-RPC コード、およびそのケースに合わせた recovery.hint が含まれます
  • サイズ差分:変更を伴うすべてのツールが previousSizeInBytes / currentSizeInBytes を返すため、呼び出し元は追加の読み取りを行わずに、意図しない上書きに気付けます
  • 曖昧さをデータとして提示:見出し名が重複している場合は candidates を返し、タグ操作では applied と skipped を報告します
  • 判別可能な出力コントラクト:obsidian_get_note の format、obsidian_search_notes の mode、obsidian_manage_frontmatter と obsidian_manage_tags の operation

はじめに

Claude Code に追加します:

claude mcp add obsidian-mcp-server -e OBSIDIAN_API_KEY=your-api-key -- npx -y obsidian-mcp-server

その他のクライアントでは、MCP 設定ファイルに次の内容を追加します:

{
  "mcpServers": {
    "obsidian-mcp-server": {
      "command": "npx",
      "args": ["-y", "obsidian-mcp-server"],
      "env": { "OBSIDIAN_API_KEY": "your-api-key" }
    }
  }
}

Obsidian の Settings → Community Plugins → Local REST API でキーを生成します。プラグインは前提条件の説明に従って設定してください。Docker またはソースからビルドする場合は、サーバーの実行を参照してください。

前提条件
  • Obsidian Local REST API プラグインの v4.0.0 以降が、Vault で有効になっていること。API キーは OBSIDIAN_API_KEY です。
  • サーバーのデフォルトは http://127.0.0.1:27123 です。そのため、プラグイン設定で 「Non-encrypted (HTTP) Server」 を有効にするか、常時稼働の HTTPS ポートを使用するために OBSIDIAN_BASE_URL=https://127.0.0.1:27124 を設定してください(自己署名証明書は、デフォルトの OBSIDIAN_VERIFY_SSL=false の場合に受け入れられます)。
  • 定期ノートのターゲットは、プラグイン v5.0.1 以前では標準で動作します。v5.0.2 以降では periodic-notes API extension が必要です。これがない場合は periodic_unsupported エラーになります。
  • プラグイン v4.x では、改行コードが CRLF(Windows)のノートに対する見出しセクションへの書き込みは、行の途中に配置されます。プラグインの markdown-patch 1.x エンジンが誤った位置に配置し、サーバー側では修正できません。プラグイン v5.0 以降では、CRLF のノートが正しく処理されます。
  • プラグイン v6.0 では markdown-patch 1.x が削除されますが、2 種類の表の行への書き込み(contentType: "json")では引き続き使用されます。見出しの下にある行と、表の下の単独行にあるブロック ID を介した行です。v6.0 では、最終行の ID を使って表を指定してください。
  • OBSIDIAN_DELETE_ELICITATION=true の場合、obsidian_delete_note を使用するには、エリシテーションに対応し、フォームを表示する MCP クライアントが必要です。それ以外のすべてのツールと、デフォルトの削除機能は、これがなくても動作します。

設定

変数説明デフォルト
OBSIDIAN_API_KEY必須。 Local REST API プラグインのベアラートークンです。—
OBSIDIAN_BASE_URLLocal REST API のベース URL です。https://127.0.0.1:27124 は常時使用可能な HTTPS ポートです。末尾のスラッシュは削除されます。応答がない場合、呼び出しは obsidian_unreachable で失敗します。http://127.0.0.1:27123
OBSIDIAN_VERIFY_SSLプラグインの TLS 証明書を検証します。自己署名証明書を使用するため、デフォルトでは無効です。この緩和が適用されるのは、OBSIDIAN_BASE_URL が https: の場合のみです。true にすると、信頼されていない証明書では呼び出しが certificate_rejected で失敗します。false
OBSIDIAN_REQUEST_TIMEOUT_MSリクエストごとのタイムアウト(ミリ秒)です。30000
OBSIDIAN_ENABLE_COMMANDSobsidian_list_commands と obsidian_execute_command を有効にします。コマンドの内容は不透明で、破壊的な操作を行う可能性があります。false
OBSIDIAN_READ_PATHS読み取り対象フォルダーの許可リストをカンマ区切りで指定します。パスのポリシーを参照してください。未設定(ボルト全体)
OBSIDIAN_WRITE_PATHS書き込み対象フォルダーの許可リストをカンマ区切りで指定します。パスのポリシーを参照してください。未設定(読み取り範囲、または読み取り範囲が設定されていない場合はボルト全体)
OBSIDIAN_READ_ONLYすべての書き込みを拒否し、コマンドパレットの 2 つのツールを無効にします。false
OBSIDIAN_DELETE_ELICITATION削除前に、各 obsidian_delete_note 呼び出しについて、エリシテーションフォームを通じてユーザーに確認を求めます。エリシテーションを表示できるクライアントと、HTTP のステートフルセッションが必要です(OBSIDIAN_READ_ONLY=true によってこのツールが無効になる場合は不要です)。無効の場合、最初の呼び出しで削除が実行されます。false
OBSIDIAN_OMNISEARCH_URLOmnisearch HTTP サーバーの URL です。未設定の場合、OBSIDIAN_BASE_URL のホストを使用し、ポート 51361 から導出されます。起動時に一度だけプローブされ、応答があった場合にのみ omnisearch 検索モードが表示されます。導出
MCP_TRANSPORT_TYPEトランスポートです。stdio または http を指定します。stdio
MCP_HTTP_PORTHTTP サーバーのポートです。3010
MCP_SESSION_MODEHTTP セッションモードです。stateful、stateless、または auto を指定します。OBSIDIAN_DELETE_ELICITATION=true で、かつ OBSIDIAN_READ_ONLY が無効の場合、2025 年時点のクライアントでは確認にセッションが必要なため、サーバーにはステートフルセッションが必要です。そのため、HTTP では stateless にすると起動に失敗します。stdio には影響しません。stateful
MCP_AUTH_MODE認証方式です。none、jwt、または oauth を指定します。none
MCP_LOG_LEVELログレベル(RFC 5424)です。info
LOGS_DIRログファイルの保存ディレクトリです(Node.js のみ)。<project-root>/logs
OTEL_ENABLEDOpenTelemetry を有効にします。false

オプションの上書き設定の全一覧については、.env.exampleを参照してください。

パスのポリシー

任意の環境変数を3つ設定すると、ツールが操作できる保管庫パスを制限できます。未設定の場合、読み取りと書き込みは保管庫全体が対象になります。

目的設定
すべてを読み取り、projects/ と scratch/ のみ書き込むOBSIDIAN_WRITE_PATHS=projects/,scratch/
public/ のみ読み取り、public/inbox/ のみ書き込むOBSIDIAN_READ_PATHS=public/、OBSIDIAN_WRITE_PATHS=public/inbox/
どこにも書き込まないOBSIDIAN_READ_ONLY=true
  • 一致判定はプレフィックスによる再帰的なもので、大文字と小文字を区別しません。末尾のスラッシュは正規化されます。書き込みパスは読み取りも可能です。
  • OBSIDIAN_READ_ONLY=true を設定すると、obsidian_manage_frontmatter や obsidian_manage_tags(そのため、それらの get / list も対象です)を含む、すべての書き込みツールとコマンドパレットのペアが tools/list から除外されます。obsidian_open_in_ui は既存のファイルを開きますが、新規作成はしません。
  • 拒否された操作は path_forbidden で失敗し、data.activeScope に有効なスコープと復旧のヒントが示されます。対象が active または periodic の場合、解決先のノートではなく対象((active file)、daily note for 2026-10-01)が示されます。obsidian_list_notes は、読み取り可能な項目と、スコープに至るフォルダーのみを一覧表示するため、ネストされたスコープもルートからたどって参照できます。
  • OBSIDIAN_READ_PATHS を設定すると、検索結果には読み取り可能なノートのみが含まれ、JSONLogic ツリーはスコープ外のノートを読み取りません。サーバーは読み取り可能なノートを対象に評価し、links、backlinks、unresolvedLinks には読み取り可能な項目のみを含めます。リンク先のノートは、引き続き保管庫全体を対象とする Obsidian の解決処理によって決まるため、スコープ外のノートが作成または削除されると、これら3つのフィールドが変わることがあります。その点が重要な場合は、content 内のリンクテキストを照合してください。この評価には上限があります。ネストは1,000階層まで、ツリーが構築する値にはノートごとの処理予算、保持する結果には検索ごとの処理予算が設定されており、制限時間は10秒です。上限を超えたツリーは logic_too_costly で失敗します。評価器に渡すにはネストが深すぎる(Node では約3,500階層)読み取り可能なノートがある場合、検索は note_too_deep で失敗します。読み取りスコープがない場合、ツリーは変更されずにプラグインへ渡されます。
  • OBSIDIAN_READ_PATHS を設定すると、タグ一覧(obsidian_list_tags、obsidian://tags)の対象は読み取り可能なノートのみとなり、出現回数ではなくノート数が集計されます。書き込みパスの設定や読み取り専用の設定だけでは、対象は保管庫全体のままです。
  • サーバーの instructions には有効なスコープが示されます。読み取り可能な範囲は読み取りパスと書き込みパスで、書き込み可能な範囲は書き込みパス、または読み取りのみが制限されている場合は読み取りスコープです。起動ログには設定されたリストが出力されます。

サーバーの実行

ローカル開発

Bun v1.4.0 以降(または Node.js v24 以降)が必要です。

  • クローンしてインストール:

    git clone https://github.com/cyanheads/obsidian-mcp-server.git
    cd obsidian-mcp-server && bun install
    cp .env.example .env   # set OBSIDIAN_API_KEY
    
  • 本番バージョンをビルドして実行:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:stdio
    # or, listening at http://127.0.0.1:3010/mcp
    bun run start:http
    
  • チェックとテストを実行:

    bun run devcheck   # Lint, format, typecheck, security, changelog sync
    bun run test       # Vitest test suite
    bun run lint:mcp   # Validate MCP definitions against spec
    
Docker
docker run --rm -e OBSIDIAN_API_KEY=your-key -p 3010:3010 ghcr.io/cyanheads/obsidian-mcp-server:latest

イメージのデフォルト設定は、0.0.0.0 での HTTP トランスポート、ステートフルセッション、/var/log/obsidian-mcp-server へのログ出力です。コンテナー内では、デフォルトの OBSIDIAN_BASE_URL(http://127.0.0.1:27123)はコンテナー自身のループバックを指します。ホスト上のプラグインに接続するには、http://host.docker.internal:27123 を指定する(Docker Desktop)か、--network host を使用してください(Linux)。MCP クライアントから stdio 経由で実行するには、"command": "docker" と "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "-e", "OBSIDIAN_API_KEY=your-key", "-e", "OBSIDIAN_BASE_URL=http://host.docker.internal:27123", "ghcr.io/cyanheads/obsidian-mcp-server:latest"] を使用してください。ローカルでビルドするには、docker build -t obsidian-mcp-server . を実行します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。

ポートが他のマシンから到達可能な場合は、MCP_AUTH_SECRET_KEY とともに MCP_AUTH_MODE=jwt を設定するか、oauth を設定してください。デフォルトの none では、すべての呼び出し元が自身の OBSIDIAN_API_KEY を使って保管庫を操作できます。

プロジェクト構成

ディレクトリ目的
src/index.tscreateApp() のエントリーポイントです。ツールとリソースを登録し、Omnisearch を確認して、読み取り専用とコマンドのゲートを適用します。
src/configZod による、サーバー固有の環境変数(OBSIDIAN_*)の解析です。
src/services/obsidianローカル REST API クライアント、パスのポリシー、マークダウンパッチ形式の処理、フロントマター/セクション/タグの解析、ドメイン型です。
src/mcp-server/toolsツールの定義(*.tool.ts)と共有スキーマおよびヘルパーです。
src/mcp-server/resourcesリソースの定義(*.resource.ts)です。
src/mcp-server/promptsプロンプトの定義です(登録されているものはありません)。
tests/ツール、リソース、サービス、設定に関する Vitest テストです。
docs/ローカル REST API の OpenAPI 仕様と、生成された tree.md です。
changelog/バージョンごとのリリースノートです。CHANGELOG.md は再生成されたリリースノートの集約版です。

開発ガイド

開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。

  • ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで try/catch を使用しないでください。
  • リクエスト単位のログには ctx.log を使用してください。すべての Local REST API 呼び出しを getObsidianService() 経由にしてください。
  • 新しいツールとリソースは、src/mcp-server/*/definitions/index.ts のバレル経由で登録してください。
  • 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマを返してください。不足しているフィールドを捏造しないでください。

コントリビューション

バグ、機能リクエスト、ドキュメントの不足は issue で報告してください。対応可能な issue の条件については CONTRIBUTING.md を、協力の進め方については CODE_OF_CONDUCT.md を参照してください。セキュリティに関する報告は SECURITY.md を通じて行い、公開 issue には投稿しないでください。

提出前にチェックとテストを実行してください。

bun run devcheck
bun run test

ライセンス

Apache-2.0 — 詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。