Obsidian MCP Server について
Obsidian MCP Server は Local REST API プラグイン経由で Obsidian の保管庫に接続し、ノート、タグ、frontmatter を操作します。パス単位の読み書き制限に対応し、MCP クライアント向けに stdio と Streamable HTTP のトランスポートを備えます。
主な機能
- 01本文・セクション・構造化データでノートを取得
- 02テキスト・JSONLogic・Omnisearchで検索
- 03ノート内容の作成・追記・部分編集・置換
- 04タグとfrontmatter項目の管理
- 05保管庫・タグ・状態リソースの公開
活用シーン
- 01テキストや構造条件に合うノートの検索
- 02見出しやfrontmatter項目のその場での編集
- 03設定した保管庫パス内へのアクセス制限
MCP 対応
MCP サーバーとして、Obsidian のノート、タグ、状態を扱う 14 個のツールと 3 個のリソースを公開します。stdio と Streamable HTTP に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y obsidian-mcp-serverOBSIDIAN_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
12掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| format | enum | はい | 返す投影形式。`content` — Markdown 本文そのまま。`full` — 内容に加え、解析済みの frontmatter、タグ、ファイルメタデータ。`document-map` — 見出し、ブロック ID、frontmatter フィールド名の一覧(パッチ対象の特定に使用)。`section` — 単一の見出し、ブロック、または frontmatter セクション(`section` が必要)。見出しセクションにはその見出し以下のサブツリー全体が含まれ、ネストには `Parent::Child` 構文を使用します。content | full | document-map | section |
| target | any | はい | ノートの保存場所。 |
| section | object | いいえ | `format` が `"section"` の場合に必須です。抽出する見出し、ブロック、または frontmatter を指定します。 |
| section.type | enum | はい | 名前で見出し、参照でブロック、キーで frontmatter フィールドを指定します。heading | block | frontmatter |
| section.target | string | はい | 見出し名 — 完全なパス(`"Parent::Child"`)または完全一致する見出しが 1 つだけの末端名 — 先頭のキャレットを除いたブロック参照(例:"2d9b4a"、"^2d9b4a" ではありません)、または frontmatter フィールド名。 |
| includeLinks | boolean | いいえ | `format: "full"` の場合に true にすると、ノート本文から外向きの wiki リンクおよび Markdown リンクの参照を解析します。その他の形式ではスキップされます。 |
詳細
obsidian-mcp-server
MCP 経由で Obsidian の保管庫のノート、タグ、フロントマターを読み取り、書き込み、検索し、必要な箇所だけ編集できます。STDIO または Streamable HTTP に対応しています。
概要
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_note | 1 つの見出し、ブロック参照、または frontmatter フィールドに追記、前置、または置換します |
obsidian_replace_in_note | 既定では本文のみを対象に、1 つのノート内でリテラル検索または正規表現検索による置換を行います |
obsidian_manage_frontmatter | frontmatter のキーを 1 つ取得、設定、または削除します |
obsidian_manage_tags | frontmatter、インライン、またはその両方で、ノートのタグを追加、削除、または一覧表示します |
obsidian_delete_note | ユーザーの確認後(OBSIDIAN_DELETE_ELICITATION)に削除することもでき、ノートを完全に削除します |
obsidian_open_in_ui | Obsidian アプリでファイルを開きます。新しいペインで開くこともできます |
obsidian_list_commands | コマンドパレットのコマンドを一覧表示します(OBSIDIAN_ENABLE_COMMANDS によるオプトイン) |
obsidian_execute_command | ID を指定してコマンドパレットのコマンドを実行します(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(既定値は保管庫のルート)から、depth1~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_URL | Local 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_COMMANDS | obsidian_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_URL | Omnisearch HTTP サーバーの URL です。未設定の場合、OBSIDIAN_BASE_URL のホストを使用し、ポート 51361 から導出されます。起動時に一度だけプローブされ、応答があった場合にのみ omnisearch 検索モードが表示されます。 | 導出 |
MCP_TRANSPORT_TYPE | トランスポートです。stdio または http を指定します。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモードです。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_ENABLED | OpenTelemetry を有効にします。 | 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.ts | createApp() のエントリーポイントです。ツールとリソースを登録し、Omnisearch を確認して、読み取り専用とコマンドのゲートを適用します。 |
src/config | Zod による、サーバー固有の環境変数(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 を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。