Echo — a personalized memory MCP server with a 3D brain dashboard and gesture-controlled recall.
Echo demonstrates solid tool design with consistent naming (verb_noun pattern), complete input schemas using Zod, and clear descriptions. All 5 tools follow the verb-first convention (save_, recall, search, list_, forget). Schemas are well-typed with enums for categories and proper constraints (limit 1-50 for search). However, output schemas are not formally documented, responses are inferred from handler code. Error handling is basic (missing memory returns isError: true, but lacks recovery guidance). No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Parameter descriptions are adequate but could be more prescriptive about format/constraints.
Delete a memory by id. Returns false if no such memory exists.
List memories, optionally filtered by category, sorted by freshness.
Recall the full content of a memory by id.
Save a new memory or update an existing one by id. Use stable kebab-case ids.
Free-text search across all memories. Returns ranked results with snippets.
Output schemas not formally documented. Handlers return text-only responses without structured field definitions. LLMs cannot reliably extract data for downstream tool chaining (e.g., search returns snippet but no structured metadata for recall).
Tool annotations missing. save_memory and forget are destructive/write operations but lack destructiveHint or idempotentHint annotations. Agents cannot determine retry safety or side-effect scope.
Error recovery guidance absent. recall returns isError: true for missing memory but does not suggest next steps (e.g., 'Try search() with a keyword'). Agents have no actionable path forward.
Parameter descriptions lack format constraints. 'id' is described as 'kebab-case slug' but no regex pattern or length bounds. 'body' accepts markdown but no size limit stated. LLMs may pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
sessionId parameter in save_memory is optional and undocumented. Purpose unclear, is it for grouping? Filtering? Agents cannot reason about when to include it.