Automated 2-speaker audio conversation using Google Cloud Text-to-Speech Chirp 3 HD voices in the EU region
Server has 6 well-named tools with clear verb-noun patterns (upload_script, validate_script, translate_script, start_conversation, get_conversation_status, cancel_conversation). All tools have descriptions (50-150 chars, within baseline 34-392 range). Input schemas are present with typed parameters and descriptions. Tool annotations (readOnlyHint, destructiveHint) are implemented via _annotations() helper. However, output schemas are not documented in the visible code, responses are inferred from result objects but not formally declared. Error handling exists (JobNotFound, ScriptPayloadError, VoiceCatalogError exceptions) but recovery guidance is minimal. Parameter descriptions are adequate but lack format constraints (e.g., BCP-47 language tag format not validated in schema). No pagination or result limits documented for list-like operations.
Stop a queued or running job when the user asks to cancel. The current TTS batch may finish; later batches are skipped.
Poll a job started by start_conversation. Repeat with a delay until succeeded, failed, or cancelled. On success, report audio_uri.
Start billed TTS from a gs:// script_uri. Returns immediately with job_id and status queued. Poll get_conversation_status; the WAV is not ready yet.
Translate a gs:// script to another language only when the user asked. Pass the returned output_uri to start_conversation.
Store an inline YAML/JSON conversation script in staging GCS. Call this first, then validate_script with the returned script_uri.
Check that a gs:// script is valid before synthesis. If valid is false, explain error and stop; do not call start_conversation.
Output schemas not formally documented. Tool responses (ScriptUploadResult, ScriptValidationResult, TranslateScriptResult, JobRecord) are defined in logic/results.py but not exposed in MCP tool registration. LLMs cannot plan downstream calls without knowing returned fields.
Parameter format constraints missing from schema. translate_script accepts 'target_language' as free-form string with only description 'BCP-47 target, e.g. de-DE', no enum, pattern, or validation. LLMs may pass invalid language codes.
Error recovery guidance incomplete. Exceptions (JobNotFound, ScriptPayloadError, VoiceCatalogError) are caught and converted to ToolError, but error messages do not guide LLM on next steps (e.g., 'Job not found. Check job_id or call start_conversation again.').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
No dry-run or confirmation step for destructive operations. start_conversation initiates billed TTS synthesis immediately. Agents cannot preview or confirm before incurring costs.
Polling pattern lacks guidance. get_conversation_status description says 'Repeat with a delay until succeeded' but does not specify recommended delay, max retries, or timeout. Agents may poll too aggressively or give up prematurely.