Persistent AI memory for LLMs and AI agents. Local-first memory system that learns from every interaction, with MCP (Model Context Protocol) support for Claude Code / VS Code / Claude Desktop.
Server has well-structured tool definitions with detailed descriptions and comprehensive input schemas. store_memory and query_memory are particularly strong, with canonical predicate guidance and clear usage examples embedded in descriptions. However, three tools (forget_memory, list_memories, memory_stats) have minimal descriptions (<50 chars) and empty input schemas, dragging the average down. No tool annotations (readOnlyHint/destructiveHint) are present despite clear risk classifications. Error handling guidance is absent, tools don't explain recovery paths when queries fail or memory IDs don't exist.
Delete a specific memory by ID.
List all stored memories organized by category.
Get memory statistics — total counts.
Search the user's memory. ALWAYS pass the natural-language question as `query`. If the question targets a specific attribute, ALSO pass `predicate_hint` (string or list) using the canonical predicates listed in store_memory. If asking about the user themselves, pass `subject_hint="user"`. Hints are boosts, not filters — wrong hints don't hide results, but right hints surface the answer instantly. Examples: query="what is my job?", predicate_hint=["job_title","works_at"], subject_hint="user" query="where does my sister live?", predicate_hint="lives_in" query="do I have any pets?", predicate_hint="pet", subject_hint="user"
Save a memory. ALWAYS pass the user's original text in `text`. If you can identify clear subject-predicate-object triples in the text, ALSO pass them in `facts` — this gives much better recall later than letting the local grammar parser guess. Use canonical predicates whenever possible: Identity: name, age, birthday, email, phone, nationality, native_language Location: lives_in, born_in, from Work: works_at, job_title, role, manages, reports_to Relations: partner, spouse, sister, brother, mother, father, child, friend, manager, colleague, neighbor, pet Preferences: likes, loves, dislikes, hates, prefers, favorite_* Activities: hobby, plays, drives, owns, learning, studied Health: allergic_to, on_medication, has_diagnosis Subject is usually "user" (the person speaking). For facts about other people, use their name ("Sarah", "my neighbor"). Example: text="I have a cat named Luna and I love climbing", facts=[{"subject":"user","predicate":"pet","object":"Luna"},{"subject":"user","predicate":"hobby","object":"climbing"}]
Three tools (forget_memory, list_memories, memory_stats) have empty input schemas with no properties defined.
forget_memory, list_memories, and memory_stats have descriptions under 50 characters ('Delete a specific memory by ID.', 'List all stored memories organized by category.', 'Get memory statistics, total counts.').
No tool annotations present. forget_memory is marked DESTRUCTIVE and list_memories/memory_stats are READ_ONLY in metadata, but destructiveHint and readOnlyHint are not declared in tool definitions. LLMs cannot infer safety properties without explicit annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
No error recovery guidance. Tools lack descriptions of failure modes and recovery paths. E.g., forget_memory doesn't explain what happens if memory_id doesn't exist; query_memory doesn't guide the LLM if no results match.
query_memory accepts predicate_hint as 'string or list' but description doesn't clarify when to use each form or how multiple predicates are combined (AND vs OR). Ambiguous parameter relationships.