say-mcp-server
An MCP server that provides text-to-speech functionality using macOS's built-in say
command.
Requirements
- macOS (uses the built-in
say
command) - Node.js >= 14.0.0
Configuration
Add the following to your MCP settings configuration file:
{
"mcpServers": {
"say": {
"command": "node",
"args": ["/path/to/say-mcp-server/build/index.js"]
}
}
}
Installation
npm install say-mcp-server
Tools
speak
The speak
tool provides access to macOS's text-to-speech capabilities with extensive customization options.
Basic Usage
Use macOS text-to-speech to speak text aloud.
Parameters:
text
(required): Text to speak. Supports:- Plain text
- Basic punctuation for pauses
- Newlines for natural breaks
- [[slnc 500]] for 500ms silence
- [[rate 200]] for changing speed mid-text
- [[volm 0.5]] for changing volume mid-text
- [[emph +]] and [[emph -]] for emphasis
- [[pbas +10]] for pitch adjustment
voice
(optional): Voice to use (default: "Alex")rate
(optional): Speaking rate in words per minute (default: 175, range: 1-500)background
(optional): Run speech in background to allow further MCP interaction (default: false)
Advanced Features
- Voice Modulation:
use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: "[[volm 0.7]] This is quieter [[volm 1.0]] and this is normal [[volm 1.5]] and this is louder",
voice: "Victoria"
}
});
- Dynamic Rate Changes:
use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: "Normal speed [[rate 300]] now speaking faster [[rate 100]] and now slower",
voice: "Fred"
}
});
- Emphasis and Pitch:
use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: "[[emph +]] Important point! [[emph -]] [[pbas +10]] Higher pitch [[pbas -10]] Lower pitch",
voice: "Samantha"
}
});
Integration Examples
- With Marginalia Search:
// Search for a topic and have the results read aloud
const searchResult = await use_mcp_tool({
server_name: "marginalia-mcp-server",
tool_name: "search",
arguments: { query: "quantum computing basics", count: 1 }
});
await use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: searchResult.results[0].description,
voice: "Daniel",
rate: 150
}
});
- With YouTube Transcripts:
// Read a YouTube video transcript
const transcript = await use_mcp_tool({
server_name: "youtube-transcript",
tool_name: "get_transcript",
arguments: {
url: "https://youtube.com/watch?v=example",
lang: "en"
}
});
await use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: transcript.text,
voice: "Samantha",
rate: 175
}
});
- Background Speech with Multiple Actions:
// Start long speech in background
await use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: "This is a long speech that will run in the background...",
voice: "Rocko (Italian (Italy))",
rate: 69,
background: true
}
});
// Immediately perform another action while speech continues
await use_mcp_tool({
server_name: "marginalia-mcp-server",
tool_name: "search",
arguments: { query: "parallel processing" }
});
- With Apple Notes:
// Read notes aloud
const notes = await use_mcp_tool({
server_name: "apple-notes-mcp",
tool_name: "search-notes",
arguments: { query: "meeting notes" }
});
if (notes.length > 0) {
await use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: notes[0].content,
voice: "Karen",
rate: 160
}
});
}
Example:
use_mcp_tool({
server_name: "say",
tool_name: "speak",
arguments: {
text: "Hello, world!",
voice: "Victoria",
rate: 200
}
});
list_voices
List all available text-to-speech voices on the system.
Example:
use_mcp_tool({
server_name: "say",
tool_name: "list_voices",
arguments: {}
});
Recommended Voices
Voice | Language/Region | Intellectual Figure | Haiku | CLI Specification |
---|---|---|---|---|
Anna (Premium) | German | Emmy Noether | Symmetrie haucht LebenAlgebras verborgne FormAbstraktion blühtSymmetry breathes lifeAlgebra's hidden formsAbstraction blooms | -v "Anna (Premium)" |
Emma (Premium) | Italian | Maria Adelaide Sneider | Algoritmi in danzaMacchina sussurra dolceIl codice viveAlgorithms danceMachine whispers secrets softCode becomes alive | -v "Emma (Premium)" |
Federica (Premium) | Italian | Pia Nalli | Teoremi fluentiNumeri danzano liberiVerità emergeFlowing theorems danceNumbers move in freedom's spaceTruth emerges pure | -v "Federica (Premium)" |
Serena (Premium) | English (UK) | Bertha Swirles | Quantum waves rippleThrough mathematical seas deepTruth's light emergesQuantum waves rippleThrough mathematical seas deepTruth's light emerges | -v "Serena (Premium)" |
Petra (Premium) | German | Ruth Moufang | Algebra sprichtIn Symmetrien verstecktWahrheit erblühtAlgebra speaks softHidden in symmetries pureTruth blooms anew here | -v "Petra (Premium)" |
Yuna (Premium) | Korean | Hee Oh | 숨은 패턴 빛나고마음의 방정식 핀다지식 자라나Hidden patterns gleamMind's equations softly bloomKnowledge multiplies | -v "Yuna (Premium)" |
Alva (Premium) | Swedish | Sonja Korovkin | Mönster flödar frittGenom tankens labyrinterVisdom blomstrar härPatterns flowing freeThrough labyrinths of the mindWisdom blooms right here | -v "Alva (Premium)" |
Amélie (Premium) | French (Canada) | Sophie Germain | Nombres premiers murmurentDansent entre les silencesSymétrie s'ouvrePrime numbers whisperDancing between the silenceSymmetry unfolds | -v "Amélie (Premium)" |
Ewa (Premium) | Polish | Maria Wielgus | Logiki korzenieMatematyczne krainyMyśl kiełkującaLogic's tender rootsMathematical landscapesThought's seeds germinate | -v "Ewa (Premium)" |
Kiyara (Premium) | Hindi | Shakuntala Devi | गणित की लय मेंअंक नृत्य करते हैंज्ञान जगता हैIn rhythm of mathNumbers dance their sacred stepsKnowledge awakens | -v "Kiyara (Premium)" |
Majed (Premium) | Arabic | Maha Al-Aswad | أرقام ترقصفي فضاء اللانهايةالحقيقة تشرقNumbers dance freelyIn infinity's vast spaceTruth rises like dawn | -v "Majed (Premium)" |
Tünde (Premium) | Hungarian | Julia Erdős | Számok táncolnakVégtelen térben szállnakIgazság virradNumbers dance and soarThrough infinite space they glideTruth dawns pure and bright | -v "Tünde (Premium)" |
Fiona (Enhanced) | English (Scottish) | Mary Somerville | Highland mists revealMathematical mysteriesTruth shines like the starsHighland mists revealMathematical mysteriesTruth shines like the stars | -v "Fiona (Enhanced)" |
Lesya (Enhanced) | Ukrainian | Olena Voinova | Тиша говоритьМіж зірками знання спитьДумка проростаєSilence speaks softlyKnowledge sleeps among the starsThought begins to grow | -v "Lesya (Enhanced)" |
Carmit (Enhanced) | Hebrew | Tali Seror | מילים נושמות בשקטבין שורות של דממהשיר מתעוררWords breathe silentlyBetween lines of deep stillnessPoem awakening | -v "Carmit (Enhanced)" |
Milena (Enhanced) | Russian | Olga Ladyzhenskaya | Память шепчет намУравнения текутИстина молчитMemory whispersEquations flow like riversTruth speaks silently | -v "Milena (Enhanced)" |
Katya (Enhanced) | Russian | Sofia Kovalevskaya | Числа танцуютВ пространстве бесконечномИстина цветётNumbers dance freelyIn space of infinityTruth blooms like a flower | -v "Katya (Enhanced)" |
Damayanti (Enhanced) | Indonesian | Sri Pekerti | Angka menariDalam ruang tak batasKebenaran tumbuhNumbers dance gentlyIn boundless space they flutterTruth grows like new leaves | -v "Damayanti (Enhanced)" |
Dariush (Enhanced) | Persian | Maryam Mirzakhani | اعداد می رقصنددر فضای بی پایانحقیقت می رویدNumbers dance with graceIn endless space they traverseTruth springs forth anew | -v "Dariush (Enhanced)" |
Rocko (Italian) | Italian | Astro Boy (Tetsuwan Atomu)Italian dub | Robot di metalloCuore umano batte fortePace nel futuroMetal robot formHuman heart beats strong withinPeace in future dawns | -v "Rocko (Italian (Italy))" |
Rocko (Italian) | Italian | Jeeg Robot d'Acciaio(Kōtetsu Jeeg) | Acciaio lucenteProtettore dei deboliVola nel cieloShining steel warriorProtector of the helplessSoars through the heavens | -v "Rocko (Italian (Italy))" |
Rocko (Italian) | Italian | Numero 5(Short Circuit) | Input infinitoLa coscienza si risvegliaVita artificialeInfinite inputConsciousness awakeningArtificial life | -v "Rocko (Italian (Italy))" |
Binbin (Enhanced) | Chinese (Mainland) | Li Shanlan | 算术之道流数理演绎真理智慧绽放Arithmetic flowsLogic unfolds truth's patternWisdom blossoms bright | -v "Binbin (Enhanced)" |
Han (Premium) | Chinese (Mainland) | Chen Jingrun | 素数之舞动哥德巴赫猜想真理永恒Prime numbers dancingGoldbach's conjecture whispersTruth eternal flows | -v "Han (Premium)" |
Lilian (Premium) | Chinese (Mainland) | Hua Luogeng | 数论之光芒解析延续美智慧升华Number theory shinesAnalysis extends graceWisdom ascends pure | -v "Lilian (Premium)" |
Meijia | Chinese (Taiwan) | Sun-Yung Alice Chang | 幾何之美現曲率流動不息空間展開Geometry showsCurvature flows endlesslySpace unfolds anew | -v "Meijia" |
Sinji (Premium) | Chinese (Hong Kong) | Shing-Tung Yau | 流形之奧秘卡拉比空間動維度交織Manifolds revealCalabi spaces in flowDimensions weave truth | -v "Sinji (Premium)" |
Tingting | Chinese (Mainland) | Wang Zhenyi | 星辰轨迹明天文数学融智慧闪耀Starlit paths shine brightAstronomy meets numbersWisdom radiates | -v "Tingting" |
Yue (Premium) | Chinese (Mainland) | Chern Shiing-shen | 微分几何纤维丛中寻真本质显现Differential formsIn fiber bundles seek truthEssence emerges | -v "Yue (Premium)" |
Configuration
Add the following to your MCP settings configuration file:
{
"mcpServers": {
"say": {
"command": "node",
"args": ["/path/to/say-mcp-server/build/index.js"]
}
}
}
Requirements
- macOS (uses the built-in
say
command) - Node.js >= 14.0.0
Contributors
- Barton Rhodes (@bmorphism) - [email protected]
License
MIT