Portable cognitive memory MCP server with semantic search and decay
mnemo-mcp demonstrates solid foundational quality with well-structured tool definitions, clear naming conventions, and comprehensive parameter schemas. All 8 tools follow verb_noun patterns and have descriptions. However, the implementation has notable gaps: (1) output schemas are NOT formally documented, responses are returned as unstructured text blocks rather than structured objects, violating pattern:response-shaper; (2) error handling lacks recovery guidance and categorization, generic success/not-found responses do not tell the LLM why a call failed or what to do next; (3) some parameter descriptions lack actionable constraints (e.g., 'limit' has 'no hard cap' but should specify practical bounds); (4) decay tool lacks input schema entirely (score 0 for schema). Tool naming is strong (remember, recall, forget, bump, decay, inspect are all action-oriented and unambiguous). Descriptions average ~80 chars, which is solid but could be more prescriptive (e.g., when to prefer recall over inspect, dependency hints). The batch variant (remember_batch) is a good composition pattern for efficiency. Security is reasonable, no API keys exposed, though audit logging is not mentioned. Per-tool scores range 50 - 85; the decay tool drags the average down due to missing schema.
Reinforce a memory's weight (recall reinforcement)
Trigger a decay cycle — reduces memory weights based on tag tiers
Delete a memory by ID
View a specific memory or aggregate stats
Search memories semantically by query
Store a memory with optional tag, categories, and namespace
Store multiple memories in a single call. Embeds all at once for efficiency. Deduplicates automatically.
decay tool has no input schema (source: package.json references decay but src/index.ts does not show registerTool call). Schema cannot be evaluated and MUST score 0. This violates pattern:constrained-input and pattern:tool.
Output schemas are not formally documented. Tools return text-only responses ('content': [{'type': 'text', 'text': '...'}]) without structured field definitions. Agents cannot plan downstream tool calls or extract typed data. Violates pattern:response-shaper and pattern:tool.
Error handling lacks recovery guidance and categorization. Responses like 'Memory not found: ID' do not tell the LLM what to do next (retry? ask user? call another tool?). No distinction between retryable vs. permanent failures. Violates pattern:recovery-guide and pattern:error-classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Update an existing memory's content or metadata. Re-embeds automatically if content changes.
Parameter 'limit' in recall tool has description 'Max results (default 10, no hard cap)' but no explicit bounds. LLMs may pass very large values, risking context window exhaustion. Should specify maximum (e.g., limit 1 - 100, default 10). Violates pattern:constrained-input.
Missing tool for common multi-step workflow. Users likely say 'search for memories about X' (recall) but then need to refine based on metadata or weight. No filter-by-example or faceted-search tool, agents must call recall multiple times. Consider adding a 'recall_refined' tool or enhancing recall with post-filtering.
forget tool is destructive but has no confirmation/dry-run pattern. Agents can permanently delete memories without preview. Consider adding a 'preview_delete' mode or requiring confirmation. Violates pattern:confirmation-request.
remember and remember_batch accept 'author' parameter but do not document how LLMs should infer/default it when omitted. Currently defaults to 'unknown', which is not user-friendly. Should provide guidance on agent identity injection. Violates pattern:tool-description.