Persistent memory for your AI that you actually own — local-first, shared across every MCP client, one command to install, a dashboard to see and edit everything. No cloud, no account, no API key.
Cairn demonstrates strong naming conventions (verb-first: remember, recall, update_memory, forget, list_memories, get_context, export_memories, import_memories) and comprehensive parameter descriptions. All 8 tools have detailed, LLM-optimized descriptions (100-250 chars) that explain WHEN to call them with concrete examples, a pattern:tool-description best practice. Input schemas are fully visible with type definitions and descriptions for all parameters. However, output schemas are not explicitly documented in the source code, responses are JSON-serialized but the structure is inferred from code (memoryToJson, hitToJson). Error handling is minimal; no recovery guidance or error categorization visible. Tool composition is excellent (each does one thing), and parameter naming is consistent (query/text aliases show forgiving design). Missing: explicit output schema documentation, error classification patterns, and destructive operation confirmation.
Export all memories to a .zip file on the user's machine. Call this to create a backup of Cairn's memory store, or to migrate memories to another system. The export is written to the Cairn home directory with a timestamp in the filename so repeated exports never collide. Example: call export_memories with no arguments to create a timestamped backup file.
Delete a memory from Cairn by id. Call this when a memory is no longer accurate or relevant — for example, if the user corrects a fact you stored, or if they ask you to delete something. Forgotten memories are soft-deleted and do not appear in search results. Example: you stored a memory about the user's old job, but they've moved on — call forget with id=<memory_id>.
Retrieve contextual memories for the current conversation without a specific query. Call this at the start of a conversation or when you need background context about the user without searching for something specific. Returns the most important and relevant memories ranked by importance, recency, and semantic fit. Example: at the start of a new conversation, call get_context with no arguments to load what Cairn knows about the user.
Import memories from a .zip file previously exported by Cairn. Call this to restore a backup or migrate memories from another Cairn instance. Memories that already exist (by id) are skipped; new memories are added to the store. Example: call import_memories with path='/path/to/cairn-export-2024-01-15T12-34-56-789Z.zip' to restore a backup.
Output schemas not explicitly documented. Responses are JSON-serialized but structure is inferred from code (memoryToJson, hitToJson functions). LLMs cannot reliably parse undocumented output formats.
No error handling guidance. Tools return errors but do not categorize them as retryable, user-fixable, or fatal. No recovery suggestions (e.g., 'Try recall() with a different query').
Destructive operations (forget, import_memories) lack confirmation or dry-run support. An agent could accidentally delete memories or overwrite imports without explicit user approval.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
List memories from Cairn in reverse chronological order (most recent first). Call this to browse the user's stored memories, optionally filtered by scope. Useful for auditing what Cairn knows, or for building a summary of the user's profile. Example: call list_memories with limit=20 to see the 20 most recent memories.
Search Cairn's memory store for memories relevant to a question or topic. Call this when you need to retrieve information about the user — their preferences, past decisions, context about their work or life. Returns the most relevant memories ranked by a combination of semantic similarity, recency, importance, and access frequency. Example: the user asks 'what do you know about my work?' — call recall with query='work' to find all work-related memories.
Save a memory to Cairn. Call this when you learn something about the user that should persist across conversations and clients — a preference, a goal, a fact about their life, a decision they made. Memories are searchable and ranked by relevance and importance; tag them so recall can find them later. Example: the user just told you their name is Alex and they work in product management — call remember with text='Alex works in product management', tags=['identity','work'], importance=0.8.
Update an existing memory by id. Call this to correct, refine, or add detail to a memory you've already stored — for example, if you learn more about a user's preference or need to update a fact. You can update the text, tags, or importance; any field you omit is left unchanged. Example: you stored a memory about the user's favorite coffee, but they just told you they switched to tea — call update_memory with id=<memory_id>, text='Alex prefers tea', importance=0.7.
Parameter constraints not fully specified. 'importance' accepts 0-1 but no enum/min/max in schema. 'limit' accepts number|string but coercion rules are implicit. 'scope' is free-form with no validation.
Pagination not fully documented. list_memories supports page/limit but no 'total_count' or 'next_cursor' mentioned in description. Agents cannot determine if more results exist.