A production-ready Model Context Protocol (MCP) server for semantic memory management with vector embeddings, clustering, and relationship traversal
This MCP server provides 10 well-structured memory management tools with comprehensive input schemas and detailed descriptions. Strengths: all tools have clear verb-noun naming (memory_store, memory_search, etc.), detailed parameter descriptions with type constraints (enums, min/max bounds), and explicit schema definitions in the ListToolsRequestSchema handler. Weaknesses: descriptions are extremely verbose (800-1200 chars each, well above the optimal 50-200 char range for LLM decision-making), lack of output schema documentation (critical for chaining and agent reasoning), missing error handling patterns, and no tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear semantic distinctions between read-only and mutating operations. The server exposes 'content' as a freeform object without schema constraints, risking invalid data storage. No validation of user_context or relation_types at the tool interface level, validation is deferred to the MemoryService, leaving the MCP layer unguarded.
BATCH BULK MULTIPLE IMPORT - Store multiple memories at once for efficiency. Keywords: batch, bulk, multiple, import, mass store, save many, store all, bulk import, batch save
BATCH DELETE BULK REMOVE - Delete multiple memories at once. Keywords: batch delete, bulk remove, mass delete, delete many, remove all, clear multiple
CONSOLIDATE MERGE CLUSTER DEDUPLICATE - Group and merge similar memories to reduce redundancy. Keywords: consolidate, merge, cluster, deduplicate, group, combine, compress, organize
DELETE REMOVE FORGET ERASE - Delete a specific memory by ID. Keywords: delete, remove, forget, erase, clear, purge, discard, eliminate, destroy memory, remove fact, forget information
GRAPH RELATED CONNECTED NETWORK - Search memories and traverse relationships to find connected information. Keywords: graph, related, connected, network, relationships, linked, associated, traverse connections
LIST BROWSE SHOW ALL - List all stored memories chronologically. Use when search returns nothing or to explore what is stored. Keywords: list, browse, show, display, view all, get all, see memories, show history, list facts, display knowledge, browse storage, what is stored, show everything, recent memories
Description bloat: all tool descriptions exceed 800 characters, far above the optimal 50-200 char LLM-friendly range (rubric baseline avg 194 chars). This wastes tokens and buries key decision signals. Example: memory_search description is 1100+ chars when it could be '5 words: Search stored memories using natural language. Filters: type, tags, similarity threshold. Returns paginated results with optional relation graph.' This is a token efficiency and agent reasoning degradation risk.
No output schema documentation. Agents need to know what fields to expect from each tool response (e.g., does memory_search return [{ id, content, confidence, tags, relations }] or something else?). Without documented outputs, agents cannot reliably chain tool calls or extract required fields for downstream operations. This violates the 'Document the output schema' critical check.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 40 | - | v1 |
SEARCH FIND RECALL RETRIEVE QUERY LOOKUP - Search for stored information using natural language. USE THIS FIRST before any memory operation. Keywords: search, find, recall, retrieve, query, lookup, remember, fetch, get, access, locate, discover, check memory, find information, recall fact, retrieve data, search knowledge, what do I know, user preferences, user name, previous conversation
STATS STATUS INFO METRICS - Get database statistics, counts, and health metrics. Keywords: stats, status, info, metrics, statistics, counts, summary, overview, database info
STORE SAVE REMEMBER CREATE - Store new information, facts, preferences, conversations, or knowledge. Use after searching to avoid duplicates. Keywords: save, remember, store, record, memorize, learn, retain, persist, create memory, add knowledge, save fact, store preference, remember conversation
UPDATE MODIFY EDIT CHANGE - Update existing memory metadata, tags, confidence, or importance. Keywords: update, modify, edit, change, revise, amend, alter, adjust, correct, fix, improve memory, update fact, change information
Missing tool annotations for semantic clarity. Tools memory_search, memory_list, memory_graph_search, and memory_stats are read-only (should have readOnlyHint=true). Tools memory_delete and memory_batch_delete are destructive (should have destructiveHint=true). Tools memory_store, memory_update, memory_batch are state-mutating and idempotent (should have idempotentHint=true). Annotations guide agent planning and prevent misuse of mutating operations when read-only alternatives exist.
'content' parameter in memory_store and memory_batch is an unconstrained object type. This allows storing arbitrary nested structures without validation at the MCP layer, risking malformed or oversized data. Add a schema constraint: maxProperties, additionalProperties=false, or a pattern requirement (e.g., 'JSON object, max 50KB serialized'). Also document expected key-value structure.
No error recovery guidance in descriptions. The tool descriptions say WHAT they do but not what the agent should do if a call fails. Example: memory_search with no results, should the agent call memory_list as fallback? Should it retry with a lower threshold? Add dependency hints: 'If search returns no results, try memory_list() to browse all memories.' This guides agent planning and reduces hallucination.
Destructive operations (memory_delete, memory_batch_delete) lack confirmation or dry-run support. An agent mistake could permanently erase user memories. Implement a 'dry_run' parameter or require explicit confirmation via a second tool call (e.g., 'confirm_memory_deletion(id)'). This prevents accidental data loss and matches the 'Irreversible operations should support a dry-run or confirmation step' critical check.
Parameter 'content_hash' in memory_delete is underdocumented. What is this hash? How is it computed? When is it required vs optional? If optional, why provide it? Add: 'Optional SHA-256 hash of the memory content for verification. If provided, the memory is only deleted if the hash matches, preventing accidental deletion of updated memories. Compute as: sha256(JSON.stringify(content)).' This prevents user confusion and silent failures.
memory_consolidate accepts a 'threshold' parameter (0.5 - 0.95) but does not explain what it means or how clustering works. Is it cosine similarity? Euclidean distance? What does a threshold of 0.7 imply, memories with >70% similarity are merged? Add: 'Similarity threshold (0.5 - 0.95). Memories with pairwise cosine similarity >= threshold are merged into clusters. Lower values = more aggressive merging. Default: 0.8. Returned merged memories are deduped summaries, not overwrites of originals.' This prevents agent misuse.
No pagination or limit enforcement documented in list and search operations. memory_search accepts a 'limit' parameter (1 - 100) but the description does not state: 'Results are capped at limit. If total_count > limit, use offset/cursor to fetch the next page.' without this, agents may assume all matching memories are returned in one call, leading to incomplete understanding of memory contents.
'user_context' appears in 8 tools but is never explained. Is it a session ID? A user profile snippet? A contextual hint for embedding? If user_context='Alice is a project manager', does it affect search results or just metadata? Add a single definition: 'Optional user metadata (e.g., role, preferences, session context) used to contextualize embeddings and filter results. If omitted, searches are user-agnostic.' Include in the server description or as a dedicated reference, not redefined in each tool.