MCP server that gives any agent persistent memory — namespaced facts with tags, SQLite FTS5 full-text search, TTL expiry and zero external dependencies.
Strong tool definitions with clear naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and complete JSON Schema with types and descriptions for all parameters. All 8 tools follow consistent patterns. Strengths: deduplication logic, TTL support, FTS5 search, export/import for portability. Weaknesses: no error handling guidance (e.g., what to do if memory_id not found), no output schema documentation, no parameter constraints (enums, ranges), no confirmation step for destructive forget() operation.
Export memories as JSON-serializable dicts for backup or migration.
Permanently delete one memory by id.
Import memories from a previous export_memories call. Each item needs at least a non-empty "content"; namespace, tags, source, created_at, and expires_at are preserved when present. Exact duplicates (same content + namespace) are skipped.
Browse stored memories, most recent first, without a search query.
Get vault statistics and health information.
Search memories by full text and get the best matches first. All query terms must match (AND semantics). Results are ranked by relevance (SQLite FTS5 bm25) with recency as tiebreaker, and each hit includes a highlighted snippet, its tags, and a readable age like "3 days ago".
forget() lacks confirmation step and error guidance. Destructive operations should support dry-run or require explicit confirmation to prevent accidental data loss.
No output schema documentation. Tools return dicts but LLMs cannot infer field names, types, or structure. Document what each tool returns (e.g., remember returns {id, content, namespace, tags, created_at, expires_at, deduplicated, message}).
No parameter constraints (enums, ranges, patterns). E.g., ttl_days accepts any int but should be constrained to 0+ or 0-36500. limit should be 1-100. Undocumented constraints invite invalid LLM inputs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Store a fact in persistent memory so it survives across sessions. Use this whenever you learn something worth keeping: user preferences, project decisions, environment quirks, follow-ups. Exact duplicates (same content in the same namespace) are detected and returned with "deduplicated": true instead of being stored twice.
Edit an existing memory: rewrite content, add tags, or change TTL.
Error handling lacks recovery guidance. If memory_id not found in forget(), what should the LLM do? Suggest list_memories() first? Document error cases and next steps in tool descriptions.
import_memories accepts arbitrary list[dict] with no validation hints. Document required fields (content), optional fields (namespace, tags, source, created_at, expires_at), and what happens if required fields are missing.