An MCP server that provides text-to-speech functionality using macOS's built-in speech synthesis via /usr/bin/say
The server has two tools with explicit definitions via mcp-go's builder API. Both tools have clear action-verb names and descriptions. However, the schema documentation is incomplete for the agent's perspective, while input parameters are defined in code, the output schemas are not formally documented. The 'speak' tool has well-constrained inputs (rate range 90-500), but the 'list_voices' tool returns JSON without an explicit schema declaration. Parameter descriptions are present and reasonably detailed (e.g., 'Voice to use for speech synthesis (optional, uses system default if not specified)'). Error handling is present with context-aware guidance (permission errors include remediation steps), but lacks explicit error categorization (retryable vs. fatal). The tools are well-composed (single responsibility, idempotent operations), but the server lacks batch operations and does not document return schemas formally.
List all available text-to-speech voices on the system with their locales and descriptions
Converts text to audible speech using macOS text-to-speech
Output schemas are not formally documented. 'list_voices' returns a JSON structure with a 'voices' array containing Voice objects (name, locale, description), but this schema is not exposed in the tool definition for the LLM to understand expected fields.
No error classification or recovery guidance in tool definitions. Errors are handled internally (e.g., permission denied → show guidance), but the tool definition does not declare which errors are retryable, user-fixable, or fatal. LLMs cannot determine whether to retry, ask the user, or give up.
The 'speak' tool description does not explicitly state that it is a write/command operation. While it is clearly a side-effect tool (produces audible speech), the description does not say 'Executes text-to-speech synthesis' or similar. Agents need to know which tools modify system state.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
No parameter constraints documented for 'voice'. The tool accepts any string, but the description does not hint that voices are discovered via 'list_voices' or provide examples. LLMs may hallucinate invalid voice names.
Tool descriptions are below the optimal 50 - 200 character range. 'Converts text to audible speech using macOS text-to-speech' is 54 chars, which is acceptable. However, more context on when to use each tool (e.g., 'Executes text-to-speech synthesis immediately; call list_voices() first to see available voice options.') would aid LLM tool selection.