Persistent cross-session memory for Claude and AI agents. Self-host on Redis/Valkey, or use the managed cloud at recallmcp.com.
Recall MCP Server presents 17 tools with moderate definition quality. Strengths: all tools have descriptions (10-200 chars), input schemas are present and use Zod with proper type definitions, and tool names follow verb_noun conventions. Critical weaknesses: (1) 4 tools (memory_category, memory_graph, memory_maintain, memory_template) use action-based enum dispatching, making them act as composite tools combining multiple unrelated responsibilities, violating single-responsibility principle; (2) parameter descriptions are sparse or missing constraints (e.g., recall_relevant_context's min_importance lacks range/default); (3) tool descriptions lack guidance on WHEN to use them or dependencies between tools; (4) output schemas are not documented, responses are JSON-serialized text without explicit schema contracts; (5) error handling in handlers catches generic errors but returns only summary messages without recovery guidance; (6) no tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. Tools are correctly registered and schemas are valid JSON Schema, preventing a lower floor score. Average per-tool score: 52.
Analyze conversation text and automatically extract and store important information (decisions, patterns, directives, etc.). Use this after important discussions.
Automatically consolidate similar memories if needed. Checks if memory count exceeds threshold and no recent consolidation. Returns early if not needed — safe to call proactively.
Check if consolidation is needed and get last run info. Returns memory count, threshold, last run, and recommendation.
Force consolidation regardless of thresholds. Use for manual trigger or after large batch imports.
Get all memories in a specific category
Get a graph of related memories starting from a root memory
Get memories related to a given memory with graph traversal
Four tools (memory_category, memory_graph, memory_maintain, memory_template) use action-enum dispatching, combining 3-7 unrelated operations into single tools. Violates single-responsibility principle and forces LLMs to reason about which action to invoke. Should split into separate tools (e.g., set_memory_category + list_categories + get_memories_by_category already exist as separate tools 1-3, making memory_category redundant).
Output schemas are not documented. All tool handlers return JSON-stringified responses without explicit schema contracts. LLMs cannot predict response structure to plan downstream tool calls or extract fields. Handlers wrap results in {content:[{type:'text',text:JSON.stringify(...)}]} but the JSON shape is undocumented.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 56 | - | v1 |
Create a relationship between two memories
List all categories with memory counts
Manage memory categories. Actions: set (assign category to a memory), list (all categories with counts), get (memories in a specific category).
Manage memory relationships and version history. Actions: link (create relationship), unlink (remove), related (get linked memories), graph (visualize network), history (version log), rollback (restore version).
Maintain memory store health. Actions: consolidate (auto-merge similar if needed), force (force consolidation), status (check consolidation status), export (backup to JSON), import (restore from JSON), find_duplicates (detect and optionally merge duplicates), merge (manually merge memories).
Manage memory templates. Actions: create (new template with placeholders), use (create memory from template), list (show all available templates).
Proactively search memory for context relevant to current task. Use this when you need to recall patterns, decisions, or conventions. Returns summaries by default for context efficiency.
Set or update the category of a memory
Summarize the current work session and create a snapshot. Use this at the end of a work session to preserve context.
Remove a relationship between memories
No tool annotations present. Tools declare Risk classifications (WRITE, READ_ONLY) in metadata but do not expose readOnlyHint, destructiveHint, or idempotentHint in MCP tool definitions. LLMs cannot distinguish which tools are safe to retry or have side effects.
Parameter descriptions lack constraints and defaults. Examples: recall_relevant_context.min_importance has no range/default; auto_consolidate.similarity_threshold, min_cluster_size, max_age_days, memory_count_threshold lack type hints in descriptions (assumed float/int); memory_maintain.filter_by_type is array but no enum of valid types provided.
Tool descriptions lack dependency hints and selection guidance. Descriptions state WHAT tools do but not WHEN to use them or if prerequisites exist. Examples: recall_relevant_context does not explain relationship to analyze_and_remember or if memories must exist first; consolidation_status does not explain when auto_consolidate is preferred over force_consolidate.
Error handling returns generic recovery paths without specific context. All error handlers throw McpError with summary messages (e.g., 'Failed to set category: <error>') but do not classify errors as retryable/user-fixable/fatal or suggest next steps. Example: memory not found returns 'Memory not found' without suggesting list_categories or search operations.
No idempotency or dry-run support for destructive operations. force_consolidate, unlink_memories, memory_maintain (merge/import actions) lack dry-run or confirmation steps. Agents cannot safely preview consequences before committing irreversible changes.
Pagination not implemented. list_categories, get_memories_by_category, get_related_memories, and consolidation queries lack offset/limit or cursor pagination with total_count. Large memory stores will return unbounded results, exhausting context windows.
Response fields do not chain downstream tool calls. Example: get_memories_by_category returns memory summaries but does not include memory_id for each, forcing extra lookup calls. recall_relevant_context returns context summaries without memory_ids needed for link_memories or get_memory_graph.