Skip to main content
Glama

Mnemento

CI

Like Leonard's polaroids in Memento — a shared, structured record book for LLM agents.

LLM agents forget between sessions. Mnemento gives them one place to write facts and ask questions in natural language, answered by exact structured queries — with evidence.

  • Keeper agent — the only writer; validates, deduplicates, records provenance, asks back when unsure

  • JSON documents + schema registry on SQLite — flexible storage, but the LLM always knows which fields exist

  • Event log + current state — every answer can cite the records it counted

  • MCP server — plug into Claude Code / Claude Desktop

Status: v1.3 — storage core, question pipeline, MCP server, measured three times against Claude Code's own memory (benchmarks on v1.1).

Latest result (v3, opus, questions the system was not developed on): the same accuracy as Claude Code's own memory — 27/27 vs 27/27 at 100 records, 24/27 vs 24/27 at 1,000 — and at 1,000 records 6× faster at 1/8 of the cost. Earlier rounds lost on accuracy (v0, v2); they are kept below as history. Design: docs/PLAN.md · decisions: docs/adr/ · demo log: docs/demo/0002-demo-log.md

How a question is answered

"10/2 사람인 지원 몇 곳?"
  ① interpret   rule-based fast path (no LLM) ─┐   or LLM → QuerySpec (sees only the relevant
                                               │      schema dictionary, never the records)
  ② query       QuerySpec ──code──▶ parameterised SQL on generated, indexed columns
  ③ answer      count / list / groups + evidence ids + warnings (small samples, incomplete
                periods, records too recent to have an outcome, resolved dates and names)
  • The model never writes SQL and never sees your records; it gets field names, descriptions and allowed values.

  • Anything outside the schema dictionary is rejected (and the model is asked once more), so it cannot query fields that do not exist.

  • When a question or a write is ambiguous (which company? which record?), the Keeper stores nothing and returns clarify with options.

  • A new kind of record over MCP: record it with a new entity_type and the schema you suggest (schema_draft); it is stored and queryable at once under a draft type, and the user approves the type later with apply_schema_proposal — required fields, enums and indexes apply from then on. A new name that looks like an existing type is asked about first (ADR-0021). Once you organized a type, this repository's later dictionary improvements reach your database only as a proposal you approve item by item (ADR-0023).

  • Each answer carries a trace: per-stage time, LLM calls, input/output tokens and cost.

  • Every question is kept in a local query log (question, interpretation, QuerySpec, SQL and parameters, result count, evidence ids, warnings, timings, cost). The query_log tool shows recent questions, those with warnings or errors, questions whose SQL changed between askings (diverging), and answers that found nothing (empty). An id filter naming no record is read as the import's source key or the record's name, or asked back — never answered with a silent 0 — and plans that found nothing are not cached (ADR-0020). Bounded to 10,000 rows / 50 MB; MNEMENTO_QUERY_LOG=off turns it off (ADR-0015).

Related MCP server: code-recall

Beyond job search: investment records (fictional example)

The same record book holds a second domain without new query code — only new schemas (examples/investment: security, trade, decision; task 0008 step 3).

"가상바이오(900001) 몇 번 샀어?"           -> trade, count, security resolved by its code (identifier)  -> 2
"올해 손절한 종목은?"                       -> trade, sell, pnl < 0, this year                            -> list
"왜 그 종목은 안 사기로 했지?"              -> the reason where it was written, quoted as recorded        -> text + evidence
  • Identifiers first: a field marked identifier (a stock code, a business registration number) is matched wherever it appears in the question — "nickname(900001)" finds the security even if the nickname is unknown (ADR-0019). Names alone that only look similar are offered as candidates, never linked.

  • Relation notes: a schema can say how it relates to another ("a trade and the decision behind it may be the same event — count buys from trade"); the interpreter is shown related types and counts each event from one type.

  • Copies of files you keep elsewhere: mnemento.importer makes repeated imports safe — the same source key is the same record, a changed fact becomes a corrected event, a changed state (e.g. buy criteria) an updated event at the source's own date, and records that disappeared from the source are reported, never deleted.

  • Used locally on the author's own investment records (trades, decisions, buy criteria, holdings); none of that data is in this repository. Daily valuations are left for price series (next step, ADR-0016).

Measurements over time (series, fictional example)

Some records are not "things that change state" but values measured again and again — body weight, daily spending, prices. A schema can be kind: "series" (a key such as person, a time field, numeric measures); points are stored one row per key and time, in batches that can be reverted as a whole (ADR-0016).

"가상인 3월 평균 몸무게 얼마였어?"                    -> weight, avg kg, March                       -> 68.7
"샘플인은 6월부터 8월 말까지 몸무게가 얼마나 변했어?"  -> change = last - first in the period        -> +0.9
"8월에 가상인 몸무게가 최근 4주 평균보다 낮았던 날은?" -> 28-day window + compare with the window     -> 20 days
  • Period, group_by key or time bucket (day/week/month/year), avg/min/max/sum, first/last/change/ change_pct, moving windows (unit: points|days, computed over the history before the asked period) and comparisons with a window or a value. SQL is generated by code, as for every other question.

  • Warnings: days without a point in the asked period, small samples, a period still in progress.

  • MCP: record_series (one batch, all or nothing; a point already stored is updated and the batch keeps the old value), revert_series_batch.

  • Evaluation: bench/series_eval.py — fictional questions with answer keys computed from the generator. Dev (10, written with the code): M-haiku 9/10, M-opus 9/10. Unseen (7, written by someone who did not see the code, run once): M-haiku 4/7, M-opus 4/7 (5/7 each when the right value is anywhere in the answer). The misses are honest gaps: a difference of two periods in one number, and counting days without a point, are not expressible yet; a right change listed after first/last is graded on the first measure (dev, unseen).

  • Records joined with a series, as of a date (ADR-0022): values computes per record a series value at a date (asof: the latest point at or before today, a date, or the record's own date such as the trade day) and arithmetic on it (expr), e.g. unrealized P/L = units × last close − invested. Only along a declared reference (holding.security_id and price.security_id both point at security); warnings for records without a price and for stale prices. Unseen price questions (5, run once): strict M-haiku 4/5, M-opus 2/5; 4/5 each counting the right number among the returned values (report). Used locally on real holdings: the P/L of every held position equals a direct calculation from the source data.

From text memory to a ledger (mixed-text ingest, fictional example)

Memory files mix facts that belong in several tables with rules and prose. ingest_preview reads text or a folder of .md files and shows what it would record; nothing is written until the user agrees and ingest_apply writes exactly that preview as one batch, which ingest_revert takes back (ADR-0017, ADR-0025).

- 2026-07-30 가상바이오 1회차 3주 12,340원 매수 — 수출 반등이 근거   -> trade + decision (siblings, one chunk)
- 2026-07-30 가상바이오 1회차 3주 12,340원 매수   (again, elsewhere)  -> the same trade: one record, two spans
- 2026-09-03 샘플전자 … 5,200원 매도 / … 5,300원 매도                  -> conflict: asked, never picked
매수는 세 번에 나눠서 한다.                                            -> not data: kept as a line reference only
| 2026-09-01 | 72.4 |  (a weight table)                              -> new series type, proposed with its schema
  • Every stored value carries a quote from the note, and code checks that the value comes from it (numbers, dates, enum labels, text); values without evidence are dropped and listed. References are linked only on a certain match; an unknown name is asked about. New entity types become draft types (approved later, ADR-0021).

  • Evaluation on fictional, labelled notes (bench/ingest_eval.py). Unseen (3 files, 25 chunks, written by someone who did not see the code, run once): classification 25/25 for both models, field precision/recall 24/24 (M-haiku) and 23/23, 23/24 (M-opus), values not in the source 0, wrong merges 0, siblings 1/1, conflicts 1/1; new-type kind 1/2 for both (a workout log read as a series) (report).

Benchmark (v3, latest)

Measured on the frozen version 2c56c658bc5f10f9 (v1.1). v1.2 (names of referenced records in answers, unknown dates and event-time precision — ADR-0013, a benchmark formatter fix) came from using Mnemento on real records afterwards and is not re-measured; v1.3 (store first, organize later — ADR-0014) was only checked with a regression run on dev questions. Later changes (task 0008) are checked the same way. In its step 2 the benchmark converter for Mnemento's answers was fixed — an average question answered with extra count measures was recorded as the record count (it cost M-haiku two of the D5 misses at 1,000 records below). The fix changes the frozen hash; the scores below stay as measured. Same fictional job-search history rendered three ways (ADR-0011), the same answer-format hint for every system, evaluation set v3 (own seed; reference date Monday 2027-02-01 so weeks and month ends matter), 28 dev questions + 9 unseen questions written by the directing agent before measuring, 3 repetitions, prompts and rules frozen (hash in the report). Claude Code memory = MEMORY.md index + one markdown file per record, searched with Grep/Read.

records

system

dev ¹

unseen

time / question, mean (p95)

input tokens / question

API-equivalent cost / question

100

Mnemento · opus

84/84

27/27

5.9 s (9 s)

6.1k

$0.025

100

Claude Code memory · opus

77/84

27/27

14.8 s (24 s)

36.9k

$0.058

100

Mnemento · haiku

76/84

24/27

26.2 s (75 s)

5.1k

$0.025

100

Claude Code memory · haiku

63/84

19/27

42.4 s (97 s)

61.0k

$0.050

1,000

Mnemento · opus

79/84

24/27

5.8 s (10 s)

6.2k

$0.025

1,000

Claude Code memory · opus

74/84

24/27

35.6 s (127 s)

123.3k

$0.205

1,000

Mnemento · haiku

72/84

24/27

24.8 s (67 s)

5.2k

$0.024

1,000

Claude Code memory · haiku

39/84

10/27

77.0 s (224 s)

454.0k

$0.149

¹ The dev questions were used while fixing Mnemento (v1, v1.1); an advantage on them may be overfitting. Compare on the unseen column.

  • Accuracy on unseen questions: on par with Claude Code's own memory on opus (100 records 27/27 = 27/27; 1,000 records 24/27 = 24/27). On haiku, Mnemento is clearly ahead (24 vs 19 of 27 at 100 records, 24 vs 10 at 1,000), and Claude Code memory on haiku falls apart as records grow (unseen 70% → 37%).

  • Cost and speed at 1,000 records: 6× faster, 1/20 of the input tokens, 1/8 of the cost. Claude Code memory got slower and more expensive as records grew (2.4× the time, 3.6× the cost from 100 to 1,000); Mnemento stayed flat.

  • Every question, every system, with a one-line reason for each miss: results by question · raw data: report · results.

Limitations (current)

  • Elapsed-time filters are not expressible ("viewed more than three days after applying", W5): QuerySpec v1.1 can average the time between two events but cannot filter on it. Haiku said so (clarify); opus found a workaround that happened to hit an accepted reading at 100 records and failed at 1,000.

  • Vague criteria ("quickly viewed", D5) make the haiku interpreter ask back instead of choosing a default.

  • Both are addressed after this measurement (ADR-0018: an elapsed condition, and default readings for vague words shown as warnings). W5 prompted the change, so its score here cannot show the gain; that needs new unseen questions, which have not been measured yet.

  • A harness formatter bug cost Mnemento D3 at 1,000 records: it answered "187 records, showing 50", the benchmark recorded 50 because the plan carried limit: 50 from the format hint. Scored as measured.

  • One fictional domain and generator, 37 questions, 3 repetitions, a format hint that tells every system the expected answer shape; the format hint is not how people ask. API-equivalent cost = list price reported by the CLI (the runs used a Claude subscription, not an API key).

Benchmark history — v2 (haiku vs opus at 100 records)

After v1 (history-aware reached filter, having, ordering by event time), a fairer harness: the same answer-format hint for every system, a new evaluation set (seed and date different from v0; company aliases unique, ~30% of records written under the alias), 20 dev questions + 9 unseen questions written by the directing agent, 3 repetitions, 100 records. Claude Code memory (B1) and Mnemento (M) each on haiku (claude-haiku-4-5) and opus (claude-opus-5-5):

system

dev (20 × 3)

unseen (9 × 3)

total

time / question, mean (p95)

input tokens / question

API-equivalent cost / question

M-haiku

45/60

19/27

64/87 (74%)

22.3 s (63 s)

4.7k

$0.022

M-opus

53/60

22/27

75/87 (86%)

6.2 s (11.5 s)

5.7k

$0.024

B1-haiku

36/60

18/27

54/87 (62%)

44.8 s (124 s)

59.3k

$0.051

B1-opus

56/60

27/27

83/87 (95%)

15.9 s (28 s)

34.6k

$0.059

  • With opus, Claude Code's own memory was more accurate at 100 records: B1-opus 83/87 > M-opus 75/87. Mnemento answered 2.6× faster with 1/6 of the input tokens and ~40% of the cost.

  • With haiku, Mnemento was ahead (64 vs 54 of 87) at half the cost.

  • Mnemento's gap is concentrated in five questions where its interpreter fails the same way on both models (event kinds without Korean labels, schema selection missing the referencing record type, ordering by a date field instead of event time, "last week of a month", and a formatter bug for event counts) — being fixed in task 0005 and re-measured on a fresh evaluation set (v3) with new unseen questions.

Raw data: report · results. API-equivalent cost = list price reported by the CLI; the runs used a Claude subscription, not an API key.

Benchmark history — v0 (first, reduced, haiku only)

Does a structured record book beat an LLM's own memory? Same fictional job-search history, same questions, same model (haiku via the Claude Code CLI), three ways of remembering:

  • B0 full context — every memory file in the prompt

  • B1 Claude Code memory — MEMORY.md index (first 200 lines loaded) + one markdown file per record, searched with Grep/Read

  • M Mnemento — interpret → QuerySpec → SQL → template answer

Accuracy, time and input tokens per question by number of records

records

system

correct (12 questions × 3)

time / question, mean (p95)

input tokens / question

list cost / question

100

B0 full context

23/36 (64%)

35.7 s (106 s)

24.9k

$0.029

100

B1 Claude Code memory

28/36 (78%)

55.2 s (151 s)

84.5k

$0.063

100

M Mnemento

23/36 (64%)

15.2 s (42 s)

3.7k

$0.016

1,000

B0

not measurable — prompt exceeds the 200k context

1,000

B1 Claude Code memory

18/36 (50%)

82.8 s (224 s)

510k

$0.159

1,000

M Mnemento

24/36 (67%)

16.3 s (41 s)

4.0k

$0.017

10,000

B1 Claude Code memory ¹

5/12 (42%)

83.0 s (195 s)

342k

$0.127

10,000

M Mnemento

22/36 (61%)

14.9 s (39 s)

3.9k

$0.016

¹ one repetition only (approved separately for cost). Times include ≈2 s of CLI process start per LLM call for every system; input tokens include the CLI's fixed ≈2.5k (≈6.7k with tools) per call. Values without that overhead, the dev/unseen split and every raw answer: report · notes & limitations · method: ADR-0008, ADR-0011.

Reading it honestly

  • Small data: Claude Code's own memory was more accurate (28 vs 23 of 36 at 100 records). Mnemento was 3.6× faster and used ~1/23 of the input tokens.

  • As records grow, Mnemento's time and tokens stay flat (≈15 s, ≈4k tokens at 100, 1,000 and 10,000) while file search gets slower, more expensive and less accurate (B1: 78% → 50% → 42%).

  • Mnemento's misses are mostly fixable gaps, tracked for v1 (task 0004): it reads "was viewed" as the current status (H2), and QuerySpec v0 cannot filter on group size or sort by event time (H3, H4).

Limitations of this measurement

  • Reduced: 12 of 20 questions (first four of each set: dev D1–D4, unseen U1–U4, independently written H1–H4), 3 repetitions, narration variant only at 100 records; one model (haiku).

  • Harness bias on D4: B0/B1 get an answer-format hint ("value = share viewed"); Mnemento gets only the question and read it as time to view. All three systems missed D4.

  • Generator flaw at 10,000 records: English aliases are drawn from a small pool, so several companies share one (U2). Mnemento asked back instead of guessing (graded wrong); B1 merged them (also wrong).

  • Answer keys come from the generator's ground truth, never from Mnemento; prompts and rules were frozen (hash in the report) before measuring and not changed during it.

Install as an MCP server (Claude Code)

Requires uv and Python 3.11+.

git clone https://github.com/reddol18/mnemento.git
claude mcp add mnemento -e MNEMENTO_DB="$HOME/.mnemento/mnemento.db" -- uv --directory /path/to/mnemento run mnemento-mcp

Tools: query, record, record_series, revert_series_batch, get_entity, history, list_schemas, propose_schema, apply_schema_proposal, query_log, purge_query_log. Natural-language interpretation uses the Claude Code CLI you are already logged into (MNEMENTO_LLM=claude-cli, default model haiku; set MNEMENTO_MODEL to change). With MNEMENTO_LLM=none only the fast path and structured QuerySpecs are answered.

For Claude Desktop, add the same command to claude_desktop_config.json:

{ "mcpServers": { "mnemento": {
    "command": "uv", "args": ["--directory", "/path/to/mnemento", "run", "mnemento-mcp"],
    "env": { "MNEMENTO_DB": "/path/to/mnemento.db" } } } }

Development

uv sync
uv run pytest                              # unit tests (no network, LLM is a scripted fake)
uv run python examples/demo_queries.py     # real LLM calls via the claude CLI, writes docs/demo/

Layout: src/mnemento/ — storage/ (SQLite, WAL, append-only events), schema/ (dictionary + JSON Schema validation), ledger.py (record/replay API), keeper/ (query pipeline, record tool, identity resolution, schema proposals, LLM adapters), mcp_server.py. Domain schemas live in schemas/. All example data is fictional.


한국어

LLM 에이전트는 세션이 끝나면 잊습니다. Mnemento는 여러 에이전트가 사실을 한 장부에 기록하고, 자연어로 물으면 정확한 조건 질의로, 근거와 함께 답하게 해 주는 기록 관리 에이전트입니다.

  • 질문 처리: ① 해석(정형 질문은 LLM 없이, 나머지는 LLM이 스키마 사전만 보고 QuerySpec 작성) → ② 질의(코드가 SQL 생성, LLM은 SQL을 쓰지 않음) → ③ 답변(근거 id 목록 + 표본 수·미완료 기간·결과 미확정 경고).

  • 기록: 형식이 맞는 입력은 코드로 바로 검증·저장, 자유 서술은 LLM이 구조화한 뒤 같은 검증을 거칩니다. 대상이 여럿이거나 모르는 회사면 저장하지 않고 되묻습니다. 새 종류의 기록은 에이전트가 제안 스키마(schema_draft)와 함께 record하면 draft 종류로 바로 저장·조회되고, 사용자 승인(apply_schema_proposal) 뒤에 필수·enum·색인이 적용됩니다. 기존 종류와 이름이 비슷하면 먼저 묻습니다(ADR-0021). 사용자가 정리한 종류에는 저장소의 사전 개선이 자동으로 들어가지 않고, 항목별로 승인받는 제안으로 옵니다(ADR-0023).

  • 동일 회사 판정: 사업자번호 → 정규화 이름·별칭. 비슷한 이름은 후보로만 제시하고 자동 병합하지 않습니다.

  • 계측: 질문마다 단계별 시간, LLM 호출 수, 입력·출력 토큰, 비용을 기록합니다.

  • 조회 로그: 모든 질문을 로컬 DB에 남깁니다(질문, 해석, QuerySpec, SQL과 파라미터, 결과 수, 근거 id, 경고, 시간, 비용). query_log 도구로 최근 질문, 경고·오류가 붙은 질문, 같은 질문인데 SQL이 달라진 것(diverging), 0건으로 끝난 답(empty)을 볼 수 있습니다. 기록에 없는 id로 거르는 해석은 0건으로 답하지 않고 원본 key·이름으로 읽거나 되묻고, 0건으로 끝난 해석은 캐시하지 않습니다(ADR-0020). 최대 10,000행 또는 50MB, MNEMENTO_QUERY_LOG=off로 끕니다(ADR-0015).

  • 두 번째 도메인(투자 기록, 가상 예시): 질의 코드는 그대로 두고 스키마만 더해 투자 기록(종목·체결·판단)을 담습니다(examples/investment). 질문에 종목 코드·사업자번호 같은 식별자가 있으면 그것으로 먼저 찾습니다(ADR-0019). 스키마 간 관계 설명으로 같은 사건을 두 번 세지 않습니다. mnemento.importer로 다른 곳에 두는 파일을 여러 번 가져와도 안전합니다(바뀐 사실은 정정, 바뀐 상태는 원본 날짜의 갱신, 사라진 기록은 보고만). 작성자의 실제 투자 기록으로 로컬에서 쓰고 있으며, 그 데이터는 저장소에 없습니다.

  • 벤치마크(v3, 최신): opus 기준으로 개발에 쓰지 않은 문항의 정확도는 Claude Code 자체 메모리와 같다(100건 27/27 동률, 1,000건 24/27 동률). 1,000건에서는 6배 빠르고 비용은 1/8이다. 개발 문항에서 앞선 부분은 그 문항으로 고쳤기 때문에 과적합일 수 있다. 남은 약점은 경과 시간 조건 필터를 표현할 수 없다는 점과 모호한 기준이다(측정 이후 ADR-0018로 보완. W5가 계기였으므로 개선 효과는 새 미노출 문항으로 측정해야 하며, 아직 측정하지 않았다). 문항별 결과는 여기.

  • 이력 — 벤치마크(v2, 100건, 같은 형식 힌트, haiku·opus 2×2): opus 기준으로는 Claude Code 자체 메모리가 더 정확했다(B1-opus 83/87 > M-opus 75/87). Mnemento는 2.6배 빠르고 입력 토큰은 1/6이었다. haiku 기준으로는 Mnemento가 앞섰다(64 대 54/87). Mnemento의 약점 5가지는 작업 0005에서 고친 뒤 새 평가셋(v3)으로 다시 잰다.

  • 이력 — 벤치마크(v0, 축소 측정: 12/20문항·3회 반복·haiku 한 모델):

    • 기록 100건에서는 Claude Code 자체 메모리(B1)가 더 정확했다(28 대 23/36). 대신 Mnemento가 3.6배 빠르고 입력 토큰은 약 1/23이었다.

    • 기록이 1,000·10,000건으로 늘어도 Mnemento는 문항당 약 15초·약 4천 토큰으로 일정했다. 반면 파일 검색 방식은 느려지고 비싸지면서 정확도도 떨어졌다(78% → 50% → 42%, 10,000건은 1회 측정).

    • 한계: D4는 형식 힌트가 B0·B1에만 주어진 하네스 편향이 있다. 10,000건에서는 생성기 별칭이 중복된다. 자세한 내용은 위 표와 결과 노트에 있다.

설치(Claude Code): 위 claude mcp add ... 한 줄. 개발: uv sync && uv run pytest. 현재 상태: v1.3(벤치마크 3회는 v1.1 기준). v1.2는 실제 기록으로 써 보며 나온 개선(답에 회사명 표시, 날짜·시각 정밀도)이고, v1.3은 "먼저 저장하고 나중에 정리"(스키마에 없는 필드·값도 저장하고 바로 조회, 정리는 사용자 승인)이다. v1.3은 회귀 측정만 했다. 이후 변경(작업 0008)도 회귀로만 확인하며, 그 ② 단계에서 벤치 답 변환기의 결함(평균을 묻는 질문에 개수 측정값이 함께 있으면 레코드 수를 기록)을 고쳤다. 이 결함 때문에 위 v3 표의 1,000건 M-haiku D5 오답 중 2건이 생겼다. frozen hash는 바뀌었고, 표의 점수는 측정한 그대로 둔다. 기획서는 docs/PLAN.md, 설계 결정은 docs/adr/.

License: MIT

Available Tools

14 tools
apply_schema_proposalA

Organize unregistered (draft) fields and values, register a new record type (proposal id type_...), or take the repository's dictionary improvements into an organized type (dict_...) — ONLY with the user's explicit consent.

    Never call this on your own initiative. First show the user the proposal from propose_schema (its
    `question`), ask whether to apply it, and call this only after they answer yes. Pass who approved
    (approved_by) and the user's own words (user_answer); both are kept in the schema history.
    descriptions: {field: description} for every field being registered (required).
    labels: {field: {value: [natural-language names]}} for every new enum value (required, e.g.
    {"platform": {"remember": ["리멤버"]}}).
    merges: {draft_field: target_field} to fold look-alike names together (values move with history kept).
    index: fields to index. type_description: a new type's description, if its proposal has none.
    items (dict_... only): the item keys the user picked; default: the proposal's additive items. Items left out
    are not offered again for the same file.
    The data itself was already stored when it was written; this only organizes it.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo
itemsNo
labelsNo
mergesNo
approved_byYes
proposal_idYes
user_answerYes
descriptionsNo
type_descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the hard consent requirement, that approved_by/user_answer are persisted in schema history, that merges keep history while moving values, that omitted items are not re-offered, and that the data was already stored so this only organizes it. It does not cover failure/reversibility behavior on partial application, so not a full 5.

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?

Long but well front-loaded: the consent precondition and the three core operations come first, followed by per-parameter semantics. Sentences are dense but each carries distinct information, with only minor redundancy between the opening list and the later parameter notes.

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 9-parameter, no-annotation mutation tool with an output schema (so return values need not be explained), the description covers purpose, gating, sequence, and per-parameter meaning adequately. A little more on partial-apply or rollback behavior would make it fully self-sufficient.

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 0%, so the description must compensate, and it defines the semantics of nearly every parameter: approved_by (who approved), user_answer (user's own words), descriptions/labels/merges shapes with examples, index, type_description, and items including its default behavior. Only proposal_id is left implicit (its meaning is obvious from the surrounding 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?

States specific verbs and resources: organize draft fields/values, register a new record type (type_...), or consolidate dictionary improvements into a dict_... type. It also names the relationship to the sibling propose_schema by casting itself as the applier of that proposal, letting an agent distinguish 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?

Explicitly states when NOT to act ('Never call this on your own initiative') and the required sequence: show the propose_schema question, ask the user, call only after a yes. It names the alternative tool and the consent condition that gates use, leaving nothing to inference.

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

get_entityC

Current state of one record (after corrections/retractions).

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose one meaningful trait — the returned state already reflects corrections/retractions — but says nothing about authentication, error behavior for unknown IDs, or read cost/rate limits.

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 front-loaded fragment with no wasted words. It is efficient, though its brevity edges into under-specification rather than optimal concision.

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?

An output schema exists, so return-value explanation is not required, and the tool is simple with one parameter. However, in a crowded sibling namespace the description omits any routing signal that would let an agent distinguish it from query or history, leaving a real contextual gap.

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

Parameters2/5

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

Schema description coverage is 0%, so the schema provides no explanation of entity_id. The description mentions 'one record' but never explains the identifier's form or origin, adding essentially no meaning beyond the parameter name.

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

Purpose3/5

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

The fragment 'Current state of one record' communicates the resource but supplies no action verb and no sibling differentiation. With 13 siblings including query, history, and record, an agent cannot easily tell why it would call get_entity over those alternatives. Purpose is inferable but vague.

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 when-to-use, when-not-to-use, prerequisites, or alternative tools are stated. The parenthetical about corrections/retractions hints at timing but provides no selection guidance against siblings like query or history.

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

historyB

Every event of one record, including corrections and retractions, in recording order.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full disclosure burden. It does add real behavioral value: completeness (ALL events, including corrections and retractions) and deterministic ordering by recording time. However, it says nothing about behavior when entity_id does not exist, or about result size limits for long-lived records.

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?

A single front-loaded sentence with no filler. The ordering guarantee and the inclusion of corrections/retractions are packed into the same clause that identifies the resource.

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?

An output schema exists, so return values need not be explained, and a one-parameter read tool is simple. Still, the description omits the parameter's meaning and any failure behavior, leaving just enough gaps that an agent must infer how to call it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, and it does not. 'One record' hints that a record must be identified, but entity_id is never named or explained, so an agent gets no confirmation that the parameter is the record identifier rather than, say, an event or series id.

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?

The description makes the resource and return content concrete: 'Every event of one record, including corrections and retractions, in recording order.' This distinguishes it in substance from get_entity (current state) and query_log (query traffic), though it never explicitly names a sibling. The verb is implied rather than stated, keeping it short of a 5.

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?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as get_entity for current state or query_log for other history types. The audit-trail purpose is inferable but never stated as a condition for selection.

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

ingest_applyB

Write exactly one preview as one ingest batch — ONLY after the user agreed to that preview. New entity types become draft types (approve them later with apply_schema_proposal). Returns batch_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
preview_idYes
approved_byYes
user_answerYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the user-agreement gate, the draft-type side effect, and the returned batch_id, but says nothing about permissions (approved_by format), idempotency, or whether a second apply on the same preview is rejected.

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?

Front-loaded with the verb and the gating constraint; the parenthetical and sibling pointer are compact. Every sentence earns its place, minor cost from the em-dash clause.

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?

An output schema exists, so return-value detail is not required, yet the description leaves all three required parameters undefined on a mutation tool with zero annotations. The workflow gate is covered but the call contract is not.

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

Parameters2/5

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

Schema description coverage is 0% and the description never explains preview_id, approved_by, or user_answer — including the free-form format of user_answer, which is the sort of value that will be guessed wrong. The description does not compensate for the schema gap.

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: write one preview as one ingest batch, and names the return value (batch_id). It implicitly distinguishes itself from ingest_preview/ingest_revert by the word 'apply', though it never names those siblings directly.

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?

Gives a hard precondition — ONLY after the user agreed to that preview — and routes the follow-up case (new entity types) to apply_schema_proposal. No explicit when-not guidance relative to ingest_preview or ingest_revert, but the gating condition is unusually clear.

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

ingest_previewA

Turn notes that mix facts with rules and prose (e.g. a memory folder) into records — PREVIEW ONLY, nothing is written. Give text, or path (a file, or a folder of .md/.txt files; exclude skips file names). The preview lists, per chunk, whether it holds data; the records found (each value checked against a quote from the text — values without evidence are dropped and listed); facts repeated in several places merged; conflicting repeats; facts already recorded; new record types with a suggested schema; and the chunks kept only as notes. Show the user summary, the ambiguous list and the conflicts, then ingest_apply with their answer. Costs LLM calls (about one per 15 chunks per stage).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
textNo
sourceNotext
excludeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it declares the tool writes nothing, discloses LLM cost (~one call per 15 chunks per stage), and explains internal behavior — evidence-checking that drops unevidenced values, merging of repeated facts, and conflict detection. This is unusually rich disclosure beyond a bare verb.

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?

The preview-only constraint and input options are front-loaded, and every clause carries information (return contents, cost, next step). It is dense and long, but no sentence is filler — slightly heavy for a single paragraph.

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?

An output schema exists, so return values need not be re-explained; the description instead supplies exactly the missing context — safety (no writes), cost, input modes, and the handoff to ingest_apply. Nothing needed to call it correctly is absent apart from `source`.

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 0%, so the description must compensate. It covers text, path (file vs folder, .md/.txt), and exclude (skips file names), but never explains the `source` parameter (default 'text'), leaving one of four params undocumented.

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: turning mixed facts/rules/prose notes into records, with an explicit 'PREVIEW ONLY, nothing is written' scope. It clearly distinguishes itself from ingest_apply, which it names directly.

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 how to supply input ('Give text, or path — a file or folder of .md/.txt files; exclude skips file names') and prescribes the workflow: show the user summary/ambiguous/conflicts, then call ingest_apply with their answer. The alternative tool and the condition selecting it are named, not inferred.

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

ingest_revertA

Undo one ingest batch: its records are retracted (history kept) and its series points reverted. Only when the user asks.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the key mutation semantics: records are retracted but 'history kept', and series points are reverted — a meaningful reversibility/side-effect statement. It omits permissions required, whether the revert is itself undoable, and error behavior for an already-reverted or unknown batch.

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, effect described first and the usage gate second, with no filler. Every clause adds information.

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?

Complexity is low (one parameter) and an output schema exists, so return values need no explanation. The effect, reversibility nuance, and usage gate are covered; only permissions and failure modes are missing for a destructive operation.

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?

One required parameter (batch_id) with 0% schema description coverage, so the schema contributes nothing. The description implies the batch is the unit of operation ('one ingest batch') but never explains where batch_id comes from or its format; baseline 3 for a self-evident identifier the description only implicitly covers.

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?

The description states a specific verb and resource ('Undo one ingest batch') and immediately names the concrete effects: records retracted, series points reverted. It is clear what the tool does, though it never distinguishes itself from the near-identical sibling revert_series_batch, so the agent must guess which scope applies.

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?

'Only when the user asks' is an explicit, unusually strong usage gate that tells the agent this is a user-initiated, not autonomous, action. It stops short of naming alternatives (ingest_apply, ingest_preview, revert_series_batch) or when-not conditions beyond that single gate.

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

list_schemasB

Record types with their fields, descriptions and allowed values, plus drafts (unregistered fields and values already in use) and the history of organize approvals.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It usefully discloses non-obvious content traits (unregistered fields/values already in use, approval history), but it says nothing about read-only nature, scope, filtering behavior, pagination, or permissions.

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 dense sentence with no filler, front-loaded on the primary content (record types and fields). It is slightly run-on when enumerating drafts and approval history, but nothing is wasted.

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?

Because an output schema exists, return values need not be spelled out, yet the description reasonably previews the payload shape. However, for a tool whose only input is undocumented, the definition is not complete enough to call confidently without opening the schema.

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

Parameters2/5

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

The single parameter 'name' has 0% schema description coverage and is never mentioned in the description, so its purpose (presumably filtering by record type) is unexplained. The description does not compensate for the coverage gap, leaving the only input ambiguous.

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?

The description names a specific resource — record types (schemas) — and enumerates what comes back: fields, descriptions, allowed values, drafts, and organize-approval history. An agent can tell this is a read of schema definitions, but it never states an explicit verb and offers no differentiation from nearby tools like propose_schema or apply_schema_proposal.

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?

There is no statement of when to call this versus alternatives such as propose_schema, apply_schema_proposal, or query. The description only characterizes the payload, leaving the agent to infer that this is the inspection counterpart to the proposal tools.

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

propose_schemaA

Schema proposals (never applied automatically).

    Without samples: how to organize drafts — fields and enum values that records already use but the
    dictionary has not registered (they are stored and queryable; organizing adds descriptions, labels,
    indexes, and merges look-alike names). Ask the user before apply_schema_proposal.
    With samples and a new entity_type: a first schema draft for a new kind of record.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
samplesNo
entity_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does fairly well: it signals the operation is non-destructive ('never applied automatically'), clarifies that the fields/enums already exist and are 'stored and queryable' so nothing is lost, and explains what organizing actually does (adds descriptions, labels, indexes, merges look-alike names). It does not mention permissions or rate limits, but the safety-relevant behavior is well disclosed.

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?

The key constraint ('never applied automatically') is front-loaded, followed by the two modes in parallel structure. It is dense but every sentence contributes; the phrasing 'how to organize drafts' is slightly loose but does not waste space.

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?

An output schema exists, so return values need not be explained. For a two-parameter, fully optional proposal tool, the description covers both invocation modes, the non-persistent nature, and the handoff to apply_schema_proposal, leaving little an agent would need to infer.

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 0% and neither parameter has an inline description, so the description must compensate. It does: 'samples' is tied to the 'with samples and a new entity_type' mode and 'entity_type' is named as the key for a new record kind, giving each parameter a distinct role rather than leaving them opaque.

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 (propose) and resource (schema), and immediately distinguishes itself from the sibling apply_schema_proposal with '(never applied automatically)'. It also spells out the two operating modes (organize existing unregistered fields vs. draft a schema for a new entity_type), so an agent can tell what it will produce.

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?

Gives a clear mode-selection rule: 'Without samples' = organize drafts, 'With samples and a new entity_type' = first draft for a new record kind. It also routes correctly by instructing 'Ask the user before apply_schema_proposal.' It lacks an explicit 'when NOT to use' beyond this handoff, but the context is clear.

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

purge_query_logA

Delete query log entries asked before before (ISO 8601), or all of them when omitted. Only when the user asks for it. Recorded facts are not touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
beforeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose the destruction scope (entries before the timestamp, or everything when omitted) and a confirmation requirement ('Only when the user asks for it'). It also bounds the blast radius ('Recorded facts are not touched'). It stops short of stating irreversibility or any permission requirements.

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 short sentences, front-loaded with the action and parameter semantics, followed by the safety constraint and scope boundary. No filler; every clause contributes.

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?

An output schema exists, so return values need no explanation, and the single parameter plus the no-argument case are both covered. The remaining gap for a destructive, annotation-free tool is whether the purge is recoverable, which the description does not address.

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 0% — the schema only says `before` is a nullable string defaulting to null. The description compensates by naming the ISO 8601 format and, importantly, the default semantics: omitting it deletes all entries. That is meaning the schema does not convey.

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 (delete query log entries) plus the scoping rule (before `before`, or all when omitted). It implicitly separates itself from the data-recording siblings by noting 'Recorded facts are not touched', though it never names `query_log` or another alternative directly.

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?

'Only when the user asks for it' gives a clear consent guardrail, which is real usage guidance for a destructive tool. However, it does not say when to prefer this over `query_log` inspection, `history`, or a revert path, so routing between siblings is left to inference.

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

queryC

Answer a question from the record book with evidence.

    question: natural-language question (e.g. "10/2 사람인 지원 몇 곳?").
    spec: optional structured QuerySpec; when given, no LLM is used.
    narrate: also write a prose answer with the LLM (it only sees aggregates).
    by: your agent name (optional; kept in the local query log).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
byNo
specNo
narrateNo
questionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does add genuine value beyond structured fields: narrate's LLM 'only sees aggregates', spec means 'no LLM is used', and 'by' is persisted in the local query log. It stops short of stating read-only scope, auth, error behavior, or what 'evidence' actually contains.

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?

Front-loaded with a one-line purpose, followed by a compact per-parameter list with no filler. Slightly dense formatting (inline indented param notes) but every line earns its place.

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?

An output schema exists, so return values are covered and need not be explained. With no annotations, the description should carry the behavioral and routing load, but it omits sibling differentiation and the QuerySpec structure, leaving meaningful gaps for a 4-parameter 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 description coverage is 0%, so the description must compensate; it does explain question, narrate, and by meaningfully (though 'by' restates the schema default). The critical 'spec' parameter is only described as 'optional structured QuerySpec' with no shape or pointer to list_schemas, leaving the agent unable to construct it.

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

Purpose3/5

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

The description states a recognizable action ('Answer a question') against a resource ('the record book') and flags that evidence is returned. However, 'record book' is undefined domain jargon, and the definition never distinguishes this from siblings like query_log, history, or get_entity, so an agent cannot cleanly route between them.

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?

There is no explicit when-to-use/when-not-to-use guidance relative to query_log, history, or get_entity. The only implied usage signal is the spec conditional (structured spec bypasses the LLM), which is a behavioral note rather than routing guidance.

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

query_logA

Look back at earlier questions: interpretation, QuerySpec, SQL and parameters, result count, evidence ids, warnings, stage times, tokens and cost.

    view: recent (last n) | warnings (answers that carried warnings) | errors |
          diverging (the same question pattern answered with different SQL — the interpretation moved) |
          path (only questions answered by `path`: fast | cache | llm | structured | entity | none) |
          empty (answers that found nothing — check whether the reading was wrong; with `path`, e.g.
          cache, only those).
    since: only entries asked at or after this time (ISO 8601).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nNo
pathNo
viewNorecent
sinceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It clearly signals a read/inspection operation by describing the logged fields returned, but never states the operation is read-only, what access it requires, or any retention/limit constraints. Adequate but not rich for a no-annotation tool.

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

Conciseness3/5

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

The purpose line is front-loaded, which is good, but the `view` block packs heavily nested parentheticals (e.g. 'empty ... with `path`, e.g. cache, only those') that require re-reading. Content mostly earns its place, but the structure is cramped.

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?

An output schema exists, so return values need not be explained (the field list is mildly redundant), and parameter meaning is well covered. The remaining gap is sibling disambiguation versus `history`/`purge_query_log` and an explicit read-only statement.

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 0%, so the description must compensate, and it largely does: it enumerates `view` modes, gives the enum-like values for `path` (fast | cache | llm | structured | entity | none), defines `since` as ISO 8601, and conveys `n` via 'recent (last n)'. Only the interaction between views and `path` is described densely rather than fully.

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?

The description states a specific resource (earlier questions / the query log) and enumerates the fields returned (interpretation, QuerySpec, SQL, result count, evidence ids, warnings, tokens, cost), so an agent can tell it inspects past query records. It stops short of differentiating itself from the sibling `history`, which likely covers overlapping ground.

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?

Each `view` value carries context on when to pick it (e.g. `empty` = 'answers that found nothing — check whether the reading was wrong', `diverging` = 'the same question pattern answered with different SQL'). This gives real selection guidance, but no explicit when-not or named alternative tool.

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

recordA

Record a fact. Either structured or free text.

    Structured: entity_type + kind (created | updated | status_changed | corrected | retracted)
    + payload, and the target by entity_id or match (field values, e.g. {"platform": "saramin",
    "posting_id": "10000001"}). Reference fields may hold a name (e.g. a company name).
    Free text: text="사람인 10000001 가상테크 열람" — the Keeper structures it.
    at: when it happened (ISO 8601 with offset); defaults to now. at_precision: time | date (only the
    day is known) | unknown. by: your agent name.
    evidence: why you believe it (quote, mail subject...).
    Fields or values the dictionary does not know are stored as given (drafts, queryable at once); the
    reply lists them under `drafts` and may ask under `questions` whether a new name means an existing one.
    New kind of record (entity_type not in list_schemas, kind created): it is stored at once under a new draft
    type. Send schema_draft with it — the schema you suggest: {"description", "keywords", "fields": {name:
    {"type", "description", "enum", "labels", "required", "indexed", "format"}}}; you know best what each field
    means now. The reply carries a proposal under `proposals`: ask the user, and on their yes call
    apply_schema_proposal. If the name looks like an existing type you are asked first (new_type=true confirms).
    Returns status:
      recorded — stored (check `drafts` and `questions`);
      clarify  — nothing stored: the target is ambiguous (several matches), a referenced name (e.g. a
                 company) is unknown or only similar, the record looks like a duplicate, or it contradicts
                 the current state; ask the user and call again;
      rejected — nothing stored: a registered field is violated (required field missing, wrong type, bad
                 date) or the target was looked up by an unregistered field;
      error    — free text could not be structured (no LLM configured or the call failed).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
atNo
byYes
kindNo
textNo
matchNo
payloadNo
evidenceNo
new_typeNo
entity_idNo
entity_typeNo
at_precisionNotime
schema_draftNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it enumerates all four status outcomes (recorded/clarify/rejected/error) and states precisely what is and isn't stored in each, plus side effects like drafts, questions, and proposals. That is exactly the mutation/side-effect disclosure an agent needs before calling.

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?

The content is dense and each block (modes, drafting, status codes) earns its place, and the core purpose is front-loaded. The formatting is somewhat run-on and the nested parentheticals make it harder to scan than it needs to be.

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 12-parameter tool with zero schema descriptions and no annotations, this is about as complete as a description can be: input modes, edge cases, draft/proposal workflow, and the full status taxonomy are all covered. The output schema exists, so return-shape detail is appropriately not duplicated.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it documents entity_type, kind (with its five enum values), payload, entity_id, match (with an example), text, at (ISO 8601 with offset), at_precision (time|date|unknown), by, evidence, new_type, and even the schema_draft shape. Nearly every one of the 12 parameters gains meaning absent from the schema.

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?

The opening 'Record a fact. Either structured or free text.' states a specific verb and resource, and the two modes are laid out precisely. It references siblings (list_schemas, apply_schema_proposal) but never contrasts itself with record_series, the closest sibling, so the differentiation is good but not complete.

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?

Strong conditional guidance: structured vs free-text input, when to send schema_draft, when the reply produces a proposal, and to call apply_schema_proposal on user confirmation. It also tells the agent to ask the user and re-call on 'clarify'. What's missing is any explicit when-not-to-use or alternative-tool routing.

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

record_seriesA

Record measurements over time for a series type (list_schemas shows kind "series", its key fields, time field and measures), e.g. [{"person": "A", "measured_on": "2026-07-01", "kg": 70.2}].

    One call = one batch, all or nothing: if any point is invalid nothing is stored and `rejected` says why.
    A point whose key and time are already stored is updated (the batch keeps the previous values).
    source: where the values come from (file, app, "user said"). by: your agent name.
    Returns batch_id and counts (inserted / updated / unchanged); revert_series_batch(batch_id) undoes it.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
byYes
pointsYes
sourceYes
entity_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations the description carries the full burden and does well: it discloses transactional atomicity ('all or nothing', `rejected` reason on failure), upsert semantics for duplicate key+time including that previous values are kept for the batch, the meaning of the by/source provenance fields, and the batch_id/counts response with a reversal route. Gaps are permissions/auth requirements and any rate or size limits on a batch.

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?

Front-loaded with the verb and resource, then a worked example, then the batch semantics and return/undo behavior — minimal waste. The parenthetical around the example is slightly dense, but every sentence adds operative information.

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 four-parameter mutation tool with no annotations, the description covers the essentials: point shape, atomicity, upsert behavior, provenance fields, and the undo sibling. Since an output schema exists it need not restate return values, yet it still names batch_id and counts. Only authorization expectations are left unaddressed.

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

Parameters5/5

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

Schema coverage is 0% and every property is a bare title, so the description must compensate — and it does, defining `entity_type` via the series-type concept, `by` as the agent name, `source` as the value's origin (file, app, "user said"), and `points` through a concrete example showing key field, time field and measure. This effectively documents all four required parameters.

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 — record measurements over time for a 'series' type — and even defines what a series type is by pointing at list_schemas for its key fields, time field and measures. It is clearly distinct from the plain 'record' sibling in framing, though it never contrasts them explicitly.

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?

Gives a clear context of use (time-series measurements keyed by a series type) plus the prerequisite discovery step via list_schemas, and names revert_series_batch as the undo path. No explicit when-not-use condition or comparison against the 'record' sibling is offered.

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

revert_series_batchA

Undo a whole series batch: its new points are removed, updated points get their previous values. Refused when a later batch changed the same points (revert that one first). Only when the user asks.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the destructive effect (new points removed), the restorative effect (updated points get previous values), and a refusal condition dependent on batch ordering. It omits permissions/auth requirements and whether the revert itself can be undone, which keeps it from 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 short sentences, front-loaded with the core action, then the failure condition, then the usage gate. 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?

For a single-parameter mutation with an output schema (so return values need no explanation), the description covers effects, preconditions, and invocation policy. The main remaining gap is that `batch_id` provenance is never established, which matters for a tool whose whole input is that opaque id.

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

Parameters2/5

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

There is a single required parameter, `batch_id`, with 0% schema description coverage, and the description adds nothing about it — no format, no source (e.g., from a prior record_series call), no scope. The schema alone leaves the agent guessing what a valid batch id looks like.

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?

The description uses a specific verb ("Undo") plus resource ("a whole series batch") and then defines exactly what that means: new points removed, updated points restored to prior values. That is far more precise than a bare 'revert'. It does not, however, distinguish itself from the nearby sibling `ingest_revert`, which an agent could reasonably confuse with this tool.

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 an explicit when-to-use gate ("Only when the user asks") and a concrete precondition/refusal rule — if a later batch touched the same points the call is refused and you must revert that one first — which effectively points to an alternative action. It stops short of naming sibling tools or other alternatives, so there is no explicit tool-routing guidance.

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. 14 tool updatesv0.1.0
    • First observedapply_schema_proposal
    • First observedget_entity
    • First observedhistory
    • First observedingest_apply
    • First observedingest_preview
    • First observedingest_revert
    • First observedlist_schemas
    • First observedpropose_schema
    • First observedpurge_query_log
    • First observedquery
    • First observedquery_log
    • First observedrecord
    • First observedrecord_series
    • First observedrevert_series_batch

TDQS

A3.7/5.0

Scored across 14 tools

Disambiguation5/5

Each tool has a clearly distinct role: recording facts vs. series, querying vs. reading query logs, preview/apply/revert for ingest, and proposal vs. application for schemas. Overlaps are explicitly resolved in descriptions, so an agent can reliably select the intended tool.

Naming Consistency4/5

Almost all names use predictable snake_case with verb_noun or verb_noun_noun patterns (record_series, ingest_apply, apply_schema_proposal). A few single-word tools like query, record, and history deviate slightly but remain clear and consistent in style.

Tool Count5/5

14 tools are well within the sweet spot for a domain that spans recording, querying, ingestion, history, and schema management. Each tool earns its place with a specific operation, and there is no redundant surface area.

Completeness4/5

The surface covers record lifecycle through explicit kinds (created, updated, corrected, retracted), series batches with revert, ingest lifecycle, querying, history, and schema proposals. Minor gaps exist, such as no dedicated list-entities operation, but query and get_entity provide workarounds.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Gives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides persistent, searchable memory for Claude Code using local SQLite, semantic embeddings, and full-text search, enabling Claude to recall and retrieve context across sessions and projects without external services.
    17 npm
    4
    MIT