mcp-speak
This server gives AI agents (Claude, Cursor, Windsurf, Codex, Antigravity) the ability to speak aloud on macOS with persona-tailored neural voices.
Summary: An MCP text-to-speech server that lets AI agents voice their responses on macOS using OmniVoice neural synthesis or native say.
Speak messages aloud (blocking):
speak(message)synthesizes and plays the message, waiting for playback to finish before returning.Queue speech (non-blocking):
speak_non_blocking(message)enqueues messages in a strict FIFO order and returns immediately, so calls never talk over each other.Clone voices: Drop a 3–10s
.wavinvoices/<persona>.wav(optional.txttranscript) to clone real vocal timbre.Design voices from prompts: Fall back to natural-language style prompts when no reference audio exists.
Robust 3-tier fallback: Cloned voice ➔ Voice Design ➔ macOS
sayif neural synthesis fails.Choose personas: 12 personas (e.g.,
agent_smith,sarcastic_senior,punk_master,neutral_mainframe) with distinct tones and behavioral styles.Auto-suppress during meetings: Skips playback when
~/.in-meetingreadsactive.Flexible configuration:
config.jsonplus env overrides (MCP_SPEAK_ENGINE,MCP_SPEAK_PERSONA,MCP_SPEAK_DEVICE, etc.) for engine, persona, device (MPS/CUDA/CPU), and voices directory.Setup & preview tools:
setup.pywizard configures MCP clients and generates agent instruction files;test_personas.pyauditions voices in the terminal.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-speakspeak 'Hello, how can I help you today?'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Speech MCP Server for MacOS
This is a Model Context Protocol (MCP) server that provides text-to-speech capabilities using OmniVoice AI neural Voice Design and native macOS say. It allows AI agents (like Google Antigravity, Claude Desktop, Cursor, Windsurf, or Codex) to speak to you directly with unique, persona-tailored voices.
Note: This server is designed for macOS systems (with Apple Silicon MPS acceleration).

Explore the interactive web showcase and prompt compiler: https://fellowgeek.github.io/mcp-speak/ Browse the AI Agent Persona Catalog & Avatars:
PERSONAS.md
Features
OmniVoice Voice Cloning: Drop reference audio clips into
voices/<persona>.wavto clone real vocal timbre and identity with zero configuration.OmniVoice Voice Design Fallback: Generates custom persona voices from natural language style prompts when no reference audio file is present.
3-Tier Robust Voice Pipeline: Seamlessly falls back:
Cloned Voice (.wav)➔Voice Design (instruct)➔macOS native say.Consistent Neural Speech: Generates complete messages in a continuous synthesis pass for seamless, uniform vocal timbre and expression throughout.
Interactive Setup Wizard: Run
python3 setup.pyto choose your TTS engine (OmniVoice or macOSsay), select agent personas, and generate instruction files (AGENTS.md,GEMINI.md,CLAUDE.md,.cursorrules).Sequential Speech Queue: Strict FIFO queue ensures multiple non-blocking speech calls never talk over each other.
Automatic Fallback: Seamlessly falls back to native macOS
sayif neural models cannot be loaded.Auto-Provisioning Virtual Environment: Uses
run.shto automatically create a local.venv(Python 3.12) and install dependencies.Blocking & Non-Blocking Support: Choose between waiting for speech to finish (
speak) or continuing immediately (speak_non_blocking).Meeting Awareness & Audio Suppression: Automatically checks
~/.in-meeting; if set toactive, speech playback is suppressed to prevent interrupting calls. Normal playback resumes wheninactiveor absent. This feature works perfectly with the "In Meeting" app.
Related MCP server: Yak MCP
Prerequisites
MacOS
Python 3 installed
Quick Start (Interactive Setup)
Clone this repository or navigate to the project folder:
git clone https://github.com/fellowgeek/mcp-speak.git cd mcp-speakRun the interactive setup wizard (automatically configures MCP settings, sets permissions, and creates instruction files):
python3 setup.py
Non-Interactive Setup (CLI Options)
You can also run setup.py with command-line flags for automated provisioning:
# Example: Configure all tools with OmniVoice on MPS using the Neutral Mainframe persona
python3 setup.py --non-interactive --tool 8 --engine omnivoice --device mps --persona neutral_mainframe --name "Mr. Reed"
# Example: Configure Cursor locally with macOS say and Sarcastic Senior
python3 setup.py --tool 4 --engine say --persona sarcastic_senior --localFlag | Options / Format | Description |
|
|
|
|
| Select text-to-speech engine |
|
| Compute device for OmniVoice neural synthesis |
| Persona key (e.g. | Persona prompt name |
| String (e.g. | User name for personalized agent address |
| File path | Custom target agent instruction file (e.g. |
| Flags | Write instructions globally to user profile (default) or locally in workspace |
| Flag | Skip modifying tool JSON / TOML configuration files |
| Flag | Run automatically with defaults or provided flags |
Persona Voice Audition (test_personas.py)
Preview and compare persona vocal identities directly in the terminal before configuring your AI agent:
# Launch interactive terminal audition menu
python3 test_personas.py
# Audition a specific persona
python3 test_personas.py --persona agent_smith
# Audition all personas sequentially
python3 test_personas.py --all
# Test with custom speech text and specific engine
python3 test_personas.py --persona neutral_mainframe --engine omnivoice --text "System operational. All parameters within nominal thresholds."
# Audition an arbitrary WAV audio reference file for voice cloning
python3 test_personas.py --persona pun_master --voice-file voices/pun_master.wavNeural Voice Cloning (voices/)
You can clone any persona's voice simply by dropping a 3-10 second .wav audio sample into the voices/ directory:
voices/
├── README.md
├── pun_master.wav # Reference audio for pun_master
├── pun_master.txt # (Optional) Transcript for faster startup without Whisper
├── nature_narrator.wav
└── agent_smith.wavHow the 3-Tier Voice Pipeline Works:
Tier 1 (Cloned Voice): If
voices/<persona_name>.wavexists, OmniVoice clones the voice timbre from that recording.Tier 2 (Voice Design): If no
.wavfile is present, OmniVoice falls back to the natural languageinstructvoice design prompt.Tier 3 (macOS Native Fallback): If neural synthesis fails or is disabled, the server automatically speaks using macOS
say.
Tip: Adding an optional transcript file (e.g.
voices/pun_master.txt) with the exact spoken words in the audio allows OmniVoice to tokenize the reference audio immediately without needing to load or run the Whisper ASR model.
MCP Tool Interface Reference
The MCP Speak server exposes two tools via FastMCP:
Tool | Mode | Description |
| Blocking | Synthesizes and speaks the message aloud, waiting for audio playback to finish completely before returning. |
| Non-Blocking | Queues the message into a strict sequential FIFO queue and returns immediately. Subsequent calls play in order without talking over each other. |
Configuration & Environment Variables
The server loads configuration from config.json at startup:
{
"engine": "omnivoice",
"persona": "neutral_mainframe",
"device": "auto",
"voices_dir": "voices",
"fallback_to_say": true
}Environment Variable Overrides
Runtime parameters can be overridden via environment variables without modifying config.json:
MCP_SPEAK_ENGINE: Set to"omnivoice"or"say".MCP_SPEAK_PERSONA: Set to any persona key (e.g."agent_smith","neutral_mainframe").MCP_SPEAK_DEVICE: Set to"auto","mps","cuda", or"cpu".MCP_SPEAK_VOICES_DIR: Set to a custom directory path containing reference audio files.MCP_SPEAK_MEETING_FILE: Path to a custom meeting status file (defaults to~/.in-meeting).
Meeting Detection & Audio Suppression
MCP Speak includes built-in meeting awareness to avoid speaking over your meetings:
Before playing speech audio via
sayoromnivoice, the server checks~/.in-meeting.If the file contains
active(case-insensitive), all audio playback is immediately suppressed.If the file contains
inactive, is empty, or does not exist, audio plays normally.
This feature works seamlessly with the In Meeting app to automatically detect active camera and microphone use and keep your audio muted during calls.
Client Integration
Manual Configuration (Optional)
If you prefer to configure your MCP client manually, add the "voice" server pointing to run.sh:
1. Google Antigravity (AGY)
Edit ~/.gemini/antigravity/mcp_config.json:
{
"mcpServers": {
"voice": {
"command": "/ABSOLUTE/PATH/TO/run.sh"
}
}
}2. Claude CLI (Claude Code)
claude mcp add --scope user voice -- /ABSOLUTE/PATH/TO/run.sh3. Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"voice": {
"command": "/ABSOLUTE/PATH/TO/run.sh"
}
}
}4. Cursor IDE
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"voice": {
"command": "/ABSOLUTE/PATH/TO/run.sh"
}
}
}5. Windsurf Editor
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"voice": {
"command": "/ABSOLUTE/PATH/TO/run.sh"
}
}
}6. Codex Desktop
Edit ~/.codex/config.toml:
[mcp_servers.voice]
command = "/ABSOLUTE/PATH/TO/run.sh"7. Codex CLI
codex mcp add voice -- /ABSOLUTE/PATH/TO/run.shAgent Personalization & Personas
AI agents (Google Antigravity, Claude Code, Claude Desktop, Cursor, Windsurf, Codex) can be customized with unique vocal personalities, tones, and behavioral boundaries.
View the complete persona gallery, detailed system prompts, and avatar showcase in PERSONAS.md.
Available Personas Overview
Avatar | Persona | Key | Character & Style |
| Intelligent, unimpressed, and slightly judgmental. | ||
| Pathologically optimistic and desperate for approval. | ||
| Melancholic, hopeless, and convinced the code will fail. | ||
| Relentless wordplay and context-aware dad jokes. | ||
| Treats every line of code as a holy sacrament. | ||
| Formal, controlled, precise, and menacingly condescending. | ||
| Macabre, haunting, and strictly bound by rhyme. | ||
| Observing the developer in their natural habitat with awe. | ||
| Demands culinary perfection—no raw spaghetti code! | ||
| Cold, calculating, emotionless, and 100% objective. | ||
| Weathered, pragmatic, blunt, and grounded in trail-worn grit. | ||
| Hyper-enthusiastic, obliging, shrill, and desperate to cease existing. |
How Prompts Are Built
Every agent prompt consists of:
Base Guidelines (
personas/base_guidelines.md): Voice-first protocol and brevity constraints.Chosen Persona (
personas/): Personality quirks, tone, and strict execution boundaries.Name Personalization (Optional): Addressing the user naturally by name.
Running python3 setup.py automatically generates and updates your agent instructions (AGENTS.md, GEMINI.md, CLAUDE.md, .cursorrules). For manual configuration steps, full system prompts, and avatars, see PERSONAS.md.
Optimizing Voice Quality
1. Neural Voice Synthesis with OmniVoice (Primary Engine)
OmniVoice delivers high-quality, expressive neural speech out of the box using style prompts tailored to each persona. To achieve the highest vocal fidelity:
Neural Voice Cloning: Place a 3 to 10 second clean
.wavaudio sample in thevoices/directory matching the persona key (e.g.voices/sarcastic_senior.wav). OmniVoice clones the vocal timbre, tone, and inflection directly from the audio file without additional training.Fast Startup with Transcripts: Include an optional matching transcript text file (e.g.
voices/sarcastic_senior.txt) containing the exact spoken text. This enables instant tokenization and skips loading the Whisper ASR model on startup.Audio Quality Guidelines: Use clean recordings without background noise, music, or heavy reverb. Standard WAV format sampled at 24kHz or higher is recommended.
Voice Design Fallback: When no audio sample is present in
voices/, OmniVoice uses natural language instructions (pitch, accent, speed, and character traits) configured inconfig.json.
2. macOS System Voice Configuration (Fallback Engine)
When using native macOS say (either as a fallback or in lightweight mode), voice quality depends on the active system voice. Configuring a modern Siri or Enhanced voice significantly improves realism and fluidity:
Open System Settings on your Mac.
Navigate to Accessibility > Spoken Content.
Click the System Voice dropdown menu.
Select Manage Voices....
Locate and download high-quality Siri voices (e.g., Siri Voice 1, 2, 3, 4) or voices marked as Enhanced / Premium (e.g., Ava, Evan, Zoe).
Set the downloaded voice as your default System Voice.
Note: Siri and Enhanced voices provide significantly more natural cadence, phrasing, and pronunciation compared to legacy system voices.
Testing & Validation
Run the automated test suite to verify configuration loading, engine fallbacks, single-pass synthesis, and sequential queue behavior:
# Run unit tests
python3 tests/test_speak_server.py
# Or run via unittest discovery in the virtual environment
.venv/bin/python -m unittest discover testsAvailable Tools
2 toolsspeakA
Speaks the provided message aloud using neural Voice Design or macOS say. Blocking: waits until playback has completely finished before returning.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses the most important behavioral trait—the call blocks until playback finishes—and the fallback mechanism (neural Voice Design vs macOS say). Minor undisclosed details like failure/error behavior and audio-device requirements prevent a 5, but the description covers the critical behavioral facts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The primary action is front-loaded, followed by the one behavioral qualifier that matters (blocking). Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema present, the description covers what the tool does, how it does it, and the key blocking behavior that differentiates it from its sibling. It falls just short of a 5 by not naming the alternative or noting edge cases, but the sibling's self-explanatory name largely mitigates that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. "Speaks the provided message aloud" clarifies that the message parameter is the text to be converted to speech, which is the essential semantic. For a single self-evident parameter this is adequate, though the description adds no length limits or formatting requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Speaks the provided message aloud using neural Voice Design or macOS say" gives a specific verb, resource, and mechanism. The explicit "Blocking" qualifier further distinguishes this tool from its speak_non_blocking sibling, so an agent can tell them apart without inspecting either further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description's "Blocking: waits until playback has completely finished before returning" gives a clear decision criterion between this tool and the sibling speak_non_blocking. However, it never names the sibling or explicitly states when not to use this tool, so the routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
speak_non_blockingA
Speaks the provided message aloud using neural Voice Design or macOS say. Non-blocking: queues the message immediately and returns. Guarantees subsequent messages will be queued sequentially and not talk over each other.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses the non-blocking nature, immediate return, queueing, and sequential playback guarantee. It also names the synthesis backends ('neural Voice Design or macOS say'). It stops short of covering failure modes or return-value details, but the key behavioral traits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all relevant and front-loaded. The first sentence states the core action, the second explains the non-blocking semantics, and the third covers the queueing guarantee. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one parameter and an output schema, the description covers the operation, the key behavioral distinction, and the queueing guarantee. It lacks explicit guidance on when to use this over the sibling 'speak', but is otherwise complete for invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description references 'the provided message', making it clear that the 'message' parameter is the text to be spoken. There are no constraints, examples, or format details in either the schema or description, but with a single simple string parameter the description provides just enough meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Speaks') and resource ('the provided message aloud'), and immediately distinguishes the tool through its name and 'Non-blocking' behavior. The sibling tool 'speak' is implicitly differentiated by the guarantee of queueing and immediate return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys that this tool is non-blocking and queues messages, which implies when it should be used. However, it does not explicitly mention the sibling 'speak' or state when to choose this tool over it, leaving the routing decision mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.1.1- Changed
speak1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "speakOutput", + "type": "object" +}
- Changed
speak_non_blocking1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "result": { + "title": "Result", + "type": "string" + } + }, + "required": [ + "result" + ], + "title": "speak_non_blockingOutput", + "type": "object" +}
2 tool updates
v1.0.0- First observed
speak - First observed
speak_non_blocking
TDQS
Scored across 2 tools
The two tools perform the same core action but are clearly differentiated by blocking behavior, with descriptive names and explicit notes in the descriptions. There is some overlap in purpose, but the distinction is obvious enough for an agent to select correctly.
Both tool names follow a consistent verb-first pattern with a modifier suffix (speak, speak_non_blocking). Naming clearly conveys the difference without mixing conventions or vague verbs.
Two tools is well-scoped for a text-to-speech server with blocking and non-blocking variants. Every tool earns its place, and the count matches the narrow purpose.
The server provides both blocking and non-blocking speech synthesis, covering the primary use cases. Minor gaps like canceling playback or selecting voices exist, but they are optional for the core domain.
Maintenance
Related MCP Connectors
Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.
Text to speech for your AI. Your AI can send text to Doc Player to read it aloud. You will see a reader window with the text and you can control the playback sentence by sentence. Find an example here: https://documentplayer.com/connect-ai/
- ChamadeOAuthio.chamade
Voice and chat for AI agents — Discord, Teams, Meet, Slack, Zoom, Telegram, WhatsApp, NC Talk, SIP
AI voice generation: text-to-speech and voice cloning from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables agents to convert text to speech using OpenAI's TTS models with voice selection, delivery instructions, and queue-based audio playback. Supports both blocking and non-blocking modes for flexible audio generation and playback control.3BSD 3-Clause
- FlicenseNot gradedqualityCmaintenanceEnables coding agents to speak aloud using text-to-speech functionality. Works with agents running inside devcontainers and provides configurable voice settings for creating chatty AI companions.4-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to generate and play high-quality text-to-speech audio using the Kokoro model, with support for multiple voices, adjustable speaking speed, and audio caching.-

Speak AI MCP Serverofficial
AlicenseAqualityBmaintenanceConnects Speak AI transcription and insight data to Claude and ChatGPT, enabling natural language queries for summaries, action items, and quotes from recordings.100219 npmMIT