Two well-named tools with strong descriptions and complete input schemas. memory_recall and memory_add follow verb_noun convention and include detailed, LLM-optimized descriptions (100+ chars each). All parameters have types and descriptions. Output schema is documented in code comments. However, no explicit output schema is visible in the tool registration itself, and error handling guidance is minimal in the tool definitions. The server demonstrates solid fundamentals but lacks some production-grade polish around error recovery and response structure documentation.
Save a durable fact, decision, or lesson to the user's persistent memory. Call when you learn something worth remembering across sessions. A bug you fought: kind='lesson', one line: symptom — real cause — fix. Always pass keywords: synonyms, Vietnamese+English terms, error codes, symptoms — search is lexical.
Search the user's persistent cross-session memory. Call before answering questions about project history, past decisions, or user preferences.
Output schema not declared in tool registration. Code comments reference §4 payload shape but MCPServer.add_tool() does not register output schemas. LLMs cannot infer response structure without explicit documentation.
Error handling lacks recovery guidance. Tool docstrings mention 'never raises' and wrap failures, but the actual error messages returned are not shown. LLMs need actionable error text like 'Try search_users() first' or 'Invalid workspace name, available: [list]'.
Parameter 'workspace' accepts None with implicit detection logic not documented in the parameter description. LLMs cannot reason about when to omit vs. pass 'all'. Description should state: 'Omit to auto-detect from current directory; pass "all" to search all workspaces (recall only).'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Parameter 'k' (limit) lacks range constraints in description. Baseline rubric requires 'number of results, 1 to 20' but description does not state minimum/maximum. LLMs may pass invalid values.
memory_add 'kind' parameter rejects 'core' but the rejection reason is not in the parameter description, it is only in a module-level constant CORE_KIND_REJECTION. LLMs will not see this constraint and may attempt to pass 'core', causing a failure with no guidance.