obsidian-mcp-server
[!NOTE] 이 저장소는 huaqing0 커스텀 에디션으로, Apache-2.0 라이선스 하에
cyanheads/obsidian-mcp-serverv3.5.0을 기반으로 합니다. 업스트림 서버를 유지하면서 이 에디션에서 사용하는 로컬 워크스페이스, 볼트 구조, 네이티브 Excalidraw 자동화를 추가합니다. 아래의 npm 및 MCPB 설치 링크는 여전히 업스트림 배포판을 가리키며, 이 커스텀 에디션은 현재 소스 전용입니다.
도구
31개의 도구가 노트 콘텐츠, 메타데이터, 역링크, 네이티브 Excalidraw 자동화, 그리고 완전한 볼트 구조 관리를 다루며, Obsidian 명령 팔레트 명령을 위한 보호된 탈출구도 포함합니다.
도구 이름 | 설명 |
| 노트를 원시 콘텐츠, 전체 구조화 형식(콘텐츠 + frontmatter + 태그 + stat, 선택적으로 작성된 링크, 해석된 링크, 역링크 포함), 구조적 문서 맵 또는 단일 섹션으로 읽습니다. |
| 볼트 경로 아래의 노트와 하위 디렉터리를 나열합니다. 선택적 |
| 사용 횟수와 함께 볼트 태그를 나열하며, 계층적 상위 태그를 포함합니다. 개수 내림차순으로 정렬되고 |
| Obsidian 명령 팔레트 명령을 나열하며, 선택적으로 표시 이름에 대한 |
| 텍스트, JSONLogic 또는 BM25 순위 Omnisearch(플러그인에 연결 가능한 경우)로 볼트를 검색합니다. 결과는 불투명 커서를 통해 페이지네이션됩니다. |
| 기본 |
| Excalidraw 파싱, 안정적인 의미론적 ID, 지오메트리 및 관계 참조를 검증합니다. |
| 노드, 바인딩된 관계 및 프레임의 하나의 의미론적 배치로 기본 Excalidraw 드로잉을 생성합니다. |
| 기존 드로잉에 의미론적 노드, 관계 또는 프레임을 멱등적으로 추가합니다. |
| 안정적인 의미론적 ID로 관리되는 드로잉 요소를 정밀하게 업데이트합니다. |
| 드로잉 파일과 관련 없는 콘텐츠를 보존하면서 선택한 관리 요소를 삭제합니다. |
| 관리되는 노드를 결정적 관계 깊이 레이어로 정렬합니다. |
| 안정적인 의미론적 ID로 관리되는 드로잉 요소에 Obsidian 링크를 첨부하거나 교체합니다. |
| 라이브 Excalidraw 보기에서 선택한 의미론적 요소에 초점을 맞추고 주변 요소를 흐리게 하거나 복원합니다. |
| 플러그인 내보내기 API를 통해 기본 Excalidraw 드로잉을 제한된 PNG 미리보기로 렌더링합니다. |
| 검증된 Excalidraw wiki-embed를 기존 Markdown 노트에 멱등적으로 추가합니다. |
| 노트를 생성하거나, 단일 섹션을 제자리에서 교체하거나, |
| 노트에 콘텐츠를 추가합니다. |
| 제목, 블록 참조 또는 frontmatter 필드에 대해 정밀한 |
| 단일 노트 내에서 검색-바꾸기를 수행하며 기본적으로 본문으로 범위가 제한됩니다. 리터럴 또는 정규식 매칭과 전체 단어, 공백 유연성, 대소문자 구분 옵션을 지원하며 캡처 그룹 바꾸기를 지원합니다. |
| 단일 frontmatter 키에 대한 원자적 |
| 태그를 추가, 제거 또는 나열합니다. 기본적으로 frontmatter |
| Obsidian을 통해 볼트 폴더와 누락된 상위 폴더를 생성합니다. |
| Obsidian의 FileManager를 통해 볼트 파일 또는 폴더를 이동하거나 이름을 바꾸어 내부 링크가 링크 업데이트에 참여하도록 합니다. |
| 노트를 영구 삭제합니다. |
| Obsidian 휴지통 또는 영구 삭제를 통해 폴더와 모든 하위 항목을 삭제합니다. |
|
|
| 탭, 패널, 사이드바, 활성 파일 및 Markdown 편집기 모드를 검사합니다. |
| 사이드바, 탭, 분할, 리프 포커스/닫기, Markdown 편집기 모드 및 기본 제공 검색을 입력된 작업을 통해 제어합니다. |
| 시각적 검증을 위해 Obsidian 창을 제한된 MCP 이미지 블록으로 캡처합니다. 폴더 범위 권한이 활성화된 경우 거부됩니다. |
| ID로 Obsidian 명령 팔레트 명령을 실행합니다. |
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로 거부됨).jsonlogic—path,content,frontmatter.<key>,tags,stat.{ctime,mtime,size}에 대해 평가되는 JSONLogic 트리. 사용자 정의glob및regexp연산자는 둘 다[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: true와 totalMatches가 포함됩니다.
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를 보고합니다. 모든 변경 도구는 또한 previousSizeInBytes와 currentSizeInBytes를 반환하므로 에이전트가 우발적인 덮어쓰기, 예상치 못한 업스트림 동작, 또는 잘못된 파일에 도달한 오타 경로를 감지할 수 있습니다.
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_note 및 obsidian_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[]는bodyCount와frontmatterCount를 별도로 보고합니다.
frontmatter가 범위에 있는 경우, 다시 작성된 YAML은 쓰기 전에 다시 파싱됩니다. 더 이상 속성 매핑으로 파싱되지 않으면 frontmatter_invalid로 호출이 실패하고 노트는 원본 바이트를 유지합니다. 이 검사는 깨지는 YAML(스칼라의 따옴표 없는 :, 별칭으로 다시 작성된 목록 마커, 잘못된 따옴표)을 잡아냅니다. 그러나 잘 구성된 상태를 유지하면서 다른 의미를 갖는 편집(키 이름을 바꾸는 부분 문자열 충돌, 스칼라의 따옴표를 제거하여 타입을 변경하는 교체 등)은 잡을 수 없습니다. 단일 속성에 대한 타입화된 편집에는 obsidian_manage_frontmatter를 선호하세요.
교체별 옵션:
useRegex—search를 ECMAScript 정규식으로 처리.useRegex: true인 경우 교체는$1/$&캡처 그룹 참조를 지원합니다.caseSensitive—false인 경우 대소문자를 구분하지 않고 일치wholeWord— 패턴을\b…\b로 감쌉니다. 리터럴 및 정규식 모드 모두에서 작동flexibleWhitespace—search의 모든 공백 실행을\s+로 대체. 리터럴 모드 전용 —useRegex: true일 때는 효과가 없습니다(직접 표현하세요).replaceAll—false인 경우 첫 번째 일치 항목만 교체됩니다.scope: 'both'에서 해당 단일 치환은 frontmatter에서 일치하면 frontmatter로, 그렇지 않으면 body로 이동합니다.
리터럴 모드는 교체에서 $1 / $&를 그대로 보존합니다. 캡처 그룹 참조를 확장하는 것은 useRegex: true뿐입니다.
obsidian_manage_tags
노트에 태그를 추가, 제거 또는 나열합니다. 두 가지 표현 중 하나로 작동하며, 기본값은 표준 Obsidian frontmatter 위치입니다:
location: 'frontmatter'(기본값) — frontmattertags:배열만. 노트 본문은 건드리지 않습니다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/는 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.hint와 data.activeScope에 에코되어 LLM이 서버 로그를 검사하지 않고도 스스로 수정할 수 있습니다. obsidian_search_notes의 검색 결과는 READ_PATHS에 대해 조용히 필터링됩니다. "N개 히트를 숨겼습니다" 표시기를 표시하면 게이트가 무력화됩니다.
태그 목록은 볼트 전체에 걸쳐 있습니다. obsidian_list_tags와 obsidian://tags 리소스는 전체 볼트의 태그 이름을 집계하며 OBSIDIAN_READ_PATHS로 좁혀지지 않습니다. 게이트할 경로가 없으므로 읽기 범위 밖의 태그 이름(노트 내용은 절대 아님)이 표면화될 수 있습니다.
시작 배너는 활성 범위를 기록하여 운영자가 부팅 시 구성을 확인할 수 있게 합니다.
리소스
유형 | URI | 설명 |
리소스 |
| 볼트의 노트 — 콘텐츠, frontmatter, 태그 및 파일 메타데이터. |
리소스 |
| 볼트 전체에서 발견된 모든 태그와 사용 횟수. |
리소스 |
| 서버 연결 가능성, 인증 상태, 플러그인/Obsidian 버전 정보 및 플러그인 매니페스트. |
모든 리소스 데이터는 도구를 통해서도 접근할 수 있습니다. obsidian://vault/{+path}는 obsidian_get_note, obsidian://tags는 obsidian_list_tags로 접근합니다. 리소스는 특정 노트나 볼트 스냅샷을 대화에 첨부하는 것을 선호하는 클라이언트를 위해 존재합니다. 태그 쌍은 미러가 아닙니다. obsidian://tags는 스냅샷 의미론을 유지하고 업스트림 페이로드를 전체 및 정렬되지 않은 상태로 반환하는 반면, obsidian_list_tags는 개수와 상한으로 정렬합니다.
기능
선언적 도구 및 리소스 정의 — 프리미티브당 단일 파일, 프레임워크가 등록 및 검증 처리
통합 오류 처리 — 핸들러가 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_note및obsidian_open_in_ui에서 관대한 경로 해석 — 대소문자가 일치하지 않는 경로를 정규 파일 이름으로 자동 재시도, 모호한 대소문자 일치 시Conflict발생, 근접 일치만 존재할 때NotFound에Did 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(기본값)로 처리됩니다.
설치
저장소 복제:
git clone https://github.com/cyanheads/obsidian-mcp-server.git디렉터리로 이동:
cd obsidian-mcp-server의존성 설치:
bun install환경 구성:
cp .env.example .env # edit .env and set OBSIDIAN_API_KEY
구성
변수 | 설명 | 기본값 |
| 필수. Obsidian Local REST API 플러그인용 Bearer 토큰. | — |
| Local REST API 플러그인의 기본 URL. 항상 켜져 있는 HTTPS 포트(자체 서명 인증서)에는 |
|
| TLS 인증서를 검증합니다. 플러그인이 자체 서명 인증서를 사용하므로 기본값은 |
|
| 요청당 제한 시간(밀리초). |
|
| 기본 파일/폴더 구조 작업을 위한 Obsidian CLI 실행 파일. 셸 없이 직접 호출됩니다. |
|
| CLI 작업을 위한 선택적 정확한 볼트 이름. 설정하지 않으면 활성 볼트가 사용됩니다. | 설정 안 됨 |
| 명령 팔레트 쌍( |
|
| 노트 및 폴더 삭제를 위한 옵트인 플래그. 기본적으로 꺼져 있으므로 두 삭제 도구 모두 |
|
| 읽기 작업을 위한 쉼표로 구분된 볼트 상대 폴더 허용 목록. 접두사 기반이며 암시적 재귀, 대소문자 구분 없음, 후행 슬래시 정규화. 설정하지 않음 = 전체 볼트. 쓰기 경로는 암시적으로 읽을 수 있습니다. | 설정 안 됨 |
| 쓰기 작업을 위한 쉼표로 구분된 볼트 상대 폴더 허용 목록. | 설정 안 됨 |
| 전역 킬 스위치. |
|
| Omnisearch 플러그인의 HTTP 서버에 대한 재정의 URL. 설정하지 않으면 | 파생됨 |
| 전송: |
|
| HTTP 서버의 호스트. |
|
| HTTP 서버의 포트. |
|
| JSON-RPC 핸들러의 엔드포인트 경로. |
|
| TLS 종료 리버스 프록시 배포를 위한 공개 오리진 재정의(랜딩 페이지, Server Card, RFC 9728 메타데이터). | 설정 안 됨 |
| 인증 모드: |
|
|
| — |
|
|
|
| 로그 수준(RFC 5424). |
|
| 로그 파일 디렉터리(Node.js 전용). |
|
| OpenTelemetry 계측 활성화(스팬, 메트릭, 완료 로그). |
|
선택적 재정의의 전체 목록은 .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 specDocker
docker build -t obsidian-mcp-server .
docker run --rm -e OBSIDIAN_API_KEY=your-key -p 3010:3010 obsidian-mcp-serverDockerfile은 기본적으로 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를 볼트로 전달합니다.
프로젝트 구조
디렉터리 | 용도 |
|
|
| Zod를 사용한 서버별 환경 변수 파싱( |
| 로컬 REST API 클라이언트, frontmatter 연산, 섹션 추출기, 도메인 타입. |
| 도구 정의( |
| 리소스 정의( |
| 프롬프트 정의(현재 비어 있음 — CRUD/검색 형태는 구조화된 템플릿의 이점이 없음). |
|
|
| Local REST API 플러그인의 업스트림 OpenAPI 스펙 및 생성된 |
| 버전별 릴리스 노트; |
개발 가이드
개발 지침과 아키텍처 규칙은 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를 참조하세요.
This server cannot be installed
Maintenance
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
- AlicenseBqualityDmaintenanceEnables 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.64,785MIT
- FlicenseAqualityDmaintenanceEnables comprehensive management of Obsidian vaults with full CRUD operations, advanced search, link/tag extraction, backlinks discovery, frontmatter editing, and template-based note creation through natural language.16
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to read, write, search, and navigate Obsidian vault notes with support for CRUD operations, full-text search, graph navigation, daily notes, and frontmatter management.4,785
- AlicenseNot gradedqualityDmaintenanceEnables 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
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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