Featured

Deploy OpenClaw in 60 seconds β€” 20% off logoDeploy OpenClaw in 60 seconds β€” 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger β†’
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger β†’
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free β†’
6,000+ web scrapers for your AI agent, start free logo6,000+ web scrapers for your AI agent, start free

Apify gives your agent live web data: 6,000+ prebuilt scrapers and actors, MCP-ready. Sign up free with $5 in usage credits.

Try Apify free β†’
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data β€” no proxies, no parsers, no maintenance.

Start building free β†’
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it β€” secured from day one.

Get it set up for you β†’
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free β†’
Reach 48,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here β†’

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

supertone-inc/supertone-mcp MCP server](https://glama.ai/mcp/servers/supertone-inc/supertone-mcp/badges/score.svg)](https://glama.ai/mcp/servers/supertone-inc/supertone-mcp) 🐍 ☁️ 🍎 πŸͺŸ 🐧 - High-quality Supertone TTS API: generate speech, search & preview...

README.md

supertone-mcp

<!-- ⚠️ SERVICE DISCONTINUATION NOTICE β€” paste at the very top of the README, right below the title -->

[!CAUTION] ## ⚠️ Service Discontinuation Notice The Supertone API will be permanently shut down on August 31, 2026. After this date, all API requests will stop being served and this package will no longer work. πŸ‘‰ For the full timeline, refund policy, and details, see the End-of-Life Guide.

<!-- mcp-name: io.github.supertone-inc/supertone-mcp -->

A composable MCP toolkit for the Supertone TTS API. Rather than a single "speak this text" command, it exposes Supertone's SDK as a set of building-block tools β€” synthesis, voice discovery, preview, duration/credit prediction, usage tracking, and full voice-cloning CRUD β€” that an LLM assembles to fulfill a request. Works in Claude Desktop, Cursor, or any MCP-compatible client.

![supertone-inc/supertone-mcp MCP server](https://glama.ai/mcp/servers/supertone-inc/supertone-mcp)

Covers Korean, English, Japanese, and 31 languages total. Speed (0.5x–2.0x), pitch shift (-24 to +24 semitones), emotion styles, per-call output mode, streaming, and model selection.

Features

Synthesis

  • text_to_speech β€” Convert text to audio. Per-call control of output_mode (files / resources / both), autoplay, streaming, model, plus include_phonemes / normalized_text. Long text is auto-chunked by the SDK.
  • predict_duration β€” Estimate audio length (and credit cost) without synthesizing.

Voice discovery (preset)

  • search_voice β€” Filter the catalog by language, gender, age, use_case, style, model, name, or description.
  • get_voice β€” Full detail for one voice.
  • preview_voice β€” Sample audio URLs for a voice (filterable by language/style/model).

Custom voice cloning

  • clone_voice β€” Create a cloned voice from a local WAV/MP3 (≀3MB).
  • search_custom_voice β€” List/filter cloned voices.
  • get_custom_voice β€” Full detail for one cloned voice.
  • edit_custom_voice β€” Update name and/or description.
  • delete_custom_voice β€” Permanently delete (irreversible).

Audio assembly

  • merge_audio_files β€” Concatenate two or more local audio files (mp3/wav) into one via a bundled ffmpeg. Supports plain concat, silence gaps between clips (gap_ms), or crossfade blending (crossfade_ms). Output format auto-detected (mixed β†’ mp3) or forced via output_format. No system ffmpeg required.

Usage & credits

  • get_credit_balance β€” Remaining credits.
  • get_usage_history β€” Usage over a time window.
  • get_voice_usage β€” Usage for a specific voice.

Breaking changes & migration (0.2.0)

0.2.0 moves behavior control out of environment variables and into per-call tool parameters β€” so the LLM decides per request, not the server config.

| Before (env var) | After (per-call parameter) | Note | |------------------|----------------------------|------| | SUPERTONE_MCP_OUTPUT_MODE=files\|resources\|both | text_to_speech(output_mode=...) | Default still files | | SUPERTONE_MCP_AUTOPLAY=true | text_to_speech(autoplay=...) | Default changed true β†’ false (playback is now explicit) | | (always streamed) | text_to_speech(streaming=...) | New, default false (one-shot). streaming=true requires model="sona_speech_1" |

Other changes:

  • Default model changed sona_speech_1 β†’ sona_speech_2_flash.
  • list_voices was removed (since the discovery release) and replaced by search_voice β€” call it with no arguments to reproduce the old "list everything" behavior.
  • No more hard 300-character limit β€” longer text is auto-chunked by the SDK (credit/latency scale with length).

If you previously set SUPERTONE_MCP_OUTPUT_MODE or SUPERTONE_MCP_AUTOPLAY, remove them from your client config and pass output_mode / autoplay per call instead. (The server prints a one-time stderr notice if it sees the removed vars.)

Installation

# Using uvx (recommended)
uvx supertone-mcp

# Using pip
pip install supertone-mcp

Configuration

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "supertone-tts": {
      "command": "uvx",
      "args": ["supertone-mcp"],
      "env": {
        "SUPERTONE_API_KEY": "your-api-key-here"
      }
    }
  }
}

Cursor

Add to your Cursor MCP settings (same JSON shape as above).

Environment Variables

Only authentication and stable defaults are configured via the environment β€” all behavior is controlled per call.

| Variable | Required | Default | Description | |----------|----------|---------|-------------| | SUPERTONE_API_KEY | Yes | β€” | Your Supertone API key | | SUPERTONE_MCP_VOICE_ID | No | preset voice (Aiden, multilingual) | Default voice_id for text_to_speech / predict_duration (override per call) | | SUPERTONE_OUTPUT_DIR | No | ~/supertone-tts-output/ | Directory where audio files are saved (used by output_mode=files/both) |

Removed in 0.2.0: SUPERTONE_MCP_OUTPUT_MODE and SUPERTONE_MCP_AUTOPLAY β€” see Migration.

Output modes (text_to_speech output_mode)

| Mode | Returns | Use when | |------|---------|----------| | files (default) | Plain text with the saved file path + metadata | You want the file on disk | | resources | MCP AudioContent + TextContent (no file written) | The client renders audio inline (e.g., Claude.ai chat) | | both | File on disk and AudioContent/TextContent | You want both β€” preview inline, keep the file |

Usage Examples

The MCP client routes natural-language requests across these tools β€” the value of the toolkit is composition: the LLM chains several tools to satisfy one request.

Example 1 β€” Discover β†’ preview β†’ estimate cost β†’ synthesize

"Find a calm Korean female voice, let me hear a sample, check the cost, then make this announcement as an mp3."

The LLM assembles: `` search_voice(language="ko", gender="female", style="neutral") # find candidates β†’ preview_voice(voice_id) # sample URLs to confirm the voice β†’ predict_duration(text, voice_id) + get_credit_balance() # gauge cost before spending β†’ text_to_speech(text, voice_id, output_format="mp3", output_mode="files") # synthesize ``

Example 2 β€” Clone my voice β†’ use it right away

"Make a cloned voice from ~/recordings/sample.wav named MyVoice, then read this greeting with it and play it for me."

The LLM assembles: `` clone_voice(name="MyVoice", audio_path="~/recordings/sample.wav") # create the cloned voice β†’ get_custom_voice(voice_id) # confirm it was created β†’ text_to_speech(text, voice_id=<cloned>, autoplay=true) # synthesize, then play immediately ``

autoplay is a per-call parameter (default false), so playback happens only when explicitly requested.

Tool Parameters

text_to_speech

| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | text | string | Yes | β€” | Text to convert (long text is auto-chunked by the SDK) | | voice_id | string | No | env or preset | Voice identifier (browse via search_voice) | | language | string | No | ko | Language code β€” one of 31 (ko, en, ja, …) | | output_format | string | No | mp3 | mp3 or wav | | model | string | No | sona_speech_2_flash | sona_speech_1, sona_speech_2, sona_speech_2_flash, sona_speech_2t, sona_speech_3t, supertonic_api_1, supertonic_api_3 | | speed | float | No | 1.0 | 0.5–2.0 | | pitch_shift | int | No | 0 | -24 to +24 semitones | | style | string | No | β€” | Emotion style (varies by voice) | | output_mode | string | No | files | files, resources, or both (see Output modes) | | autoplay | bool | No | false | Play the audio locally after synthesis (macOS afplay) | | streaming | bool | No | false | Stream synthesis. Only supported by model="sona_speech_1" | | include_phonemes | bool | No | false | Return phoneme timing data alongside the audio | | normalized_text | string | No | β€” | Pre-normalized text (only used by sona_speech_2 / sona_speech_2_flash) |

predict_duration

Same core parameter schema as text_to_speech (long text auto-chunked). Returns "Predicted duration: 2.34s (credit usage is proportional to duration).".

search_voice

All parameters optional. With no filters β†’ full catalog. With any filter β†’ first response line is Filters applied: ....

| Parameter | Type | Description | |-----------|------|-------------| | language | string | e.g., ko, en, ja | | gender | string | e.g., male, female | | age | string | e.g., young_adult, child | | use_case | string | e.g., narration, advertisement | | style | string | e.g., neutral, happy | | model | string | e.g., sona_speech_2_flash | | name | string | partial match | | description | string | partial match |

get_voice / preview_voice

| Tool | Required | Optional | |------|----------|----------| | get_voice | voice_id | β€” | | preview_voice | voice_id | language, style, model (filter samples) |

clone_voice

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | name | string | Yes | Display name (non-empty) | | audio_path | string | Yes | Local WAV or MP3 path (≀3MB). Supports ~ expansion | | description | string | No | Optional note |

Custom voice CRUD

| Tool | Required | Optional | |------|----------|----------| | search_custom_voice | β€” | name, description (partial match) | | get_custom_voice | voice_id | β€” | | edit_custom_voice | voice_id | name, description (at least one required) | | delete_custom_voice | voice_id | β€” (IRREVERSIBLE) |

Usage & credits

| Tool | Required | Optional | |------|----------|----------| | get_credit_balance | β€” | β€” | | get_usage_history | β€” | β€” (reports a recent default window) | | get_voice_usage | voice_id | β€” |

merge_audio_files

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | input_paths | string[] | Yes | Two or more local mp3/wav paths (~ expansion supported). A single file is returned as-is | | gap_ms | int | No | Silence (ms) inserted at each junction. Default 0. Mutually exclusive with crossfade_ms | | crossfade_ms | int | No | Crossfade blend (ms) at each junction. Default 0. Mutually exclusive with gap_ms | | output_format | string | No | Force mp3 or wav. If omitted: all-same-ext β†’ that ext; mixed β†’ mp3 |

Development

# Clone and install
git clone https://github.com/supertone-inc/supertone-mcp.git
cd supertone-mcp
uv sync

# Run tests
uv run pytest -q

# Run with coverage
uv run pytest --cov=src --cov-report=term-missing

License

MIT

See related servers & alternatives β†’

Related MCP servers

Browse all β†’

Related guides

Hand-picked reading to help you choose and use Search servers.