That is the config mistake the project calls out explicitly, and it is worth knowing before you spend an evening on it: to make OpenAI your default you name a voice block whose provider is OpenAI, not the provider itself. Past that, the design is sensible — agents never see provider voice ids, and the local-only binding plus optional bearer token keeps the speaker on your desk from being addressable by anything else.
A macOS menu bar app that is also a Streamable HTTP MCP server. An agent sends text; isimud picks the provider behind the named voice, generates the audio and plays it — with a queue, so two agents talking at once do not talk over each other.
- `isimud.speak` — text plus a voice name and rate; it returns immediately with a job id and the queue depth, or blocks until the utterance finishes if you ask it to wait
- `isimud.status` — what the server is doing right now
- `isimud.list_voices` — the voices available, including the built-in OpenAI voice ids
- Named voices as the contract: agents ask for narrator or default, and the provider-specific voice id stays in your config
- Three providers — Apple through the system `say` command with no credentials at all, OpenAI, and Google Cloud Text-to-Speech
- Automatic fallback when a voice's provider is unavailable, and a failure event when none is
- A menu bar indicator that pulses while something is being spoken, or `--headless` for server-only use
macOS — the packaged app declares macOS 12.0 or newer — and Rust 1.89 or newer with Cargo to `cargo install isimud-text-to-speech`. Your MCP client must speak streamable HTTP; the server listens on http://127.0.0.1:3654/mcp and binds loopback only, rejecting any non-loopback address at startup. Apple voices need no key; OpenAI and Google read OPENAI_API_KEY and GOOGLE_API_KEY, or their keys from the config file. Setting ISIMUD_AUTH_TOKEN turns on bearer auth, and requests without the exact token are refused. MIT licensed.
One command — cargo install isimud-text-to-speech
