MCP server for transcribing Telegram voice messages using Whisper, with Kokoro/OpenAI TTS voice replies
Server has 5 tools with complete schemas and descriptions. Naming is clear and verb-based (transcribe_*, list_*, check_*, speak_*). Descriptions are detailed (100-300 chars) and explain WHAT, WHEN, and HOW. Parameters have types and descriptions. However, output schemas are not formally documented in the code, only inferred from docstrings. Error handling returns structured dicts but lacks recovery guidance (e.g., 'try X next'). The speak_text tool is WRITE-risk but lacks confirmation/dry-run pattern. No tool annotations (readOnlyHint/destructiveHint) visible in FastMCP registration.
Check which transcription backends are available and configured. Call this first to verify your setup before transcribing.
List available Whisper model sizes with performance characteristics. Configure the active model via the WHISPER_MODEL environment variable. Default is 'base' -- a good balance of speed and accuracy for voice messages.
Convert text to speech and return an OGG/Opus audio file path. Plays as a native voice note in Telegram when sent as an attachment. TTS backends (in priority order): 1. Kokoro (local, free, natural-sounding) -- auto-starts via `uvx kokoro-fastapi` 2. OpenAI TTS (cloud, requires OPENAI_API_KEY, ~$0.015/1k chars) 3. macOS say (Mac only fallback, sounds robotic) Configure via TTS_BACKEND env var: "auto" | "kokoro" | "openai" | "macos"
Transcribe an audio file to text using Whisper. Supports OGG (Telegram voice), WAV, MP3, FLAC, and most common audio formats.
Download and transcribe a Telegram voice message. Downloads the voice message from Telegram, transcribes it, then deletes the temp file.
Output schemas not formally documented. Docstrings describe return dicts but no JSON Schema definitions visible. LLMs cannot reliably parse or chain results.
speak_text is a WRITE tool (creates audio files) but lacks confirmation/dry-run pattern. No way for agents to preview before committing.
Error responses lack recovery guidance. _error_dict returns 'error' field but does not suggest next steps (e.g., 'Call check_backends() first').
Tool annotations (readOnlyHint, destructiveHint) not visible in FastMCP @mcp.tool() decorators. Cannot signal to clients which tools are safe vs destructive.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
check_backends and list_models are discovery tools but lack explicit guidance on when to call them (e.g., 'Call this first to verify setup').