tts-mcp-server 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. tts_mcp_server-0.1.1/.gitignore +19 -0
  2. tts_mcp_server-0.1.1/CHANGELOG.md +41 -0
  3. tts_mcp_server-0.1.1/Dockerfile +10 -0
  4. tts_mcp_server-0.1.1/LICENSE +21 -0
  5. tts_mcp_server-0.1.1/PKG-INFO +361 -0
  6. tts_mcp_server-0.1.1/PUBLISHING.md +143 -0
  7. tts_mcp_server-0.1.1/README.md +320 -0
  8. tts_mcp_server-0.1.1/docs/images/voiceover-captions-mcp-architecture-diagram.png +0 -0
  9. tts_mcp_server-0.1.1/docs/images/voiceover-captions-mcp-architecture-diagram.svg +74 -0
  10. tts_mcp_server-0.1.1/docs/images/voiceover-captions-mcp-server-terminal-demo.png +0 -0
  11. tts_mcp_server-0.1.1/docs/images/voiceover-captions-mcp-server-terminal-demo.svg +118 -0
  12. tts_mcp_server-0.1.1/examples/list_tools.py +30 -0
  13. tts_mcp_server-0.1.1/glama.json +4 -0
  14. tts_mcp_server-0.1.1/llms.txt +39 -0
  15. tts_mcp_server-0.1.1/pyproject.toml +69 -0
  16. tts_mcp_server-0.1.1/server.json +83 -0
  17. tts_mcp_server-0.1.1/skills/miragea-voiceover/SKILL.md +91 -0
  18. tts_mcp_server-0.1.1/smithery.yaml +30 -0
  19. tts_mcp_server-0.1.1/src/miragea_voice_mcp/__init__.py +5 -0
  20. tts_mcp_server-0.1.1/src/miragea_voice_mcp/__main__.py +4 -0
  21. tts_mcp_server-0.1.1/src/miragea_voice_mcp/captions.py +300 -0
  22. tts_mcp_server-0.1.1/src/miragea_voice_mcp/cli.py +100 -0
  23. tts_mcp_server-0.1.1/src/miragea_voice_mcp/client.py +364 -0
  24. tts_mcp_server-0.1.1/src/miragea_voice_mcp/config.py +92 -0
  25. tts_mcp_server-0.1.1/src/miragea_voice_mcp/server.py +658 -0
  26. tts_mcp_server-0.1.1/tests/__init__.py +0 -0
  27. tts_mcp_server-0.1.1/tests/conftest.py +163 -0
  28. tts_mcp_server-0.1.1/tests/test_captions.py +78 -0
  29. tts_mcp_server-0.1.1/tests/test_captions_wordsplit.py +32 -0
  30. tts_mcp_server-0.1.1/tests/test_cli_and_stdio.py +108 -0
  31. tts_mcp_server-0.1.1/tests/test_tools.py +354 -0
@@ -0,0 +1,19 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .coverage
10
+ .env
11
+ *.mp3
12
+ *.wav
13
+ *.srt
14
+ *.vtt
15
+ # real example outputs are committed on purpose
16
+ !examples/**/*.mp3
17
+ !examples/**/*.wav
18
+ !examples/**/*.srt
19
+ !examples/**/*.vtt
@@ -0,0 +1,41 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
5
+ [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.1] - 2026-11-08
10
+
11
+ ### Changed
12
+ - Published on PyPI and Docker Hub as **`tts-mcp-server`** (`uvx tts-mcp-server`, `docker run -i --rm -e MIRAGEA_API_KEY miragea/tts-mcp-server`). The `miragea-voice-mcp` command stays installed as an alias, so existing configs keep working.
13
+ - Client snippets now use the server key `tts` and the PyPI package instead of a git URL.
14
+ - MCP Registry name is `io.github.RTY2345RR/tts-mcp-server` (PyPI + OCI packages).
15
+
16
+ ### Fixed
17
+ - Subtitles: words that speech recognition cut across two cues ("an" | "d bruised") are re-joined at word boundaries, and stray punctuation-only cues are merged. SRT, VTT and JSON are now always rendered from the cleaned segments.
18
+
19
+ ### Added
20
+ - `examples/` with real outputs: YouTube voiceover with SRT, two-voice dialogue, and transcription to captions.
21
+
22
+ ## [0.1.0] - 2026-11-08
23
+
24
+ ### Added
25
+ - stdio MCP server `miragea-voice-mcp`, runnable with `uvx --from git+https://github.com/RTY2345RR/miragea-voice-mcp miragea-voice-mcp` (PyPI release `uvx miragea-voice-mcp` coming soon).
26
+ - Tools: `miragea_get_capabilities`, `miragea_list_voices`, `miragea_text_to_speech`,
27
+ `miragea_transcribe`, `miragea_script_to_voiceover`, `miragea_get_task`, `miragea_list_tasks`.
28
+ - One-shot script → voiceover + SRT/VTT captions, with script-accurate caption wording and
29
+ short-form cue splitting (`max_caption_chars`).
30
+ - Local WebVTT rendering from Miragea's timed segments.
31
+ - No duplicate jobs on retry: idempotency keys on every job, automatic retries reuse the same key,
32
+ timeouts return a resumable `task_id`, pre-flight validation against live capabilities.
33
+ - `--check` (read-only key/API check) and `--print-config` for Claude Desktop, Claude Code, Cursor,
34
+ Codex, VS Code and Windsurf.
35
+ - Compatible with MCP Python SDK 1.x (`FastMCP`) and 2.x (`MCPServer`).
36
+ - Companion Agent Skill `skills/miragea-voiceover`.
37
+ - Registry metadata: `server.json`, `smithery.yaml`, `glama.json`, `llms.txt`.
38
+
39
+ [Unreleased]: https://github.com/RTY2345RR/miragea-voice-mcp/compare/v0.1.1...HEAD
40
+ [0.1.1]: https://github.com/RTY2345RR/miragea-voice-mcp/compare/v0.1.0...v0.1.1
41
+ [0.1.0]: https://github.com/RTY2345RR/miragea-voice-mcp/releases/tag/v0.1.0
@@ -0,0 +1,10 @@
1
+ # Minimal image for registries that build MCP servers in containers (Glama, Smithery).
2
+ FROM python:3.12-slim
3
+ ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 MIRAGEA_OUTPUT_DIR=/data
4
+ WORKDIR /app
5
+ COPY pyproject.toml README.md LICENSE ./
6
+ COPY src ./src
7
+ RUN pip install --no-cache-dir . && mkdir -p /data
8
+ VOLUME ["/data"]
9
+ LABEL io.modelcontextprotocol.server.name="io.github.RTY2345RR/tts-mcp-server"
10
+ ENTRYPOINT ["tts-mcp-server"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Miragea
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,361 @@
1
+ Metadata-Version: 2.5
2
+ Name: tts-mcp-server
3
+ Version: 0.1.1
4
+ Summary: TTS MCP server: text-to-speech, AI voiceover, voice cloning and SRT/VTT subtitles for Claude, Cursor, Codex and other AI agents.
5
+ Project-URL: Homepage, https://github.com/RTY2345RR/miragea-voice-mcp
6
+ Project-URL: Demo, https://huggingface.co/spaces/miragea/miragea-voice-mcp
7
+ Project-URL: Voice engine, https://miragea.ai
8
+ Project-URL: PyPI, https://pypi.org/project/tts-mcp-server/
9
+ Project-URL: Docker, https://hub.docker.com/r/miragea/tts-mcp-server
10
+ Project-URL: Repository, https://github.com/RTY2345RR/miragea-voice-mcp
11
+ Project-URL: Documentation, https://github.com/RTY2345RR/miragea-voice-mcp#readme
12
+ Project-URL: Issues, https://github.com/RTY2345RR/miragea-voice-mcp/issues
13
+ Project-URL: Changelog, https://github.com/RTY2345RR/miragea-voice-mcp/blob/main/CHANGELOG.md
14
+ Project-URL: API keys, https://miragea.ai/workspace/api
15
+ Author: Miragea
16
+ License-Expression: MIT
17
+ License-File: LICENSE
18
+ Keywords: ai-voice,ai-voiceover,captions,claude,codex,cursor,elevenlabs-alternative,mcp,mcp-server,miragea,model-context-protocol,speech-to-text,srt,subtitles,text-to-speech,text-to-speech-mcp,transcription,tts,tts-mcp,tts-mcp-server,video-creator,voice-cloning,voiceover,vtt,youtube-shorts
19
+ Classifier: Development Status :: 4 - Beta
20
+ Classifier: Environment :: Console
21
+ Classifier: Intended Audience :: Developers
22
+ Classifier: Operating System :: OS Independent
23
+ Classifier: Programming Language :: Python :: 3
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Conversion
29
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
30
+ Classifier: Topic :: Multimedia :: Video
31
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
32
+ Requires-Python: >=3.10
33
+ Requires-Dist: httpx>=0.27
34
+ Requires-Dist: mcp<3,>=1.9
35
+ Provides-Extra: dev
36
+ Requires-Dist: anyio>=4; extra == 'dev'
37
+ Requires-Dist: build; extra == 'dev'
38
+ Requires-Dist: pytest>=8; extra == 'dev'
39
+ Requires-Dist: twine; extra == 'dev'
40
+ Description-Content-Type: text/markdown
41
+
42
+ # TTS MCP Server — text-to-speech, AI voiceover, voice cloning and SRT/VTT subtitles for Claude, Cursor and Codex
43
+
44
+ [![CI](https://github.com/RTY2345RR/miragea-voice-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/RTY2345RR/miragea-voice-mcp/actions/workflows/ci.yml)
45
+ [![Release](https://img.shields.io/github/v/release/RTY2345RR/miragea-voice-mcp)](https://github.com/RTY2345RR/miragea-voice-mcp/releases)
46
+ [![PyPI](https://img.shields.io/pypi/v/tts-mcp-server.svg)](https://pypi.org/project/tts-mcp-server/)
47
+ [![Docker](https://img.shields.io/badge/docker-miragea%2Ftts--mcp--server-2496ED.svg)](https://hub.docker.com/r/miragea/tts-mcp-server)
48
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)
49
+ [![Hugging Face Space](https://img.shields.io/badge/%F0%9F%A4%97%20Demo-Hugging%20Face%20Space-yellow.svg)](https://huggingface.co/spaces/miragea/miragea-voice-mcp)
50
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
51
+ [![MCP](https://img.shields.io/badge/MCP-stdio-black.svg)](https://modelcontextprotocol.io)
52
+
53
+ **tts-mcp-server is an open-source text-to-speech (TTS) MCP server that gives AI agents a voice.** It lets Claude Desktop, Claude Code, Cursor, OpenAI Codex, VS Code and Windsurf turn a script into a narration audio file (MP3, WAV, FLAC, Opus, AAC or PCM) plus matching SRT and WebVTT subtitles in one [Model Context Protocol](https://modelcontextprotocol.io) tool call. It also clones a voice from a reference audio URL, uses the voices saved in your account, and transcribes any local audio or video file into captions. Text-to-speech, voice cloning and speech recognition run on the [Miragea](https://miragea.ai) voice engine. Install it with one command, `uvx tts-mcp-server`; it needs only a `MIRAGEA_API_KEY` and is MIT licensed.
54
+
55
+ **Install:** `uvx tts-mcp-server` · `pip install tts-mcp-server` · `docker run -i --rm -e MIRAGEA_API_KEY miragea/tts-mcp-server` · **Try it in the browser:** [live demo on Hugging Face Spaces](https://huggingface.co/spaces/miragea/miragea-voice-mcp) · **Source:** [github.com/RTY2345RR/miragea-voice-mcp](https://github.com/RTY2345RR/miragea-voice-mcp)
56
+
57
+ > Formerly published as `miragea-voice-mcp`. The `miragea-voice-mcp` command is still installed as an alias, so existing configs keep working.
58
+
59
+ <!-- mcp-name: io.github.RTY2345RR/tts-mcp-server -->
60
+
61
+ ![Terminal screenshot: installing the voiceover and captions MCP server with uvx from GitHub, printing the Claude Code config, and listing its 7 MCP tools (text-to-speech, voice cloning, transcription to SRT/VTT)](docs/images/voiceover-captions-mcp-server-terminal-demo.svg)
62
+
63
+ ```text
64
+ You: Turn script.txt into a calm voiceover with captions for a YouTube Short.
65
+ Agent: miragea_script_to_voiceover(script_file="script.txt", actor_id="…", tags=["calm"])
66
+ → ~/Miragea/my-short.mp3 ~/Miragea/my-short.srt ~/Miragea/my-short.vtt
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Contents
72
+
73
+ - [How it works](#how-it-works)
74
+ - [Features](#features)
75
+ - [Quickstart (60 seconds)](#quickstart-60-seconds)
76
+ - [Client setup: Claude Desktop, Claude Code, Cursor, Codex, VS Code, Windsurf](#client-setup)
77
+ - [Tools reference](#tools-reference)
78
+ - [Examples with real output](#examples)
79
+ - [Example prompts](#example-prompts)
80
+ - [Configuration](#configuration)
81
+ - [How it compares](#how-it-compares)
82
+ - [FAQ](#faq)
83
+ - [Troubleshooting](#troubleshooting)
84
+ - [Agent Skill](#companion-agent-skill)
85
+ - [Development](#development)
86
+ - [Links](#links)
87
+
88
+ ## How it works
89
+
90
+ ![Architecture diagram of the voiceover and captions MCP server: an AI agent such as Claude, Cursor or Codex calls tts-mcp-server over MCP stdio; the server calls the Miragea voice engine for text-to-speech, voice cloning and speech recognition, and writes MP3 audio plus SRT and WebVTT captions](docs/images/voiceover-captions-mcp-architecture-diagram.svg)
91
+
92
+ 1. Your AI agent (Claude Desktop, Claude Code, Cursor, OpenAI Codex, VS Code or Windsurf) calls a tool such as `miragea_script_to_voiceover` over the Model Context Protocol (stdio).
93
+ 2. The server checks the request against the live voice-engine capabilities (models, emotion tags, formats, text length) and adds an idempotency key.
94
+ 3. The [Miragea](https://miragea.ai) voice engine generates the narration (or clones a voice from your reference clip), then runs speech recognition on the new audio for timestamps.
95
+ 4. The server writes `.mp3` + `.srt` + `.vtt` side by side, with captions that keep your exact script wording, ready to import into your video editor.
96
+
97
+ ## Features
98
+
99
+ - **Script → voiceover + captions in one call.** `miragea_script_to_voiceover` generates the narration, times captions by running Miragea speech recognition on the new audio, and writes `.mp3` + `.srt` + `.vtt` side by side, ready for CapCut, Premiere Pro, DaVinci Resolve, YouTube, TikTok, Reels and Shorts.
100
+ - **Captions spelled like your script.** Recognition can mishear brand names ("Miragea" → "Mirage ear"). By default the server keeps the recognized *timing* but puts back your *exact script wording*, snapping cue breaks to sentence ends.
101
+ - **Short-form friendly caption lengths.** `max_caption_chars` (default 42 for scripts) splits long cues and shares their time by length, so captions stay readable on vertical video.
102
+ - **Two voice sources.** Use a voice already saved in your Miragea account (`actor_id`), or clone from a public reference audio URL (`reference_audio_url` + optional `reference_text`).
103
+ - **Expressive or standard models, emotion tags, speed 0.25–4×.** Options are read live from `/capabilities`, and every argument is validated *before* a job is submitted.
104
+ - **Subtitles for any audio or video file.** `miragea_transcribe` uploads mp3/wav/m4a/mp4/mov… and saves SRT, VTT, TXT or JSON (text, language, timed segments).
105
+ - **No duplicate jobs on retry.** Every job carries an `Idempotency-Key`; network errors and 502/503/504 are retried with the *same* key, so a retry never creates a second job. Timeouts return the `task_id` so the agent resumes with `miragea_get_task` instead of resubmitting.
106
+ - **Never overwrites files.** Existing outputs get `-2`, `-3`… suffixes.
107
+ - **Secret-safe.** The key is read from the environment, never logged, never echoed in errors, never sent to the audio download host, and API redirects are not followed.
108
+ - **Starts without a key.** Tool listing works with no key (handy for registries and inspectors); calls return a clear "set MIRAGEA_API_KEY" message.
109
+ - **Works on MCP Python SDK 1.x and 2.x**, Python 3.10–3.13, macOS, Windows and Linux. Two dependencies: `mcp` and `httpx`.
110
+
111
+ ## Quickstart (60 seconds)
112
+
113
+ 1. **Get a voice-engine key.** The server uses [Miragea](https://miragea.ai) for voiceover, voice cloning and recognition. Sign in and create an API key at **[miragea.ai/workspace/api](https://miragea.ai/workspace/api)**. Setup guide: **Install https://miragea.ai/skills/miragea-audio/install.md**.
114
+ 2. **Install [uv](https://docs.astral.sh/uv/)** if you don't have it: `curl -LsSf https://astral.sh/uv/install.sh | sh` (macOS/Linux) or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"` (Windows).
115
+ 3. **Add the server to your client** (Claude Code shown; others below):
116
+
117
+ ```bash
118
+ claude mcp add tts -s user -e MIRAGEA_API_KEY=<your-miragea-api-key> -- uvx tts-mcp-server
119
+ ```
120
+
121
+ 4. **Verify** (read-only, creates no job):
122
+
123
+ ```bash
124
+ MIRAGEA_API_KEY=<your-miragea-api-key> uvx tts-mcp-server --check
125
+ ```
126
+
127
+ Then ask your agent: *"List my Miragea voices, then read 'Welcome back to the channel!' in the first English one."*
128
+
129
+ > Prefer pip? `pip install tts-mcp-server` and use `"command": "tts-mcp-server"` with no `args` in the snippets below. Prefer Docker? Use `"command": "docker"` with `"args": ["run", "-i", "--rm", "-e", "MIRAGEA_API_KEY", "-v", "/path/to/output:/data", "miragea/tts-mcp-server"]`.
130
+
131
+ ## Client setup
132
+
133
+ Print any snippet with `uvx tts-mcp-server --print-config <client>` (`claude-desktop`, `cursor`, `claude-code`, `codex`, `vscode`, `windsurf`). Replace `<your-miragea-api-key>` and restart the client.
134
+
135
+ ### Claude Desktop
136
+
137
+ Settings → Developer → Edit Config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\Claude\claude_desktop_config.json` on Windows):
138
+
139
+ ```json
140
+ {
141
+ "mcpServers": {
142
+ "tts": {
143
+ "command": "uvx",
144
+ "args": ["tts-mcp-server"],
145
+ "env": { "MIRAGEA_API_KEY": "<your-miragea-api-key>" }
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### Claude Code
152
+
153
+ ```bash
154
+ claude mcp add tts -s user -e MIRAGEA_API_KEY=<your-miragea-api-key> -- uvx tts-mcp-server
155
+ ```
156
+
157
+ ### Cursor
158
+
159
+ `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project) — same JSON as Claude Desktop.
160
+
161
+ ### OpenAI Codex (CLI and IDE extension)
162
+
163
+ `~/.codex/config.toml`:
164
+
165
+ ```toml
166
+ [mcp_servers.tts]
167
+ command = "uvx"
168
+ args = ["tts-mcp-server"]
169
+ tool_timeout_sec = 900
170
+ env = { MIRAGEA_API_KEY = "<your-miragea-api-key>" }
171
+ ```
172
+
173
+ `tool_timeout_sec` matters: voiceover jobs can take longer than Codex's default tool timeout.
174
+
175
+ ### VS Code (Copilot agent mode)
176
+
177
+ `.vscode/mcp.json`:
178
+
179
+ ```json
180
+ {
181
+ "servers": {
182
+ "tts": {
183
+ "type": "stdio",
184
+ "command": "uvx",
185
+ "args": ["tts-mcp-server"],
186
+ "env": { "MIRAGEA_API_KEY": "<your-miragea-api-key>" }
187
+ }
188
+ }
189
+ }
190
+ ```
191
+
192
+ ### Windsurf
193
+
194
+ `~/.codeium/windsurf/mcp_config.json` — same JSON as Claude Desktop.
195
+
196
+ ## Tools reference
197
+
198
+ | Tool | What it does |
199
+ | --- | --- |
200
+ | `miragea_get_capabilities` | Live models (`expressive`, `standard`), emotion tags per model, formats, speed range, max characters per request, subtitle formats and upload limits. **Call first.** |
201
+ | `miragea_list_voices` | Voices saved in your account (`actor_id`, `name`, `language`), paged; `search` finds a name across pages. |
202
+ | `miragea_text_to_speech` | Text (or `text_file`) → audio file. Voice via `actor_id` **or** `reference_audio_url` (+ `reference_text`). Options: `model`, `tags`, `speed`, `format`, `language`, `output_path`, `wait`. |
203
+ | `miragea_transcribe` | Local audio/video → subtitles in `srt`, `vtt`, `txt`, `json`; `max_caption_chars` for short cues. |
204
+ | `miragea_script_to_voiceover` | Script → audio + captions (SRT + VTT by default). `caption_text="script"` (exact wording) or `"recognized"`; `captions=false` for audio only; `name`, `output_dir`. |
205
+ | `miragea_get_task` | Check or resume any job by `task_id`; with `wait=true` it saves the audio or subtitles. |
206
+ | `miragea_list_tasks` | Recent jobs, newest first. |
207
+
208
+ Every generation tool returns `task_id`, `status` and the `idempotency_key` it used, plus the saved file paths.
209
+
210
+ ## Examples
211
+
212
+ Real outputs from this server (Miragea voice engine), committed in [`examples/`](https://github.com/RTY2345RR/miragea-voice-mcp/tree/main/examples). Voices are cloned from [CMU ARCTIC](http://www.festvox.org/cmu_arctic/) reference clips (licensed free for any use); the audiobook clip is from [LibriSpeech](https://www.openslr.org/12) (CC BY 4.0).
213
+
214
+ | Example | Prompt to your agent | Tools | Output |
215
+ | --- | --- | --- | --- |
216
+ | [YouTube voiceover with SRT](https://github.com/RTY2345RR/miragea-voice-mcp/tree/main/examples/youtube-voiceover-srt) | "Read `script.txt` as a YouTube intro in a clear male voice and give me SRT captions." | `miragea_text_to_speech` → `miragea_transcribe` | [MP3](https://github.com/RTY2345RR/miragea-voice-mcp/raw/main/examples/youtube-voiceover-srt/youtube-intro.mp3) · [SRT](https://github.com/RTY2345RR/miragea-voice-mcp/blob/main/examples/youtube-voiceover-srt/youtube-intro.srt) |
217
+ | [Two-voice dialogue](https://github.com/RTY2345RR/miragea-voice-mcp/tree/main/examples/two-voice-dialogue) | "Make a two-line dialogue: one male, one female voice, then join them with captions." | `miragea_text_to_speech` ×2 (voice cloning) | [MP3](https://github.com/RTY2345RR/miragea-voice-mcp/raw/main/examples/two-voice-dialogue/dialogue.mp3) · [SRT](https://github.com/RTY2345RR/miragea-voice-mcp/blob/main/examples/two-voice-dialogue/dialogue.srt) |
218
+ | [Transcribe audio to captions](https://github.com/RTY2345RR/miragea-voice-mcp/tree/main/examples/transcribe-to-captions) | "Create SRT and VTT subtitles for `audiobook-clip.flac`." | `miragea_transcribe` | [SRT](https://github.com/RTY2345RR/miragea-voice-mcp/blob/main/examples/transcribe-to-captions/audiobook-clip.srt) · [VTT](https://github.com/RTY2345RR/miragea-voice-mcp/blob/main/examples/transcribe-to-captions/audiobook-clip.vtt) |
219
+
220
+ Transcription output (`audiobook-clip.srt`), with words kept whole across cues:
221
+
222
+ ```srt
223
+ 1
224
+ 00:00:00,480 --> 00:00:01,987
225
+ He hoped there would be stew for
226
+
227
+ 2
228
+ 00:00:01,987 --> 00:00:03,987
229
+ dinner, turnips and carrots, and
230
+
231
+ 3
232
+ 00:00:03,987 --> 00:00:06,063
233
+ bruised potatoes and fat mutton
234
+ ```
235
+
236
+ ## Example prompts
237
+
238
+ - "Make a 30-second product-ad voiceover from `ad.txt` with my *Nova* voice, happy tone, 1.1× speed, and give me SRT + VTT with short captions."
239
+ - "Clone the voice at `https://example.com/me.wav` (it says: 'Hi, I'm Sam and this is my test.') and narrate `intro.md` as WAV."
240
+ - "Create subtitles for `~/Videos/vlog.mp4` as SRT and VTT."
241
+ - "That voiceover timed out — resume task `…` and save it to `~/Desktop/episode-3.mp3`."
242
+ - "What models and emotion tags does my Miragea account have, and how many characters can I send per request?"
243
+
244
+ ## Configuration
245
+
246
+ | Variable | Default | Purpose |
247
+ | --- | --- | --- |
248
+ | `MIRAGEA_API_KEY` | — (required for calls) | Your key from [miragea.ai/workspace/api](https://miragea.ai/workspace/api). |
249
+ | `MIRAGEA_OUTPUT_DIR` | `~/Miragea` | Where relative output paths and default file names go. Absolute paths are used as given. |
250
+ | `MIRAGEA_BASE_URL` | `https://miragea.ai/v1` | API root including `/v1` (for private deployments). |
251
+ | `MIRAGEA_WAIT_TIMEOUT` | `600` | Max seconds a tool waits for a job before returning its `task_id`. |
252
+ | `MIRAGEA_HTTP_TIMEOUT` | `60` | Per-request HTTP timeout in seconds. |
253
+
254
+ ## How it compares
255
+
256
+ Honest snapshot from each project's public README (November 2026). "–" means not offered or not documented.
257
+
258
+ | | **This server** | [elevenlabs-mcp](https://github.com/elevenlabs/elevenlabs-mcp) (local) | [AllVoiceLab-MCP](https://github.com/allvoicelab/AllVoiceLab-MCP) | [better-tts-mcp](https://github.com/CatVinci-Studio/better-tts-mcp) |
259
+ | --- | --- | --- | --- | --- |
260
+ | Status | Active | Deprecated in favor of ElevenLabs' hosted MCP | Active | Active |
261
+ | Voice engine | Miragea | ElevenLabs API | AllVoiceLab API | Microsoft Edge read-aloud (unofficial, no key) |
262
+ | One-command install | `uvx tts-mcp-server` | `uvx elevenlabs-mcp` | `uvx allvoicelab-mcp` | `uvx better-tts-mcp` |
263
+ | Required config | 1 env var | 1 env var | Key **and** matching region domain | None |
264
+ | Ready snippets for Claude Desktop / Claude Code / Cursor / Codex / VS Code / Windsurf | All six + `--print-config` | Claude Desktop + `--print` helper | Claude Desktop, Cursor | Claude Desktop, Claude Code |
265
+ | Voice cloning from a sample | Reference audio URL | Yes (voice library) | Yes | – |
266
+ | Subtitles from your own audio/video (speech) | SRT, VTT, TXT, JSON | Speech-to-text (text) | OCR of burned-in subtitles | – |
267
+ | Script → audio **+ captions** in one call | Yes | – | – | Audio + SRT |
268
+ | Captions keep exact script spelling | Yes | – | – | Yes (from TTS) |
269
+ | No duplicate jobs on retry (idempotency keys) + resume by task ID | Yes | – | – | – |
270
+
271
+ Where the others are ahead: ElevenLabs and AllVoiceLab cover more audio tasks (sound effects, voice changer, dubbing, agents), and better-tts-mcp needs no key and offers batch and multi-voice synthesis. This server stays focused on the video-creator loop of **script → voiceover → captions** and does that one loop end to end.
272
+
273
+ ## FAQ
274
+
275
+ ### What is a TTS MCP server?
276
+ A TTS (text-to-speech) MCP server is a small program that exposes speech synthesis as tools over the Model Context Protocol, so an AI agent such as Claude or Cursor can turn text into an audio file on request. tts-mcp-server adds voice cloning, speech-to-text subtitles and a one-call script → voiceover + SRT/VTT workflow on top.
277
+
278
+ ### How do I install a text to speech MCP server in Claude Code?
279
+ Run `claude mcp add tts -s user -e MIRAGEA_API_KEY=<your-miragea-api-key> -- uvx tts-mcp-server`, then ask Claude to "read this paragraph aloud and save it as MP3". Use `uvx tts-mcp-server --print-config <client>` for Claude Desktop, Cursor, Codex, VS Code or Windsurf.
280
+
281
+ ### Is there a free text to speech MCP server?
282
+ The server itself is free, open-source software (MIT). Speech is generated by the Miragea voice engine, so you need a Miragea API key. If you need a keyless option, [better-tts-mcp](https://github.com/CatVinci-Studio/better-tts-mcp) uses Microsoft Edge read-aloud, and [kokoro-tts-mcp](https://github.com/mberg/kokoro-tts-mcp) runs a local model; neither does voice cloning or subtitles from your own audio.
283
+
284
+ ### Is this an alternative to the ElevenLabs MCP server?
285
+ Yes, for the voiceover use case. Like [elevenlabs-mcp](https://github.com/elevenlabs/elevenlabs-mcp) it installs with `uvx` and gives agents text-to-speech and voice cloning; unlike it, one tool call returns the audio together with SRT/VTT captions that keep your exact script wording. ElevenLabs covers more audio tasks (sound effects, voice changer, conversational agents); see [How it compares](#how-it-compares).
286
+
287
+ ### How do I add text-to-speech to Claude Desktop?
288
+ Add the `tts` block from [Claude Desktop](#claude-desktop) to `claude_desktop_config.json`, put your Miragea API key in `env`, and restart Claude. Claude can then call `miragea_text_to_speech` and save MP3 files to `~/Miragea`.
289
+
290
+ ### How do I generate SRT subtitles from a video with an AI agent?
291
+ Ask the agent to run `miragea_transcribe` on the file (for example, *"make SRT and VTT subtitles for ~/Videos/clip.mp4"*). The server uploads it to Miragea speech recognition and writes `clip.srt` / `clip.vtt`.
292
+
293
+ ### Can an MCP server make a voiceover with matching captions for YouTube Shorts or TikTok?
294
+ Yes. `miragea_script_to_voiceover` returns the audio plus SRT/VTT captions timed to that audio, with cues capped at 42 characters by default for vertical video. Import both into CapCut, Premiere Pro or DaVinci Resolve.
295
+
296
+ ### Does it support voice cloning?
297
+ Yes. Pass `reference_audio_url` (a public http(s) link to a clean sample) and, ideally, `reference_text` with the exact words spoken in it. Supplying the exact text gives the most faithful clone; if you omit it, Miragea recognizes it automatically. Only clone voices you have the right to use.
298
+
299
+ ### Does it work with Cursor, Claude Code and OpenAI Codex?
300
+ Yes, with any MCP client that supports stdio servers. Run `uvx tts-mcp-server --print-config cursor` (or `claude-code`, `codex`, `vscode`, `windsurf`, `claude-desktop`) for a ready snippet.
301
+
302
+ ### Which audio formats can I export?
303
+ MP3 (default), WAV, FLAC, Opus, AAC and PCM. Subtitles: SRT, WebVTT, plain text, and JSON with timed segments.
304
+
305
+ ### Can I use it without an API key or with another TTS engine?
306
+ No. Miragea is the only voice engine; there is no hidden fallback. Without a key the server still starts and lists its tools, and every call explains how to add the key.
307
+
308
+ ### Is my API key safe?
309
+ The key stays in your local MCP config or environment. The server never prints or logs it, redacts it from errors, sends it only to the Miragea API root (redirects are refused), and never sends it to the audio download URL.
310
+
311
+ ### What happens if a long voiceover times out?
312
+ The job keeps running on Miragea. The tool returns the `task_id`; ask the agent to call `miragea_get_task` with `wait=true` to download the result. Don't resubmit, because that would create a duplicate job.
313
+
314
+ ### Can I use it in Python scripts or n8n instead of chat?
315
+ Any MCP-capable runtime works. For plain scripts, call the Miragea REST API directly ([guide](https://miragea.ai/v1/guide), [OpenAPI schema](https://miragea.ai/v1/schema)).
316
+
317
+ ## Troubleshooting
318
+
319
+ | Symptom | Fix |
320
+ | --- | --- |
321
+ | `MIRAGEA_API_KEY is not set` | Add the key to the server's `env` block (not your shell profile, for GUI clients) and fully restart the client. |
322
+ | `HTTP 401 invalid_api_key` | The key is wrong or revoked. Create a new one at [miragea.ai/workspace/api](https://miragea.ai/workspace/api). Run `uvx tts-mcp-server --check`. |
323
+ | `HTTP 403` | The account has no API access right now; check it in your Miragea account. `cloudflare_blocked` means a proxy or VPN is being challenged; try another network. |
324
+ | `HTTP 429` | Rate-limited or an account limit was reached. Check your Miragea account, or wait and retry. |
325
+ | `Text is N characters but this account allows M` | Split the script into parts under `audio.max_text_length` and generate them one by one. |
326
+ | `wait_timeout` | The job is still running. Use `miragea_get_task` with the returned `task_id`. Raise `MIRAGEA_WAIT_TIMEOUT` and your client's tool timeout (Codex: `tool_timeout_sec`). |
327
+ | Client tool call times out first | Call with `wait=false`, then poll with `miragea_get_task`. |
328
+ | `spawn uvx ENOENT` | The GUI app can't find `uvx`. Use its absolute path (`which uvx` / `where uvx`) as `command`. |
329
+ | `Tag(s) … are not available` | Tags are per model. List them with `miragea_get_capabilities`. |
330
+ | `reference_audio_url must be a public http(s) URL` | Miragea downloads the sample server-side. Upload it somewhere public (not `localhost`, not a file path). |
331
+ | Where are my files? | `~/Miragea` by default, or `MIRAGEA_OUTPUT_DIR`. Each tool returns the exact path. |
332
+
333
+ Logs go to stderr, which your client keeps (Claude Desktop on macOS: `~/Library/Logs/Claude/mcp-server-tts.log`).
334
+
335
+ ## Companion Agent Skill
336
+
337
+ [`skills/miragea-voiceover/SKILL.md`](skills/miragea-voiceover/SKILL.md) is an [Agent Skill](https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills) that teaches Claude a script-to-voiceover workflow on top of these tools: tightening a script for speech, choosing a voice and tone, confirming long jobs first, and delivering audio and captions for each platform. Copy the folder into `~/.claude/skills/` (Claude Code) or upload it as a skill in Claude. It is also published on its own in [RTY2345RR/miragea-agent-skills](https://github.com/RTY2345RR/miragea-agent-skills) with install steps for Claude Code, Codex and Cursor.
338
+
339
+ ## Development
340
+
341
+ ```bash
342
+ git clone https://github.com/RTY2345RR/miragea-voice-mcp && cd miragea-voice-mcp
343
+ uv venv && uv pip install -e ".[dev]"
344
+ pytest # offline; HTTP is mocked
345
+ npx @modelcontextprotocol/inspector uvx --from . tts-mcp-server
346
+ ```
347
+
348
+ The server wraps only the documented Miragea endpoints: `GET /capabilities`, `GET /actors`, `POST /audio/generations`, `POST /subtitles/recognitions`, `GET /tasks/{id}`, `GET /tasks` ([API guide](https://miragea.ai/v1/guide)). VTT and short-cue splitting are local formatting of Miragea's timed segments.
349
+
350
+ ## Links
351
+
352
+ - GitHub: https://github.com/RTY2345RR/miragea-voice-mcp
353
+ - Live demo (Hugging Face Space): https://huggingface.co/spaces/miragea/miragea-voice-mcp
354
+ - Agent Skills: https://github.com/RTY2345RR/miragea-agent-skills
355
+ - Miragea API keys: https://miragea.ai/workspace/api
356
+ - PyPI: https://pypi.org/project/tts-mcp-server/
357
+ - Docker Hub: https://hub.docker.com/r/miragea/tts-mcp-server
358
+
359
+ ## License
360
+
361
+ [MIT](LICENSE). "Miragea" is the voice engine this server connects to (voiceover, voice cloning, speech recognition). Use cloned voices only with the speaker's consent.
@@ -0,0 +1,143 @@
1
+ # Publishing checklist
2
+
3
+ Everything below assumes the GitHub repository is **`github.com/RTY2345RR/miragea-voice-mcp`**.
4
+ If it ever moves to another owner, replace
5
+ `RTY2345RR/miragea-voice-mcp` and `io.github.RTY2345RR/` with your owner in: `server.json` (`name`,
6
+ `repository.url`), `README.md` (the `mcp-name:` comment and the links), `pyproject.toml`
7
+ (`[project.urls]`), `llms.txt`, `CHANGELOG.md`, `glama.json` (`maintainers`) and
8
+ `src/miragea_voice_mcp/client.py` (`USER_AGENT`). Then run `pytest`, which checks that the
9
+ README `mcp-name` matches `server.json`.
10
+
11
+ ## 1. GitHub repository
12
+
13
+ **Description** (paste into *About*):
14
+
15
+ > Voiceover & captions MCP server for AI agents: turn a script into narration + SRT/VTT subtitles from Claude, Cursor and Codex. Voice cloning, emotion tags, transcription. Miragea voice engine.
16
+
17
+ **Website:** `https://huggingface.co/spaces/miragea/miragea-voice-mcp` (live demo)
18
+
19
+ **Topics** (20, GitHub's maximum):
20
+
21
+ ```
22
+ mcp mcp-server model-context-protocol text-to-speech tts voiceover ai-voice
23
+ voice-cloning subtitles srt webvtt captions speech-to-text transcription
24
+ claude claude-code cursor codex video-editing youtube-shorts
25
+ ```
26
+
27
+ CLI: `gh repo edit RTY2345RR/miragea-voice-mcp --description "…" --homepage https://huggingface.co/spaces/miragea/miragea-voice-mcp --add-topic mcp --add-topic mcp-server …` (one `--add-topic` per topic).
28
+
29
+ **Release:** tag `v0.1.0`, title "v0.1.0 — script to voiceover + captions", and paste the CHANGELOG section as the body.
30
+
31
+ Also: enable Discussions, upload a social preview image (1280×640) showing the script → mp3 + srt flow, and pin the repo on the profile.
32
+
33
+ ## 2. PyPI (`tts-mcp-server`)
34
+
35
+ Recommended: **trusted publishing** (no token stored anywhere).
36
+
37
+ 1. Sign in at pypi.org → *Your account → Publishing → Add a new pending publisher*:
38
+ project `tts-mcp-server`, owner `RTY2345RR`, repo `miragea-voice-mcp`, workflow `publish.yml`, environment `pypi`.
39
+ 2. On GitHub: *Settings → Environments → New environment* named `pypi`.
40
+ 3. Run *Actions → Publish → Run workflow* (or add a `release: published` trigger to `.github/workflows/publish.yml`). It builds the package, uploads it to PyPI, then publishes to the MCP Registry (step 3).
41
+
42
+ Manual alternative:
43
+
44
+ ```bash
45
+ uv build # dist/tts_mcp_server-0.1.1-py3-none-any.whl + .tar.gz
46
+ uvx twine check dist/*
47
+ uvx twine upload dist/* # needs a PyPI API token
48
+ ```
49
+
50
+ Verify: `uvx tts-mcp-server --version` on a clean machine.
51
+
52
+ ## 3. Official MCP Registry (registry.modelcontextprotocol.io)
53
+
54
+ The registry checks that the PyPI README contains `<!-- mcp-name: io.github.RTY2345RR/tts-mcp-server -->` (already in `README.md`), so publish to PyPI first.
55
+
56
+ ```bash
57
+ # install the publisher CLI (macOS: brew install mcp-publisher)
58
+ curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
59
+ sudo mv mcp-publisher /usr/local/bin/
60
+
61
+ cd miragea-voice-mcp
62
+ mcp-publisher login github # sign in as GitHub user `RTY2345RR` (io.github.RTY2345RR namespace)
63
+ mcp-publisher publish # reads ./server.json
64
+ curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.RTY2345RR/tts-mcp-server"
65
+ ```
66
+
67
+ CI does the same with `mcp-publisher login github-oidc` after each release. For every new version, bump `version` in `pyproject.toml`, `src/miragea_voice_mcp/__init__.py` and both places in `server.json` (the tests enforce this).
68
+
69
+ Optional: owning `miragea.ai` allows the namespace `ai.miragea/voice` via DNS verification (`mcp-publisher login dns --domain miragea.ai …`). Change `name` and the README `mcp-name` together if you switch.
70
+
71
+ Many directories (PulseMCP and others) import from the official registry, so this step also feeds them.
72
+
73
+ ## 4. Smithery (smithery.ai)
74
+
75
+ 1. Sign in at https://smithery.ai with the GitHub account that owns the repo.
76
+ 2. Choose **Publish / Add server** → select `RTY2345RR/miragea-voice-mcp`.
77
+ 3. Smithery reads `smithery.yaml` (stdio; config field `mirageaApiKey` maps to `MIRAGEA_API_KEY`) and builds with the root `Dockerfile`. If the UI asks for a deployment type, choose local/stdio.
78
+ 4. After the build passes, open the server page, check that all 7 tools are listed (they list without a key), and add the description, the demo homepage and the topics.
79
+
80
+ ## 5. Glama (glama.ai/mcp/servers)
81
+
82
+ 1. Go to https://glama.ai/mcp/servers → **Add Server** → submit `https://github.com/RTY2345RR/miragea-voice-mcp`.
83
+ 2. `glama.json` lists `RTY2345RR` as maintainer, so sign in with that GitHub account and **Claim** the server.
84
+ 3. Glama builds the `Dockerfile` and runs an introspection check. It passes without a key because the server starts and lists tools without one. In the server's admin settings, set `MIRAGEA_API_KEY` as a placeholder or a test key if you want the "tested" badge.
85
+ 4. Copy the score badge for the awesome-mcp-servers PR:
86
+ `[![RTY2345RR/miragea-voice-mcp MCP server](https://glama.ai/mcp/servers/RTY2345RR/miragea-voice-mcp/badges/score.svg)](https://glama.ai/mcp/servers/RTY2345RR/miragea-voice-mcp)`
87
+
88
+ ## 6. mcp.so
89
+
90
+ 1. Open https://mcp.so and click **Submit** (top navigation).
91
+ 2. Type: MCP Server. Name: `Voiceover & Captions MCP (Miragea voice engine)`. URL: the GitHub repo.
92
+ 3. Description: the GitHub description above. Tags: text-to-speech, voiceover, subtitles, captions, voice-cloning.
93
+ 4. Server config: paste the Claude Desktop JSON from the README.
94
+ Fallback if the form is unavailable: open an issue in mcp.so's GitHub repository with the same details.
95
+
96
+ ## 7. PulseMCP
97
+
98
+ PulseMCP ingests the official registry, so the listing usually appears within about a week of step 3. To speed it up or correct details, use https://www.pulsemcp.com/submit with the GitHub URL and the description above.
99
+
100
+ ## 8. awesome-mcp-servers (punkpeye) pull request
101
+
102
+ Do this after Glama lists the server, because entries there carry the Glama score badge.
103
+
104
+ ```bash
105
+ gh repo fork punkpeye/awesome-mcp-servers --clone && cd awesome-mcp-servers
106
+ git checkout -b add-miragea-voice-mcp
107
+ ```
108
+
109
+ In `README.md`, under **🎧 Text-to-Speech**, insert this line in alphabetical order (after `mberg/kokoro-tts-mcp`, before `transcribe-app/mcp-transcribe`):
110
+
111
+ ```markdown
112
+ - [RTY2345RR/miragea-voice-mcp](https://github.com/RTY2345RR/miragea-voice-mcp) [![RTY2345RR/miragea-voice-mcp MCP server](https://glama.ai/mcp/servers/RTY2345RR/miragea-voice-mcp/badges/score.svg)](https://glama.ai/mcp/servers/RTY2345RR/miragea-voice-mcp) 🎖️ 🐍 ☁️ 🍎 🪟 🐧 - Voiceover & captions for AI agents: script to narration plus SRT/VTT subtitles, voice cloning from a reference URL, emotion tags, and subtitles for any audio or video file (Miragea voice engine).
113
+ ```
114
+
115
+ ```bash
116
+ git commit -am "Add RTY2345RR/miragea-voice-mcp to Text-to-Speech"
117
+ git push -u origin add-miragea-voice-mcp
118
+ gh pr create --repo punkpeye/awesome-mcp-servers --title "Add tts-mcp-server (text-to-speech, voiceover + subtitles)" \
119
+ --body "Voiceover & captions MCP server (Python, stdio, MIT, Miragea voice engine). Script → voiceover + SRT/VTT captions, voice cloning, transcription. Listed on Glama."
120
+ ```
121
+
122
+ Their CONTRIBUTING notes that PRs opened by an automated agent can append `🤖🤖🤖` to the title for a fast-tracked review. Use it only when an agent actually opens the PR. Disclose that you maintain the project, since 🎖️ marks an official implementation.
123
+
124
+ ## 9. More places worth a listing (optional)
125
+
126
+ - **Anthropic Agent Skills:** publish `skills/miragea-voiceover` in the README and to skill directories such as skillsmp.com, and add it to community `awesome-claude-skills` lists via PR.
127
+ - **MCP directories:** mcpservers.org, mcpmarket.com, cursor.directory (MCP section), LobeHub MCP marketplace. Each has a "Submit" form; reuse the description above.
128
+ - **Docker MCP Catalog** (`docker/mcp-registry` PR): uses the `Dockerfile` in this repo.
129
+
130
+ ## Before each release
131
+
132
+ ```bash
133
+ pytest
134
+ uv build && uvx twine check dist/*
135
+ python -c "import json;d=json.load(open('server.json'));assert len(d['description'])<=100"
136
+ ```
137
+
138
+ Then optionally run a real smoke test with a key, using a short test line:
139
+
140
+ ```bash
141
+ MIRAGEA_API_KEY=… uvx tts-mcp-server --check # read-only
142
+ # in your MCP client: "Use miragea_text_to_speech to say 'Hi' with my first voice"
143
+ ```