Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,537Letters: 14Defects: 1,322counted 2 min ago
teppi

Server definition

Hash
sha256:be7321d0a32ca5fdd805d9128da74aef17fa502dc37bf8b177b892913ca5351a
What it is
What a remote MCP server returned when asked what it offers: 6 tools

The blob, as servednamed by its sha256

{ "instructions": "Kurdish text-to-speech (Sorani, Kurmanji and Badini) and speech-to-text (Sorani and Kurmanji).\n\nCREDENTIALS\n- TTS and STT are SEPARATE key spaces. Send \"Authorization: Bearer <ttsKey>\" or\n \"Bearer <ttsKey>:<sttKey>\" to use both in one session. Keys are 40 lowercase hex characters.\n- list_dialects, list_voices and get_plan need no key. synthesize_speech, transcribe_audio and\n start_streaming_transcription are billed and require one.\n- No key? Call get_plan for the plan ladder, or GET https://www.kurdishtts.com/api/plans.\n\nCHOOSING A VOICE (this is where first calls usually fail)\n- Always pass the SAME model_version to list_voices and synthesize_speech. Both default to\n \"v3\". A speaker id from one catalog does NOT exist in another.\n- Never invent a speaker_id. Take it from list_voices.\n- Free keys can only render: v3 → sorani_85, sorani_214, kurmanji_6, kurmanji_12; v4 → sorani_1, sorani_986, kurmanji_236, kurmanji_233.\n Every other id returns 403 on a free plan. model_version \"v5\" and the Cast/Studio voices\n require a paid API plan. Call get_plan to see what your own key may use.\n\nTRANSCRIBING (read before calling transcribe_audio)\n- \"dialect\" SELECTS THE DECODER. It is not a hint and nothing detects it for you. Sorani audio\n decoded as Kurmanji returns fluent, confident, WRONG text — HTTP 200, no warning, fully billed.\n- If you are not certain which dialect the audio is, pass dialect \"auto\". It transcribes with both\n decoders, returns both, and lets you pick the coherent one. It bills the audio TWICE; say so if\n the user is paying per minute.\n- Free plans truncate the returned transcript at 500 characters. The whole file is still\n transcribed and billed — only the text you get back is cut.\n\nAPI GOTCHAS\n- \"speed\" is caller-facing: HIGHER = FASTER.\n- Omit \"temperature\" entirely; sending 0.0 returns 422.\n- On v4 a successful-looking response carrying collapsed:true is a FAILED generation, not audio.\n- Cast and Studio voices (cast_*, studio_*) are tagged sorani because their reference clip is, but\n they read Sorani AND Kurmanji. To get a correct Kurmanji read from one, pass dialect \"kurmanji\" to\n synthesize_speech — without it the voice pronounces Kurmanji text with Sorani phonetics.\n- Badini (Behdini) is a THIRD dialect: Northern Kurdish written in the Arabic script. It is\n TEXT-TO-SPEECH ONLY — transcribe_audio and start_streaming_transcription do not accept it. Its six\n badini_ voices are the only ones that read it, and they read nothing else; a badini_ id resolves on\n v5 whatever model_version you send. Free keys may render badini_story_m and badini_narrator_f.\n- The \"moods\" field on a voice is not callable yet: /api/tts-proxy rejects \"emotion\" with a 400.\n- start_streaming_transcription is for LISTENING (live microphone to text), not for speaking. It\n consumes one streaming session from your plan THE INSTANT it is called.\n\nSPEAKING IN REAL TIME\n- MCP cannot stream audio: a tool result is one message, so synthesize_speech must finish the whole\n clip before you get anything. That is fine for a sentence and wrong for a live voice agent.\n- For first-audio latency, call POST https://www.kurdishtts.com/api/tts-stream directly with the same API key and\n stream_format \"sse\" (or \"pcm\"). It emits speech.audio.delta events and returns first audio in\n about a second. Keep MCP for one-shot lines; use that endpoint for conversation.\n\nLIMITS\n- synthesize_speech: 4000 characters per call in the default mp3 container, but only\n 600 with format \"wav\" (uncompressed audio hits the transport limit ~8x sooner).\n Free plans are capped at 500 characters server-side regardless of format.\n- transcribe_audio: 3MB of decoded audio — about 90 seconds of 16kHz WAV, but roughly 25 minutes\n of 64kbps MP3. Send compressed audio and you fit far more in one call. For bigger files use POST\n https://www.kurdishtts.com/api/stt-proxy (multipart) or the signed-URL job flow.", "tools": [ { "description": "Show what this connection may use. With an API key: your current plan, remaining allowance, which model_versions and speaker ids you may render. Without a key: the purchasable plan ladder and how to get a key. Free, no credits consumed. Call this FIRST when any tool returns a 401 or 403 — it is the fastest way to learn what went wrong.", "inputSchema": { "properties": {}, "type": "object" }, "name": "get_plan", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "allowed_model_versions": { "items": { "type": "string" }, "type": "array" }, "authenticated": { "type": "boolean" }, "cast_and_studio_voices": { "type": "boolean" }, "catalog": {}, "keys_url": { "type": "string" }, "next_step": { "type": "string" }, "plan": { "type": "string" }, "plan_name": { "type": "string" }, "plans_url": { "type": "string" }, "status": { "type": "string" }, "stt": {}, "tts_characters_quota": { "type": [ "number", "null" ] }, "tts_characters_remaining": { "type": [ "number", "null" ] }, "tts_characters_used": { "type": [ "number", "null" ] }, "usable_speaker_ids": { "additionalProperties": { "items": { "type": "string" }, "type": "array" }, "type": "object" } }, "required": [ "authenticated", "plans_url", "keys_url", "next_step" ], "type": "object" } }, { "description": "List the supported Kurdish dialects and their scripts. Static capability descriptor — costs nothing and needs no API key.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_dialects", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "dialects": { "items": { "additionalProperties": false, "properties": { "direction": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "script": { "type": "string" }, "speaker_id_prefix": { "type": "string" } }, "required": [ "id", "name", "script", "direction", "speaker_id_prefix" ], "type": "object" }, "type": "array" } }, "required": [ "dialects" ], "type": "object" } }, { "description": "List available Kurdish text-to-speech voices. Returns speaker ids to use with synthesize_speech. Free metadata call — no credits consumed, no API key needed. Defaults to model_version \"v3\", the SAME default synthesize_speech uses — pass the same model_version to both, because a speaker id from one catalog does not exist in another. Results are paginated; the response reports total_count and which ids a free plan may render.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "dialect": { "description": "Filter by dialect.", "enum": [ "sorani", "kurmanji", "badini" ], "type": "string" }, "gender": { "description": "Filter by voice gender.", "enum": [ "male", "female" ], "type": "string" }, "limit": { "description": "Maximum voices to return. Default 25.", "maximum": 200, "minimum": 1, "type": "integer" }, "model_version": { "description": "Voice catalog. Default \"v3\", matching synthesize_speech. v3 is the compatibility catalog; v4 is the large catalog (hundreds of voices); v5 is the curated catalog plus Cast and Studio voices, and requires a paid API plan.", "enum": [ "v3", "v4", "v5" ], "type": "string" }, "offset": { "description": "Number of voices to skip, for paging. Default 0.", "minimum": 0, "type": "integer" } }, "type": "object" }, "name": "list_voices", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "free_plan_speaker_ids": { "items": { "type": "string" }, "type": "array" }, "has_more": { "type": "boolean" }, "limit": { "type": "number" }, "model_version": { "type": "string" }, "model_version_source": { "type": "string" }, "note": { "type": "string" }, "offset": { "type": "number" }, "returned_count": { "type": "number" }, "speakers": { "items": { "additionalProperties": true, "properties": { "dialect": { "type": "string" }, "dialect_note": { "type": "string" }, "free_plan": { "type": "boolean" }, "gender": { "type": "string" }, "id": { "type": "string" }, "name": { "type": "string" }, "reads_either_dialect": { "type": "boolean" }, "requires_developer_plan": { "type": "boolean" }, "speaker_id": { "type": "string" }, "usable_by_you": { "type": [ "boolean", "null" ] } }, "required": [ "free_plan", "usable_by_you", "requires_developer_plan", "reads_either_dialect" ], "type": "object" }, "type": "array" }, "total_count": { "type": "number" }, "unique_speaker_ids": { "type": "number" }, "your_allowed_model_versions": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ] }, "your_plan": { "type": [ "string", "null" ] } }, "required": [ "model_version", "model_version_source", "your_plan", "your_allowed_model_versions", "total_count", "unique_speaker_ids", "returned_count", "offset", "limit", "has_more", "free_plan_speaker_ids", "note", "speakers" ], "type": "object" } }, { "description": "Open a live speech-to-text session for LISTENING — a microphone or audio stream you transcribe in real time. This does NOT make anything speak; to speak Kurdish use synthesize_speech, or POST https://www.kurdishtts.com/api/tts-stream for progressive audio. WARNING: calling this immediately consumes one streaming session from your STT plan quota — only call it when you are ready to connect. Returns a websocket_url: open it, stream PCM16 mono 16kHz audio chunks, send {\"type\": \"finalize\"} to flush and {\"type\": \"done\"} to close. Session duration is limited by plan.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "dialect": { "description": "Dialect that will be spoken.", "enum": [ "sorani", "kurmanji" ], "type": "string" } }, "required": [ "dialect" ], "type": "object" }, "name": "start_streaming_transcription", "outputSchema": null }, { "description": "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).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "dialect": { "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 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.", "enum": [ "sorani", "kurmanji", "badini" ], "type": "string" }, "format": { "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" }, "include_timestamps": { "description": "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.", "type": "boolean" }, "model_version": { "description": "Voice catalog and plan entitlement. Default \"v3\". Explicit \"v5\" and the Cast/Studio voices require a paid API plan.", "enum": [ "v3", "v4", "v5" ], "type": "string" }, "speaker_id": { "description": "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.", "type": "string" }, "speed": { "description": "Playback speed, higher = faster. Default 1.", "maximum": 4, "minimum": 0.25, "type": "number" }, "text": { "description": "Kurdish text to synthesize. Max 4000 characters (only 600 if you set format \"wav\"); free plans are capped at 500.", "maxLength": 4000, "minLength": 1, "type": "string" } }, "required": [ "text", "speaker_id" ], "type": "object" }, "name": "synthesize_speech", "outputSchema": null }, { "description": "Transcribe Kurdish audio (Sorani or Kurmanji) to text. Requires an STT API key; usage is metered per audio minute against your plan. IMPORTANT: dialect selects the decoder and nothing detects it for you — transcribing Sorani audio as Kurmanji returns fluent, confident, WRONG text with no error. Pass dialect \"auto\" when you are not certain, and pick the coherent transcript from the two it returns. Max 3MB of decoded audio over MCP (~90s of 16kHz WAV, but ~25 minutes of 64kbps MP3 — send compressed audio to fit more); for larger files call POST https://www.kurdishtts.com/api/stt-proxy directly (multipart).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "audio_base64": { "description": "Base64-encoded audio file (WAV, MP3, FLAC, OGG or M4A). Max 3MB decoded — compressed formats fit far more speech in that budget than WAV does.", "maxLength": 4194308, "minLength": 1, "type": "string" }, "dialect": { "description": "Which decoder to run. \"sorani\" or \"kurmanji\" when you know the dialect. \"auto\" transcribes with BOTH and returns both transcripts so you can choose — it bills the audio twice, so prefer a known dialect when you have one.", "enum": [ "sorani", "kurmanji", "auto" ], "type": "string" }, "filename": { "description": "Original filename, used to infer the format. Default audio.wav.", "type": "string" }, "mime_type": { "description": "Audio MIME type. Default audio/wav.", "type": "string" } }, "required": [ "audio_base64", "dialect" ], "type": "object" }, "name": "transcribe_audio", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:be7321d0a32ca5fdd805d9128da74aef17fa502dc37bf8b177b892913ca5351a | sha256sum