테마
sync_pull
✅ 라이브 (서버)
vault_* / sync_* 도구는 api.ainote.dev 서버에서 동작합니다 — JSON-RPC POST /api/mcp 또는 @ainote/sdk (ai.vault.* / ai.sync.*)로 호출하세요. (일부 vault 도구는 연결된 git-backed vault가 필요. 참고: @ainote/mcp npm 패키지 구버전엔 번들이 안 됐을 수 있으니 직접 JSON-RPC 또는 SDK 사용 권장.)
ainote hub → 로컬. 파일 내용을 받는다. 응답은 페이지 단위다(기본 25개, 최대 100개).
시그니처
특정 파일 여러 개 (paths)
json
{
"name": "sync_pull",
"arguments": {
"paths": ["global/CLAUDE.md", "global/MEMORY.md"]
}
}한 번에 최대 100개. 증분 동기화에서 바뀐 파일만 받을 때 쓴다. 없는 경로는 응답의 missing 에 담긴다.
디렉터리 또는 단일 파일 (path)
json
{
"name": "sync_pull",
"arguments": {
"path": "global"
}
}global 은 그 아래 전체, global/CLAUDE.md 는 그 파일 하나다. 끝 슬래시(global/)는 무시한다.
변경분 (since)
json
{
"name": "sync_pull",
"arguments": {
"since": "2026-05-06T00:00:00Z"
}
}| 파라미터 | 타입 | 설명 |
|---|---|---|
paths | string[] | 정확한 파일 경로 최대 100개. path·since·cursor 와 함께 쓸 수 없다 |
path | string | 디렉터리(하위 전체) 또는 정확한 파일 경로 |
since | ISO 8601 | 이 시각 이후(초과) 변경된 파일만. 삭제는 알려주지 않는다 |
limit | integer | 페이지 크기. 기본 25, 최대 100 |
cursor | string | 직전 응답의 next_cursor |
응답
json
{
"files": [
{
"path": "global/CLAUDE.md",
"content": "<file content>",
"updated_at": "2026-05-07T14:02:30Z",
"git_sha": "def456..."
}
],
"pulled_at": "2026-05-07T14:05:00Z",
"count": 1,
"has_more": false,
"next_cursor": null
}paths로 부르면missing(없는 경로 목록)이 항상 붙는다. 없는 경로는 삭제된 파일이다.git_sha는 내용 자체의 SHA1 이다(sha1(content)). git blob 해시(blob <len>\0접두)와 다르니 로컬 비교도sha1(content)로 한다.has_more가true면next_cursor를cursor로 넘겨 다음 페이지를 받는다.- 모르는 인자는 무시하고, 응답 텍스트와
warnings에 그 사실을 적는다.
증분 동기화 권장 패턴
1. sync_list {limit: 1000} → 경로·git_sha 목록(내용 없음, 페이지 몇 개)
2. 로컬 sha1(content) 와 비교 → 바뀐 경로·새 경로·지울 경로
3. sync_pull {paths: [...]} → 바뀐 것만 100개씩
4. 목록에 없는 로컬 파일 → 원격에서 삭제된 것since 만으로는 삭제를 알 수 없다. 전체 내용을 매번 받는 방식은 vault 가 커질수록 호출 수와 전송량이 그대로 늘어난다.
에러
| 코드 | 메시지 |
|---|---|
| -32602 | since 형식 오류 |
| -32602 | paths 가 배열이 아님 · 비었음 · 100개 초과 · path/since/cursor 와 함께 씀 |
Claude
어제 이후 변경된 거 다 받아bash
ainote sync_pull '{"since":"2026-05-06T00:00:00Z"}'