Skip to main content
Glama
charlesmooredev

speak-to-me-mcp

speak-to-me-mcp

Give Claude Code a voice. This MCP server enables Claude to speak summaries, announcements, and explanations aloud using text-to-speech — right from your terminal.

How it works

When you use a slash command like /speak_final, Claude composes a natural, concise summary of what just happened and speaks it through your Mac's speakers. You get an audible debrief without leaving your terminal.

Two TTS engines available:

Engine

Quality

Cost

Setup

System (default)

Good — uses macOS built-in voices

Free

Zero config

OpenAI

Excellent — natural, expressive voices

~$0.015 per 1K chars

Requires API key

Related MCP server: mcp-speak-when-done

Installation

The easiest way — installs the MCP server, tools, and slash commands together:

/plugin marketplace add charlesmooredev/speak-to-me-mcp
/plugin install speak-to-me@speak-to-me

That's it — works immediately with no API keys.

Updating

/plugin marketplace update
/plugin install speak-to-me@speak-to-me

MCP-Only Install

If you just want the tools without the slash commands:

claude mcp add speak-to-me -- node "/path/to/speak-to-me-mcp/dist/index.cjs"

Building from Source

git clone https://github.com/charlesmooredev/speak-to-me-mcp.git
cd speak-to-me-mcp
npm install
npm run build
npm run bundle

(Optional) Enable OpenAI Premium Voices

For higher quality speech, add your OpenAI API key to the MCP config:

claude mcp add speak-to-me \
  -e OPENAI_API_KEY=sk-your-key-here \
  -- node "/path/to/speak-to-me-mcp/dist/index.cjs"

Or set it in your .mcp.json:

{
  "mcpServers": {
    "speak-to-me": {
      "command": "node",
      "args": ["/path/to/speak-to-me-mcp/dist/index.cjs"],
      "env": {
        "OPENAI_API_KEY": "sk-your-key-here"
      }
    }
  }
}

Slash Commands

/speak_final

Speaks a summary of the final results after Claude finishes a task. Claude will compose a natural 2-4 sentence overview of what changed — files modified, bugs fixed, features added — and read it aloud.

Example: After fixing a bug, you'll hear something like:

"I fixed the authentication timeout issue. The session handler was losing the refresh token on redirect. I updated the token storage logic and added a test to cover that edge case."

/speak_plan

Speaks Claude's current plan before implementation begins. Useful for reviewing the approach hands-free before giving the go-ahead.

Example: Before starting work, you'll hear:

"Here's my plan. I'm going to add form validation to the signup page. I'll create a validation utility, wire it up to the form inputs, and display inline error messages. The existing styles already support error states, so no CSS changes needed."

/change_voice

Lists all available voices and lets you switch to a different one. Claude will play a test phrase with the new voice so you can hear it before committing.

/speech_style

Set a speaking style or persona that changes how Claude writes spoken summaries. This doesn't change the TTS voice — it changes the personality and language Claude uses when composing text.

/speech_style talk like a clown
/speech_style speak like a business woman
/speech_style be super concise and direct
/speech_style explain things like a friendly teacher
/speech_style clear

Once set, the style applies to all spoken output (/speak_final, /speak_plan, etc.) for the session.

Examples of what you'll hear:

Style

Sample Output

Clown

"Honk honk! The bugs are squashed and your code is no joke!"

Business woman

"I've completed the deliverables on schedule. All tests passing, ready for review."

Pirate

"Arrr! The bugs be vanquished and yer code be shipshape, captain!"

Concise

"Fixed auth bug. Three files updated. Tests pass."

Use /speech_style clear to reset back to Claude's natural speaking style.

MCP Tools

These are the underlying tools that power the slash commands. Claude can also call them directly during any conversation.

speak

Speak text aloud using text-to-speech.

Parameter

Type

Required

Description

text

string

Yes

Text to speak (max 5000 chars)

voice

string

No

Override voice name

engine

"system" | "openai"

No

Override TTS engine

Audio plays in the background — the tool returns immediately without blocking Claude.

list_voices

List available TTS voices.

Parameter

Type

Required

Description

engine

"system" | "openai" | "all"

No

Which voices to list (default: "all")

configure_speech

Set session defaults. Call with no arguments to view current config.

Parameter

Type

Required

Description

engine

"system" | "openai"

No

Default TTS engine

voice

string

No

Default system voice

openai_voice

string

No

Default OpenAI voice

openai_model

"tts-1" | "tts-1-hd"

No

OpenAI model quality

rate

number

No

Speech rate in WPM (50-500, default 200)

speech_style

string

No

Speaking style/persona (set to "" to clear)

speech_style

Set a speaking style or persona. Call with no arguments to view current style.

Parameter

Type

Required

Description

style

string

No

Style description (e.g. "talk like a clown"). Set to "" to clear. Omit to view.

Voice Options

System Voices (macOS)

The default voice is your macOS system voice — whatever you've set in System Settings > Accessibility > Spoken Content. This means if you have a Siri voice selected (like "American Voice 4"), that's what you'll hear.

To change your system voice: System Settings > Accessibility > Spoken Content > System Voice. Or use /change_voice to pick a specific named voice.

Other notable system voices:

Voice

Style

Samantha

Classic, clear female

Daniel

British male

Reed

Natural male

Sandy

Natural female

Fred

Classic robotic

Whisper

Whispered speech

Run /change_voice to hear them all and pick your favorite.

OpenAI Voices

Available when OPENAI_API_KEY is set:

Voice

Style

alloy

Neutral, balanced

ash

Conversational, warm

ballad

Expressive, dramatic

coral

Clear, friendly

echo

Smooth, resonant

fable

Distinctive, narrative

nova (default)

Energetic, natural

onyx

Deep, authoritative

sage

Calm, measured

shimmer

Light, expressive

Models:

  • tts-1 — Fast, good quality (default)

  • tts-1-hd — Slower, higher quality

Project Structure

speak-to-me-mcp/
  src/
    index.ts        Entry point
    tools.ts        MCP tool registration
    tts.ts          TTS engine logic (system + OpenAI)
    types.ts        TypeScript interfaces
    constants.ts    Defaults and limits
  skills/
    speak_final/    /speak_final slash command
    speak_plan/     /speak_plan slash command
    change_voice/   /change_voice slash command
    speech_style/   /speech_style slash command
  dist/
    index.cjs       Bundled server (run this)

Requirements

  • macOS (uses say and afplay commands)

  • Node.js >= 18

  • OpenAI API key (optional, for premium voices)

License

MIT

Available Tools

4 tools
configure_speechA

Set default speech preferences for this session. Changes persist until the MCP server restarts. Call with no arguments to view current config.

ParametersJSON Schema
NameRequiredDescriptionDefault
rateNoSpeech rate in words per minute for system engine. Default 200. Range: 50-500.
voiceNoDefault system voice name (e.g. 'Samantha', 'Daniel', 'Shelley').
engineNoDefault TTS engine: "system" or "openai".
openai_modelNoOpenAI model: "tts-1" (fast) or "tts-1-hd" (higher quality).
openai_voiceNoDefault OpenAI voice (e.g. 'nova', 'alloy', 'onyx').
speech_styleNoSpeaking style or persona that shapes how text is composed (e.g. 'talk like a clown', 'be super concise', 'speak like a business woman'). Set to empty string to clear.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does disclose an important behavioral trait: changes are session-scoped and 'persist until the MCP server restarts'. That volatility disclosure plus the no-arg read mode is meaningful. It still omits what happens to in-flight or subsequent speech and how invalid values are handled, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, followed by the persistence caveat and the read-only invocation mode. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, all-optional configuration tool with no output schema, the description covers scope, lifetime and the zero-argument read behavior, which is what an agent needs to call it safely. It is slightly incomplete on the relationship to the 'speech_style' sibling tool and on interaction with active speech.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every one of the six parameters (rate, voice, engine, openai_model, openai_voice, speech_style) is documented in the schema with defaults, ranges and examples. The description adds no parameter-level detail beyond the schema, so the baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Set default speech preferences') with a clear scope ('for this session'), so an agent knows exactly what the tool mutates. It does not, however, distinguish itself from the sibling 'speech_style' tool or explain how a 'default preference' differs from a per-call style, leaving some ambiguity among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one concrete usage rule ('Call with no arguments to view current config'), which is genuinely useful dual-mode guidance. But it offers no when-not guidance and never routes the agent away from the closely named sibling 'speech_style', so selection between the two remains 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.

list_voicesB

List available text-to-speech voices. Returns system (macOS) voices and/or OpenAI voices depending on the engine parameter.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoWhich engine voices to list: "system", "openai", or "all" (default).all

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that results vary by engine and include macOS system voices and/or OpenAI voices, but it does not describe the return format (e.g., names vs. IDs vs. metadata) or any other behavioral trait beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The core purpose is front-loaded, followed by the one important behavioral dependency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with a fully documented single parameter and no output schema, the description is nearly complete. It states purpose and return variation, though it could have added a brief note on when to call it before using speak.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single enum parameter is fully documented in the schema. The description mentions the engine parameter but adds no syntax or meaning beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('available text-to-speech voices'), making the tool's purpose immediately clear. It does not explicitly differentiate itself from siblings like speak or configure_speech, but the listing purpose is distinct enough on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as speak or configure_speech. It only explains how the engine parameter affects the result, which is parameter behavior rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

speakA

Speak text aloud using text-to-speech. Use this to give Claude a voice — summarize changes, announce completions, or narrate explanations audibly. Audio plays on the user's machine and the tool returns immediately without waiting for speech to finish.

Default engine is macOS system TTS (free, offline). Set engine to "openai" for higher quality (requires OPENAI_API_KEY env var).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to speak aloud. Keep it concise — aim for 1-3 sentences summarizing what happened.
voiceNoOverride voice name. Leave unset to use the system default (Siri). For openai: alloy, ash, ballad, coral, echo, fable, nova, onyx, sage, shimmer.
engineNoTTS engine: "system" (macOS say, free) or "openai" (premium, requires OPENAI_API_KEY). Defaults to session config.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses non-blocking behavior ('returns immediately without waiting for speech to finish'), that audio plays on the user's machine, the default offline engine, and the OPENAI_API_KEY requirement. It omits failure behavior (e.g., what happens if the key is missing) and whether speech can be interrupted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose in the first clause, then usage, then behavior. Three short paragraphs with no filler; each sentence contributes routing or behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param, no-annotation, no-output-schema tool, the description covers purpose, usage, non-blocking behavior, engine choice, and the API-key prerequisite. Only error/failure handling is left uncovered, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters, making 3 the baseline. The description adds the default engine and the free-vs-premium tradeoff, but it also states 'Default engine is macOS system TTS' while the schema says 'Defaults to session config' – a mild inconsistency rather than a clarifying addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Speak text aloud using text-to-speech.' That is unambiguous and distinct from the sibling tools (list_voices, configure_speech, speech_style), but the description never names those siblings or clarifies the boundary, so an agent must infer the routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use context: 'summarize changes, announce completions, or narrate explanations audibly.' That is clear positive guidance, but there is no exclusion guidance (e.g., when not to speak, or to use configure_speech first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

speech_styleA

Set a speaking style or persona that shapes how Claude composes spoken text. This does NOT change the TTS voice — it changes the way summaries are written before being spoken aloud.

Examples: "talk like a clown", "speak like a business woman", "be super concise and direct", "explain things like a friendly teacher".

Call with an empty style to clear it. Call with no arguments to view the current style.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoThe speaking style or persona to use when composing spoken text. Set to "" to clear. Omit to view current style.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the key non-obvious behavior: the style affects the pre-TTS composition of summaries rather than the voice itself, and the empty-string sentinel clears state. It omits persistence scope (session vs global), whether setting is idempotent, and any auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short blocks: the core behavior plus its negative boundary first, then concrete examples, then the control semantics. Every sentence earns its place and the most important clarifier (not the TTS voice) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema and no annotations, the description covers purpose, examples, and state-clear/view behavior well enough to invoke correctly. The remaining gap is scope/persistence of the setting and what the view mode returns, which are minor for this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter is fully documented in the schema, so the schema does the heavy lifting. The description restates the same clear/view semantics in prose and adds only the illustrative examples, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set a speaking style or persona') and immediately bounds the effect: it shapes how spoken text is composed, not the TTS voice. That boundary functionally separates it from the voice-related siblings (speak, list_voices, configure_speech) without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit mode-selection instructions: pass a style to set it, pass an empty string to clear it, omit the argument to view the current style. This is clear context for using the tool, though it never states when to reach for this tool rather than configure_speech, nor any prerequisite conditions.

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.

  1. 4 tool updatesv2.0.0
    • First observedconfigure_speech
    • First observedlist_voices
    • First observedspeak
    • First observedspeech_style

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation4/5

speak, list_voices, configure_speech, and speech_style each target fairly distinct actions, and descriptions clarify that speech_style affects text composition rather than TTS voice. However, configure_speech and speech_style both deal with settings/preferences and could initially be confused, even if the descriptions distinguish them.

Naming Consistency4/5

Three tools follow a verb/noun or verb_object pattern (speak, list_voices, configure_speech), but speech_style breaks the imperative pattern as a noun phrase. The deviation is minor and the names remain readable.

Tool Count5/5

Four tools is well-scoped for a text-to-speech server: one to speak, one to enumerate voices, and two to configure behavior. Nothing feels extraneous or missing at the count level.

Completeness4/5

The surface covers the core lifecycle of speaking, voice discovery, and configuration. A stop/interrupt or queue-control tool is absent, but the fire-and-forget design makes that a minor, workable gap.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A cross-platform MCP server that enables Claude to speak using Microsoft Edge TTS with support for over 300 voices across 50+ languages. It requires no API keys and allows for customization of speech rate, volume, and pitch.
    3
    18 PyPI
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives Claude Code text-to-speech capabilities with support for multiple simultaneous instances, message queuing, and a web UI for monitoring.
    1
    -