kura
증류창고 — distill-kura
에이전트를 위한 장기 기억. 축적이 아니라 증류.
회상은 의미로 작동하고, 기록은 증거로 검증되며, 서버 하나가 여러 개의 분리된 기억을 담을 수 있다 — 에이전트 모드마다 하나씩 — 그래서 모드를 바꾸면 에이전트가 기억하는 내용이 바뀐다.
DeepSeek Harness 플러그인, 다른 모든 호스트를 위한 MCP 서버, HTTP 서비스, 그리고 Python 라이브러리로 제공된다. 표준 라이브러리만 사용한다. 벡터 데이터베이스도, 임베딩도, 프레임워크도 없다.
┌── recall ──────────────────────────────────────────────┐
│ question → whole index in one prompt → picked slugs │
│ → walk [[links]] → the neighbourhood │ ~0.4 s
└────────────────────────────────────────────────────────┘
┌── distil ──────────────────────────────────────────────┐
│ journal → classed evidence → candidates → GATE │
│ → new? → composed → draft → judged → poured │
└────────────────────────────────────────────────────────┘왜 존재하는가
두 가지 실패가 에이전트의 장기 기억을 죽인다. 그리고 그 둘은 정반대 방향에서 죽인다.
키워드 검색은 필요한 것을 놓친다. *"SSD 추론 칩"*에 대한 질문은 *"2.6T 모델을 SSD 티어에서 실행하기"*라는 기억과 단어 하나도 공유하지 않는다 — 하지만 둘은 같은 주제다. 단어 검색은 아무것도 반환하지 않고, 에이전트는 공허에서 대답한다. 여기서의 해결책은 임베딩이 아니라 인식이다: 전체 인덱스(기억당 한 줄, 인식 트리거로 작성됨)가 하나의 프롬프트에 들어가고, 작은 모델이 질문과 관련된 것을 지목한다. 약 500개 기억의 인덱스는 약 6k 토큰 — 현대 컨텍스트 윈도우의 몇 퍼센트에 불과하며, 프리픽스 캐시에 상주한다.
모든 것을 기록하면 저장소가 오염된다. 에이전트가 주장을 한다. 순진한 증류기가 그 주장을 사실로 기록한다. 다음 에이전트가 그것을 진실로 읽고 더 큰 확신을 가지고 반복한다. 그 루프는 자기 강화적이며, 프롬프트 지시로는 막을 수 없다 — 추정이 아니라 측정된 사실이다. 그래서 쓰기 경로는 결정론적 Python으로 검증된다: 모든 후보 기억은 원자료에 문자 그대로 존재하는 인용문을 반드시 포함해야 하며, 출처가 태그로 표시된다.
클래스 | 무엇인가 | 무엇을 허가하는가 |
| 인간의 말 그대로 | "그들이 결정했다", "그들이 요청했다" |
| 기계 출력 | 숫자 — 유일한 출처 |
| 호출된 도구 | "이것이 수행되었다" |
| 에이전트 자신의 산문 | 판단. 1인칭으로. 결코 단순한 사실이 아니다. |
문자 그대로 발견되지 않은 인용문은 폐기된다. 살아남은 인용문이 없는 후보는 버려진다. 뒤에 [TOOL]이 없는 숫자는 제거된다. [USER] 인용문이 살아남지 않았는데 인간이 결정했다고 주장하는 텍스트는 마지막 관문에서 거부된다. 아이디어는 환영한다 — 시드 파일로 가며, 저장소에는 절대 들어가지 않고, 이후 증거가 확인할 때만 승격된다.
Related MCP server: Synapto
빠른 시작
git clone https://github.com/lna-lab/distill-kura && cd distill-kura
pip install -e . # or just run: python3 -m distill_kura.cli
cp kura.example.toml kura.toml # edit: one model endpoint is enough to start
kura init main --path ~/kura/main # create an empty store
kura serve # http://127.0.0.1:8085curl -s -X POST localhost:8085/recall -H 'content-type: application/json' \
-d '{"question":"what did we decide about the archive disk?","hops":1}'인덱스를 착용하라. 에이전트가 항상 무엇이 알려져 있는지 알 수 있도록:
kura weave # build the three-layer cloth
kura prefill # the block to put in the system prompt에이전트 트랜스크립트를 공급하라:
kura distill run # drink a batch → candidates → gate → drafts
kura distill drafts # look at what it wants to write
kura distill drain # the scribe re-reads each draft cold: pour / fix / toss
kura distill night # stay resident and do it whenever things go quietdrain(또는 수동 실행 pour) 전에는 아무것도 저장소에 들어가지 않는다. 초안은 HTML 주석에 증거를 담고 있어서, 기억이 왜 존재하는지 항상 볼 수 있다.
상주 지도
도구 기반 회상은 *"X에 대해 무엇을 아는가?"*에 답한다 — 하지만 에이전트가 질문하기로 결정한 후에만. 그것은 에이전트가 생각조차 하지 못하는 질문에는 절대 답하지 않는다: 여기에 아무것도 있는가? 지도를 볼 수 없는 에이전트는 무엇을 놓치고 있는지 모르므로 추측한다. 그리고 당신의 가정에 대한 자신 있는 추측은 정확히 이 프로젝트가 막으려는 실패다.
그래서 인덱스도 착용된다: 시스템 프롬프트의 상주 블록으로, 매 턴마다.
kura weave # re-weave the index into the three-layer cloth
kura prefill # print the block a host should inject세 개의 계층, 세부사항은 최근 것에만 가치가 있으므로
맹검 A/B 테스트 — 질문 20개, 두꺼운 인덱스 대 슬림 인덱스, 어느 쪽인지 모른 채 채점 — 가 형태를 결정했다:
구간 | 두꺼움 | 슬림 |
전체 | 9 | 11 |
최근 사건 | 4 | 1 |
원칙 | 1 | 4 |
도메인 간 도약 | 1 | 4 |
원칙 줄은 두 인덱스에서 바이트 단위로 동일했는데, 슬림 인덱스가 여전히 그 구간에서 이겼다: 더 가벼운 주변부가 상주 줄을 더 잘 작동하게 만든다. 세부사항은 통찰의 원천이 아니다. 그것은 아직 움직이는 곳에서만 자리를 얻는다.
계층 | 규칙 | 줄 |
고정 | frontmatter | 전체 유지 |
최근 |
| 전체 유지 |
트리거 | 그 외 전부 | ~ |
트리거 줄은 scribe 모델이 작성하며, 설명 및 예산을 키로 하는 원장에 캐시된다. 그래서 정상 상태에서 재직조는 비용이 들지 않는다. 모델에 연결할 수 없으면 직조기는 대신 기계적으로 잘라낸다 — GPU가 다운되었다고 기억 시스템이 공백이 되어서는 안 된다.
나이는 mtime이 아니다. cp -r, 복원 또는 체크아웃은 모든 타임스탬프를 재설정하고, 전체 인덱스가 "최근"으로 바뀌며, 아무것도 잘리지 않고, 메커니즘이 조용히 스스로 꺼진다. 그래서 직조기는 기억 내부에 쓰인 날짜를 선호하고, 저장소의 5분의 1이 하루 달력 날짜를 공유하는 mtime은 불신한다.
어디에 위치하는가, 그리고 왜 그것이 캐시 결정인가
- id: kura
name: distill-kura
config: { store: eq, promptOrder: -50 } # before the persona프리픽스 캐시는 첫 번째 변경된 바이트부터 손실된다 — 로컬 서버 하나에서 측정: 동일한 4,029토큰 전문은 0.68초에서 0.14초로 재가격화되고, 끝에 추가하면 0.14초를 유지하며, 앞에 한 단어만 추가해도 전체 캐시가 손실된다(0.66초). 페르소나는 일반적으로 시계를 담고 있어 매분 변경된다. 지도는 프롬프트에서 가장 큰 블록이며 하루에 몇 번 변경된다. 크고 안정적인 것이 똑딱거리는 것 앞에 간다.
그 블록 자체에는 날짜, 시계, 카운터가 없다 — 그리고 build()는 그런 헤더를 빌드 시점에 거부한다. 3주 후에 신비롭게 느려진 턴을 통해서가 아니라.
절반의 지도를 넘겨주지 않는다
상황 | 에이전트가 받는 것 |
모두 정상 |
|
| 전체 지도, 그리고 JSON의 경고(텍스트에는 절대 없음 — 배너는 휘발성 콘텐츠다) |
| 인덱스 줄이 없는 스텁, 비어 있다고 말하는 대신 지도가 없다고 말함 |
kura에 연결 불가 | 빈 문자열이 절대 아닌, 지도가 없다는 명시적 메모 |
잘린 지도는 가능한 최악의 산출물이다: 완전해 보이고, 절단선 아래의 모든 기억은 존재하지 않는 것처럼 보인다. weave는 예산에 맞추기 위해 최근 창을 줄이겠지만, 줄을 절대 버리지 않는다 — 그리고 어떤 설정으로도 예산에 도달하지 못하면 그렇게 말하고, 더 나은 지도를 유지하며, 무게가 어디에 있는지 알려준다.
호스트에 넣기
호스트 | 메커니즘 |
DSH | 네이티브 플러그인 — |
Claude Code, VS Code, Goose | MCP |
Claude Desktop, claude.ai |
|
그 외 모든 것 |
|
MCP instructions 필드는 스펙에서 MAY이며, 9,000토큰 인덱스는 어떤 경우에도 2KB 한도를 통과할 수 없다. 그래서 이 프로젝트는 그렇게 가장하지 않는다.
모드: 하나 이상의 kura
"이것을 만드는 것을 도와줘"와 "이것을 생각해내는 것을 도와줘"를 동시에 서비스하는 단일 기억은 둘 다 제대로 서비스하지 못한다: 디버깅에 도움이 되는 회상은 다음에 무엇을 할지에 대한 대화에서 잡음이다. 그래서 저장소는 디렉토리이고, 모드는 저장소에 매핑된다.
[stores.maker]
path = "~/kura/maker"
label = "maker mode — building things"
[stores.eq]
path = "~/kura/eq"
label = "EQ mode — talking things through"
[modes]
maker = "maker"
eq = "eq"모든 라우트는 셀렉터를 받으므로, 하나의 프로세스가 모두를 서비스한다:
curl -s -X POST localhost:8085/recall -d '{"question":"...","mode":"eq"}'
curl -s localhost:8085/index?store=maker
curl -s localhost:8085/s/eq/doctor # path form, for clients that only vary a base URL저장소는 기억, 인덱스, 증류기 워터마크를 공유하지 않는다. 모드를 바꾸는 것은 진정으로 기억되는 것을 바꾼다 — 같은 기억을 다른 목소리로 말하는 것이 아니다.
라우팅으로서는 독립적이지만, 기밀성으로서는 아니다. 서버에는 인증이 없으므로, 포트에 도달할 수 있는 모든 프로세스는 서버가 보유한 어떤 저장소든 지명할 수 있다. 에이전트를 바인딩하는 것은 모델을 자기 차선에 가두는 것이다. 프로세스를 막는 것이 아니다. 프로세스당 신뢰 수준 하나 — docs/TRUST.md는 짧고, 개인 저장소를 넣기 전에 읽을 가치가 있다. 놓치기 쉬운 두 경계도 다룬다: 하나의 저널 루트에서 물을 마시는 두 저장소, 그리고 하나의 모델 엔드포인트 뒤에 있는 두 저장소.
DeepSeek Harness와 함께
DSH는 에이전트 프리셋으로 페르소나와 도구를 전환한다. distill-kura는 저장소로 기억을 전환한다. 그것들을 묶으면 하나의 프리셋 변경이 전체 자아를 움직인다:
# .agent-presets/eq/agent.cordis.yml
- id: kura-eq
name: distill-kura
config:
url: http://127.0.0.1:8085
store: eq # this preset's memory
readonly: true # the CLIENT's own switch: do not even offer a write tool
# (the store's own `write_policy` is the authority; this just keeps the tool
# out of the model's hands. Naming a store already binds the preset.)allowSwitch를 기본값으로 두면 에이전트는 kura_use도 얻어서, 프리셋 변경 없이 대화 중에 kura 사이를 이동할 수 있다. 도구: kura_recall, kura_read, kura_doctor, kura_list, kura_use, 그리고 kura_remember(저장소가 쓰기 가능할 때만). MCP 브리지와 서비스 행을 위한 isolate 영역 규칙을 포함한 전체 배선은 examples/dsh-presets/에 있다.
페르소나는 호스트의 일이다. 우리의 일이 아니다. 이 프로젝트는 페르소나를 렌더링하거나 주입하지 않는다. 저장소별로 어떤 페르소나 파일이 그와 함께하는지 기록만 하며, GET /profile?store=eq에서 읽을 수 있어서 두 절반이 프리셋 소유자에 의해 보조를 맞출 수 있다. 에이전트 지시사항도 호스트의 AGENTS.md 메커니즘에 남는다 — 이 코드베이스 에서 작업하는 에이전트가 따라야 할 규칙은 이 저장소의 AGENTS.md를 참조하라.
모든 MCP 호스트와 함께
{ "mcpServers": { "kura": {
"command": "python3", "args": ["-m", "distill_kura.mcp"],
"env": { "KURA_URL": "http://127.0.0.1:8085", "KURA_STORE": "eq", "KURA_READONLY": "1" }
}}}자유 모드를 위해 KURA_STORE를 설정하지 않은 채 두어라: 도구는 선택적 store 인수를 받고 kura_use가 세션 동안 전환한다.
모델: 기본값 하나, 역할별로 한 번에 업그레이드
세 대의 기계가 아니라 세 가지 역할:
역할 | 실행 시점 | 요구사항 |
| 모든 회상 | 작고 빠름. 의미로 관련성을 판단해야 함 |
| 증류: 저널 배치 전체를 읽음 | 컨텍스트 길이와 인내심 |
| 증류: 기억을 쓰고, 초안을 판단함 | 당신의 언어로 된 좋은 산문, 판단력 |
[models.thinker]만 선언하면 하나의 모델이 세 역할을 모두 수행한다. 다른 하나를 독립적으로 업그레이드하라 — 더 큰 로컬 모델, 또는 온라인 API(모든 OpenAI 호환 /chat/completions; 키는 당신이 이름을 지정한 환경 변수에서 읽히며, 설정에 절대 저장되지 않는다):
[models.thinker] # always-on, local, small
url = "http://127.0.0.1:8000/v1"
model = "local-small"
[models.scribe] # upgrade just the writing
url = "https://api.example.com/v1"
model = "big-model"
api_key_env = "EXAMPLE_API_KEY"이것이 처리해주는 두 가지: 추론 노력 방언은 모델 계열마다 다르므로(reasoning_effort, thinking_effort, enable_thinking), 모두 전송된다 — 알 수 없는 것은 템플릿이 무시하고, 기본적으로 딥씽킹에 남아 있는 모델은 전체 예산을 추론에 쓰고 아무것도 반환하지 않을 수 있다. 그리고 헌장 텍스트는 모든 역할의 프롬프트 머리에 바이트 단위로 동일하게 배치되어, 느린 로컬 모델에서 세 역할이 세 번의 프리필을 지불하는 대신 하나의 캐시된 프리픽스를 공유한다.
사고자가 다운되어도 회상은 조용해지지 않는다 — 단어 중복으로 폴백되고 답변에 how=words로 라벨이 붙으며, 도구는 이를 ⚠ degraded로 표시한다. 조용한 성능 저하는 성능 저하보다 더 나쁘다.
메모리의 모습
파일 하나, 사실 하나.
---
name: archive-on-slow-disk
description: the archive lives on the slow disk; the fast one stays scratch
metadata:
type: project # user | feedback | project | reference
---
The archive goes on the slow disk. The fast disk is scratch space.
**Why:** the other way round burns write endurance for nothing.
**How to apply:** check which disk a target directory is on before writing there.
Related: [[disk-layout]]그리고 MEMORY.md의 한 줄:
- [Archive on the slow disk](archive-on-slow-disk.md) — the archive lives on the slow disk; the fast one stays scratch그 줄은 매번 읽히는 유일한 것이다. 그것은 인식 트리거이지 요약이 아니다: 고유명사, 숫자, ⚠️ 지뢰, 도달한 결론. 어떤 줄이 다른 메모리의 줄과 바꿔도 여전히 자연스럽게 읽힌다면, 그 줄은 제 역할을 하지 못하는 것이다 — kura distill tidy가 기계적으로 감지 가능한 사례를 찾아 다시 쓴다.
kura doctor는 개수, 끊어진 링크, 섬(아무것도 링크하지 않는 메모리), 인덱스 표류를 보고한다. 그것은 신진대사가 필요로 하는 눈이다.
HTTP 표면
라우트 | 기능 |
|
|
|
|
| 원시 인덱스 |
| 상주 블록, 주입 준비 완료 ( |
| 하나의 메모리 전체 |
| 한 저장소의 상태 ( |
| 저장소, 모드, 각 역할을 채우는 모델 |
| 저장소의 헌장과 그 페르소나에 대한 포인터 (여기서 렌더링되지 않음) |
| 활성 상태 |
모든 라우트는 ?store= / ?mode=, 본문의 store/mode 필드, 또는 /s/<name>/… 경로 접두사를 허용한다. 인증이 없다: 루프백에 바인딩하거나, 앞에 무언가를 두어라.
변경 전에 읽을 가치가 있는 설계 노트
docs/DESIGN.md — 인식이 검색을 이기는 이유, 게이트가 제공하는 이점, 각 메커니즘을 동기부여한 실패 사례.
docs/OPERATING.md — 상주 실행, 스케줄러와 종료 코드, 백업, 주시할 사항.
docs/TRUST.md — 저장소 경계가 무엇이고 무엇이 아닌지, 쓰기 정책, 놓치기 쉬운 두 경계(공유 저널, 공유 모델). 비공개 저장소를 도입하기 전에 읽어라.
그것이 막는 문제를 겪기 전까지는 이상해 보이는 몇 가지 결정:
마시기 전에 예약. 증류기는 저널의 구간을 읽기 전에 잠금 아래에서 선점하고, 워터마크는 항상 앞으로만 이동한다. 각자 자신의 스냅샷을 다시 쓰는 두 증류기는 서로의 진행 상황을 지우고 같은 물을 수십 번 다시 마셨다.
워터마크는 어댑터별 단위. 추가 전용 트랜스크립트에는 바이트 오프셋, 재작성되는 아카이브에는 시퀀스 번호(재압축된 파일에 대한 바이트 오프셋은 거짓말이다).
에코 억제. 저장소에 이미 존재하는 인용문은 새로운 자료가 아니다 — 그것은 도구 결과를 통해 저장소가 자신을 다시 읽는 것이다. 이것이 없으면 메모리 시스템은 자신의 내용을 영원히 재발견하고 재기록한다.
마지막 게이트는 모델이지 사람이 아니다. 사람이 모든 초안을 승인해야 한다면, 시스템은 조용히 그 사람을 병목으로 만들고 초안은 영원히 쌓인다. 루프 안에는 항상 존재하지 않는 사람을 요구하는 것이 없어야 한다.
kura distill run은 할 일이 없으면 2로 종료된다. 스케줄러는 "일을 했다"와 "아무것도 찾지 못했다"를 구분할 수 있어야 한다. 그렇지 않으면 워치독이 빈 큐에서 회전하며 유휴 시간이 필요한 단계를 굶긴다.
주장 대신 측정
두 질문이 하나의 숫자로 답해지고 있는데, 그래서는 안 된다.
얼마나 작아졌는가? store_ratio = 메모리와 인덱스의 토큰 / 실제로 소비된 원시 저널의 토큰. 무엇이 손실되었는가? 그것은 다른 측정이며, 백 개 중 하나의 메모리만 유지하는 저장소는 첫 번째 기준에서는 훌륭한 점수를 받으면서도 쓸모없다.
kura bench compress # what this store cost, from the distiller's own metrics
kura bench compress --tokenizer-command "./count-tokens" # exact, not estimated
kura bench retention --questions bench/fixtures/questions.json배포된 픽스처와 내장 추정기로 여기서 측정:
코퍼스 |
|
| 0.18 |
| 1.14 |
두 번째는 버그가 아니다. 잡담이 없는 자료에서 증류는 압축하지 않는다 — 각 메모리는 이유와 적용 방법을 추가하며, 저장소는 트랜스크립트보다 약간 커진다. 비율은 이 도구의 속성이 아니라 코퍼스의 속성이다. 그래서 여기에 헤드라인 숫자가 없고 명령이 무엇으로 계산했는지 보고하는 것이다.
유지율은 모델 없이 점수가 매겨진다: 각 심어진 사실은 회상이 반환하는 것에 반드시 나타나야 하는 마커를 지니므로, 점수는 다른 사람의 머신에서도 재현 가능하다. 방해 요소는 반전된다 — must_not_store로 표시된 사실은 저장소가 유지했다면 점수를 잃는다. 메모리 시스템은 무엇을 유지하는지만큼 무엇을 거부하는지로도 평가되기 때문이다.
score 1.0 (10/10) decision 1/1 number 2/2 negation 1/1 reversal 1/1
conditional 1/1 landmine 1/1 returning 1/1 distractor 2/2이것은 합성 픽스처에 심어진 열 개의 사실로, 로컬 Qwen3.8-27B (NVFP4)를 뇌와 서기로 사용하고 max_items = 8, coverage_passes = 2로 증류한 다음, 같은 모델을 사고자로 사용해 점수를 매긴 것이다. 다른 모델은 다른 점수를 줄 것이다: 점수는 파이프라인+모델을 측정하며, 픽스처는 모델만 변하게 하기 위해 존재한다. 그것은 사실이 찾을 수 있는지를 측정하지, 답변이 잘 읽히는지는 측정하지 않는다 — 산문을 평가하려면 모델이 필요하고, 그러면 벤치마크는 더 이상 재현 가능하지 않게 된다.
kura distill run은 배치당 한 줄을 _still/metrics.jsonl에 쓴다. 원시 측면이 여기서 나온다. 정규 측면은 증거 매니페스트가 기록된 배치를 가리키는 메모리만 계산한다 — 전체 저장소를 몇 개 배치의 원시 자료로 나누는 것은 한 자릿수 방향이 틀린 숫자이며, 이 명령의 첫 버전이 정확히 그렇게 했다. 매니페스트 이전의 메모리는 unattributed로 보고되며, 조용히 포함되지 않는다. 원시 측면은 항상 마실 때 증류기의 추정치이므로, --tokenizer-command를 사용하면 비율은 mixed로 라벨이 붙는다.
이것이 실행되는 환경
요구 사항 | |
Python | 3.11+ (의존성 없음; |
Node | 20+, DSH 플러그인 전용 |
| DSH 세션 아카이브를 읽는 데만 사용 |
모델 엔드포인트 | OpenAI 형태로 |
"OpenAI 호환"은 "모든 제공자"보다 좁다. 벤더의 네이티브 API는 앞에 OpenAI 호환 게이트웨이가 필요하다; 자체 URL로는 안 된다. 엄격한 서비스는 알 수 없는 최상위 필드도 거부하므로, dialect = "openai"(또는 "generic")를 설정하라 — 기본값 "vllm"은 chat_template_kwargs를 보내는데, 로컬 서버는 원하고 엄격한 서버는 400을 반환한다. 클라이언트는 일반 본문으로 한 번 재시도하고, 모든 원인을 조용한 None으로 합치지 않고 호출 실패 이유를 기록한다.
테스트
python3 -m pytest tests -q # 145 tests, no model required
cd dsh-plugin && npm test # 24 more for the plugin게이트는 적대적으로 테스트된다: 모든 사례는 실제 모델이 게이트를 통과시키려 시도한 방식이다. test_containment.py도 같은 방식으로 작성되었다 — 모든 사례는 탈출 시도이지 행복한 경로가 아니다 — 실제였던 구멍을 지키기 때문이다: 저장소는 경로를 말할 수 있는 모든 파일에 대해 응답하곤 했다. 엔드투엔드 테스트는 실제 소켓에서 스크립트된 모델 서버에 대해 전체 증류→배수 주기를 실행한다.
라이선스
MIT.
Available Tools
6 toolskura_doctorA
Health check of the kura: how many memories, resolved and dead [[links]], islands (memories nothing links to), index drift. Call when recall behaves oddly, or when asked about the memory system itself.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Which kura. Omit for the current one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does well by naming the diagnostic nature ('health check'), the categories of data inspected, and the symptom-triggered use case. It does not explicitly state whether the tool is read-only or whether any repair/reindexing occurs, but 'health check' strongly implies diagnostic rather than mutating behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences, front-loaded with the core purpose, followed by a concise list of diagnostic metrics and explicit usage triggers. Every clause earns its place, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with zero required parameters and a fully documented optional parameter, the description provides enough context to select and invoke the tool correctly. It explains what will be inspected and when to use it. The only gap is that it does not describe the return format or explicitly confirm the absence of side effects, but neither is critical for a diagnostic health-check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description provides no additional parameter-level meaning beyond what the schema already states. The optional 'store' parameter is fully documented in the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pairing: 'Health check of the kura', and enumerates concrete diagnostic outputs (memory counts, resolved/dead links, islands, index drift). This clearly differentiates it from the sibling tools like kura_read or kura_recall, which focus on reading or retrieving memories rather than diagnosing system health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Call when recall behaves oddly, or when asked about the memory system itself.' This provides clear invocation context. However, it does not explicitly mention alternatives or when not to use it, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_listA
List the kura this server holds and which agent mode each one belongs to. Call it when you are unsure which memory you are speaking from, or before switching.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the operation (list) and the output (kura and agent modes) but does not mention side effects, read-only nature, performance, or any edge cases. Adequate but not rich for a tool without annotation safety signals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The first sentence states the core function; the second provides immediate usage context. Information is front-loaded and every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter list tool with no output schema, the description explains what is listed and exactly when to invoke it. It could mention what 'kura' refers to or if results are ordered, but the definition is sufficient for an agent to decide and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is trivially 100%. Per the rubric, 0 params earns a baseline of 4. The description does not need to add parameter details since none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list', the resource 'kura', and what is listed (which agent mode each belongs to). It implies a distinction from siblings like kura_read or kura_recall by focusing on the server's collection and mode mapping, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call it when you are unsure which memory you are speaking from, or before switching.' It lacks explicit when-not-to-use or named alternative tools, but the usage context is concrete and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_mapA
Show the whole index of the kura — every memory's one-line recognition trigger, in one answer. Use it when you need to see WHAT EXISTS rather than look something up: before claiming a topic was never discussed, when choosing which memory to open, or right after switching kura. It is a map, not the contents: open a memory with kura_read for the detail.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Which kura. Omit for the current one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It clearly frames a display operation ('Show the whole index... in one answer') and sets output expectations ('map, not the contents'). It does not discuss permissions or exact formatting, but for a non-mutating index tool the core behavioral disclosure is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the action and scope, the second gives concrete use cases, and the third clarifies depth and names the sibling for details. It is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one optional parameter and no output schema, the description provides the essential context: what it returns, when to use it, what it is not, and where to go for detail. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single 'store' parameter is already documented as 'Which kura. Omit for the current one.' The description adds no parameter-level detail beyond that, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Show the whole index of the kura - every memory's one-line recognition trigger.' It also distinguishes itself from siblings by saying it is 'a map, not the contents' and explicitly directs details to kura_read, so an agent can tell it apart from the other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions ('when you need to see WHAT EXISTS... before claiming a topic was never discussed, when choosing which memory to open, or right after switching kura') and an explicit alternative ('open a memory with kura_read for the detail'). This is clear routing guidance rather than leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_readA
Read one whole memory from the kura by its slug (e.g. 'storage-doctrine'). Use after kura_recall when a summary is not enough and you need the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Memory slug, without .md | |
| store | No | Which kura. Omit for the current one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the burden of behavior. It clearly indicates a read operation fetching the full memory text, which is sufficient for this simple tool. It could add detail about return format or failure behavior, but the core behavior is transparent enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary behavior is front-loaded, and the usage guidance, alternative, and selection condition are packed efficiently into the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-by-slug tool with only two parameters, no output schema, and full schema coverage, the description is complete. It tells the agent what it does, when to use it, and provides an example. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds a useful example slug ('storage-doctrine') but otherwise does not need to add much beyond what the schema already documents for 'slug' and 'store'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read'), the resource ('one whole memory'), and the retrieval key ('by its slug'), with a concrete example. It also names the sibling tool it complements, distinguishing it from kura_recall 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: 'Use after kura_recall when a summary is not enough and you need the full text.' This directly routes the agent to the appropriate alternative and gives a clear selection condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_recallA
Recall from the kura — long-term memory retrieved by MEANING rather than keyword, then following [[links]] between memories. Call it whenever the question touches past decisions, measurements, people, machines, or anything done before — prefer it over guessing. An empty result means it is simply not remembered yet: say so plainly and never fill the gap with invention. Pass store to reach a different kura, or call kura_use to switch for the session.
| Name | Required | Description | Default |
|---|---|---|---|
| hops | No | How many [[link]] hops to walk (default 1) | |
| store | No | Which kura to ask (store or mode name). Omit for the current one. | |
| question | Yes | What you want to remember, as a natural question |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It does reveal important behavior: it retrieves by meaning, follows links, and emphasizes not to fabricate when no result is found. However, it does not disclose potential side effects, rate limits, or what happens with the hops parameter (e.g., how deep the search goes and whether more hops affect latency). It also doesn't specify if the tool is read-only, though recall implies reading. Overall, it gives useful context but leaves some behavioral aspects unmentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph but contains no filler. It front-loads the core purpose and usage guidance, then addresses edge cases and parameter use. It is appropriately sized for a tool with multiple interconnected behaviors (meaning-based recall, link-following, empty result handling). It could be slightly more structured (e.g., bullet points for handling empty results or parameter variants), but it is efficient and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters (1 required), no output schema, and moderate complexity due to link-following and alternate stores, the description covers the essential aspects: what it does, when to use it, how to handle empty results, and how to use parameters. It does not explicitly describe return format (e.g., whether it returns text or a list of memories), but with no output schema, it could have provided more on that. Missing details on hops behavior and potential limitations are minor gaps. Overall, it is fairly complete for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters (question, hops, store) with descriptions, and coverage is 100%, so the baseline for parameter semantics is 3. The description adds value by explaining the semantics of 'store' ('reach a different kura') and hints that 'question' should be phrased as a natural question. It also implies the meaning of 'hops' (following [[links]]). It doesn't detail the format or constraints beyond the schema, but it enriches the meaning of each parameter sufficiently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Recall from the kura — long-term memory retrieved by MEANING rather than keyword, then following [[links]] between memories.' It differentiates itself from siblings by emphasizing meaning-based retrieval over keyword, which distinguishes it from tools like kura_read or kura_list. It also mentions specific use cases, making it easy for an agent to understand what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: 'Call it whenever the question touches past decisions, measurements, people, machines, or anything done before — prefer it over guessing.' It also explains what to do on empty results ('An empty result means it is simply not remembered yet: say so plainly and never fill the gap with invention') and mentions alternatives or related actions ('Pass store to reach a different kura, or call kura_use to switch for the session'). This provides clear guidance on selection and behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_useA
Switch which kura the following calls read from, for the rest of this session. Use when the conversation moves to a different mode of work (for example from building things to talking things through). Has no effect on a bridge that was bound to a single kura at startup — it will say so.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | Store or mode name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It does this well by revealing that the switch persists for the session, affects subsequent calls, and has no effect on a single-kura bridge (and that it will say so). It does not cover every possible error or side effect, but the key stateful behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. The main effect and scope are front-loaded, the usage condition follows, and the edge case is placed last. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter state-switching tool with no annotations and no output schema, this description is complete enough. It explains what the tool does, when to invoke it, how long the effect lasts, and the one major exception an agent needs to know about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — 'store' is already described as 'Store or mode name.' The description adds some context by suggesting that stores correspond to modes of work, but it does not enumerate valid values or add meaningful parameter detail beyond the schema. This is the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Switch') and names both the resource ('which kura the following calls read from') and the scope ('rest of this session'). This clearly distinguishes it from the sibling read/analysis tools like kura_read and kura_map, which retrieve data rather than change the active context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it: 'Use when the conversation moves to a different mode of work,' with a concrete example. It also discloses a limitation about bridges bound to a single kura. It does not explicitly name sibling alternatives or state when not to use it, but the intended context is clear.
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.
6 tool updates
v0.1.0- First observed
kura_doctor - First observed
kura_list - First observed
kura_map - First observed
kura_read - First observed
kura_recall - First observed
kura_use
TDQS
Scored across 6 tools
Each tool has a distinct purpose: recall for meaning-based search, read for slug-based retrieval, map for index views, doctor for health checks, list for enumerating kuras, and use for switching. No overlap in functionality.
All tools follow the same `kura_` prefix with a verb-based second part (recall, read, map, doctor, list, use), creating a consistent and predictable naming scheme.
Six tools is a well-scoped number for a memory-management server, covering retrieval, inspection, maintenance, and context switching without excess or deficiency.
The set covers all read and management operations (recall, read, map, health, list, switch), but lacks an explicit write or delete capability, which is a minor gap for a full memory system. Agents can work around this by relying on existing memories.
Maintenance
Related MCP Connectors
- sepiaceOAuthio.sepiace
Long-term memory for AI agents. Pass one sentence, and it remembers, recalls, or forgets.
- RecallOAuthdev.recallmem
Long-term memory for AI agents: learns what is true about each person and answers with sources.
- mem0OAuthio.github.mem0ai
Persistent memory for AI agents: add, search, update, and delete long-term memories.
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides AI agents with persistent, searchable memory that survives across conversations using semantic search, temporal versioning, and smart organization. Enables long-term context retention and cross-session continuity for AI assistants.14-
- AlicenseNot gradedqualityAmaintenanceProvides persistent, searchable memory for MCP-compatible agents, enabling recall by meaning, automatic decay, trust scoring, and cross-agent handoffs.5MIT

Hebbrix MCP Serverofficial
AlicenseAqualityAmaintenanceProvides long-term memory and a temporal knowledge graph for AI agents, enabling persistent memory and reasoning across sessions.33101 PyPI2MIT
whimsicality-mcpofficial
AlicenseBqualityBmaintenanceProvides persistent memory for AI agents, including context storage, facts, plans, RAG search, code snippets, and conversation compaction, enabling state to survive across sessions and processes.1414 npm2MIT