{"serverInfo":{"name":"klangzeile","title":"klangzeile","version":"1.0.0"},"description":"klangzeile: text-to-speech and transcription (German/English), EU-hosted. Costs come out of the account's monthly free allowance first, then prepaid credit; get_credit shows both. Transcription is asynchronous: create_transcription -> poll get_transcription_status -> get_transcription_result exactly once (the result is deleted after that). Errors carry a stable error_code (e.g. CREDIT_EXHAUSTED, RATE_LIMITED).","transport":{"type":"streamable-http","endpoint":"/mcp"},"authentication":{"required":true,"schemes":["bearer"],"headers":["Authorization: Bearer sk_…","X-API-Key: sk_…"]},"tools":[{"name":"list_voices","title":"List voices","description":"List the text-to-speech voices (id, language, gender). Free. Use an `id` as `voice` in synthesize_speech; German voices start with de-, English ones with en-.","inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"synthesize_speech","title":"Text to speech","description":"Turn text (German or English, up to 5,000 characters) into speech with a synthetic voice. Billed per character: the monthly free allowance first, then prepaid credit. The audio comes back in this response as an `audio` content item (base64, mp3/wav/ogg) together with the number of characters billed; neither text nor audio is stored. Results over ~6 MB (very long text as wav) are refused with RESPONSE_TOO_LARGE and not billed - use mp3 or the REST API then. / Text in Sprache (synthetische Stimme), Abrechnung pro Zeichen.","inputSchema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000,"description":"The text to speak (plain text, ≤ 5,000 characters)."},"voice":{"type":"string","default":"de-thorsten","description":"Voice id from list_voices, e.g. de-thorsten, en-heart."},"format":{"type":"string","enum":["mp3","wav","ogg"],"default":"mp3"},"speed":{"type":"number","minimum":0.5,"maximum":2.0,"default":1.0},"idempotency_key":{"type":"string","maxLength":200,"description":"Optional. A retry with the same key and the same input within 24 h is billed once; the work is done again and returned again - nothing is stored, only a SHA-256 of the input (any size) is kept for 24 h. The same key with other input is IDEMPOTENCY_CONFLICT; after 3 retries or 1 h a key is IDEMPOTENCY_KEY_EXHAUSTED - use a new one."}},"additionalProperties":false,"required":["text"]}},{"name":"create_transcription","title":"Start a transcription","description":"Start an asynchronous transcription (German/English speech to text) of a recording. Give EITHER `audio_url` (a public https URL we download once; private/internal addresses are refused) OR `audio_base64` (the file itself, up to 10 MB decoded). Formats: mp3, wav, m4a, ogg, webm, flac, aiff, amr, wma, caf; up to 200 MB and 3 h. Optional speaker labels, structured summary, word timestamps (for subtitles), translation de↔en and spelling hints (`vocabulary`). Billed per started minute when the job finishes (free minutes first, then credit; the price is reserved now). Returns a job id (tr_…): poll get_transcription_status, then fetch once with get_transcription_result. Speech recognition and summary run at Mistral AI in the EU with zero data retention; the transcript is kept encrypted until it is fetched (24 h at most). Pass an `idempotency_key`: if the call times out (large downloads), call again with the same key - the download finishes on our side and the retry returns the same job id (IDEMPOTENCY_IN_PROGRESS while it is still running), never a second job. / Transkription mit Sprechern und Zusammenfassung.","inputSchema":{"type":"object","properties":{"audio_url":{"type":"string","format":"uri","maxLength":2048,"description":"Public https URL of the audio file."},"audio_base64":{"type":"string","description":"The audio file, base64-encoded (≤ 10 MB decoded)."},"language":{"type":"string","enum":["de","en","auto"],"default":"auto"},"speakers":{"type":"boolean","default":false,"description":"Label who spoke (S1, S2, …)."},"summary":{"type":"boolean","default":true,"description":"Structured summary (title, outline, decisions, open points)."},"timestamps":{"type":"string","enum":["segment","word"],"default":"segment","description":"word = word-level timestamps for subtitles."},"translate":{"type":"string","enum":["de","en"],"description":"Also translate the transcript into this language."},"vocabulary":{"type":"string","maxLength":2000,"description":"Comma-separated names/terms to spell correctly (merged with the account glossary)."},"idempotency_key":{"type":"string","maxLength":200,"description":"Optional. A retry with the same key and the same input within 24 h is billed once; the work is done again and returned again - nothing is stored, only a SHA-256 of the input (any size) is kept for 24 h. The same key with other input is IDEMPOTENCY_CONFLICT; after 3 retries or 1 h a key is IDEMPOTENCY_KEY_EXHAUSTED - use a new one."}},"additionalProperties":false}},{"name":"get_transcription_status","title":"Transcription status","description":"Status of a transcription job (queued, processing, done, failed, cancelled) with progress and duration. Free, and it never consumes the result - poll this (every 10-30 s) until status is done, then call get_transcription_result once.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^tr_[0-9a-fA-F-]{32,36}$","description":"Job id from create_transcription."}},"additionalProperties":false,"required":["id"]}},{"name":"get_transcription_result","title":"Fetch transcription result (once)","description":"Fetch the finished transcript: JSON (text, segments, speakers, summary, translation) or subtitles (srt/vtt, as an embedded text resource). IMPORTANT: the result is delivered exactly once and deleted from our servers by this call - keep it. A second call answers RESULT_DELIVERED; unread results expire after 24 h. If the job is not done yet you get its status instead (nothing consumed). Optional `speaker_names` (S1:Anna,S2:Ben) renames speaker labels; `lang` picks the translated subtitles. A result over ~6 MB is refused with RESPONSE_TOO_LARGE without consuming it - fetch it with the REST API then.","inputSchema":{"type":"object","properties":{"id":{"type":"string","pattern":"^tr_[0-9a-fA-F-]{32,36}$"},"format":{"type":"string","enum":["json","srt","vtt"],"default":"json"},"speaker_names":{"type":"string","maxLength":1000,"description":"e.g. S1:Anna,S2:Ben"},"lang":{"type":"string","enum":["de","en"],"description":"Translated subtitles (only with srt/vtt)."}},"additionalProperties":false,"required":["id"]}},{"name":"get_credit","title":"Credit and free allowance","description":"Show the account's prepaid credit (balance, amount reserved by running transcriptions, available), the free allowance left this month per product, prices and the current rate limit. Free; call it before large jobs or after a CREDIT_EXHAUSTED error. Top-ups happen in the dashboard (Guthaben), not via MCP.","inputSchema":{"type":"object","properties":{},"additionalProperties":false}}],"resources":[],"prompts":[]}