MCP server exposing a personal-assistant REST backend as 40+ Claude-ready tools over streamable HTTP
Server exposes 9 tools via FastMCP/HTTP. Tool naming follows verb_noun convention (query_agent, check_emails, send_text, log_expense). However, critical gaps undermine quality: (1) Most tools lack structured output schemas, responses are free-text strings ('No response', 'Error: {e}'), forcing LLMs to parse unstructured text. (2) Parameter descriptions are minimal (e.g., 'Time period - "today", "yesterday"...') but lack constraints, ranges, or validation guidance. (3) No error handling guidance, exceptions caught and returned as strings ('Error: {e}') without recovery hints. (4) Tool descriptions are adequate (50-150 chars) but lack WHEN/WHY context for selection. (5) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear read/write distinction. (6) Composition issues: check_emails, check_messages, check_calls, get_communication_summary overlap significantly, LLM must reason which to call. Average per-tool score: 42/100.
Check budget status.
Get phone call log and voicemail summary.
Get email summary for specified timeframe.
Get SMS/text message summary for specified timeframe.
Get unified summary of all communications (email, SMS, calls).
Get a cross-domain weekly summary of all assistant activities. Combines brain digest (7-day), cron health, and recent stats into a single summary. Useful for morning briefings and weekly reviews.
No structured output schemas. All tools return free-text strings (e.g., 'No response', 'Error: {e}'). LLMs cannot extract typed fields for downstream tool chaining. Violates pattern:response-shaper and mxe:strip-api-responses.
Overlapping tool semantics. check_emails, check_messages, check_calls, and get_communication_summary all retrieve communications but with unclear distinctions. LLM must reason which to call. Violates pattern:tool (one responsibility per tool).
No error recovery guidance. Exceptions caught as 'Error: {e}' strings. LLM receives no hint whether to retry, ask user, or abandon. Violates pattern:recovery-guide.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | <=2025-11-25 | v2 |
Log a financial expense.
Send a natural language query to the assistant.
Send an SMS text message via Twilio.
Parameter descriptions lack constraints. 'timeframe' accepts free-form strings; description lists examples but no enum. LLM may pass invalid values ('next_month', 'last_year'). Violates pattern:constrained-input.
No tool annotations. send_text and log_expense are destructive (WRITE risk) but lack destructiveHint annotation. check_* tools are read-only but lack readOnlyHint. Violates pattern:tool-annotation.