MCP server providing voice interaction tools for clinical trial queries. Exposes speech-to-text, entity extraction, text-to-speech, and query building capabilities for voice-based clinical trial navigation.
Server has 5 tools with complete input/output schemas and descriptions. Naming follows verb_noun convention (transcribe_, extract_, synthesize_, build_, manage_). Descriptions are present (avg ~80 chars) but lack actionable context for LLM selection. Parameters are typed and mostly described, but lack constraints (enums, ranges, patterns). Output schemas are documented via Pydantic models. Error handling is minimal, no recovery guidance or categorization. Security: no secrets in params (good), but no audit logging or permission gates visible. Composition is reasonable (each tool has one responsibility), but session management tool mixes create/get/end into one endpoint.
Build structured trial search query from natural language
Extract patient attributes and clinical entities from text
Create, get, or end voice interaction sessions
Convert text to speech audio
Convert speech audio to text using Whisper
manage_voice_session combines three distinct operations (create/get/end) into one tool with an action enum. This violates single-responsibility principle and forces LLMs to reason about which action to invoke. Should split into create_voice_session, get_voice_session, end_voice_session.
Parameter descriptions lack actionable constraints. 'format' accepts 'wav, mp3, webm, ogg' but is not declared as an enum, LLMs may hallucinate other formats. 'speed' has range 0.5-2.0 but no validation or error message if violated. 'voice_profile' defaults to 'clinical_clear' but no enum of valid profiles documented.
Tool descriptions do not explain WHEN to use each tool or dependencies between them. E.g., build_trial_query description does not mention it should follow extract_clinical_entities. No guidance on multi-step workflows (transcribe → extract → build → search).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling is absent from visible code. No recovery guidance (e.g., 'If transcription fails, try a different audio format'). No error categorization (retryable vs. user-fixable vs. fatal). Agents cannot determine next steps on failure.
Output schemas (TranscribeResponse, ExtractEntitiesResponse, etc.) are documented but lack guidance on field semantics. E.g., ExtractEntitiesResponse.confidence is a float but no range (0-1?) or interpretation documented. BuildQueryResponse.clarification_needed is boolean but no guidance on when/how to act on it.