Anchored memory for AI coding agents — MCP server that binds decisions to code symbols and delivers context just-in-time
Mnemex defines 9 tools with complete input schemas and descriptions. Naming follows verb_noun convention (remember_, recall_, forget_, check_, override_, reconcile_, export_, import_). Descriptions are substantive (80-180 chars), explaining WHAT and WHEN. However, parameter descriptions lack actionable constraints (no enums, ranges, or format specs). Output schemas are undocumented, LLMs cannot predict response structure. Error handling is minimal; tools return generic error dicts without recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear risk profiles (WRITE, DESTRUCTIVE, READ_ONLY). Composition is sound: tools are single-purpose and chainable via memory_id references.
Check whether anchored memories are fresh, stale, or orphaned.
Check a proposed edit against fresh anchored decisions. A change blocks only on a fresh, confidence-qualified semantic contradiction. Local mode and every other result are advisory.
Export selected local decision records as a portable bundle.
Remove a memory by its ID.
Import a project-brain bundle into the local database.
Record an explicit override for a prior guard result.
Retrieve relevant memories via hybrid BM25+vector search.
No output schemas documented. LLMs cannot predict response structure (fields, types, pagination). Tools return dicts with 'memory_id', 'status', 'error' but no formal schema.
Parameter descriptions lack actionable constraints. 'scope' accepts 'comma-separated scopes' but no enum or examples. 'limit' has no min/max bounds. 'max_tokens' capped at 800 in code but not documented in schema.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools marked WRITE/DESTRUCTIVE/READ_ONLY in metadata but not exposed to LLM via schema annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Classify a stale decision for auditable follow-up.
Store a decision or convention, optionally anchored to a code symbol.
Error handling returns generic dicts without recovery guidance. 'AnchorNotFoundError' caught but returned as {'error': str(e)}, LLM cannot infer next steps or whether to retry.
Parameter 'anchor_node_id' accepts arbitrary strings with no validation. No documentation of valid node ID format, length, or character restrictions.