Skip to main content
Glama
huaqing0
by huaqing0

[!NOTE] 이 저장소는 huaqing0 커스텀 에디션으로, Apache-2.0 라이선스 하에 cyanheads/obsidian-mcp-server v3.5.0을 기반으로 합니다. 업스트림 서버를 유지하면서 이 에디션에서 사용하는 로컬 워크스페이스, 볼트 구조, 네이티브 Excalidraw 자동화를 추가합니다. 아래의 npm 및 MCPB 설치 링크는 여전히 업스트림 배포판을 가리키며, 이 커스텀 에디션은 현재 소스 전용입니다.

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework


도구

31개의 도구가 노트 콘텐츠, 메타데이터, 역링크, 네이티브 Excalidraw 자동화, 그리고 완전한 볼트 구조 관리를 다루며, Obsidian 명령 팔레트 명령을 위한 보호된 탈출구도 포함합니다.

도구 이름

설명

obsidian_get_note

노트를 원시 콘텐츠, 전체 구조화 형식(콘텐츠 + frontmatter + 태그 + stat, 선택적으로 작성된 링크, 해석된 링크, 역링크 포함), 구조적 문서 맵 또는 단일 섹션으로 읽습니다.

obsidian_list_notes

볼트 경로 아래의 노트와 하위 디렉터리를 나열합니다. 선택적 extensionnameRegex 필터와 함께 재귀 탐색(기본 깊이 2, 최대 깊이 20, 1000개 항목 상한)을 수행합니다.

obsidian_list_tags

사용 횟수와 함께 볼트 태그를 나열하며, 계층적 상위 태그를 포함합니다. 개수 내림차순으로 정렬되고 limit(기본 200, 최대 10000)으로 제한되며, 제외된 나머지가 공개됩니다. 선택적 nameRegexminCount가 먼저 집합을 좁힙니다.

obsidian_list_commands

Obsidian 명령 팔레트 명령을 나열하며, 선택적으로 표시 이름에 대한 nameRegex로 필터링합니다. OBSIDIAN_ENABLE_COMMANDS=true로 옵트인(obsidian_execute_command와 함께 사용).

obsidian_search_notes

텍스트, JSONLogic 또는 BM25 순위 Omnisearch(플러그인에 연결 가능한 경우)로 볼트를 검색합니다. 결과는 불투명 커서를 통해 페이지네이션됩니다.

obsidian_get_scene

기본 .excalidraw.md 장면에서 전체 원시 JSON을 반환하지 않고 간결한 의미론적 요약을 읽습니다.

obsidian_validate_drawing

Excalidraw 파싱, 안정적인 의미론적 ID, 지오메트리 및 관계 참조를 검증합니다.

obsidian_create_drawing

노드, 바인딩된 관계 및 프레임의 하나의 의미론적 배치로 기본 Excalidraw 드로잉을 생성합니다.

obsidian_add_elements

기존 드로잉에 의미론적 노드, 관계 또는 프레임을 멱등적으로 추가합니다.

obsidian_update_elements

안정적인 의미론적 ID로 관리되는 드로잉 요소를 정밀하게 업데이트합니다.

obsidian_delete_elements

드로잉 파일과 관련 없는 콘텐츠를 보존하면서 선택한 관리 요소를 삭제합니다.

obsidian_layout_drawing

관리되는 노드를 결정적 관계 깊이 레이어로 정렬합니다.

obsidian_link_element

안정적인 의미론적 ID로 관리되는 드로잉 요소에 Obsidian 링크를 첨부하거나 교체합니다.

obsidian_focus_elements

라이브 Excalidraw 보기에서 선택한 의미론적 요소에 초점을 맞추고 주변 요소를 흐리게 하거나 복원합니다.

obsidian_export_preview

플러그인 내보내기 API를 통해 기본 Excalidraw 드로잉을 제한된 PNG 미리보기로 렌더링합니다.

obsidian_embed_drawing

검증된 Excalidraw wiki-embed를 기존 Markdown 노트에 멱등적으로 추가합니다.

obsidian_write_note

노트를 생성하거나, 단일 섹션을 제자리에서 교체하거나, overwrite: true로 기존 파일을 덮어씁니다. 기본적으로 기존 경로에 대한 전체 파일 쓰기를 거부합니다.

obsidian_append_to_note

노트에 콘텐츠를 추가합니다. section 없이 파일이 없으면 생성합니다. section이 있으면 특정 제목, 블록 또는 frontmatter 필드에 추가합니다(파일이 존재해야 함).

obsidian_patch_note

제목, 블록 참조 또는 frontmatter 필드에 대해 정밀한 append / prepend / replace를 수행합니다.

obsidian_replace_in_note

단일 노트 내에서 검색-바꾸기를 수행하며 기본적으로 본문으로 범위가 제한됩니다. 리터럴 또는 정규식 매칭과 전체 단어, 공백 유연성, 대소문자 구분 옵션을 지원하며 캡처 그룹 바꾸기를 지원합니다.

obsidian_manage_frontmatter

단일 frontmatter 키에 대한 원자적 get / set / delete 작업입니다.

obsidian_manage_tags

태그를 추가, 제거 또는 나열합니다. 기본적으로 frontmatter tags: 배열을 사용합니다. location: 'inline' 또는 'both'는 노트 본문을 변경하도록 옵트인합니다.

obsidian_create_folder

Obsidian을 통해 볼트 폴더와 누락된 상위 폴더를 생성합니다.

obsidian_move_path

Obsidian의 FileManager를 통해 볼트 파일 또는 폴더를 이동하거나 이름을 바꾸어 내부 링크가 링크 업데이트에 참여하도록 합니다.

obsidian_delete_note

노트를 영구 삭제합니다. OBSIDIAN_ENABLE_DELETE=true로 옵트인합니다. 삭제 전에 항상 사용자 확인을 요청합니다.

obsidian_delete_folder

Obsidian 휴지통 또는 영구 삭제를 통해 폴더와 모든 하위 항목을 삭제합니다. OBSIDIAN_ENABLE_DELETE=true로 옵트인합니다. 정확한 영향 범위를 보고하고 항상 확인을 요청합니다.

obsidian_open_in_ui

failIfMissingnewLeaf 토글과 함께 Obsidian 앱 UI에서 파일을 엽니다.

obsidian_inspect_workspace

탭, 패널, 사이드바, 활성 파일 및 Markdown 편집기 모드를 검사합니다.

obsidian_control_workspace

사이드바, 탭, 분할, 리프 포커스/닫기, Markdown 편집기 모드 및 기본 제공 검색을 입력된 작업을 통해 제어합니다.

obsidian_capture_workspace

시각적 검증을 위해 Obsidian 창을 제한된 MCP 이미지 블록으로 캡처합니다. 폴더 범위 권한이 활성화된 경우 거부됩니다.

obsidian_execute_command

ID로 Obsidian 명령 팔레트 명령을 실행합니다. OBSIDIAN_ENABLE_COMMANDS=true로 옵트인합니다.

obsidian_get_note

볼트 경로, 활성 파일 또는 주기적 노트(daily, weekly, monthly, quarterly, yearly)로 주소를 지정하여 네 가지 프로젝션 중 하나로 노트를 읽습니다.

  • format: "content" — 원시 마크다운 본문

  • format: "full" — 콘텐츠, frontmatter, 태그 및 파일 메타데이터. includeLinks: true를 전달하면 작성된 나가는 참조와 Obsidian이 해석한 나가는 링크 및 역링크가 포함됩니다(볼트 내부 전용 — 외부 URL은 필터링됨)

  • format: "document-map" — 제목, 블록 참조 및 frontmatter 필드의 카탈로그

  • format: "section" — 단일 제목/블록/frontmatter 섹션 값(section 필요). 제목 섹션에는 해당 제목 아래의 전체 하위 트리가 포함됩니다.

document-map 프로젝션을 obsidian_patch_note와 함께 사용하여 패치 전에 편집 대상을 찾으십시오.


obsidian_search_notes

mode로 선택되는 최대 세 가지 검색 모드:

  • text — 주변 컨텍스트 창이 있는 부분 문자열 일치. contextLength는 각 일치 항목의 양쪽 컨텍스트 문자 수를 제어합니다(기본 100; 히트당 더 많은 컨텍스트를 원하면 늘리세요). 선택적 pathPrefix 필터(텍스트 모드 전용 — 다른 모드에서 pathPrefix를 전달하면 path_prefix_invalid_mode로 거부됨).

  • jsonlogicpath, content, frontmatter.<key>, tags, stat.{ctime,mtime,size}에 대해 평가되는 JSONLogic 트리. 사용자 정의 globregexp 연산자는 둘 다 [PATTERN, VALUE]를 받습니다 — 패턴 먼저, 그 다음 필드 참조: {"glob": ["Projects/*.md", {"var": "path"}]}. 순서를 반대로 하면 노트 자체의 필드를 패턴으로 컴파일합니다: glob은 그런 다음 아무것도 일치하지 않고, regexp는 필드가 파싱되는 값에 대해 즉시 실패합니다. 이것이 역링크를 표현하는 방법이기도 합니다. 전용 도구나 업스트림 엔드포인트가 없기 때문입니다: {"regexp": ["\\[\\[Target Note(\\||#|\\]\\])", {"var": "content"}]}는 본문이 Target Note를 위키링크하는 모든 노트를 반환합니다.

  • omnisearch — 커뮤니티 Omnisearch 플러그인을 통한 BM25 순위 검색. 따옴표로 묶인 구문, -exclusion, path: / ext: 필터, 오타 허용, PDF + OCR 지원(Text Extractor를 통해), 그리고 AI Image Analyzer 인덱싱이 활성화된 경우 시각적 개념 이미지 일치를 지원합니다. 플러그인의 HTTP 서버가 시작 시 연결 가능한 경우에만 모드 열거형에 존재합니다. 업스트림은 결과를 50개로 하드 상한 처리합니다 — 더 많은 결과를 표시하려면 쿼리를 좁히세요(상한에 도달했을 가능성이 있으면 응답에 truncated: true가 포함됩니다).

결과 페이지네이션은 MCP 2025-11-25 스펙에 따라 불투명 커서(opaque cursor)로 처리됩니다. 첫 페이지에서는 cursor를 생략하고, 이후 응답의 nextCursor를 전달합니다. 모든 결과는 totalCount(경로 정책 적용 후, 페이지네이션 전)를 포함하며, 마지막 페이지에서는 nextCursor가 생략됩니다. 텍스트 모드 히트는 파일당 maxMatchesPerHit(기본값 10)로 추가로 제한되어, 일치 항목이 많은 단일 노트가 응답 예산을 초과하지 않도록 합니다. 잘린 히트에는 truncated: truetotalMatches가 포함됩니다.


obsidian_write_note

의도치 않은 전체 파일 덮어쓰기를 방지하는 보호 기본값을 적용하여 파일을 생성하거나 외과적으로 교체합니다.

  • section 없이 — 전체 파일 PUT. overwrite: true가 설정되지 않는 한 기존 파일을 덮어쓰지 않습니다. file_exists(Conflict) 오류는 제자리 편집을 위해 obsidian_patch_note / obsidian_append_to_note / obsidian_replace_in_note를 제안합니다.

  • section 포함 — 지정된 헤딩/블록/frontmatter 필드에 대한 PATCH-with-replace로, 파일의 나머지 부분은 건드리지 않습니다. overwrite 플래그는 섹션 모드에서 무시됩니다.

호출로 새 파일이 생성된 경우 출력은 created: true를 보고하고, 기존 파일을 교체하거나 섹션을 대상으로 한 경우 false를 보고합니다. 모든 변경 도구는 또한 previousSizeInBytescurrentSizeInBytes를 반환하므로 에이전트가 우발적인 덮어쓰기, 예상치 못한 업스트림 동작, 또는 잘못된 파일에 도달한 오타 경로를 감지할 수 있습니다.


obsidian_append_to_note

업스트림 Local REST API 동작을 미러링하는 결합된 upsert + 섹션 추가 기본 요소입니다:

  • section 없이 — /vault/{path}POST. 파일이 존재하면 추가하고, 존재하지 않으면 콘텐츠 전체를 본문으로 하는 새 파일을 생성합니다. 출력의 created: true는 두 번째 분기를 표시하여 에이전트가 오타 경로나 아직 생성되지 않은 데일리 노트가 조용히 새 파일로 바뀌는 것을 인지할 수 있게 합니다.

  • section 포함 — 지정된 헤딩, 블록 참조 또는 frontmatter 필드에 대한 PATCH-with-append. 파일이 존재해야 합니다(그렇지 않으면 PATCH 사전 검사에서 note_missing이 발생). createTargetIfMissing: true를 전달하면 기존 파일 내부에 섹션 자체를 생성할 수 있습니다. 블록 참조 대상은 구분자 없이 블록 라인에 인접하게 연결됩니다. 구분자를 원하면 content에 선행 개행 문자를 포함하세요.

previousSizeInBytes는 upsert-생성 분기에서 0이고, 그 외에는 실제 파일 크기입니다. currentSizeInBytes는 작업 후 업스트림에서 읽은 쓰기 후 크기입니다. 델타를 Buffer.byteLength(content)와 비교하여 자동 개행 삽입이나 동시 쓰기 작업을 감지할 수 있습니다.


obsidian_patch_note

단일 문서 대상에 대한 외과적 편집.

  • operation: "append" — 섹션 뒤에 추가

  • operation: "prepend" — 섹션 앞에 추가

  • operation: "replace" — 교체

  • 대상: 헤딩 경로, 블록 참조 ID 또는 frontmatter 필드

헤딩 대상은 전체 Parent::Child 경로 또는 단순 리프 이름을 허용합니다. 정확히 하나의 헤딩과 일치하는 단순 리프는 쓰기 전에 전체 경로로 확장되며, 응답은 편집이 적용된 로케이터를 에코합니다. 여러 헤딩과 일치하는 리프는 ambiguous_section으로 거부되며, 오류 데이터에 후보 경로 목록이 포함됩니다. 동일한 해석이 section이 있는 obsidian_write_noteobsidian_append_to_note에도 적용됩니다.

패치 전에 존재하는 대상을 발견하려면 format: "document-map"과 함께 obsidian_get_note를 사용하세요.


obsidian_replace_in_note

obsidian_patch_note의 구조적 대상에 맞지 않는 편집을 위한 검색-교체. 노트를 가져와서 교체를 순차적으로 적용하고(각 교체는 이전 출력을 봅니다), 결과를 단일 PUT으로 다시 씁니다.

scope는 교체가 실행되는 대상을 선택합니다:

  • body(기본값) — YAML frontmatter 블록 이후의 텍스트. 블록은 원본 바이트에서 다시 첨부되므로 바이트 단위로 동일하게 돌아옵니다.

  • frontmatter--- 펜스 사이의 YAML만. 펜스 자체는 절대 일치하지 않습니다.

  • both — 각 교체가 frontmatter에 대해 실행된 다음 body에 대해 실행됩니다. perReplacement[]bodyCountfrontmatterCount를 별도로 보고합니다.

frontmatter가 범위에 있는 경우, 다시 작성된 YAML은 쓰기 전에 다시 파싱됩니다. 더 이상 속성 매핑으로 파싱되지 않으면 frontmatter_invalid로 호출이 실패하고 노트는 원본 바이트를 유지합니다. 이 검사는 깨지는 YAML(스칼라의 따옴표 없는 :, 별칭으로 다시 작성된 목록 마커, 잘못된 따옴표)을 잡아냅니다. 그러나 잘 구성된 상태를 유지하면서 다른 의미를 갖는 편집(키 이름을 바꾸는 부분 문자열 충돌, 스칼라의 따옴표를 제거하여 타입을 변경하는 교체 등)은 잡을 수 없습니다. 단일 속성에 대한 타입화된 편집에는 obsidian_manage_frontmatter를 선호하세요.

교체별 옵션:

  • useRegexsearch를 ECMAScript 정규식으로 처리. useRegex: true인 경우 교체는 $1 / $& 캡처 그룹 참조를 지원합니다.

  • caseSensitivefalse인 경우 대소문자를 구분하지 않고 일치

  • wholeWord — 패턴을 \b…\b로 감쌉니다. 리터럴 및 정규식 모드 모두에서 작동

  • flexibleWhitespacesearch의 모든 공백 실행을 \s+로 대체. 리터럴 모드 전용 — useRegex: true일 때는 효과가 없습니다(직접 표현하세요).

  • replaceAllfalse인 경우 첫 번째 일치 항목만 교체됩니다. scope: 'both'에서 해당 단일 치환은 frontmatter에서 일치하면 frontmatter로, 그렇지 않으면 body로 이동합니다.

리터럴 모드는 교체에서 $1 / $&를 그대로 보존합니다. 캡처 그룹 참조를 확장하는 것은 useRegex: true뿐입니다.


obsidian_manage_tags

노트에 태그를 추가, 제거 또는 나열합니다. 두 가지 표현 중 하나로 작동하며, 기본값은 표준 Obsidian frontmatter 위치입니다:

  • location: 'frontmatter'(기본값) — frontmatter tags: 배열만. 노트 본문은 건드리지 않습니다

  • location: 'inline' — 본문의 인라인 #tag 구문만. add는 파일 끝에 #tag를 추가합니다

  • location: 'both' — 두 표현 간의 옵트인 조정

add는 요청된 위치에 태그가 존재하도록 보장합니다. remove는 태그를 제거합니다. list는 입력 tags 배열을 무시합니다. 펜스 처리된 코드 블록 내부의 인라인 #tag 발생은 의도적으로 건드리지 않습니다.

인라인 모드는 노트 본문만 읽고 씁니다. YAML 스칼라 내부의 #는 frontmatter이므로 인라인 태그로 나열되지도 않고 제거로 다시 쓰여지지도 않습니다. 인라인 태그를 제거하면 정확히 하나의 인접한 가로 공백(태그 앞의 공백, 또는 앞에 공백이 없으면 뒤의 공백)이 함께 제거됩니다. 중첩 목록 들여쓰기, 4칸 들여쓰기 코드 블록, 후행 2칸 하드 줄바꿈, 테이블 셀 패딩을 포함한 다른 모든 바이트는 보존됩니다.


obsidian_delete_note

노트를 영구 삭제합니다. 기본적으로 비활성화. tools/list에 노출하려면 OBSIDIAN_ENABLE_DELETE=true를 설정하세요. 첫 번째 호출은 삭제 대신 확인 요청으로 응답합니다. 프롬프트에는 파일의 바이트 크기가 포함되어 사용자가 확인하기 전에 파괴적 영향 범위를 볼 수 있으며, 도구는 답변과 함께 재시도됩니다. 거부하거나 취소하면 cancelled로 호출이 실패하고 DELETE가 발행되지 않습니다. destructiveHint 주석은 또한 호스트의 승인 흐름에서 작업을 표시합니다. 출력은 previousSizeInBytes(삭제 시점의 크기)와 currentSizeInBytes: 0을 보고합니다.

확인은 선택 사항이 아니며 대체 경로가 없습니다. 입력 왕복을 제공할 수 없는 클라이언트는 삭제를 완료할 수 없습니다. 다른 모든 도구는 영향을 받지 않습니다.

볼트 구조 도구

obsidian_create_folder는 중첩 폴더를 멱등적으로 생성합니다. obsidian_move_path는 Obsidian의 네이티브 FileManager를 통해 파일이나 폴더를 이동하거나 이름을 바꾸며, 누락된 대상 상위 폴더를 생성하고 Obsidian이 내부 링크를 업데이트하도록 허용합니다. obsidian_delete_folder는 기본적으로 Obsidian의 구성된 휴지통 동작을 사용하여 폴더를 재귀적으로 제거하거나, 명시적으로 요청된 경우 영구 삭제합니다. 노트 삭제와 함께 OBSIDIAN_ENABLE_DELETE=true로 게이트됩니다.


obsidian_execute_command

ID로 Obsidian 명령 팔레트 명령을 실행합니다(obsidian_list_commands로 발견 가능). 동작은 명령에 따라 다릅니다. 일부 명령은 UI를 열고, 다른 명령은 파일을 삭제하거나 볼트를 닫습니다.

기본적으로 비활성화. OBSIDIAN_ENABLE_COMMANDS가 설정되지 않은 경우 obsidian_execute_command와 그 발견 파트너인 obsidian_list_commands 모두 disabledTool()로 래핑됩니다. tools/list에는 없지만(LLM이 호출할 수 없음) 운영자용 매니페스트에는 활성화 힌트와 함께 계속 표시됩니다.


Related MCP server: Obsidian Tools MCP Server

경로 정책(폴더 범위 권한)

세 가지 선택적 환경 변수가 각 도구가 대상으로 할 수 있는 볼트 경로를 제한합니다. 기본값 미설정 = 읽기와 쓰기 모두 전체 볼트 — 이전 버전과 호환됩니다.

목표

구성

기본값(현재 동작)

모두 미설정

모든 곳에서 읽기, projects/scratch/에서만 쓰기

OBSIDIAN_WRITE_PATHS=projects/,scratch/

public/만 읽기, public/inbox/만 쓰기

OBSIDIAN_READ_PATHS=public/, OBSIDIAN_WRITE_PATHS=public/inbox/

읽기 전용 배포 — 어디에도 쓰기 금지

OBSIDIAN_READ_ONLY=true

일치는 접두사 기반이며 암시적 재귀, 대소문자 구분 없음, 후행 슬래시 정규화. projects/projects/a.md, projects/sub/b.md 등과 일치합니다.

쓰기 경로는 암시적으로 읽기 가능 — 보이지 않는 것을 편집할 수는 없습니다. 따라서 대상이 READ_PATHS 또는 WRITE_PATHS와 일치하면 읽기가 통과합니다.

OBSIDIAN_READ_ONLY=true는 경로 검사 전에 단락됩니다 — 모든 쓰기 도구와 명령 팔레트 쌍은 시작 시 disabledTool()로 래핑되고(tools/list에 없음), 서비스에 도달하는 모든 쓰기는 WRITE_PATHS와 관계없이 런타임에 거부됩니다.

거부는 path_forbidden(JSON-RPC 코드 Forbidden)으로 유형화되며, 활성 범위가 data.recovery.hintdata.activeScope에 에코되어 LLM이 서버 로그를 검사하지 않고도 스스로 수정할 수 있습니다. obsidian_search_notes의 검색 결과는 READ_PATHS에 대해 조용히 필터링됩니다. "N개 히트를 숨겼습니다" 표시기를 표시하면 게이트가 무력화됩니다.

태그 목록은 볼트 전체에 걸쳐 있습니다. obsidian_list_tagsobsidian://tags 리소스는 전체 볼트의 태그 이름을 집계하며 OBSIDIAN_READ_PATHS로 좁혀지지 않습니다. 게이트할 경로가 없으므로 읽기 범위 밖의 태그 이름(노트 내용은 절대 아님)이 표면화될 수 있습니다.

시작 배너는 활성 범위를 기록하여 운영자가 부팅 시 구성을 확인할 수 있게 합니다.


리소스

유형

URI

설명

리소스

obsidian://vault/{+path}

볼트의 노트 — 콘텐츠, frontmatter, 태그 및 파일 메타데이터.

리소스

obsidian://tags

볼트 전체에서 발견된 모든 태그와 사용 횟수.

리소스

obsidian://status

서버 연결 가능성, 인증 상태, 플러그인/Obsidian 버전 정보 및 플러그인 매니페스트.

모든 리소스 데이터는 도구를 통해서도 접근할 수 있습니다. obsidian://vault/{+path}obsidian_get_note, obsidian://tagsobsidian_list_tags로 접근합니다. 리소스는 특정 노트나 볼트 스냅샷을 대화에 첨부하는 것을 선호하는 클라이언트를 위해 존재합니다. 태그 쌍은 미러가 아닙니다. obsidian://tags는 스냅샷 의미론을 유지하고 업스트림 페이로드를 전체 및 정렬되지 않은 상태로 반환하는 반면, obsidian_list_tags는 개수와 상한으로 정렬합니다.

기능

@cyanheads/mcp-ts-core 기반:

  • 선언적 도구 및 리소스 정의 — 프리미티브당 단일 파일, 프레임워크가 등록 및 검증 처리

  • 통합 오류 처리 — 핸들러가 throw하면 프레임워크가 포착, 분류, 형식화. 도구는 타입이 지정된 errors[] 계약을 통해 실패 표면을 알림.

  • initialize 시 서버 수준 instructions — 정적 도구/리소스 카탈로그와 함께 배포별 지침(활성 경로 정책, 읽기 전용 모드, 명령 팔레트 토글)을 사양 준수 클라이언트에 표시

  • HTTP 전송에서 플러그 가능한 인증: none, jwt, oauth

  • 선택적 OpenTelemetry 추적이 포함된 구조화된 로깅

  • STDIO 및 Streamable HTTP 전송

서버 자체는 상태 비저장 — 모든 도구 호출은 로컬 REST API를 직접 호출합니다. 프레임워크의 스토리지 백엔드, 요청 상태 KV, 진행률 스트림은 여기서 사용되지 않습니다. Obsidian은 단일 볼트이며 호출 간에 유지할 것이 없습니다.

Obsidian 특화:

  • Obsidian Local REST API 플러그인 래핑 — 타입이 지정된 클라이언트, 결정적 오류 매핑

  • 제목, 블록 참조, frontmatter 필드 전반에 걸친 섹션 인식 편집 — PATCH-with-target 작업

  • 두 표현 모두에서 태그 조정: frontmatter tags: 배열 및 인라인 #tag 구문(펜스 코드 블록 건너뜀)

  • 최대 세 가지 모드 검색: 텍스트, JSONLogic, (플러그인에 연결 가능한 경우) BM25 순위 Omnisearch — MCP 2025-11-25 사양에 따른 커서 페이지네이션, 텍스트 모드에서 파일별 일치 클리핑

  • 파괴적 삭제에 대한 필수 인간 개입 확인 — 두 프로토콜 개정판 모두에서 제공되는 다중 왕복 input_required 라운드, 도구를 통한 미확인 경로 없음

  • 기본 볼트 구조 관리: 폴더 생성, Obsidian 링크 업데이트로 파일/폴더 이동 또는 이름 변경, 휴지통 또는 영구 제거를 통한 폴더 삭제

  • 기본 Excalidraw Automation API 통합: 의미론적 생성/읽기/추가/업데이트/삭제, 결정적 레이아웃, 무결성 검증, PNG 미리보기 내보내기, 멱등적 노트 임베딩

  • OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS를 통한 폴더 범위 읽기/쓰기 권한 및 전역 OBSIDIAN_READ_ONLY 킬 스위치 — 거부는 타입이 지정된 path_forbidden이며 활성 범위가 오류 데이터에 다시 반영됨

  • 옵트인 명령 팔레트 쌍(obsidian_list_commands + obsidian_execute_command) — OBSIDIAN_ENABLE_COMMANDS=true일 때만 등록

  • obsidian_get_noteobsidian_open_in_ui에서 관대한 경로 해석 — 대소문자가 일치하지 않는 경로를 정규 파일 이름으로 자동 재시도, 모호한 대소문자 일치 시 Conflict 발생, 근접 일치만 존재할 때 NotFoundDid you mean: …? 제안 추가. obsidian_delete_note는 의도적으로 제외 — 파괴적 작업이 대상 경로를 조용히 다시 쓰면 안 됨.

시작하기

MCP 클라이언트 구성 파일에 다음을 추가하세요. Obsidian Local REST API 플러그인이 볼트에 설치되고 활성화되어 있어야 합니다 — 사전 요구 사항 참조.

{
  "mcpServers": {
    "obsidian-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["obsidian-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "OBSIDIAN_API_KEY": "your-local-rest-api-key"
      }
    }
  }
}

또는 npx 사용(Bun 불필요):

{
  "mcpServers": {
    "obsidian-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "obsidian-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "OBSIDIAN_API_KEY": "your-local-rest-api-key"
      }
    }
  }
}

Streamable HTTP의 경우 전송을 설정하고 서버를 시작하세요. 인라인 환경 변수는 일회성 실행에 적합합니다. 반복 사용의 경우 값을 .env에 복사하고(.env.example 참조) bun run start:http를 실행하세요.

MCP_TRANSPORT_TYPE=http OBSIDIAN_API_KEY=... bun run start:http
# Server listens at http://127.0.0.1:3010/mcp by default

사전 요구 사항

  • Bun v1.3.0 이상(또는 Node.js v24+).

  • Obsidian Local REST API 플러그인, v4.0.0 ~ v5.x가 볼트에 설치되고 활성화되어 있어야 합니다. 설정 → 커뮤니티 플러그인 → Local REST API에서 API 키를 생성하고 OBSIDIAN_API_KEY에 복사하세요. 플러그인 v6.0은 이 서버가 섹션 대상 쓰기 및 문서 맵에 고정하는 markdown-patch 1.x 와이어 형식을 제거합니다.

  • 주기적 노트 대상(target: { "type": "periodic" })은 추가로 플러그인 v5.0.1 이하가 필요합니다 — v5.0.2는 내장 /periodic/ 경로를 제거했습니다. 다른 모든 대상 유형은 영향을 받지 않습니다.

  • 입력 요청(elicitation)에 응답할 수 있는 MCP 클라이언트. obsidian_delete_note는 삭제 전에 항상 확인을 요청하므로 해당 지원이 없는 클라이언트는 노트를 읽고 쓸 수 있지만 삭제할 수는 없습니다.

  • 선택 사항: 11개의 드로잉 도구를 사용하려면 Obsidian Excalidraw 플러그인이 설치되고 활성화되어 있어야 합니다. 다른 노트 및 볼트 도구에는 필요하지 않습니다.

  • 이 서버는 단순성을 위해 기본적으로 http://127.0.0.1:27123을 사용합니다. 플러그인 설정에서 **"비암호화(HTTP) 서버"**를 활성화하여 사용하세요. 항상 켜져 있는 HTTPS 포트를 사용하려면 OBSIDIAN_BASE_URL=https://127.0.0.1:27124로 설정하세요. 플러그인의 자체 서명 인증서는 OBSIDIAN_VERIFY_SSL=false(기본값)로 처리됩니다.

설치

  1. 저장소 복제:

    git clone https://github.com/cyanheads/obsidian-mcp-server.git
  2. 디렉터리로 이동:

    cd obsidian-mcp-server
  3. 의존성 설치:

    bun install
  4. 환경 구성:

    cp .env.example .env
    # edit .env and set OBSIDIAN_API_KEY

구성

변수

설명

기본값

OBSIDIAN_API_KEY

필수. Obsidian Local REST API 플러그인용 Bearer 토큰.

OBSIDIAN_BASE_URL

Local REST API 플러그인의 기본 URL. 항상 켜져 있는 HTTPS 포트(자체 서명 인증서)에는 https://127.0.0.1:27124를 사용하세요.

http://127.0.0.1:27123

OBSIDIAN_VERIFY_SSL

TLS 인증서를 검증합니다. 플러그인이 자체 서명 인증서를 사용하므로 기본값은 false입니다. Node에서는 디스패처의 rejectUnauthorized 옵션이 프로세스 전체 변경 없이 이를 처리합니다. Bun에서는 런타임이 해당 옵션을 무시하므로 서비스가 추가로 NODE_TLS_REJECT_UNAUTHORIZED=0을 설정합니다. 이 대체 동작은 Bun에만 적용됩니다.

false

OBSIDIAN_REQUEST_TIMEOUT_MS

요청당 제한 시간(밀리초).

30000

OBSIDIAN_CLI_PATH

기본 파일/폴더 구조 작업을 위한 Obsidian CLI 실행 파일. 셸 없이 직접 호출됩니다.

obsidian

OBSIDIAN_VAULT_NAME

CLI 작업을 위한 선택적 정확한 볼트 이름. 설정하지 않으면 활성 볼트가 사용됩니다.

설정 안 됨

OBSIDIAN_ENABLE_COMMANDS

명령 팔레트 쌍(obsidian_list_commands + obsidian_execute_command)을 위한 옵트인 플래그. 기본적으로 꺼져 있습니다. Obsidian 명령은 불투명하고 파괴적일 수 있습니다.

false

OBSIDIAN_ENABLE_DELETE

노트 및 폴더 삭제를 위한 옵트인 플래그. 기본적으로 꺼져 있으므로 두 삭제 도구 모두 tools/list에 없습니다.

false

OBSIDIAN_READ_PATHS

읽기 작업을 위한 쉼표로 구분된 볼트 상대 폴더 허용 목록. 접두사 기반이며 암시적 재귀, 대소문자 구분 없음, 후행 슬래시 정규화. 설정하지 않음 = 전체 볼트. 쓰기 경로는 암시적으로 읽을 수 있습니다.

설정 안 됨

OBSIDIAN_WRITE_PATHS

쓰기 작업을 위한 쉼표로 구분된 볼트 상대 폴더 허용 목록. OBSIDIAN_READ_PATHS와 동일한 구문. 설정하지 않음 = 전체 볼트.

설정 안 됨

OBSIDIAN_READ_ONLY

전역 킬 스위치. true이면 OBSIDIAN_WRITE_PATHS와 관계없이 모든 쓰기를 거부하고 OBSIDIAN_ENABLE_COMMANDS 쌍을 억제합니다(명령은 변경을 일으킬 수 있음).

false

OBSIDIAN_OMNISEARCH_URL

Omnisearch 플러그인의 HTTP 서버에 대한 재정의 URL. 설정하지 않으면 OBSIDIAN_BASE_URL 호스트에서 포트 51361로 파생됩니다(http://localhost:51361로 폴백). 시작 시 한 번 프로브됩니다. 연결 가능하면 omnisearch 모드가 obsidian_search_notes에 추가되고, 그렇지 않으면 도구 스키마에서 제외됩니다. 다시 프로브하려면 서버를 재시작하세요.

파생됨

MCP_TRANSPORT_TYPE

전송: stdio 또는 http.

stdio

MCP_HTTP_HOST

HTTP 서버의 호스트.

127.0.0.1

MCP_HTTP_PORT

HTTP 서버의 포트.

3010

MCP_HTTP_ENDPOINT_PATH

JSON-RPC 핸들러의 엔드포인트 경로.

/mcp

MCP_PUBLIC_URL

TLS 종료 리버스 프록시 배포를 위한 공개 오리진 재정의(랜딩 페이지, Server Card, RFC 9728 메타데이터).

설정 안 됨

MCP_AUTH_MODE

인증 모드: none, jwt 또는 oauth.

none

MCP_AUTH_SECRET_KEY

MCP_AUTH_MODE=jwt일 때 필수. 들어오는 JWT를 검증하는 데 사용되는 32자 이상의 공유 비밀.

MCP_AUTH_DISABLE_SCOPE_CHECKS

true이면 인증 컨텍스트 존재 확인 후 도구별 범위 강제를 우회합니다. 토큰 서명, 대상(audience), 발급자(issuer), 만료 검증은 그대로 유지됩니다. 사용자 지정 클레임을 주입할 수 없을 때만 사용하고 접근 제어를 위해 OBSIDIAN_READ_PATHS / OBSIDIAN_WRITE_PATHS / OBSIDIAN_READ_ONLY와 함께 사용하세요. 우회가 활성화되면 시작 시 WARNING이 기록됩니다.

false

MCP_LOG_LEVEL

로그 수준(RFC 5424).

info

LOGS_DIR

로그 파일 디렉터리(Node.js 전용).

<project-root>/logs

OTEL_ENABLED

OpenTelemetry 계측 활성화(스팬, 메트릭, 완료 로그).

false

선택적 재정의의 전체 목록은 .env.example을 참조하세요.

서버 실행

로컬 개발

  • 프로덕션 버전 빌드 및 실행:

# One-time build
bun run rebuild

# Run the built server
bun run start:stdio
# or
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 build -t obsidian-mcp-server .
docker run --rm -e OBSIDIAN_API_KEY=your-key -p 3010:3010 obsidian-mcp-server

Dockerfile은 기본적으로 HTTP 전송, 무상태 세션 모드를 사용하며 /var/log/obsidian-mcp-server에 로그를 기록합니다. OpenTelemetry 피어 종속성은 기본적으로 설치됩니다. 이를 제외하려면 --build-arg OTEL_ENABLED=false로 빌드하세요.

이미지는 컨테이너 내부에서 0.0.0.0에 바인딩됩니다(Docker 포트 매핑에 필요). 자신의 머신 너머로 접근 가능한 배포의 경우 MCP_AUTH_MODE=jwt(MCP_AUTH_SECRET_KEY 포함) 또는 oauth를 설정하세요. 그렇지 않으면 리스너가 모든 호출자를 대신하여 OBSIDIAN_API_KEY를 볼트로 전달합니다.

프로젝트 구조

디렉터리

용도

src/index.ts

createApp() 진입점 — 도구/리소스를 등록하고 Obsidian 서비스를 초기화합니다.

src/config

Zod를 사용한 서버별 환경 변수 파싱(OBSIDIAN_*).

src/services/obsidian

로컬 REST API 클라이언트, frontmatter 연산, 섹션 추출기, 도메인 타입.

src/mcp-server/tools

도구 정의(*.tool.ts) 및 공유 입력 스키마.

src/mcp-server/resources

리소스 정의(*.resource.ts).

src/mcp-server/prompts

프롬프트 정의(현재 비어 있음 — CRUD/검색 형태는 구조화된 템플릿의 이점이 없음).

tests/

src/를 미러링하는 Vitest 테스트.

docs/

Local REST API 플러그인의 업스트림 OpenAPI 스펙 및 생성된 tree.md.

changelog/

버전별 릴리스 노트; CHANGELOG.md는 재생성된 롤업.

개발 가이드

개발 지침과 아키텍처 규칙은 CLAUDE.md를 참조하세요. 요약은 다음과 같습니다:

  • 핸들러는 던지고 프레임워크가 잡습니다 — 도구 로직에 try/catch 없음

  • 요청 범위 로깅에는 ctx.log, 테넌트 범위 저장에는 ctx.state 사용

  • src/mcp-server/*/definitions/index.ts의 배럴을 통해 새 도구와 리소스 등록

  • 외부 API 호출 래핑: 원시 검증 → 도메인 타입으로 정규화 → 출력 스키마 반환; 누락된 필드를 임의로 만들지 말 것

기여

버그, 기능 요청, 문서 누락은 이슈로 등록하세요 — 실행 가능한 이슈의 기준은 CONTRIBUTING.md, 협업 방식은 CODE_OF_CONDUCT.md를 참조하세요. 보안 보고는 SECURITY.md를 통해 제출하며, 공개 이슈로 올리지 마세요.

작고 독립적인 수정에 대한 풀 리퀘스트를 환영합니다. 제출 전에 검사와 테스트를 실행하세요:

bun run devcheck
bun run test

라이선스

Apache-2.0 — 자세한 내용은 LICENSE를 참조하세요.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables direct file system access to Obsidian vaults with auto-discovery, full-text search, and note operations. Supports reading, writing, and searching across Obsidian notes without requiring plugins or REST API.
    6
    4,785
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage Obsidian vaults through full CRUD operations, wikilink management, and section-level manipulation. It supports frontmatter editing, tag-based searching, and automated link updates to maintain vault integrity.
    MIT

View all related MCP servers

Related MCP Connectors

  • Search your Obsidian vault to quickly find notes by title or keyword, summarize related content, a…

  • Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.

  • Create, validate, edit, export (markdown/svg/png/mermaid), and search JSON Canvas files.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/huaqing0/obsidian-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server