Connect an OpenClaw/MCP agent to a self-hosted talkies speech API (ASR transcription + file staging) over MCP.
Talkies demonstrates solid tool design with clear verb-noun naming (list_models, transcribe, put_file, get_file, delete_file, list_files) and comprehensive descriptions (avg 180 chars, well within 10-1024 range). All 6 tools have detailed docstrings explaining WHAT they do, WHEN to use them, and prerequisites. Input schemas are present and properly typed for all tools. However, parameter descriptions lack actionable constraints (e.g., no enum for response_format despite listing valid options; no min/max for file sizes; no explicit path traversal validation guidance). Output schemas are documented in descriptions but not formally declared in JSON Schema. Error handling guidance is minimal, no recovery hints or categorization. Security considerations (path traversal rejection, base64 size caps) are mentioned but not formalized as validation rules in descriptions.
Delete a staged file. Empty parent directories are pruned up to (but not including) the staging root. Returns: ``{"deleted": str}`` on success.
Read a staged file back as base64. Args: path: Path relative to the staging root. Returns: ``{"path": str, "size": int, "content_base64": str}``. Use sparingly — bytes round-trip through JSON, so big files chew through token budget on the client side.
List files currently staged under the server's file area. Returns ``{"files": [{path, size, modified}]}``. ``path`` values can be passed straight to ``transcribe`` as ``file_path``.
List the ASR models this server can run. Returns a list of ``{slug, executor, default_source_lang, default_target_lang, default_task, loaded}`` entries. Pick one and pass its ``slug`` to ``transcribe`` as ``model``. TTS-only models (e.g. ``kokoro-82m``) are filtered out — call them over the HTTP ``/v1/audio/speech`` endpoint instead.
Upload a file to the staging area. Args: path: Destination path relative to the staging root. Leading ``/`` is stripped; ``..`` segments are rejected. content_base64: File contents, base64-encoded. After decode the size is capped at ``TALKIES_MAX_UPLOAD_BYTES``. Returns: ``{"path": str, "size": int}`` on success.
response_format parameter lacks enum constraint; description lists valid options ('json', 'verbose_json', 'text', 'srt', 'vtt') as free text instead of formal enum, inviting hallucinated values
File size constraints (TALKIES_MAX_UPLOAD_BYTES) mentioned in put_file description but not formalized as a parameter constraint or error guidance; LLM cannot predict valid range
Path traversal rejection ('.. segments are rejected') documented in descriptions but not formalized as validation rules; error messages for invalid paths not specified
Output schemas documented in prose but not formally declared in JSON Schema format; LLM cannot parse expected response structure programmatically
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Run ASR on a server-side or remote audio file. Args: file_path: Either an ``http://`` / ``https://`` URL (downloaded once, cached under ``downloads/<hash>-<basename>``) or a path relative to the staging area populated via ``put_file``. Leading ``/`` is stripped; ``..`` segments are rejected. model: Model slug. Discover with ``list_models``. language: Optional BCP-47 source-language hint (e.g. ``en``, ``de``). Models that need this default to their configured ``default_source_lang`` when omitted. response_format: One of ``json``, ``verbose_json``, ``text``, ``srt``, ``vtt``. ``json`` returns a compact ``{"text": ...}`` object; ``verbose_json`` returns the full Whisper-shape payload with segments + words. diarization: If true and the audio is stereo, splits left/right channels as two speakers and returns a chronological L/R interleaved transcript. Errors with non-stereo input. Returns: For ``json`` / ``verbose_json``: JSON-encoded string. For ``text`` / ``srt`` / ``vtt``: the raw text / subtitle stream.
No error recovery guidance; descriptions lack hints like 'If transcription fails, check model availability with list_models' or categorization of retryable vs fatal errors