Skip to main content
Glama

Kurdish text to speech

synthesize_speech

Convert Kurdish text (Sorani or Kurmanji) to speech audio. Requires a TTS API key; characters are billed against your plan. Get speaker_id from list_voices called with the SAME model_version you pass here (default "v3") — ids are not shared between catalogs. Returns one complete clip: MCP cannot stream, so for a live voice agent call POST https://www.kurdishtts.com/api/tts-stream directly instead (SSE, first audio in ~1s). Max 4000 characters per call in the default mp3 container, 600 with format "wav"; free plans are capped at 500 server-side. Note: speed is caller-facing (higher = faster).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
textYesKurdish text to synthesize. Max 4000 characters (only 600 if you set format "wav"); free plans are capped at 500.
speedNoPlayback speed, higher = faster. Default 1.
formatNoAudio container. Default "mp3". Audio is returned base64-encoded inside the tool result, so the container decides how much of your context it costs: for identical speech, mp3 is ~7.5x smaller than wav and opus ~11.5x. Choose "wav" only when you need uncompressed audio, and keep the text under 600 characters if you do.
dialectNoLanguage the text is in. Normally inferred from the speaker_id prefix and safe to omit. REQUIRED to get a correct Kurmanji read from a Cast or Studio voice (cast_*, studio_*): those are tagged sorani after their reference clip but read Sorani and Kurmanji, so without this they pronounce Kurmanji with Sorani phonetics. "badini" is valid only with one of the six badini_ voices — pairing it with any other voice is refused with a 400.
speaker_idYesVoice id from list_voices, e.g. "sorani_85" or "kurmanji_6" on the default "v3" catalog. Dialect is derived from the prefix. Must come from the same model_version you pass below.
model_versionNoVoice catalog and plan entitlement. Default "v3". Explicit "v5" and the Cast/Studio voices require a paid API plan.
include_timestampsNoReturn JSON with word-level timestamps instead of an audio block. NOTE: the audio in that JSON is headerless raw PCM16 (24kHz mono), not a WAV file — add a WAV header before saving it, or it will not play.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / dialect / description
      Previous value: -"Language the text is in. Normally inferred from the speaker_id prefix and safe to omit. REQUIRED to get a correct Kurmanji read from a Cast or Studio voice (cast_*, studio_*): those are tagged sorani after their reference clip but read both dialects, so without this they pronounce Kurmanji with Sorani phonetics."New value: +"Language the text is in. Normally inferred from the speaker_id prefix and safe to omit. REQUIRED to get a correct Kurmanji read from a Cast or Studio voice (cast_*, studio_*): those are tagged sorani after their reference clip but read Sorani and Kurmanji, so without this they pronounce Kurmanji with Sorani phonetics. \"badini\" is valid only with one of the six badini_ voices — pairing it with any other voice is refused with a 400."
    • changedInput schema / properties / dialect / enum
      Previous value: -[
      -  "sorani",
      -  "kurmanji"
      -]New value: +[
      +  "sorani",
      +  "kurmanji",
      +  "badini"
      +]
  2. Changed4 schema fields changed
    • addedInput schema / properties / dialect
      Added value: +{
      +  "description": "Language the text is in. Normally inferred from the speaker_id prefix and safe to omit. REQUIRED to get a correct Kurmanji read from a Cast or Studio voice (cast_*, studio_*): those are tagged sorani after their reference clip but read both dialects, so without this they pronounce Kurmanji with Sorani phonetics.",
      +  "enum": [
      +    "sorani",
      +    "kurmanji"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / format
      Added value: +{
      +  "description": "Audio container. Default \"mp3\". Audio is returned base64-encoded inside the tool result, so the container decides how much of your context it costs: for identical speech, mp3 is ~7.5x smaller than wav and opus ~11.5x. Choose \"wav\" only when you need uncompressed audio, and keep the text under 600 characters if you do.",
      +  "enum": [
      +    "mp3",
      +    "opus",
      +    "wav"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / text / description
      Previous value: -"Kurdish text to synthesize. Max 600 characters; free plans are capped at 500."New value: +"Kurdish text to synthesize. Max 4000 characters (only 600 if you set format \"wav\"); free plans are capped at 500."
    • changedInput schema / properties / text / maxLength
      Previous value: -600New value: +4000
  3. Changed7 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / properties / context
      Removed value: -{
      -  "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"",
      -  "type": "string"
      -}
    • changedInput schema / properties / include_timestamps / description
      Previous value: -"Return JSON with word-level timestamps and base64 audio instead of audio content."New value: +"Return JSON with word-level timestamps instead of an audio block. NOTE: the audio in that JSON is headerless raw PCM16 (24kHz mono), not a WAV file — add a WAV header before saving it, or it will not play."
    • changedInput schema / properties / model_version / description
      Previous value: -"Voice catalog and plan entitlement. Default v3; every option renders on V5, and explicit v5 requires a paid API plan."New value: +"Voice catalog and plan entitlement. Default \"v3\". Explicit \"v5\" and the Cast/Studio voices require a paid API plan."
    • changedInput schema / properties / speaker_id / description
      Previous value: -"Voice id from list_voices, e.g. sorani_1 or kurmanji_236. Dialect is derived from the prefix."New value: +"Voice id from list_voices, e.g. \"sorani_85\" or \"kurmanji_6\" on the default \"v3\" catalog. Dialect is derived from the prefix. Must come from the same model_version you pass below."
    • changedInput schema / properties / text / description
      Previous value: -"Kurdish text to synthesize."New value: +"Kurdish text to synthesize. Max 600 characters; free plans are capped at 500."
    • changedInput schema / required
      Previous value: -[
      -  "text",
      -  "speaker_id",
      -  "context"
      -]New value: +[
      +  "text",
      +  "speaker_id"
      +]
  4. Changed2 schema fields changed
    • changedInput schema / properties / model_version / description
      Previous value: -"TTS model. Default v3; v4 requires a plan with v4 access."New value: +"Voice catalog and plan entitlement. Default v3; every option renders on V5, and explicit v5 requires a paid API plan."
    • changedInput schema / properties / model_version / enum
      Previous value: -[
      -  "v3",
      -  "v4"
      -]New value: +[
      +  "v3",
      +  "v4",
      +  "v5"
      +]
  5. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavioral context beyond the neutral annotations: API key requirement, per-character billing, 4000/600/500 character caps, free-plan server-side limit, one-complete-clip non-streaming behavior, model-version catalog scoping for voice IDs, and the caller-facing speed direction. This goes well beyond what annotations convey and directly shapes expectation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded: purpose, then prerequisites, then limitations and the streaming alternative, then speed semantics. It repeats a couple of schema details like default 'v3' and character limits, but each sentence carries operational importance and the structure is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only neutral annotations, the description carries the full burden of operational context and does so thoroughly: auth, billing, size limits, streaming limitation, fallback endpoint, and cross-tool prerequisites. Nothing an agent needs to decide whether to invoke it and do so correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description adds real cross-parameter meaning: speaker_id must come from the same model_version, format determines character limits and audio size tradeoffs, and speed is caller-facing. This exceeds the baseline for fully-covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact function — converting Kurdish text (Sorani or Kurmanji) to speech audio — with a specific verb, resource, and dialect scope. The description also distinguishes this from streaming/TTS streaming and transcribe-style siblings by noting MCP cannot stream, so the agent can correctly separate it from start_streaming_transcription and transcribe_audio.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs live voice agent use cases away from this tool to the direct HTTPS SSE endpoint, and instructs the agent to obtain speaker_id from list_voices with the same model_version. It does not explicitly contrast this tool with transcribe_audio or start_streaming_transcription beyond the streaming note, but the purpose clarity makes those distinctions obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources