Agent memory in a single SQLite file — no vector DB, no server, no cloud. Keyword recall on stdlib alone; torch-free hybrid semantic search via model2vec + sqlite-vec. Python lib + MCP server + CLI.
agentrecall provides 6 tools with complete input schemas and descriptions. Naming follows verb_noun convention (remember, recall, forget, list_memories). Descriptions are present and contextual (avg ~100 chars), exceeding the 20-char minimum. However, parameter descriptions lack detail on constraints, formats, and error recovery. Output schemas are documented via return type hints but lack explicit field documentation. Error handling is minimal, no guidance on retryability, user-fixable vs fatal errors, or recovery paths. The server follows basic patterns but misses LLM-optimization details that would elevate it to 70+.
Delete a memory by id. Returns True if a row was removed.
Permanently delete memories whose TTL has elapsed. Returns how many went.
List the most recent memories.
Return counts and the active configuration.
Search stored memories; returns the most relevant first.
Store a new memory verbatim and return the stored record. Set ``ttl`` ("30d", "12h", "1h30m", or seconds) for facts that go stale — a temporary preference, a value that's only true for this session. The memory stops being recalled once the deadline passes.
Parameter descriptions lack constraint details. 'tags' is described as 'Optional list of tags' but does not specify max length, character restrictions, or format. 'importance' lacks range (0 - 1? 0 - 10?). 'ttl' format is documented in tool description but not in parameter description.
No error handling guidance. forget() returns bool but does not explain what False means (ID not found? Permission denied?). forget_expired() returns int but does not document what happens if purge fails. No recovery hints for LLM.
Output schemas not formally documented. Tools return dicts/lists but lack explicit field documentation. LLM cannot infer what fields 'to_dict()' produces or their types. recall() returns list[dict] but does not specify structure of each dict.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Destructive operations lack confirmation or dry-run. forget() and forget_expired() are irreversible but offer no confirmation step or preview. Agents cannot safely plan deletion without risk of accidental data loss.
recall() and list_memories() lack pagination guidance. No mention of result limits, next_cursor, or total_count. If memory store grows large, unbounded results could exhaust context window.