Skip to main content
Glama

Seekstone

obsidian-mcp-server (다운로드 수 1위)

REST 프록시 서버

로컬 REST API 플러그인

불필요

필요

필요

Obsidian 앱 실행

불필요 — Obsidian을 닫아도 동작

필요

필요

검색 페이로드 @ 10k 노트

2.0 KB

47 KB

최대 95 MB

웜 검색 지연 시간 @ 10k 노트

6.2 ms

732 ms (~118× 느림)

최대 1,550 ms

구조화된 frontmatter 쿼리

내장 (query_notes) — 속성/날짜/크기 조건, 수백 바이트로 응답

REST를 통한 JSONLogic

서버마다 상이

동일한 쿼리, 동일한 커밋된 볼트, 각각 20회 실행, 단일 머신에서 위와 같이 연습 — 수집 결과는 2026년 6월–8월 스냅샷(각 커밋 리포트에 포함)이며, 아래의 8개 서버와 3가지 볼트 크기 비교 전체 결과는 harness에서 완전재 재현할 수 있습니다.



Seekstone이란 무엇인가요?

Seekstone은 Obsidian MCP 서버입니다. Claude(그리고 모든 Model Context Protocol 클라이언트)가 Obsidian 볼트에 직접 읽기/쓰기 접근할 수 있게 해줍니다. Obsidian 앱이 켜져 있을 필요도, 플러그인이 필요하지도 없습니다. 그리고 그 어떤 데이터도 여러분의 컴퓨터 밖으로 나가지 않습니다.

Obsidian Local REST API 플러그인을 경유하는 다른 아니라 볼트를 디스크에서 직접 읽고, 프로세스 내부에 웜(warm) 전체 텍스트 인덱스를 유지합니다. 실질적인 차이점은 두 가지입니다:

  • 속도. 웜 상태의 키워드 검색은 한 자릿수 밀리초(ms) 단위로, 시맨틱 검색은 ~14 ms 안에 반환됩니다. 하위 프로세스를 생성하거나 HTTP 요청을 쿼리 당 왕복할 필요가 없기 때문에, 우리가 벤치마킹한 다른 모든 Obsidian MCP 서버보다 ~440배 이상 빠릅니다.

  • 컨텍스트. REST 프록시 서버를 거치면 수십 MB와 수백만 토큰을 반환했을 광범위한 검색이, Seekstone에서는 ~2 KB만 반환합니다. 이는 최대 ~47,000배의 컨텍스트 절감이며, 볼트가 커짐에 따라 이 차이는 계속 더 넓어집니다.

검색은 세 가지 모드로 제공됩니다: 우선순위가 매겨진 전문 검색(퍼지 및 접두어 일치), 선택적인 로컬 시맨틱 검색(의미 기반으로, 소형 온디바이스 임베딩 모델을 사용 — 시작 시 선택 & 일회성 30 MB 모델 다운로드 후 런타임에서 오프라인으로 동작), 그리고 구조화된 메타데이터 쿼리가 있습니다. query_notes는 frontmatter 속성(status, due, type, ...), 태그, 폴더, 수정 시각, 크기로 필터링하여 "이번 주에 변경된 초안 노트는?" 같은 질문에 검색-읽기 루프 없이 수백 바이트 만으로 답합니다.

Claude는 컨텍스트 윈도우 대부분을 한 번의 도구 호출로 소모하지 않으면서, 전체 노트 라이브러리를 밀리초 단위로 검색하고 읽을 수 있습니다.

npm에 peedstone으로 배포되어 있습니다 — npx -y seekstone로 설치할 수 있습니다. (이전에는 obsidian-mcp-seekstone으로도 배포되었던 별칭은 deprecated이만 기존 설치본은 계속 작동합니다.)


Related MCP server: mcp-obsidian-ek

왜 Seekstone인가? 수치로 보세요.

대부분의 Obsidian MCP server는 검색 결과에 대해 노트 전체 내용을 반환합니다. 광범위한 쿼리 하나당 LLM이 처리해야할수 MB 규모의 텍스트 되어, 대부분은 관련없고 모두 컨텐스트 윈도를 태울 수 있습니다.

Seekstone는 그 대신 짧고 순위화된 발췌만 반환합니다(기본값 약 120자, 쿼리마다 조절 가능). Seekstone는 다른 7개의 Obsidian MCP 서버 — 총 8개 — 와 1,000 / 5,000 / 10,000 노트 의 세 가지 **서버 볼트 크기(각 20회 실행)**에서 비교했습니다. 아래의 모든 수치는 완전히 재현 가능합니다 — 이 저장소에 커먼된 볼트가 포함되어 있으므로(1910년 공공 도메인 1911 Encyclopædia Britannica 기반), 직접 클론하여 동일한 벤치마크를 실행할 수 있습니다.

세 가지 크기로 시험하는 요지는 아키텍처가 드러나는 지점이 바로 여기이기 때문입니다 — 실제 볼트는 계속 커집니다.

검색 페이로드 — 쿼리당 반환되는 바이트(컨텍스트 비용; 낮을수록 좋음)

서버

아키텍처

1k 노트

5k 노트

10k 노트

시 Seekstone

인프로스 인덱스

1.6 KB

1.8 KB

2.0 KB

mcpvault

파일시스템 직접 하위 프로세스

1.7 KB

1.9 KB

2.2 KB

obsidian-mcp-rs

파일시스템 직접, 쿼리별 스캔

5.4 KB

5.8 KB

6.2 KB

obsidian-tc

SQLite 플랫폼

4.6 KB

6.8 KB

7.2 KB

obsidian-mcp-server

REST API

55 KB

47 KB

47 KB

obsidian-mcp-pro

파일시스템 직접 하위 프로세스

25 KB

84 KB

114 KB

obsidian-mcp

파일시스템 직접 하위 프로세스

18 KB

105 KB

201 KB

mcp-obsidian

REST API

9.8 MB

45 MB

95 MB

Seekstone은 볼트 크기와 무관하게 ~2 KB로 평평하게 유지됩니다. 항상 순위 기반 발췌를 반환하기 때문에, 그리고 이제는 테스트된 모든 server 중 가장 작은 페이로드를 기록하며 세 크기 모두 mcpvault까지 제친다는 점이 됩니다. REST 프록시 서버들은 모든 일치 항목에 노트 전체를 반환하므로 볼트가 커질수록 페이로드가 커집니다 — mcp-obsidian은 10k 노트에서 95 MB까지 이릅니다. 그리고 광범위한 단일 쿼리(the capital of)는 20회 실행 동안 호출당 평균 370 MB / 97.8 million tokens을 반환했습니다. 10k 노트에서 이는 ~47,000배 의 컨텍스트 비용 차이입니다.

검색 지연 — 웜(캐시) 상태 평균, ms(낮을수록 좋음)

서버

1k notes

5k notes

10k notes

Seekstone @10k 대비

🥇 Seekstone

1.1

3.1

6.2

—

obsidian-mcp-rs

6.1

19

37

~6배 느림

obsidian-mcp-pro

46

213

430

~70배 느림

obsidian-mcp-server

82

356

732

~118배 느림

obsidian-mcp

82

405

811

~131배 느림

mcpvault

96

467

958

~155배 느림

mcp-obsidian

164

740

1,550

~250배 느림

obsidian-tc

264

1,302

2,714

~440배 느림

모든 경쟁 제품은 쿼리마다 서브프로세스를 생성하거나 HTTP 왕복을 수행하며, 대부분 볼트 크기에 비례해 증가하는 작업을 수행합니다. Seekstone은 이미 준비된 인메모리 인덱스를 유지하므로 — IPC도 네트워크도 없이 — 키워드 검색이 10,000개 노트에서도 수 밀리초(ms) 단위로 유지됩니다 (시맨틱 모드는 평균적으로 ~8ms의 임베딩 및 스캔을 추가합니다). 이 격차는 규모가 커질수록 더 벌어집니다: 1k → 10k 노트 사이에서 경쟁 제품들은 5–10배 느려지지만, Seekstone은 거의 움직임이 없습니다. 가장 빠른 대안조차도 — obsidian-mcp-rs (쿼리마다 볼트를 재스캔) — 10k 노트의 웜 상태에서 **~6배 느리고 페이로드가 3×**이며, REST 프록시 계열은 ~90–250배 느립니다.

Seekstone은 우리 벤치마크 세트에서 모든 볼트 크기에 대해 약 2KB 페이로드와 수 밀리초 단위의 키워드 지연시간을 동시에 제공하는 유일한 서버입니다 — 그리고, 우리가 아는 한, 공개적이고 재현 가능한 벤치마크를 제공하는 유일한 Obsidian MCP 서버입니다. 하네스, 합성 볼트, 전체 결과는 모두 오픈소스입니다: benchmark-scaling.md와 harness를 참조하세요. 클론하고, 실행하고, 직접 확인하세요.


설치

자신에게 맞는 방법을 선택하세요.

AI 에이전트를 사용하시나요? 이 프롬프트를 붙여넣으세요

Claude Code, Cursor, 또는 다른 코딩 에이전트를 사용한다면, 직접 설치 절차를 따를 필요가 없습니다 — 이 프롬프트를 붙여넣으면 에이전트가 설치를 처리합니다:

이 에디터에 seekstone MCP 서버를 설치해 줘. npx -y seekstone init --client code --write를 실행해 (다른 클라이언트는 desktop, cursor, 또는 vscode를 사용해). 내 Obsidian 볼트를 자동으로 감지해. 여러 개가 나열되면 어느 것인지 내게 물어봐 준비하고 --vault "<path>"와 함께 다시 실행해 줘. 발생하는 오류를 나에게 전달하고, seekstone 도구가 로드되도록 이 세션을 다시 시작하라는 것도 알려줘.

seekstone init은 완전히 비대화형입니다 — --write를 사용하면 볼트를 검증하고 클라이언트 설정을 한 번에 패치합니다 (Claude Code는 claude mcp add로, 그 외 클라이언트는 타임스탬프 백업과 함께 추가적인 JSON 패치를 적용합니다).

방법 1 — 원클릭 (Claude Desktop, 터미널 불필요)

  1. GitHub Releases에서 seekstone.mcpb를 다운로드합니다.

  2. Claude Desktop으로 열기 — Finder에서 더블 클릭하거나, 우클릭 → 연결 프로그램 → Claude Desktop을 선택합니다.

  3. 요청할 때 원하는 Obsidian 볼트 폴더를 선택합니다.

seekstone이 Claude의 도구 모음에 나타나면 설치가 성공한 것입니다. JSON 편집, 터미널, Node.js가 필요하지 않습니다.

방법 2 — 안내 설치 (CLI 사용자에게 권장)

터미널을 여세요 (macOS: Cmd+Space를 누르고 "터미널" 입력 후 Enter). 그리고 다음을 실행합니다:

npx -y seekstone init

Claude의 도구 모음에서 플러그 아이콘 아래에 Seekstone이 나타나면 설치가 완료된 것입니다.

Seekstone은 Obsidian의 볼트 레지스트리를 읽어 볼트를 감지하고, 볼트를 검증하고, 붙여넣을 설정 블록을 출력하거나 Claude Desktop을 직접 패치합니다:

# Auto-detect vault, print config to paste
npx -y seekstone init

# Auto-detect vault, patch Claude Desktop in place (with backup)
npx -y seekstone init --write

# Specify vault explicitly if you have multiple
npx -y seekstone init --vault "/path/to/vault"

# Auto-configure Claude Code in one step (auto-detects vault, runs claude mcp add)
npx -y seekstone init --client code --write

# Or just print the Claude Code command without running it
npx -y seekstone init --client code

방법 3 — 수동 설정 (Claude Desktop)

claude_desktop_config.json에 추가합니다 (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

방법 4 — Claude Code

볼트를 자동으로 감지하고, 한 번에 Claude Code를 설정합니다:

npx -y seekstone init --client code --write

또는 직접 볼트 경로를 명시해서 수동으로 설정하려면:

claude mcp add seekstone --env SEEKSTONE_VAULT=/absolute/path/to/your/vault -- npx -y seekstone

방법 5 — Cursor

원클릭: — 그 다음 Cursor의 MCP 설정에서 SEEKSTONE_VAULT를 볼트의 절대 경로로 지정하세요 (링크가 기본 경로를 설치해 둡니다).

또는 CLI가 볼트를 자동 감지하고 ~/.cursor/mcp.json에 패치하게 할 수 있습니다 (백업 포함):

npx -y seekstone init --client cursor --write

또는 ~/.cursor/mcp.json (전역) 또는 <project>/.cursor/mcp.json (작업 단위)에 수동으로 블록을 추가하세요:

{
  "mcpServers": {
    "seekstone": {
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

방법 6 — VS Code

원클릭: — VS Code가 서버 구성을 열면 SEEKSTONE_VAULT을 볼트의 절대 경로로 지정하세요 (링크가 placeholder 경로를 미리 --config에 넣어줍니다).

또는 CLI가 볼트를 자동으로 감지하고 워크스페이스 등록 (현재 디렉토리의 .vscode/mcp.json)을 생성하도록 만들 수 있습니다:

npx -y seekstone init --client vscode --write

또는 터미널에서 서버를 추가할 수 있습니다:

code --add-mcp '{"name":"seekstone","command":"npx","args":["-y","seekstone"],"env":{"SEEKSTONE_VAULT":"/absolute/path/to/your/vault"}}'

또는 .vscode/mcp.json (워크스페이커) 또는 Command Palette → MCP: Open User Configuration (사용자 전역)으로 블록을 추가할 수 있습니다. VS Code의 두 가지 규칙을 기억하세요: 최상위 키는 servers (즉 mcpServers가 아님)이고, "type": "stdio"가 필수입니다:

{
  "servers": {
    "seekstone": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "seekstone"],
      "env": { "SEEKSTONE_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

VS Code 1.102+ 이상이 필요합니다. seekstone은 Copilot Chat의 Agent 모드 도구 선택기에 나타납니다.

기타 MCP 클라이언트 (Windsurf, Cline, …)

Seekstone은 표준 MCP stdio 서버입니다 — 어떤 MCP 클라이언트든 실행할 수 있습니다. 자신의 MCP 클라이언트 설정에 위와 동일한 JSON 블록을 사용하세요: command: npx, args: ["-y", "seekstone"], env SEEKSTONE_VAULT.


설치가 끝난 후 클라이언트를 재시작하세요. 시작되면 Seekstone은 볼트를 스캔해서 인메모리 전체 텍스트 인덱스(수천 개의 노트에는 몇 초 소요)를 만들고, 편집하는 동안에 지속 유지합니다. 이를 통해 아래의 19가지 고객 도구가 Claude에서 사용 가능해집니다.

CLI 옵션을 사용하기 위해 Node.js ≥ 22가 필요합니다. 원클릭 .mcpb 번들에는 외부 요구 사항이 없습니다.

Seekstone가 읽기 안전과 문맥을 아껴준다면, ⭐ 저장소에 스타를 별모양을 부탁드립니다 — 다른 사람이 발견하는 데 도움이 됩니다.


볼트를 이용해 Claude에게 시킬 수 있는 일

Seekstone이 연결되면, Claude에게 다음과 같은 것을 요청할 수 있습니다:

  • "내 노트에서 [주제]에 대한 모든 것을 검색한 다음 알려줘" — search를 사용하며, 전체 파일이 아닌 관련도에 따른 발췌 결과를 반환합니다.

  • "#project 태그가 달린 모든 이미지를 찾고 이미지 제목을 나열하라" — 태그 필터를 사용하여 list_notes를 호출합니다.

  • "내 [project] 노트의 'Decisions' 섹션만 읽어라" — read_note를 섹션 선택기와 함께 사용하여 해당 조각만 context에 들어갑니다.

  • "내 [topic] 노트로 링크를 보내는 것은 무엇이고, 그 노트는 어떤 링크를 밖으로 내보내나요?" — get_backlinks와 get_links를 이용해 그래프를 탐색합니다.

  • "오늘의 스탠드업 메모리 일일 메모리에 추가하라" — append_periodic_note를 사용하며, 골 설정에서 daily-note 경로를 매핑합니다 (Obsidian을 열 필요가 없습니다).

  • "이 노트에서 기존 프로젝트 이름을 모두 수정하세요" — replace_in_note에 미리보기 생성 전에 dry-run preview를 제공합니다.

  • "[note]의 아래한정된 요약 섹션을 추가해 주세요." — append_note를 사용하며, 앞 머리에는 전혀 여기지 않습니다.

  • "/inbox의 모든 노트를 /archive/[year]로 이동시켜 주세요." — move_note 사용합니다.

  • "이 노트의 frontmatter의 status 필드를 'done'로 변경해 주세요." — patch_frontmatter를 사용하며, 매핑된 상태에서 키 순서와 인용 부호 스타일을 유지합니다.

  • "오늘자의 회의 노트를 표준 템플릿으로 새로 만들어 주세요." — create_note을 사용합니다.

Claude는 전체 볼트를 한 번에 보지 않습니다 — 탐색과 묻지를 선택적으로 수행하므로, 볼트 크기가 크더라도 (10k 개 이상의 노트) 컨텍스트 예산 안에 유지될 수 있습니다.


도구

읽기

Tool

설명

search

전체 텍스트 검색. 결과는 노트 본문보다는 순위 기반 발췌(기본 ~120자, excerptLength 로 결정 가능)을 반환합니다. 퍼지 및 접두사 일치를 지원하며, SEEKSTONE_SEMANTIC=1인 경우 mode: "semantic"/"hybrid"을 로컬 임베딩을 통해 의미적 검색을 수행합니다 (정보가 기기를 떠나지 않음).

query_notes

구조화된 메타데이터 쿼리. front matter여러 key/value 프레디케이트(eq, ne, contains, exists, missing, gt/gte/lt/lte), 태그, 폴더, 수정 시각, 모양 세 등을 이용해 필터링하고 필요에 따라 정렬과 선택을 합니다. 일행 경로 + 이름(기본값)만 포함한 요약 행을 반환합니다.

context_pack

자연어 질문에 대해 응답 가능한 컨텍스트를 한 요청으로 받아옵니. 바이트 예산 기본 2KB에 캡(하드) 있습니다: 순위 발췌, 한 줄 요약을 가진 인접 노트, 후속 소스 경로를 포함하며, search→read_note→get_backlinks 왕복 루프를 대체합니다.

read_note

볼트 유형 경로(노트의 전체 내용)로 해당 노트의 전체 내용을 읽습니다. 단일 섹션, 블록, 혹은 줄 범위를 반환할 수 있습니다.

list_notes

선택적으로 폴더 접두사 또는 태그로 필터링된 노드 목록을 반환합니다.

list_tags

볼트의 모든 태그를 사용 횟수(기본) 또는 알파벳 순으로 정렬하여 반환합니다.

outline_note

노트 전체 내용 없이 가점과 블록 구조를 반환합니다 — 쾌속으로 정확한 독서 전에 네비게이션할 수 있습니다.

get_backlinks

주어진 노트를 가리키는 모든 노드를 찾습니다.

get_links

노트에서 나가는 합니다. 모든 정보와 위키링크와 마크다운 링크를 나열합니다.

get_periodic_note

오늘 날짜 또는 어떤 날짜의 일간/주간/월간/분기/연간 노트를 읽는다. 볼트 설정에서 경로를 해석하므로 , Obsidian이 필요하지 않습니다.

쓰기

도구

설명

create_note

노트를 생성합니다(선택적 frontmatter + 본문). 상위 디렉터리는 자동으로 만들어집니다.

delete_note

노트를 볼트의 .trash/ 폴더로 이동합니다(Obsidian 호환, 복원 가능). permanent: true를 전달하면 복구할 수 없는 삭제가 수행됩니다.

move_note

노트를 이동하거나 이름을 바꿉니다. 해당 노트를 가리키는 다른 노트의 wikilink와 마크다운 링크도 모두 다시 써져서 끊기지 않습니다(rewriteLinks: false로 거부 가능). 대상 디렉터리는 자동으로 만들어집니다.

rename_heading

노트에서 제목을 바니다. 볼트 전체의 모든 [[note#heading]] wikilink 및 임베드가 다시 작성되어 참조가 계속 작동합니다(별칭은 유지되고, 펜스 코드 블럭은 그대로 둡).

append_note

frontmatter는 건드리지 않center note 본문에 텍스트를 추가합니다.

patch_frontmatter

기존 키 순서를 바꾸거나 따옴표 스타일을 변경하지 않고 frontmatter 키를 설정·업데이트·삭제합니다.

patch_note

헤딩 또는 블록 참조 위치에 텍스트를 추가, 앞에 삽입, 또는 교체합니다(createIfMissing으로 섹션 추가). frontmatter는 건드리지 않습니다.

replace_in_note

노트 본문에서 텍스트를 찾기 및 바꾸기: 리ß터럴 또는 정규Ç식, 대·소문자 구분, 단어 단위 일치, 선택적 limit(기본적으로 모든 出現을 교체), 및 건식 실행 미리보기.

append_periodic_note

오늘의 periód 노트에 추가하며, 아직 없으면 템플릿르 외어 생생합니다.

모든 쓰기 도구(append_note, get_note, patch_frontmatter, replace_in_note, rename_heading, move_note, delete_note, append_periodic_note, overwrite: true가 포함된 get_note)는 선택적 compare-and-swap을 지원합니다. read_note에서 얻은 contentHash(를)을 prevHash로 넘기면, 호출이 순간에 노트가 변되어 있을 깨끗하게 실패합니다 — 동시에 편집이 실반 없이 사라지거나, 보지 못한 내용을 이동/삭제하지 않습니다. 모들은 변형 결과에서 새 contentHash를 반환하므로 연속 편집에 재읽기 없이 사용할 수 습니다.

**빠르고 완전합니다.** Seekstone은 우리 벤치마크 세트에서 list_tags, outline_note, get_backlinks, get_links를 일급 도구로 제공하는 유일한 Obsidian MCP 서버입니다. 네 가지 추가 기능이 더 뛰어납니다:

  • 메모리 내 로컬 의미 검색. SEEKSTONE_SEMANTIC=1로 설정하면 search는 mode: "semantic" 및 "hybrid"를 지원합니다. 즉, 작은.avalo.on-device 임베딩 모델을 통한 의미 기반 검색(일회성 npx -y seekstone fetch-model 다운로드만; 실행 중인 서버는 네트워크를 전혀 닿지 않습니다). 커밋된 10,000노트 벤치마크 보트에서는, 설명형 쿼리가 상위 5개 안에 올바른 노트를 넣을 확률이 **키워드 검색의 30% vs 70%**입니다 (커밋된 검증). 우리가 벤치마크한 다른 서버는 library의존성이 없고 오프라인 임베딩을 제공하지 않으며 — 같은 골든 세트에서 대안들과 정면 비교했습니다(커밋된 비교). obsidian-tc의 자체 임베딩 의미 검색은 실제로 더 정확합니다(우리의 hit¹@10 72% vs obsidian-tc의 93% — 해당 137M 파раметр 모델 vs 우리의 8M 모델). 그리고 그 대가로 쿼리가 12배 느락 (165 ms vs 14 ms p50), 인덱싱이 71배 느락 (콜드 스타트 26.5분 vs 22초), ~7배 큰 응답량 (쿼리당 15.4 KB vs ~2 KB) 및 반드시 설치/실행해야 하는 추가 서버가 필요합니다. obsidian-mcp-pro는 10,000노트 보트를 전혀 인덱싱하지 못했습니다(대략 15분 동안 임베딩 후 JSON 벡터 store가 JavaScript의 string 크기 한계를 초과). 선택은 엄지상의 결정입니다 — 그 숫자들은 전부 커밋되어 있습니다.

  • 주기적 노트를 파일시스템에서 직접. get_periodic_note와 append_periodic_note는 볼트 자체 설정(.obsidian/daily-notes.json 및 Periodic Notes 플러그인)을 읽어 일간, 주간, 월간, 분기, 연간 노트 경로를 결정합니다 — Obsidian이 닫힌 상태에서도. 모든 REST 기반 서버는 앱이 실행 중일 때만 이 작업을 할 수 있습니다.

  • 바이트 단위 동일 frontmatter 보장. patch_frontmatter는 YAML을 제자리에서 편집하여 키 순서, 따옴표 스타일, 주석을 유지하며, 쓰기 안전성은 바이트 단위로 테스트 하네스에 의해 증명됩니다. 우리가 조사한 다른 서버는 이 보장을 제공하지 않습니다.

  • 완전한 분리 (zero coupling). Obsidian 앱, Local REST API 플러그인, 플러그인 버전 드리프트 없음. 단지 디스크의 파일만 있습니다.


설정

변수

필수

설명

SEEKSTONE_VAULT

Yes

Obsidian 볼트의 절대 경로.

SEEKSTONE_LOG_LEVEL

아니요

error | warn | info(기본값) | debug.

SEEKSTONE_LOG_FILE

아니요

절대 경로; 설정 시 JSON 라인 로그가 여기에 추가(크기 회전).

SEEKSTONE_LOG_MAX_SIZE

아니요

SEEKSTONE_LOG_FILE의 로그 회전 크기 (예: 10mb; 기본 5MB).

SEEKSTONE_WATCH_POLL

아니요

1로 설정하면 네이티브 OS 이벤트 대신 stat-poll로 변경 감지 — 네트워크 드라이브, WSL, 일부 컨테넉에서 안정적이지만 느점.

SEEKSTONE_READ_ONLY

아니요

1로 설정하면 읽기 전용 실행: 8개 쓰기 도구가 목록에서 완전히 제거(호출해도 거부)되므로, 세션이 볼트를 바꿀 수 없습니다.

SEEKSTONE_WRITE_PATHS

아니요

쉼표로 구분된 볼트 상대 glob (예: journal/**,inbox/*.md). 해당 경로을만 쓰기 허용, 나머지 볼트는 읽기 전용.

SEEKSTONE_SEMANTIC

아니요

1로 설정하면 의미 기반 검색(search에 mode: "semantic" 및 "hybrid" 추가)을 활성화. 로컬 임베딩 모델 필요 — npx -y seekstone fetch-model로 한 번 다운로드; 실행 중인 서버는 네트워크를 사용하지 않습니다.

SEEKSTONE_MODEL_PATH

아니요

Model2Vec 임베딩 모델이 있는 디렉터리(기본은 캐시 디렉터리의 fetch-mode가 저장하는 위치).

SEEKSTONE_CACHE_DIR

아니요

다운로드한 모델 및 볼트별 임베딩 캐시의 루트 (기본: ~/.cache/seekstone).


작동 방식

Seekstone은 fast-glob으로 볼트를 스캔하고, 각 노트의 frontmatter를 바이트 인코딩으로 파싱한 후(따라서 쓰기 전후 프론트매터 영역이 바이트 확실히 동일함), 메모리 안에 MiniSearch 전문 검색 인덱스를 구축합니다. 검색은 내러티브가 아닌 짧은 순위가 매겨진 발췌를 반환하고 — 발췌-아니라-문서라는 설계가 컨텍스트 오버헤드 감저의 원천입니다. 파일 시스템 모니터 chokidar가 Obsidian에서 편집하는 동안 인덱스를 최신으로 유지합니다.

쓰기는 보수적으로 설계되었습니다: append_note은 frontmatter에 닿지 않으며, patch_frontmatter는 YAML을 재직렬화하지 않고 해당 지점을 직접 편집하여 키 순서, 따옴표 스타일, 주석을 보존합니다.

때문에 항상 작동하게 설계되어 있습니다. Seekstone은 모든 커밋이 macOS, Linux, Windows CI에서 테스트되고, 쓰기 도구는 병리적(ReDoS) 입력에 대비해 강화되었으며, 원하지 않는 unhandled rejection은 비정상 종료가 아닌 로그로 처리됩니다 — 그래서 오래 실행되는 MCP 세션이 대화 중 끊기지 않고 웜 인덱스를 유지할 수 있습니다.

코드베이스의 계층별 안내 — 패키지 구조, 서버 내부, 종단간 요청 흐름, 측정용 테스트 하네스 — 는 docs/ARCHITECTURE.md를 보세요.


보안 및 개인정보

Seekstone은 로컬 디스크에서 SEEKSTONE_VAULT 아래의 파일을 읽고(쓰기 도구를 통해 수정) 작동합니다. 실행 중인 서버는 네트워크 요청을 보내지 않으며 텔레메트리를 보내지 않습니다(패키지의 네트워크 접근은 명시적인 npx -y seekstone fetch-model 서브커맨드뿐입니다 — 선택적 의미 검색 모델의 SHA256 검증된 일회성 다운로드이며, 서빙이 시작되기 전에 종료됩니다). 로그는 기본적으로 메타데이터만 포함합니다(노트 내용은 debug 수준에서만 나타남). 볼트 외부에 기록되는 것은 선택적으로 설정한 로그 파일과, SEEKSTONE_SEMANTIC=1일 때 ~/.cache/seekstone에 기록되는 볼트별 임베딩 캐시(파생 노트 벡터 — 외부에 전송되지 않음)뿐입니다.

쓰기 안전 계약

AI에게 노트에 쓰기 권한을 주는 건 단순히 "신뢰하세요"보다 더 많은 것이 필요합니다. Seekstone에는 이름이 붙은 테스트된 계약인 docs/WRITE-SAFETY.md가 포함되어 있습니다. 여덟 가지 보증은 각각 이를 강제하는 코드와 이를 증명하는 테스트와 연결되어 있으며, 퍼블리시 및 릴리스마다 CI 하니스 안전 스위트가 바이트 단위 검증합니다: 네트워크 없음, 볼트 샌트박스, 본문 변경 시 frontmatter 바이트 고정, 원자적 쓰기(부분 파일 없음), 생성 중 기존 파일 덮어쓰지 않음, 삭제 취소 가능(.trash/), 모든 쓰기 도구에서 선택적 compare-and-swap, 그리고 구성 가능한 쓰기 범위/읽기 전용 모드. 같은 스위트가 다른 FS-direct 서버에 대해서도 headless로 실행됩니다 — 비교표는 계약서에 있습니다.


자주 묻는 질문

Obsidian 앱이 한 동안 열려 있어야 하나요? 아니요. Seekstone은 볼트 폴더를 디스크에서 직접 읽으므로 Obsidian이 켜져 있거나 닫혀 있든 상관없습니다.

Local REST API 플러그인이 필요한가요? 아니요. Seekstone은 이것을 완전히 우회하는데, 이 것이 최대 47,000배의 페이로드 감소의 원인입니다. 플러그인은 필요 없습니다.

어떤 AI 클라이언트를 지원하나요? stdio 위에서 Model Context Protocol(MCP)을 지원하는 모든 클라이언트 — Claude Desktop, Claude Code, Cursor, Windsurf, Continue 등.

내 볼트(vault)에 사용해도 안전한가요? Seekstone는 위 표의 9가지 쓰기 도구(create_note, append_note, patch_note, patch_frontmatter, replace_in_note, move_note, rename_heading, delete_note, append_periodic_note)를 명시적으로 호출하는 경우를 제외하고는 파일을 절대 수정하지 않습니다. 실행 중인 서버는 네트워크 요청을 보내지 않습니다(시맨틱 검색의 모델은 명시적인 fetch-model 하위 명령으로 한 번만 대역 외(out-of-band)로 가져옵니다). 볼트 경로는 샌드박스 처리되어 있습니다. 즉 어떤 도구도 그 밖을 읽거나 쓸 수 없습니다. 그리고 더 강화할 수도 있습니다: SEEKSTONE_READ_ONLY=1로 설정하면 쓰기 도구가 세션에서 완전히 제거되고, SEEKSTONE_WRITE_PATHS로 허용한 디렉터리(예: journal/**만)에만 쓰기를 제한할 수 있습니다. 둘 다 도구별 검사가 아니라 디스패치 계층에서 적용되므로, 어떤 도구도 검사 로직을 누락할 수 없습니다.

Windows에서도 작동하나요? 네. Seekstone는 모든 커밋마다 macOS, Linux, Windows에서 테스트를 통과합니다.

어느 정도 규모의 Obsidian 볼트를 처리할 수 있나요? Seekstone는 수천 개의 노트가 있는 볼트를 대상으로 프로파일링되었습니다. 등록되어 있는 10,000개의 노트 벤치마크 볼트에서 콜드 인덱스 구축은 수십 초가 걸리고 프로세스 RSS는 약 100MB 미만으로 유지됩니다. 일반적인 개인 볼트는 몇 초 안에 인덱싱됩니다. 시맨틱 모드는 부팅 후 백그라운드에서 임베딩됩니다(10,000개 노트 기준 약 20초, 이후 볼트별로 캐시되어 재시작 시 2초 이내로 다시 로드됩니다).

seekstone init는 내 볼트를 어떻게 자동으로 찾나요? Obsidian 자체 볼트 레지스트리(obsidian.json)를 읽습니다. 이는 Obsidian이 사용자의 알려진 볼트를 기록하는 데 사용하는 동일한 파일입니다. 볼트가 하나만 있으면 자동으로 선택되고, 여러 개면 목록을 보여주며 --vault로 선택하라는 요청을 받습니다.

.mcp 파일은 무엇인가요? MCP 번들(Bundle)입니다. 서버와 목록이 포함된 자체 포함(거함) zip 파일입니다. 설치하려면 Finder에서 더블클릭(또는 오른쪽 클릭 → 연결 프로그램 → Claude Desktop)한 다음 볼트를 선택하면 됩니다. 터미널이나 Node.js는 필요 없습니다.


기여와 개발

기여는 환영합니다. 자세한 내용은 CONTRIBUTING.md를 참고하거나 바로 시작하세요:

npm install                                          # install all workspace deps
npm test                                             # run all tests
npm run lint                                         # biome check
npm run build -w seekstone                           # tsup → dist/
npm run build:mcpb                                   # build seekstone.mcpb bundle

npx vitest run packages/server/src/tools/search.test.ts  # single test file
npx vitest run -t 'parses a typical frontmatter'         # single test by name
npx tsc -p packages/server/tsconfig.json --noEmit        # typecheck

저장소 구조

패키지

적의 사항

packages/server

배포된 seekstone MCP 서버(19가지 도구, stdio, MiniSearch 인덱스, chokidar 감시자).

packages/core

공통 볼트 기본 요소 — 볼트 탐색(walk), frontmatter 파서, 링크/태그 추출기, 개요(outline), 백분위(퍽센타일), pmap, 그리고 Model2Vec 임베더. 서버 빌드에 포함됩니다.

packages/harness

프로파일러 + 벤치마크 + 쓰기 안정성 하네스(REST vs 파일시스템)로, 위에서 제시된 페이로드 수치를 만든 것입니다. 개발 중에만 사용하며 공개하지 않습니다.

서버는 실제 빌드(tsup → dist/)가 있으며 npm에 공개되어 있습니다. 하네스는 소스에서 tsx로 실행됩니다. 릴리실은 자동화되어 있습니다 — docs/RELEASING.md를 참조하세요.

측정 하네스

하네스는 파일시스템 직접 설계의 동기가 된 벤치마크 수치를 재현하기 위한 것입니다. 기본 재현 경로(fs/seekstone 백엔드와 등록된 합성 볼트 사용)는 추가 설정 없이 실행됩니다. REST 기반 백엔드(rest, mcp-obsidian, obsidian-mcp-server)만 Obsidian과 로컬 REST API 플러그인이 실행 중이어야 합니다.

export SEEKSTONE_VAULT="/absolute/path/to/your/vault"

npx tsx packages/harness/src/cli.ts profile --vault "$SEEKSTONE_VAULT"
npx tsx packages/harness/src/cli.ts bench \
  --queries packages/harness/queries/default.json \
  --stats reports/vault-stats.json
npx tsx packages/harness/src/cli.ts safety --vault "$SEEKSTONE_VAULT"

하네스 환경 변수: SEEKSTONE_REST_API_KEY(로컬 REST API 플러그인에서 제공)와 SEEKSTONE_REST_URL(기본값 https://127.0.0.1:27124).


지원

Seekstone는 무료 오픈소스입니다. 툴가 기능(context)를 절약해 주고 비용도 줄여준다면 커피를 않을 수 있습니다를 할 수 있습니다.


라이선스

MIT © Shaq Mughal

Available Tools

25 tools
append_noteA

Append text to a note body without touching the frontmatter. Safe for meeting notes, daily logs, and append-only workflows.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
contentYesText to append.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate it's a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds valuable behavioral detail: it preserves frontmatter and is safe for 'append-only workflows,' which provides context beyond the annotations. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The core purpose is stated first, and the additional safety/use-case context is provided in a second sentence. Every phrase adds value, making it appropriately sized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple append operation with three parameters, the description covers the key points: it appends, preserves frontmatter, and indicates safe workflows. However, it does not mention error behaviors (e.g., what happens if the path doesn't exist) or whether it creates a note if missing. Given the low complexity and existing annotations, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter (path, content, prevHash) already documented in the schema. The description does not add any additional parameter-specific semantics, so it remains at the baseline score of 3 given the complete schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Append text to a note body without touching the frontmatter.' This is a specific verb (append) and resource (note body), and it explicitly distinguishes itself from other mutation tools by mentioning the frontmatter preservation, which differentiates it from patch_note or replace_in_note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when the tool is appropriate ('Safe for meeting notes, daily logs, and append-only workflows'), but does not explicitly mention when NOT to use it or point to alternative tools. It implies usage scenarios but lacks explicit exclusions or sibling comparisons, leaving the agent to infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

append_periodic_noteA

Append text to a periodic note (daily, weekly, monthly, quarterly, or yearly). Preserves existing frontmatter exactly. Creates the note first (from template if configured) when createIfMissing is true (default).

NameRequiredDescriptionDefault
dateNoISO date string (YYYY-MM-DD). Defaults to today when omitted.
periodNoPeriod type. Default: daily.
contentYesText to append to the note body.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
createIfMissingNoCreate the note if it does not exist before appending. Default true.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With all annotations false, the description carries the full behavioral burden. It adds genuinely useful guarantees ('Preserves existing frontmatter exactly') and creation-flow detail ('from template if configured'), which go beyond the raw annotations. However, it omits the most salient risk of an append operation — non-idempotency (duplicate calls duplicate content) — even though the prevHash parameter hints at concurrency concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler. The primary action leads, the scoping list follows, and the creation behavior closes. Every clause serves a distinct purpose with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderate-complexity tool with 5 simple params and no output schema, the description covers the essentials well. Gaps remain: no mention of timezone handling for date-boundary behavior (critical for 'today' defaults), no duplicate-append warning, and no interaction with prevHash conflict recovery. These are real but not fatal omissions for an append operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, establishing a baseline of 3. The description adds value by clarifying the createIfMissing parameter's effect ('Creates the note first (from template if configured)') and confirming its default, which is not fully obvious from the schema text alone. This is a small but genuine increment over baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description leads with a specific verb+resource: 'Append text to a periodic note' and immediately scopes it to '(daily, weekly, monthly, quarterly, or yearly)'. This clearly differentiates it from sibling 'append_note' (regular notes) and 'get_periodic_note' (read path) without needing to inspect either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'periodic note' qualifier implies the tool's niche, and the description notes the conditional creation behavior when createIfMissing is true. However, it never explicitly points to an alternative (e.g., 'use append_note for regular notes') or states when not to use this tool, despite siblings like append_note and patch_note existing. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

context_packA
Read-only

Assemble everything needed to ANSWER a natural-language question in one call, under a strict byte budget (default 2048): ranked excerpts, linked neighbor notes (backlinks/outlinks) with one-line summaries, and follow-up source paths. Retrieval is lexical by default: for a question phrased in words the note itself may not use, pass mode "hybrid" or "semantic", and scope with folder/tag exactly as in search. Use search to locate notes and query_notes for metadata filters; use context_pack when you want answer-ready context without multiple round-trips. Empty excerpts with confidence "none" or "low" means the vault lacks coverage — do not infer content; with folder or tag set, "none" can also mean the filter excluded every match, which totalMatches distinguishes.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
modeNolexical = keyword search (default). semantic = meaning-based over local embeddings (needs SEEKSTONE_SEMANTIC=1 and a fetched model). hybrid = exact-title lookups go lexical, everything else semantic.
queryYesNatural-language question or topic.
folderNoRestrict to a vault-relative folder prefix.
budgetBytesNoHard cap on response JSON bytes (256–16384, default 2048).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint=false, and the description adds substantial behavior beyond them: a hard byte budget with default, lexical-by-default retrieval, backlink/outlink expansion, and the important failure semantics (empty excerpts with confidence 'none'/'low' means no vault coverage; with folder/tag set, 'none' can mean the filter excluded everything, distinguishable via totalMatches). That is exactly the kind of edge-case disclosure annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Content is front-loaded — the core purpose leads, routing guidance follows, and failure semantics come last. The sentences are long and information-dense, bordering on run-on, but nearly every clause carries distinct operational value rather than repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and discharges it, describing the shape of results and the confidence/totalMatches signals that disambiguate empty responses. For a read-only, five-parameter retrieval tool this is complete enough to call correctly without opening the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema: it explains the motivation for choosing hybrid/semantic mode and clarifies that folder/tag scoping works 'exactly as in search'. It does not, however, add syntax or precedence detail for budgetBytes or folder beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource ('Assemble everything needed to ANSWER a natural-language question in one call') and enumerates the concrete outputs (ranked excerpts, neighbor notes with summaries, follow-up source paths). It is immediately distinguishable from search and query_notes, which are named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing: 'Use search to locate notes and query_notes for metadata filters; use context_pack when you want answer-ready context without multiple round-trips.' It also tells the agent when to switch modes ('for a question phrased in words the note itself may not use, pass mode hybrid or semantic'), covering both when-to-use and when-to-use-an-alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_noteA
Destructive

Create a new note at a vault-relative path. Optionally sets frontmatter and body content. Parent directories are created automatically. Fails if the note already exists unless overwrite is true (prevHash may guard the overwrite).

NameRequiredDescriptionDefault
pathYesVault-relative path, e.g. "Daily Notes/2026-06-01.md".
contentNoBody content for the note.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
overwriteNoOverwrite an existing note. Defaults to false.
frontmatterNoFrontmatter key-value pairs.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint:true annotation, the description discloses three concrete behaviors: automatic parent-directory creation, the fail-on-existing-note rule, and the prevHash compare-and-swap guard that can gate the overwrite. These are non-obvious side effects and failure modes the annotations alone do not convey. The description is consistent with readOnlyHint:false and destructiveHint:true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the core action first, then the optional parameters, then the critical existence-failure and CAS-guard behavior. No filler and no repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter destructive write with no output schema, the description covers creation, optional fields, directory auto-creation, the existence failure mode, and the overwrite/CAS guard. The one notable gap is the return contract on success — the CAS workflow implied by prevHash would benefit from knowing whether the note's contentHash is returned — but the invocation semantics are fully specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (path, content, prevHash, overwrite, frontmatter) is already documented in the input schema. The description's only added semantic is the coupling between prevHash and overwrite ('prevHash may guard the overwrite'), a small increment over the schema's per-parameter text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Create a new note at a vault-relative path' names a specific verb, resource, and scope qualifier. This cleanly distinguishes it from sibling mutators like append_note, patch_note, replace_in_note, and move_note, which all act on existing notes, and from delete_note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The fail-if-exists clause ('Fails if the note already exists unless overwrite is true') gives the agent a clear condition for choosing the overwrite path. However, it does not explicitly route to alternatives — e.g., checking existence with list_notes first or selecting patch_note/append_note for modifying an existing note — so cross-tool selection is left implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_noteA
Destructive

Delete a note. By default it is moved to the vault .trash/ folder (recoverable by moving it back); pass permanent: true to remove it outright.

NameRequiredDescriptionDefault
pathYesVault-relative path of the note to delete.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since — so you never delete content you have not seen.
permanentNoPermanently remove instead of moving to .trash/. Defaults to false.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description reveals critical behavior: the default action is non-permanent (trash) and reversible, and only permanent deletion requires an explicit flag. It also discloses recoverability. This transparency is essential for an agent deciding whether to call this tool and mitigates risk, going well beyond what the annotation already provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact at two sentences, with the action verb first and the most important behavioral nuance immediately following. Every word contributes value, and the sentence structure flows from the core action to the key conditional. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three parameters and one required field, the description covers the essential behavior (delete, default trash, permanent override) and confirms reversibility. It does not mention error handling for missing paths or concurrency, but given the schema and annotations, the definition is complete for an agent to call it correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all three parameters with 100% coverage, so the description needn't add parameter details. The description's mention of 'pass permanent: true' restates the schema without adding new meaning. This meets the baseline of 3 but does not elevate it further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete a note', which is a specific verb and resource, and immediately clarifies the default trash behavior and the permanent deletion option. This distinguishes it from siblings like move_note or patch_note, which are about modifying instead of removing. The tool's purpose is unambiguous and immediately scoped.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on how deletion works by default (to trash) and how to override it, which implicitly tells the agent when this tool is appropriate. However, it does not explicitly mention alternatives like move_note or state when NOT to use it (e.g., for reorganization). This is a slight gap in otherwise clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_periodic_noteA

Get the path and existence status of a periodic note (daily, weekly, monthly, quarterly, or yearly) for a given date. Reads folder/format config from .obsidian/daily-notes.json (daily) or the periodic-notes plugin data.json. Optionally creates the note from the configured template if it is missing.

NameRequiredDescriptionDefault
dateNoISO date string (YYYY-MM-DD). Defaults to today when omitted.
periodNoPeriod type. Default: daily.
createIfMissingNoCreate the note from the configured template if it does not exist. Default false.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, so the description correctly adds that the tool may create a note when createIfMissing is true – a behavioral detail beyond the annotations. It also discloses the config file locations (.obsidian/daily-notes.json and plugin data.json). No contradictions. However, it does not describe the exact return shape or failure modes, which are minor gaps given the side‑effect disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The primary purpose ('Get the path and existence status') is front‑loaded, followed by config sources and the optional creation behavior. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description conveys that the return includes 'path and existence status', and it explains the config‑reading logic and optional creation. This is sufficient for an agent to call correctly. It lacks explicit error cases or what happens after creation (e.g., returns path or just status), but the core information is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter schema coverage is 100% – all three parameters (date, period, createIfMissing) already have descriptions in the schema, including defaults. The description adds no new semantic meaning beyond restating the defaults ('Defaults to today', 'Default: daily', 'Default false') which are already present. Baseline 3 applies because the schema carries the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get the path and existence status of a periodic note' and enumerates the period types (daily, weekly, monthly, quarterly, yearly). This clearly distinguishes it from sibling tools like create_note or append_periodic_note, even though it never names them. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does and mentions the optional creation side‑effect, but never explicitly states when to use this tool versus a sibling like create_note or append_periodic_note. It gives context (reads config from specific files) but no when‑to‑use or when‑not‑to‑use guidance, leaving the agent to infer suitability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_notesC
Read-only

List notes, optionally filtered by folder prefix or tag.

NameRequiredDescriptionDefault
tagNoFilter by tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
limitNoMax results (1–500, default 100).
folderNoVault-relative folder prefix.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds nothing beyond that – no ordering, return format, or pagination behavior – so it contributes no behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the primary action front-loaded and no waste. It is appropriately sized, though its brevity leaves the gaps noted above unfilled.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema and fully documented parameters, the description covers the essentials. It is adequate but should do more to distinguish this listing tool from its query/search siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so tag, limit (default 100, range 1–500), and folder are all documented in the schema. The description only gestures at folder/tag filtering and omits limit, adding no syntax or format detail. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List notes") plus its filter scope, so an agent knows what it does. However, it does not differentiate from overlapping siblings like search, query_notes, or read_notes, so it falls short of the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "optionally filtered by folder prefix or tag" hints at usage but gives no when-to-use, when-not, or named alternatives. An agent choosing between this and query_notes/search gets no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA
Read-only

List all tags in the vault with usage counts. Supports substring filtering, minimum count threshold, and sort order. Nested tags (e.g. area/work) include a parent field.

NameRequiredDescriptionDefault
sortNoSort by usage count descending (default) or alphabetically.
patternNoSubstring filter on tag name. Example: "work" matches "work" and "area/work".
minCountNoOnly return tags used in at least this many notes.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a safe read operation. The description adds useful behavioral details—that all tags are returned, filtering behaviors, and that nested tags include a parent field—which goes beyond the annotation's minimal information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences deliver the purpose, options, and a notable output feature with zero redundancy. Front-loaded with the primary action and immediately informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers the return contents (usage counts, parent field for nested tags) and behavioral parameters fully. No gaps are apparent for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all parameters with descriptions (100% coverage), so the description adds no significant new meaning about inputs. It merely reiterates what the schema already specifies, meeting the baseline but not exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes a specific action ('List all tags in the vault') with clear scope and distinguishes itself from siblings by focusing solely on tags. The mention of usage counts and nested tags further specifies the tool's unique function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While it doesn't explicitly contrast with alternatives, there is no other tag-listing tool among siblings, making the purpose self-evident. It provides clear context but omits explicit exclusions or when-to-use guidance beyond its self-description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tasksA
Read-only

List Markdown checkbox tasks as compact structured rows (path, line, state, text, nearest heading) — vault-wide or scoped by note, folder, tag, or modified time. Defaults to open tasks. Custom markers like "/" are single-char states. Rows feed straight into update_task; use this instead of searching for "- [ ]" or reading whole notes.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
pathNoVault-relative path to a single note. Omit to search the whole vault.
limitNoMax tasks (1–500, default 100).
stateNoWhich tasks to return. Default: open.
folderNoRestrict to a vault-relative folder prefix.
modifiedAfterNoOnly tasks in notes modified at or after this ISO 8601 date/time.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds non-obvious behavior: the default filter is open tasks only, custom markers are treated as single-character states, and each row carries a nearest-heading field. It stops short of describing ordering or how large vaults are paginated beyond the limit param, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, zero filler, with the output shape and default scope front-loaded before the sibling routing. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter read tool with no output schema, the description compensates by enumerating the returned row fields and stating the default filter. Combined with full schema coverage and readOnly annotations, nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter is already documented with examples and semantics (tag nesting, ISO dates, limit range). The description only summarizes the scoping axes already present in the schema, plus a small clarification that custom markers like "/" are single-char states, which slightly aids the anyOf branch. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (Markdown checkbox tasks), then specifies the exact row shape returned (path, line, state, text, nearest heading). It explicitly distinguishes itself from the sibling 'search' and from read_note, so an agent can select it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternatives and rules them out: 'use this instead of searching for "- [ ]" or reading whole notes.' It also states the default scope behavior ('Defaults to open tasks') and hands off downstream to update_task, giving an explicit when-to-use path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_writesA
Read-only

List recent writes from the journal — every write tool records the pre-image of each file it touches, so any of them can be reverted with undo_write. Returns compact metadata rows (seq, timestamp, tool, paths, undoable), never note content.

NameRequiredDescriptionDefault
pathNoOnly entries that touched this vault-relative path.
limitNoMax entries to return, newest first (1–200, default 20).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, and the description reinforces that by promising metadata rows and explicitly stating 'never note content.' It adds value beyond the annotation by disclosing the exact fields returned (seq, timestamp, tool, paths, undoable) and explaining the pre-image journaling mechanism that makes undo_write possible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences front-load the main purpose, then add the key behavioral constraint and output shape. Every sentence earns its place, and there is no redundant repetition of the tool name or schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description explicitly lists the returned fields and their nature, so an agent knows what response to expect. Combined with full schema coverage for optional parameters, this is complete enough for a low-complexity list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both path and limit already described in the input schema. The tool description does not need to repeat parameter details; it adds context about the journal concept but no additional parameter-level semantics. Baseline 3 is appropriate because the schema carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List recent writes') and the resource ('the journal'), making the tool's purpose immediately obvious. It also distinguishes this from content-focused tools by explicitly noting it returns metadata and never note content, which separates it from siblings like list_notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: this tool is for reviewing write operations and identifying entries that can be reverted with undo_write. It does not explicitly say 'use this instead of list_notes' or list exclusions, but the connection to undo_write and the metadata-rows framing gives enough context for an agent to choose it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_noteA
Destructive

Move or rename a note to a new vault-relative path, rewriting wikilinks and markdown links in other notes that point at it so nothing breaks (links inside fenced code blocks are left alone). Parent directories at the destination are created automatically. Fails if the destination already exists unless overwrite is true.

NameRequiredDescriptionDefault
toYesVault-relative destination path.
fromYesVault-relative source path.
prevHashNoOptional compare-and-swap guard on the source note: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
overwriteNoOverwrite destination if it exists. Defaults to false.
rewriteLinksNoRewrite references in other notes to follow the move. Defaults to true; pass false to move the file only.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses concrete behavioral traits: it rewrites wikilinks and markdown links in other notes while leaving fenced code blocks untouched, auto-creates parent directories, and fails if the destination exists unless overwrite is true. This is rich, actionable context that goes well beyond the annotation and helps an agent anticipate side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with the primary purpose, followed by critical behaviors (link rewriting, directory creation, overwrite failure). No filler — every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 5 parameters and no output schema, the description covers the main side effects (link rewriting, directory creation, failure conditions) and explains the overwrite and rewriteLinks parameters behaviorally. The prevHash guard is documented in the schema but not in the description; however, the agent can infer it from the parameter description. Given the complexity, this is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter already has a clear meaning. The description adds context around rewriteLinks (rewriting links in other notes) and overwrite (failure behavior) but does not add new information for from, to, or prevHash beyond the schema. It sits at the baseline of 3 because the schema carries the parameter explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Move or rename a note to a new vault-relative path' — a clear verb, resource, and target location. It explicitly describes the link-rewriting side effect, distinguishing it from destructive delete_note and heading-renaming rename_heading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use the tool (moving/renaming notes) and details the overwrite and link-rewriting behavior. It does not explicitly name alternative tools, but the purpose is unambiguous given the sibling list; this falls short of a perfect 5 that requires explicit when-not/alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

outline_noteA
Read-only

Return a note's structure — heading tree with offsets, block-reference anchors, and frontmatter key list — without returning any prose. Use this before section reads or patches to discover what sections exist at a fraction of the cost of reading the full note.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
includeSizesNoInclude per-section character length in each heading entry. Default false.
includeBlocksNoInclude block-reference anchors (^id). Default true.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: it returns only structural data (headings, offsets, anchors, frontmatter keys) and explicitly excludes prose. It also signals a performance advantage ('fraction of the cost'), which is not in the annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero wasted words. The most critical information (what it returns and what it excludes) is front-loaded, and the usage guidance is packed efficiently into the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the return value (heading tree, offsets, anchors, frontmatter keys), the exclusions (no prose), and the usage context (before reads/patches). With only 3 well-documented parameters and read-only annotations, nothing essential is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description doesn't add extra semantics to the parameters beyond what the schema already states, but it does clarify the overall output context (e.g., 'frontmatter key list' implies what includeFrontmatter might do). No compensation needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') with a precise resource ('a note's structure') and enumerates the components (heading tree, offsets, block-reference anchors, frontmatter key list). It clearly distinguishes from siblings like read_note by explicitly saying 'without returning any prose,' so an agent knows exactly what it gets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Use this before section reads or patches to discover what sections exist at a fraction of the cost of reading the full note.' This tells the agent the ideal scenario and why it's preferable to full reads, effectively excluding alternatives like read_note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_frontmatterA
DestructiveIdempotent

Set, update, or delete frontmatter keys without reordering existing keys or changing quote style. Pass null as a value to delete a key.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
patchYesKey-value pairs to set. Null value removes the key.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits: it preserves key ordering and quote style, and explicitly explains that null values delete keys. These details go beyond the annotations (readOnlyHint=false, destructiveHint=true), which only indicate mutation and destructiveness. It adds useful context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the core action, key guarantees, and deletion semantics. No filler or repetition; every clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential behavior, deletion semantics, and safety guarantees. It does not mention error cases like hash_conflict, but those are captured in the schema. It also omits prerequisites (e.g., note must exist), but given the simple tool and existing schema, the description is near-complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description repeats the null-deletion behavior for the patch parameter, which is also stated in the schema, and adds no new semantic information beyond what is structured. Thus baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: setting, updating, and deleting frontmatter keys. It specifies the resource (frontmatter keys) and includes a concrete behavioral guarantee (preserving key order and quote style), which distinguishes it from sibling tools like patch_note that modify note content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as patch_note or replace_in_note. The description gives no context on selection criteria, exclusions, or comparative advantages beyond the formatting guarantee.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_noteA
Destructive

Surgically edit a section of a note — targeted by heading or block reference — without rewriting the whole file. Operations: append (add after section), prepend (add after heading line), replace (swap section content). Frontmatter is never touched.

NameRequiredDescriptionDefault
pathYesVault-relative path to the note.
targetYesExactly one of: { heading: "Section Title" } or { block: "block-id" } (without the ^ prefix).
contentYesContent to insert or replace with.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
operationYesappend: insert after section content. prepend: insert after heading line. replace: swap section content.
createIfMissingNoIf the heading target is not found, append a new heading (level 2) + content. Only valid for heading targets. Default false.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the mutation nature is known. The description adds valuable behavioral context beyond annotations: edits are surgical and localized ('without rewriting the whole file'), and frontmatter is never touched. This meaningfully clarifies the blast radius of a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the core purpose and operation model, then adds a key safety guarantee. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with rich schema coverage and annotations, the description covers the essential behavior: targeted section editing, operation types, and frontmatter safety. It could mention failure behavior for missing targets, but the schema already covers createIfMissing and prevHash behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all six parameters thoroughly. The description restates operation semantics in prose but does not add meaning beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Surgically edit'), a resource ('a section of a note'), and a precise targeting mechanism ('targeted by heading or block reference'). It also distinguishes itself from sibling tools by noting 'without rewriting the whole file' and 'Frontmatter is never touched'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool is appropriate: surgical section edits with append, prepend, or replace operations, and explicitly excludes frontmatter. It does not name sibling alternatives like patch_frontmatter or append_note, but the scope and exclusion are enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_notesA
Read-only

Structured metadata query — filter notes by frontmatter key/value predicates, tag, folder, modified time, and size. Returns compact rows (path + title by default; opt into more via select), not note content. Use this instead of search when filtering by properties rather than text.

NameRequiredDescriptionDefault
tagNoRestrict to notes with this tag. # optional, case-insensitive; nested child tags match ("project" matches project/alpha).
sortNoSort field (default path).
limitNoMax results (1–500, default 100).
orderNoSort order (default asc).
whereNoFrontmatter predicates — all must match (AND).
folderNoRestrict to a vault-relative folder prefix.
selectNoExtra fields per hit: frontmatter keys, or "mtime", "size", "tags". Default returns only path + title.
maxSizeBytesNoOnly notes at most this many bytes.
minSizeBytesNoOnly notes at least this many bytes.
modifiedAfterNoOnly notes modified at or after this ISO 8601 date/time.
modifiedBeforeNoOnly notes modified before this ISO 8601 date/time.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is already covered. The description adds real context beyond them: the return shape (compact rows, path + title by default, more only via select) and the negative statement that note content is not returned. It does not discuss pagination or result-count limits beyond what the schema's limit already says.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero padding, front-loaded with what it queries and immediately followed by what it returns and when to prefer it. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must explain return values, and it does precisely: compact path+title rows by default, expanded via select, no note content. Combined with 100% schema coverage and read-only annotations, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with per-parameter docs including operator semantics and tag nesting, so the schema carries the load and the baseline is 3. The description only restates the filter categories and hints at select, adding no format or syntax detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (structured metadata query over notes) and enumerates the filter axes: frontmatter predicates, tag, folder, modified time, size. It also names the sibling it is not (search) and the axis that separates them, so an agent can disambiguate without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says "Use this instead of search when filtering by properties rather than text," naming both the alternative and the selecting condition. That is exactly the when-to-use/when-not guidance a routing decision needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_noteA
Read-only

Read a note or a span of it — by heading section, block reference, or line range. Returns structured JSON with the content, bytes returned, total note size, and a contentHash to pass as prevHash to edit tools for compare-and-swap. Use search or outline_note first to find the right path and section names.

NameRequiredDescriptionDefault
pathYesVault-relative path, e.g. "Daily Notes/2026-05-29.md".
blockNoReturn only the line anchored by this block id (^ prefix optional).
linesNoReturn only this line range (1-indexed, inclusive).
sectionNoReturn only this heading section (heading text, # prefix optional). First match wins.
includeFrontmatterNoPrepend frontmatter to section/block span results. Default false for spans.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses the exact JSON return shape (content, bytes returned, total note size, contentHash) and the hash's purpose for compare-and-swap with edit tools. This behavioral context is not captured in annotations and is valuable for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: first states the operation and modes, second the return value, third the usage context. It is front-loaded with the core purpose and contains zero wasted words, making it efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, a nested object, and no output schema, the description covers the return structure, the purpose of contentHash, and the prerequisite discovery steps. An agent has everything needed to call the tool correctly and understand its output without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully describes all five parameters (100% coverage), so the description adds no extra parameter meaning. The mention of block reference and line range merely echoes schema descriptions; no new semantics are introduced, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (note or span), enumerates three selection modes (heading section, block reference, line range), and distinguishes it from siblings like outline_note and search by its read-only content-return focus. The purpose is unambiguous and the description clearly differentiates the tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to use search or outline_note first to find the path and section names, and explains the contentHash is to pass as prevHash to edit tools for compare-and-swap. This provides clear when-to-use guidance and ordering, effectively routing the agent to the correct prerequisite tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_notesA
Read-only

Read up to 20 notes (or spans of them) in one call instead of repeated read_note calls, e.g. the top hits from search, query_notes, list_notes, or get_backlinks. Each item takes the same options as read_note and returns the same fields, in request order. budgetBytes (default 16384) caps the total note text: when the notes exceed it, each is cut to a fair share, marked truncated: true, and keeps noteBytes, so read the rest with read_note. A failing item (missing path, unknown section) returns its own error without failing the batch. contentHash is always the whole file's hash, usable as prevHash.

NameRequiredDescriptionDefault
itemsYesNotes to read, 1–20. Same options as read_note.
budgetBytesNoCap on total note text returned across all items, in UTF-8 bytes (256–65536, default 16384).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses budgetBytes truncation semantics (fair-share cut, truncated: true, noteBytes retained for continuation), per-item error isolation ('a failing item returns its own error without failing the batch'), and that contentHash is always the whole-file hash usable as prevHash. These are non-obvious behaviors an agent could not derive from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then batching rationale, then budget/truncation behavior, then error isolation and contentHash. Four dense sentences with no filler; each one carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description compensates by describing the return contract (same fields as read_note, in request order, truncated flag, noteBytes, contentHash). Combined with rich budget/error semantics, an agent has everything needed to call it correctly and handle partial results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the default value and unit of budgetBytes, its truncation behavior, and the cross-item semantics ('each item takes the same options as read_note'). It does not restate the per-field span options, which the schema already handles well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource with explicit batch scope: 'Read up to 20 notes (or spans of them) in one call instead of repeated read_note calls.' This immediately distinguishes it from the sibling read_note by cardinality and by naming the upstream tools whose output feeds it (search, query_notes, list_notes, get_backlinks).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names when to use it (bulk-fetching top hits from search/query_notes/list_notes/get_backlinks) and routes the agent to the alternative for follow-up ('read the rest with read_note'). Both the when and the fallback path are stated, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_headingA
Destructive

Rename a heading in a note and rewrite every [[note#heading]] wikilink and embed across the vault so references keep working — aliases preserved, fenced code blocks left alone. Served from the warm backlink index, no vault scan. Heading matching is case-insensitive; with duplicate headings the first match wins, mirroring Obsidian link resolution.

NameRequiredDescriptionDefault
pathYesVault-relative path of the note containing the heading.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
newHeadingYesNew heading text, without # markers. Must not contain newlines, "[", "]", "|", or "#".
oldHeadingYesCurrent heading text, without # markers. Case-insensitive; first match wins.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite having annotations, it adds valuable context about case-insensitivity, first-match-wins on duplicates, and skipping code blocks. It doesn't contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences pack a lot of precise information: what it does, how it works (warm backlink index), and key edge-case behaviors. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a rename operation, it covers the mutation, the link rewriting, the index source, and important resolution semantics. It could elaborate on return values, but the description is comprehensive for typical usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the schema already documents each parameter. The description adds value by explaining the exact behavior of heading matching and what happens with the prevHash guard.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it renames a heading and rewrites links and embeds across the vault, which distinguishes it from simple rename or edit tools. It mentions specific behavioral nuances like alias preservation and ignoring fenced code blocks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies this tool is for renaming headings specifically, not for other edits, and mentions how it handles duplicate headings. It doesn't explicitly mention alternative tools, but the context is clear for when to use this over a generic edit tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replace_in_noteA
Destructive

Find and replace text within a note body. Supports literal and regex search, case sensitivity, whole-word matching, and a replacement limit. Frontmatter is never touched. Use dryRun to preview matches before writing.

NameRequiredDescriptionDefault
findYesText or pattern to find.
pathYesVault-relative path to the note.
limitNoMaximum number of replacements. Omit to replace all.
regexNoTreat find as a regular expression. Default false.
dryRunNoIf true, report matches without writing. Default false.
replaceYesReplacement text. Supports $1, $2, … backreferences in regex mode.
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
wholeWordNoMatch whole words only (\b boundary). Default false.
caseSensitiveNoCase-sensitive matching. Default false.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and readOnlyHint=false, so the write nature is known. The description adds valuable behavioral context beyond that: it clarifies that frontmatter is never affected (scope of mutation) and recommends dryRun for previewing. It does not discuss failure modes like hash_conflict, but the schema documents that, and the bar is lower given the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. The core purpose is front-loaded, and the supporting details (feature list, frontmatter exclusion, dryRun tip) follow in a logical order. Every sentence earns its place, and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters and no output schema, the description could do more to explain return values or error conditions. It does not mention what the tool returns on success (e.g., count of replacements, updated content) or how it reports failures like hash_conflict or note-not-found. The schema and annotations cover some aspects, but the lack of output guidance leaves a gap for a mutation tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 9 parameters are individually documented. The description adds only a high-level summary of capabilities ('Supports literal and regex search, case sensitivity, whole-word matching, and a replacement limit') and a tip about dryRun, but this does not meaningfully augment the schema, which already explains each parameter's semantics. Thus, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource and action: 'Find and replace text within a note body.' It goes beyond a simple verb by listing supported features (literal/regex, case sensitivity, whole-word, limit) and explicitly excludes frontmatter, which distinguishes it from sibling tools like patch_frontmatter or append_note. An agent can immediately understand what it does without needing to inspect the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is for body text replacement, and explicitly states 'Frontmatter is never touched,' which serves as a when-not-to-use boundary. It also advises using dryRun to preview before writing, which is a concrete usage tip. However, it does not name any alternative sibling tools, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_noteA
Read-only

Resolve a note reference — a wikilink target, bare note name, path without extension, or frontmatter alias — to canonical vault-relative path(s). Each match carries provenance (path | basename | relpath | alias); matches[0] is exactly what a wikilink with that target resolves to, and ambiguous: true means more than one note matched. Empty matches means the reference resolves to nothing (didYouMean then lists close names). Returns paths only — resolve first, then read_notes. Pure index lookup.

NameRequiredDescriptionDefault
referenceYesReference to resolve: a vault-relative path ("Projects/Core.md"), a path without extension, a bare note name ("Core"), or a frontmatter alias.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description goes well beyond that: it defines the provenance field, guarantees matches[0] equals actual wikilink resolution, explains ambiguous: true, and specifies empty-match behavior with didYouMean. That is exactly the return-shape and ambiguity semantics an agent needs to interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and accepted input forms, then the result contract, then the routing hint. Every sentence adds a distinct fact (provenance, matches[0] guarantee, ambiguity flag, empty case, paths-only) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden of describing return values — and it does: paths, provenance, ordering, ambiguity, and the empty-result hint. For a one-parameter read-only index lookup, nothing necessary is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 100% schema description coverage, the schema already documents the accepted reference forms. The description adds only marginal framing ('wikilink target') beyond the schema's enumeration, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource: resolves a note reference (wikilink target, bare name, extensionless path, alias) to canonical vault-relative paths. It explicitly separates itself from content-reading siblings by stating 'Returns paths only — resolve first, then read_notes.', so an agent can distinguish it from read_note/read_notes/search without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context and an explicit next step ('resolve first, then read_notes') and frames itself as a pure index lookup rather than a content fetch. It stops short of saying when to prefer it over search or query_notes for lookup-shaped questions, so the alternative routing is present but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undo_writeA
Destructive

Revert a journaled write: restores every file it touched to its byte-identical pre-write state (a multi-file move or heading rename is restored whole; a delete is restored even if it was permanent). Defaults to the most recent undoable write. Refuses with undo_conflict if a file changed since that write, unless force: true. The undo is itself journaled — undo it to redo.

NameRequiredDescriptionDefault
seqNoJournal entry to revert (from list_writes). Defaults to the most recent undoable write.
forceNoRestore even if a file changed after the journaled write; the clobbered state is journaled first so nothing is lost. Defaults to false.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds substantial behavioral detail beyond that: byte-identical restoration, whole-operation restoration for multi-file changes, handling of permanent deletes, the undo_conflict guard, the effect of force, and the fact that the undo is itself journaled and can be undone to redo. This is exemplary disclosure of side effects and edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries necessary information, and key facts are front-loaded: what the tool does, how it handles tricky cases, then defaults and conflict behavior. Despite covering complex semantics, the description remains compact and well-ordered with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, the description still tells the agent everything needed to invoke the tool correctly: default target, failure mode, force escape hatch, permanent-delete restoration, and redo possibility. The reference to list_writes in the schema completes the workflow context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces the schema's default behavior for seq and explains the force semantics, but it does not add significantly new parameter-level information beyond what the input schema already provides. The description's added value is mostly behavioral, not parameter-specific.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Revert a journaled write' and precisely defines the effect ('restores every file it touched to its byte-identical pre-write state'). It also distinguishes the tool's scope by giving concrete examples like multi-file moves, heading renames, and permanent deletes, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational guidance: it defaults to the most recent undoable write, explains the undo_conflict refusal condition, and clarifies how force:true changes the behavior. While it does not explicitly state 'use list_writes to find a seq,' the schema parameter references list_writes, and there is no competing sibling tool for undo operations, so the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_taskA
DestructiveIdempotent

Set the state of one Markdown checkbox identified by path + line (from list_tasks), rewriting exactly one character — the rest of the file, frontmatter included, stays byte-identical. Pass expectText to guard against the line having changed, and prevHash for full compare-and-swap. Setting the current state again is a success no-op.

NameRequiredDescriptionDefault
lineYes1-based line number of the task, as returned by list_tasks.
pathYesVault-relative path to the note.
stateYesNew marker character: "x" (done), " " (open), or a custom marker like "/".
prevHashNoOptional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.
expectTextNoOptional guard: the task text list_tasks returned. Fails with task_text_mismatch if the line’s text changed since.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations by disclosing the exact write footprint (single character, frontmatter and rest of file untouched), the repeat-set-is-a-no-op behavior that explains idempotency, and the concrete failure modes hash_conflict and task_text_mismatch tied to the guard parameters. Nothing here contradicts destructiveHint=true; it clarifies how minimal the mutation actually is.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, front-loaded with the operation and its write footprint, then the optional guards, then the no-op edge case. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the mutation's blast radius, concurrency guards, and edge-case semantics, which is what an agent needs to call it safely. With no output schema, it does not say what the call returns (e.g. new hash or status), leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it ties path + line to list_tasks as their source and explains the distinct roles of expectText (line-text guard) versus prevHash (whole-note compare-and-swap). Only the state parameter's accepted values are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the state of one Markdown checkbox identified by path + line') and pins the scope precisely: exactly one character is rewritten, everything else stays byte-identical. That distinguishes it cleanly from siblings like replace_in_note or patch_note, which edit larger regions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directs the agent to obtain path + line 'from list_tasks' and explains when to pass expectText (line changed) versus prevHash (full compare-and-swap). It gives clear positive usage context but never names exclusions or alternatives, e.g. when to prefer replace_in_note or patch_note instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.3.27
    • Addedlist_tasks
    • Addedresolve_note
    • Addedupdate_task
  2. 5 tool updatesv0.3.26
    • Changedcontext_pack1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Changedlist_notes1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Filter by tag (# prefix optional)."New value: +"Filter by tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Changedquery_notes1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag (# optional)."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
    • Addedread_notes
    • Changedsearch1 field changed
      • changedInput schema / properties / tag / description
        Previous value: -"Restrict to notes with this tag."New value: +"Restrict to notes with this tag. # optional, case-insensitive; nested child tags match (\"project\" matches project/alpha)."
  3. 3 tool updatesv0.3.25
    • Changedcontext_pack3 fields changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "description": "Restrict to a vault-relative folder prefix.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "lexical = keyword search (default). semantic = meaning-based over local embeddings (needs SEEKSTONE_SEMANTIC=1 and a fetched model). hybrid = exact-title lookups go lexical, everything else semantic.",
        +  "enum": [
        +    "lexical",
        +    "semantic",
        +    "hybrid"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "Restrict to notes with this tag.",
        +  "type": "string"
        +}
    • Changedpatch_note2 fields changed
      • addedInput schema / properties / target / anyOf
        Added value: +[
        +  {
        +    "properties": {
        +      "heading": {
        +        "description": "Heading text (without # markers).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "heading"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "block": {
        +        "description": "Block reference ID (without the ^ prefix).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "block"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / target / type
        Removed value: -"object"
    • Changedquery_notes1 field changed
      • addedInput schema / properties / where / items / properties / value / type
        Added value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
  4. 2 tool updatesv0.3.22
    • Addedlist_writes
    • Addedundo_write
  5. 1 tool updatev0.3.19
    • Changedsearch1 field changed
      • addedInput schema / properties / excerptLength
        Added value: +{
        +  "description": "Max characters of match context per hit (20–2000, default 120).",
        +  "type": "number"
        +}
  6. 3 tool updatesv0.3.18
    • Changeddelete_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since — so you never delete content you have not seen.",
        +  "type": "string"
        +}
    • Changedmove_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard on the source note: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedsearch1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "lexical = keyword search (default). semantic = meaning-based search (requires SEEKSTONE_SEMANTIC=1). hybrid = exact-title lookups go lexical, everything else semantic.",
        +  "enum": [
        +    "lexical",
        +    "semantic",
        +    "hybrid"
        +  ],
        +  "type": "string"
        +}
  7. 2 tool updatesv0.3.17
    • Addedcontext_pack
    • Addedrename_heading
  8. 7 tool updatesv0.3.16
    • Changedappend_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedappend_periodic_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedcreate_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changeddelete_note1 field changed
      • addedInput schema / properties / permanent
        Added value: +{
        +  "description": "Permanently remove instead of moving to .trash/. Defaults to false.",
        +  "type": "boolean"
        +}
    • Changedpatch_frontmatter1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedpatch_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
    • Changedreplace_in_note1 field changed
      • addedInput schema / properties / prevHash
        Added value: +{
        +  "description": "Optional compare-and-swap guard: the contentHash from a prior read. Fails with hash_conflict if the note changed since.",
        +  "type": "string"
        +}
  9. 1 tool updatev0.3.15
    • Changedmove_note1 field changed
      • addedInput schema / properties / rewriteLinks
        Added value: +{
        +  "description": "Rewrite references in other notes to follow the move. Defaults to true; pass false to move the file only.",
        +  "type": "boolean"
        +}
  10. 1 tool updatev0.3.13
    • Addedquery_notes

TDQS

A3.8/5.0

Scored across 25 tools

Disambiguation4/5

Most tools have crisply distinct purposes, and descriptions actively steer selection (query_notes 'use this instead of search when filtering by properties', context_pack 'use search to locate notes'). The residual overlaps — read_note vs read_notes, append_note vs patch_note's append op vs append_periodic_note, search vs query_notes vs context_pack — are explained but still require reading the descriptions to pick correctly.

Naming Consistency5/5

Uniform snake_case with a verb-first pattern (list_*, get_*, read_*, create_*, move_*, update_*, patch_*, append_*, delete_*, rename_*) used consistently across notes, tasks, links, periodic notes, and the write journal. The only bare-verb tools (search, undo_write) are self-explanatory and don't break the pattern.

Tool Count3/5

25 tools sits at the heavy end of the range for an Obsidian vault server. Several are convenience variants of one another (read_note/read_notes, search/query_notes/context_pack, append_note/patch_note/append_periodic_note, get_periodic_note), so the surface is broader than strictly necessary even though each tool maps to a real workflow.

Completeness4/5

Strong lifecycle coverage: read/create/append/move/delete, section and frontmatter patching, full-text and metadata search, task listing/state changes, backlinks/outlinks, periodic notes, and a journaled undo system that covers reverts of every write. Minor gaps remain — no folder-level operations (create/move/delete folders, listing folder structure), no batch multi-note edits, and no template listing despite template-based creation.

Maintenance

ActivityActive
ResponsivenessLimited data

Related MCP Connectors

Related MCP Servers