An MCP server that provides voice interaction capabilities including text-to-speech (TTS) using Kokoro, speech-to-text (STT) using Whisper, and conversational turn handling.
Three tools with basic descriptions and partial schemas. All tools have descriptions (10-100 chars, below the 194-char baseline), but parameter descriptions are sparse or missing. Input schemas present but lack type constraints and validation guidance. No output schemas documented. Error handling absent. Naming is verb-forward but descriptions lack WHEN/WHY context. No tool annotations (readOnlyHint, destructiveHint). Composition is reasonable (speak, listen, conversation_turn are distinct), but conversation_turn combines two concerns (listen + speak) without clear separation.
Execute a full conversation turn: listen for user input, process it, and speak the response.
Record audio from the microphone and transcribe it to text using Whisper model. Automatically stops on silence detection.
Convert text to speech using Kokoro TTS engine and play the audio output.
No output schemas documented. LLMs cannot infer what fields to expect from tool responses (e.g., does listen() return transcribed_text, confidence, language, duration?). Forces LLMs to guess downstream field names.
Parameter descriptions missing or incomplete. 'max_duration', 'silence_duration', 'silence_threshold' lack guidance on expected ranges, units, or when to adjust them. LLMs cannot reason about valid values.
No error handling guidance. Code lacks try-catch blocks with actionable error messages. If Whisper fails, Kokoro fails, or audio device unavailable, LLM receives no recovery path.
conversation_turn combines listen + speak concerns. Should be split into separate tools so agents can compose them independently. Current design forces both operations even if only one is needed.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 39 | <=2025-11-25 | v2 |
No tool annotations. Tools lack readOnlyHint (all three are read-only per Risk field), destructiveHint, or idempotentHint. LLMs cannot reason about retry safety or side effects.