A memory management MCP server for storing, searching, and linking memories across global and project scopes using BM25 text search.
amem has well-structured tool definitions with complete Zod schemas and consistent descriptions. All 6 tools are properly registered with input schemas and descriptions. However, descriptions are generic and lack LLM-optimized guidance on WHEN to use each tool vs. alternatives. Parameter descriptions are present but minimal (avg ~40 chars vs. baseline 72). Output schemas are not documented, LLMs cannot predict response structure. Error handling is basic (isError flag only, no recovery guidance). No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Missing idempotency guarantees and confirmation patterns for destructive operations.
Create a new memory. Returns the created memory with its ID.
Delete a memory by ID.
Get a memory and its linked neighbors.
List all memories (metadata only, no content).
Search memories using BM25 text search. Returns ranked results.
Update an existing memory's metadata or content.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). memory_search, memory_add, memory_update, memory_links, memory_list all return JSON but no schema is visible to the agent.
Destructive tool (memory_delete) lacks confirmation pattern and tool annotation. No dry-run, no destructiveHint, no recovery guidance. Agents can delete memories without safeguards.
Tool descriptions lack LLM-optimized guidance. Generic descriptions ('Update an existing memory's metadata or content') do not explain WHEN to use memory_update vs. memory_add, or what fields are optional vs. required. Baseline: 194 chars; actual avg: ~60 chars.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). memory_search, memory_list, memory_links should be marked readOnly. memory_delete should be marked destructive. Agents cannot infer safety properties.
Error handling is minimal. memory_delete and memory_update return isError=true with plain text ('Not found', 'Memory not found') but no recovery guidance. Per pattern:recovery-guide, errors should suggest next steps (e.g., 'Try memory_search() to find the ID').