A voice-first conversational AI system with three layers: voice interface (FastAPI), agent bridge (OpenCode integration), and MCP tools server
Four tools with basic descriptions and schemas, but significant gaps in parameter documentation and error handling. Tool names follow verb_noun convention (remember, recall, send_message, list_messages), which is good. However, parameter descriptions are minimal or missing entirely. For example, 'remember' accepts 'category' with description 'Category for organization (e.g. "general", "personal", "work", "shopping", "ideas")', this is an enum masquerading as free text, inviting hallucinated values. 'send_message' platform parameter lists only two options ('log', 'telegram') but lacks validation guidance. No tool documents output schema structure, pagination, or error recovery paths. Tool descriptions are adequate (50-100 chars) but lack WHEN/WHY context. No tools declare idempotency, destructiveness, or permission requirements.
List recent messages.
Search stored memories by keyword, optionally filtered by category.
Store information in memory, organized by category.
Send a message to a recipient.
Enum values presented as free-text descriptions instead of formal constraints. 'category' in remember/recall and 'platform' in send_message should declare enums to prevent LLM hallucination.
Output schemas not documented. Tools return data but LLMs cannot infer structure (e.g., does recall return {results: [{text, category, timestamp}]} or {matches: []}?). Breaks downstream tool chaining.
No error handling guidance. Tools lack recovery hints (e.g., 'If category not found, try recall with empty category filter'). LLMs cannot self-correct on failures.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | <=2025-11-25 | v2 |
Parameter descriptions are minimal. 'count' in list_messages lacks range constraints (is 1-100? 1-1000?). 'recipient' in send_message lacks format guidance (email, username, phone?).
No idempotency or destructiveness hints. 'remember' and 'send_message' modify state but lack annotations. Agents cannot determine safe retry behavior.