Skip to main content
Glama

Claude speaks through your Mac's speakers, listens to your answer the way a person would, and gets back what you said as text. Speech recognition runs on your Mac, so no audio leaves your computer.

Claude ──speak_and_listen("Tests pass. Open the PR?")──▶  🔊 "Tests pass. Open the PR?"
                                                         🎙 you: "yes, and tag Priya"
Claude ◀──────────────── "Yes, and tag Priya." ─────────  whisper.cpp on your Mac

Perfect for:

  • Long tasks: Claude works quietly and checks in out loud when it needs a decision, so you can step away from the screen.

  • Quick reviews: a 20-second summary of a pull request, then "approve it?"

  • Resting your eyes, or your wrists, after a long day at the keyboard.

  • Thinking out loud: talking a problem through instead of typing it.

Features

  • 🔒 On-device. whisper.cpp transcribes on your Mac. Recordings are deleted after each turn.

  • 📞 Calls. Run /mac-voice-mcp:call and the mic stays open until you hang up: talk whenever you like, while Claude works or waits. With headphones you can talk over Claude, and an optional floating bubble shows the call with mute and hang up (more).

  • 💬 Natural turn-taking. A soft chime, then it waits for you to start, and hands back about 1.5 seconds after you stop. No push-to-talk.

  • ⚡ Fast replies. A warm whisper.cpp server keeps the model loaded, so transcribing takes a fraction of a second on Apple Silicon.

  • 🗣️ A natural voice, if you want one. Uses your best macOS voice, or the optional Kokoro neural voice.

  • ✋ Asks before installing anything. Setup checks what you already have and reuses it.

  • 🙋 Talk while Claude works. Say "Claude, use the other branch" mid-task and it takes it into account at its next step (Claude Code plugin).

  • 🫧 Voice Buddy (optional, Claude Code). A one-line status above the prompt shows when Claude is speaking or listening, your first keystroke interrupts it, and on a call it hands your words to Claude while it waits.

  • 🪟 One mic, many windows. Claude Code, Claude Desktop and Cursor take turns instead of talking over each other.

  • 📏 Measured, not guessed. doctor checks the whole pipeline on your Mac and scores it PASS, WARN or FAIL.

Related MCP server: Voice MCP

Quick start

You need a Mac (Apple Silicon recommended) and Node.js 22 or newer.

1. Install.

  • Claude Code (recommended). Install the plugin, and Voice Buddy with it:

    /plugin marketplace add jeet0007/mac-voice-mcp
    /plugin install mac-voice-mcp@mac-voice-mcp
    /plugin install voice-buddy@mac-voice-mcp

    Voice Buddy is optional: it adds a one-line voice status above the prompt and lets you interrupt by typing (more).

  • Cursor or VS Code:

  • Claude Desktop and other apps: add npx -y mac-voice-mcp@latest as a stdio MCP server. See Install for each app.

2. Set up. Ask Claude to "set up voice" (or run /mac-voice-mcp:setup). It checks for SoX, whisper.cpp and a speech model, shows you what's missing, and installs it only after you say yes.

3. Allow the microphone. The first time Claude listens, macOS asks. Click Allow.

4. Talk. Run /mac-voice-mcp:talk fix the flaky login test, or ask Claude to "check in with me by voice when you need a decision". Reply after the chime. Or start a call with /mac-voice-mcp:call and talk like on the phone; say "hang up" to end it.

Allow voice turns without prompts

Claude Code asks for approval every time Claude wants to speak, which breaks the flow of a conversation. To allow voice turns, add the tool to permissions.allow in ~/.claude/settings.json:

{
  "permissions": {
    "allow": [
      "mcp__plugin_mac-voice-mcp_voice-mcp__speak_and_listen",
      "mcp__voice-mcp__speak_and_listen"
    ]
  }
}

The first name is for the plugin, the second for claude mcp add voice-mcp …. Leave voice_setup out, so installs still ask you first.

How it works

The server has two tools and two prompts:

What it does

speak_and_listen

Speaks a short message, listens for one conversational turn and returns the transcript.

voice_setup

Checks what's installed. After you agree, it installs only what's missing.

setup prompt

A guided setup: it checks, asks you, installs, then runs a spoken test.

voice_mode prompt

A hands-free session where Claude checks in by voice at natural points.

Claude is told to write for the ear: short sentences, no markdown, file names instead of paths. Anything that slips through is rewritten before it's spoken. In Claude Code, the plugin keeps a voice conversation in voice until you type. More in Using it.

Troubleshooting

Run npx -y mac-voice-mcp@latest doctor first. It tests setup, the voice and transcription, and your speakers and mic, and tells you which part fails.

Symptom

Fix

"microphone returned pure digital silence"

Allow the mic for the app (Claude, Cursor or your terminal) in System Settings → Privacy & Security → Microphone, then restart it.

It cuts me off while I'm thinking

Set VOICE_MCP_END_SILENCE_MS=2000.

The voice sounds robotic

Download a Premium macOS voice or install Kokoro. See Voices.

It asks for approval every turn

See Allow voice turns without prompts.

More in Troubleshooting.

Documentation

  • Install: every app, the MCP Registry, installing from a clone, upgrading.

  • Voices: macOS Premium voices and the optional Kokoro voice.

  • Using it: voice mode, talking while Claude works, Voice Buddy, several sessions.

  • Configuration: every setting, and the speech models.

  • Troubleshooting: common problems and known limitations.

  • Privacy and security: what stays on your Mac, and how the project is secured.

  • Development: building, testing and releasing.

  • Changelog

🤖 Vibe-coded

This project was designed and written with Claude, in conversation. A human (me) steered it, tested it on a real Mac and checked the test suite, but most of the code was written by AI. Read the Disclaimer before you rely on it.

Disclaimer

mac-voice-mcp is a free, open-source personal project. It's provided as is, with no warranty of any kind, and the authors aren't liable for any damage or loss from using it. See the LICENSE for the exact terms. In plain words:

  • It turns on your microphone whenever an AI assistant calls speak_and_listen, and for the whole of a call, until you hang up. It plays sound through your speakers.

  • Speech recognition makes mistakes. An assistant may act on a misheard word. Check what it heard before you let it do anything you can't undo, like deleting files, pushing code or sending messages.

  • It installs software on your Mac, but only after you agree: Homebrew packages, and kokoro-js with npm if you choose the Kokoro voice. Those are separate projects, under their own licenses (below).

  • There's no guaranteed support. Issues and pull requests are welcome, and fixed on a best-effort basis.

Trademarks. Apple, Mac, macOS and Siri are trademarks of Apple Inc. Claude is a trademark of Anthropic. mac-voice-mcp is an independent project, not affiliated with, sponsored or endorsed by Apple or Anthropic.

Third-party software

mac-voice-mcp doesn't bundle any of these. It uses them when they're on your Mac, and installs them only with your consent. Each one comes under its own license.

Software

Used for

License

SoX

Recording from the mic, Kokoro playback

GPL-2.0

whisper.cpp

Speech-to-text

MIT

Whisper models (OpenAI)

Speech-to-text

MIT

macOS voices (say)

The built-in voice

Apple's macOS license

kokoro-js (optional)

The Kokoro voice

Apache-2.0

Kokoro-82M model (optional)

The Kokoro voice

Apache-2.0

espeak-ng (optional, inside kokoro-js)

Turning text into sounds for Kokoro

GPL-3.0

ffmpeg (fallback, never installed by setup)

Recording, if SoX is missing

LGPL-2.1 / GPL

License

MIT © Jeet

Available Tools

5 tools
callCallA
Idempotent

Start or end a call: a hands-free session where the microphone stays open and the user talks whenever they like, like a phone call, until they hang up. action start takes the speaker and microphone, says a short greeting and returns the rules of the call; action end hangs up (also happens when the user says "hang up" or "bye Claude", or after a long silence). During the call, speak with say and hear the user with listen.

NameRequiredDescriptionDefault
actionYesstart: take the mic and greet the user. end: hang up.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare the safety profile (destructive=false, idempotent=true), and the description adds substantial context beyond them: a greeting is spoken on start, the rules of the call are returned, and hangup can be triggered by the user ('hang up', 'bye Claude') or by long silence. Remaining gap: it does not say what happens if start is invoked while a call is already active, which is exactly where idempotentHint=true would matter.

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

Conciseness4/5

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

Front-loaded with the core definition, then actions, then in-call routing — good ordering with no filler sentences. The 'like a phone call, until they hang up' clause is slightly verbose but does real semantic work by conveying the open-mic model, so the cost is minor.

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

Completeness5/5

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

One required enum parameter, annotations covering safety, no output schema to explain — the description covers the full lifecycle (start, in-call, implicit and explicit end) at the right level of detail for a tool this small. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

With one enum parameter at 100% schema coverage, the baseline is 3; the description earns above that by adding outcomes the schema omits — start returns the rules of the call, and end may occur without an explicit call. The schema's own enum text ('take the mic and greet the user') is thinner than the description's explanation.

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 pair ('Start or end a call') and immediately defines the resource in operational terms (hands-free, mic stays open, user talks freely). An agent can distinguish this from 'say' and 'listen' without opening either schema, since the description frames those as in-call primitives.

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

Usage Guidelines5/5

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

Gives explicit when-to-use for each action ('action start takes the speaker and microphone', 'action end hangs up') and routes in-call behavior to the correct siblings: 'During the call, speak with say and hear the user with listen.' It also lists the implicit conditions under which the call ends, so the agent knows ending is not solely its job.

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

listenListen (on a call)A

During a call: return what the user has said since you last heard from them, at once if something is waiting, otherwise wait up to wait_seconds (default and maximum 40) for their next words. "(still on the call, nothing said)" means nobody spoke yet: call listen again to keep waiting, or say something. Once it reports that the call ended, don't call it again.

NameRequiredDescriptionDefault
wait_secondsNoHow long to wait for the user to speak (default and maximum 40).

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, it discloses the key behaviors: it returns immediately if data is pending, otherwise blocks up to wait_seconds (default and maximum 40), emits the literal sentinel string '(still on the call, nothing said)', and reaches a terminal state after the call ends. This explains the non-idempotent, state-advancing nature implied by readOnlyHint=false and idempotentHint=false.

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 situational trigger ('During a call'), followed by behavior, sentinel interpretation, and the terminal rule. No filler, and each sentence carries distinct operational information.

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

Completeness5/5

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

With one optional parameter and no output schema, the description covers everything an agent needs: return semantics, blocking/timeout behavior, the exact sentinel string, and when to stop calling. Return values are described in prose, compensating for the absent output schema.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter is fully documented there, so the baseline is 3. The description adds meaning beyond the schema by explaining the conditional behavior: the wait only happens if nothing is already waiting, making wait_seconds a maximum blocking time rather than a fixed sleep.

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?

The description opens with a precise verb+resource and scope: 'During a call: return what the user has said since you last heard from them.' The delta semantics ('since you last heard from them') distinguish it from a full transcript read and implicitly from the sibling 'say'/'speak_and_listen' tools, which produce speech rather than consume it.

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?

It gives explicit lifecycle guidance: call it again to keep waiting when the sentinel '(still on the call, nothing said)' is returned, and stop calling once the call-ended signal appears. What's missing is an explicit statement of when to prefer this over 'speak_and_listen' or 'say', so it stops short of full alternative routing.

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

saySay (on a call)A

During a call: say text out loud and return at once, so you carry on working while it plays. The result includes anything the user said meanwhile. Only during a call: use speak_and_listen otherwise.

Write text for the ear, not the screen:

  • 1–3 short sentences, under ~40 words; lead with the outcome, then one question.

  • Plain words only: no markdown, bullets, emoji, code, file paths, URLs, stack traces or tables.

  • Describe code instead of reading it ("I added a retry to the upload function"), say file names not paths ("in index.ts"), round numbers ("about two hundred ms"), spell out symbols.

  • Ask one question at a time, answerable in a few words ("Should I deploy it — yes or no?").

  • Put the details (diffs, logs, links) in your normal on-screen reply, and say so out loud.

  • Tool output (Bash stdout, file writes) is NOT the on-screen reply. Only your own assistant message text renders.

  • A spoken turn with no assistant message text shows the user nothing — never skip the on-screen reply.

NameRequiredDescriptionDefault
textYesWhat to say. Plain, conversational text.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that playback is non-blocking, that the result includes anything the user said meanwhile, and that tool output does not render on screen. These are important behavioral traits not represented in the annotations.

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

Conciseness4/5

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

Purpose and routing are front-loaded, and the bullet structure is scannable. However, the description runs long for a one-parameter tool and repeats the on-screen reply warning across two bullets, so it is useful but not maximally concise.

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

Completeness5/5

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

It covers when to use the tool, the alternative, playback and return behavior, speech composition constraints, and the on-screen reply caveat. With no output schema, it adequately explains what the result includes and what the agent must do to avoid a silent interaction.

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

Parameters5/5

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

Although the schema fully covers the single text parameter, the description adds concrete semantics: 1–3 short sentences, under about 40 words, plain words only, no markdown or URLs, describe code rather than reading it, and ask one question at a time. This is substantial meaning beyond the schema's 'plain, conversational text.'

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?

The description states a specific action: speak supplied text during a call and return immediately. It also names the sibling alternative, speak_and_listen, for use outside a call, so an agent can distinguish it from related voice tools.

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

Usage Guidelines5/5

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

It explicitly restricts usage to during a call and directs the agent to speak_and_listen otherwise. Additional guidance covers how to compose spoken text, leaving little ambiguity about when and how to invoke it.

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

speak_and_listenSpeak and listenA

Say something out loud to the user and hear their spoken reply. Speaks text_to_speak through the computer's speakers, then listens like a conversation turn — it waits for the user to start talking and stops when they finish — and returns an on-device transcript of what they said.

Write text_to_speak for the ear, not the screen:

  • 1–3 short sentences, under ~40 words; lead with the outcome, then one question.

  • Plain words only: no markdown, bullets, emoji, code, file paths, URLs, stack traces or tables.

  • Describe code instead of reading it ("I added a retry to the upload function"), say file names not paths ("in index.ts"), round numbers ("about two hundred ms"), spell out symbols.

  • Ask one question at a time, answerable in a few words ("Should I deploy it — yes or no?").

  • Put the details (diffs, logs, links) in your normal on-screen reply, and say so out loud.

  • Tool output (Bash stdout, file writes) is NOT the on-screen reply. Only your own assistant message text renders.

  • A spoken turn with no assistant message text shows the user nothing — never skip the on-screen reply.

Good: "The build passed and all tests are green. Want me to open the pull request?" Bad: "## Results\n- npm test ✅ 42/42\n- see /Users/x/repo/src/index.ts:120"

Once the user is talking with you by voice, keep the conversation in voice: answer each transcript with another speak_and_listen call (not a text reply) until they say stop or start typing. To end voice mode, or for a one-way announcement, pass listen: false: it returns at once and speaks while you work. A reply of "(No speech detected …)" means the user did not answer — never treat it as consent. Ask once more; if still nothing, stop and say on screen that voice mode is paused and they can type to carry on (not speak: the mic is off). The "voice-mcp timing" line at the end is diagnostics: ignore it unless the user asks why things feel slow. If it reports that voice-mcp is not set up, call voice_setup.

NameRequiredDescriptionDefault
listenNoDefault true. false: only speak, without opening the microphone — for a one-way announcement, or to say goodbye when the user ends voice mode. It returns right away and speaks while you carry on.
text_to_speakYesThe summary or message to read aloud to the user. Plain, conversational text.
listen_secondsNoUpper limit on how long to listen, in seconds (default 30, max 120). Listening already stops when the user finishes talking, so you rarely need this.

TDQS

A4.7/5.0
Behavior4/5

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

Goes well beyond the generic annotations by disclosing the blocking listen cycle (waits for speech to start, stops when the user finishes), the on-device transcript return, the non-blocking behavior of listen:false, the canned '(No speech detected …)' string, and the trailing diagnostics line. It stops short of stating hard limits on audio length or error modes beyond the no-speech case.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence and the good/bad example pair earns its space. The block is long, and some lines (e.g. the reminder that Bash stdout is not the on-screen message) drift into coaching on surrounding agent behavior rather than the tool itself, but nearly every sentence carries operational value.

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

Completeness5/5

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

There is no output schema, and the description covers the return value (on-device transcript, no-speech sentinel, diagnostics line), the conversational continuation contract, and the failure fallback to voice_setup. An agent has everything it needs to invoke this correctly across its main modes.

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

Parameters5/5

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

Schema coverage is already 100%, but the description still adds real semantic value: it defines when listen:false is appropriate, explains why listen_seconds is rarely needed, and gives content-level rules for text_to_speak (plain words only, 1–3 short sentences, describe code instead of reading it, ask one answerable question).

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?

The first sentence states a precise verb pair and resource: speak text aloud, then capture the user's spoken reply as a transcript. It also implicitly separates itself from the sibling voice_setup by naming that tool only for the setup-failure case.

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

Usage Guidelines5/5

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

Explicit routing rules: keep the loop in voice via repeated calls, pass listen:false to end voice mode or make a one-way announcement, call voice_setup when diagnostics report it is not configured. It also states how to handle 'No speech detected' (ask once more, then fall back to screen text) and that transcripts must never be treated as consent.

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

voice_setupVoice setupA
Idempotent

Check whether this computer has everything speak_and_listen needs — text-to-speech, a microphone recorder (SoX), whisper.cpp speech-to-text and the speech model — and optionally install what's missing. Anything already installed is reused (an existing model elsewhere on disk is symlinked, not re-downloaded). Call it with install=false (the default) first and tell the user what is missing. Only call it with install=true after the user agrees: it runs brew install for the missing packages and downloads the speech model once. It never uninstalls or changes anything else. kokoro=true (also only after the user agrees) installs the optional Kokoro voice: more natural than the built-in one, runs on this Mac, about 1 GB on disk. Once installed it's used automatically; the built-in voice stays as the fallback. bubble=true (also only after the user agrees) builds the floating call bubble on this Mac with swiftc: a small window during calls with mute and hang up. If it reports INSTALLING, the install continues in the background — wait a minute and call it again to check.

NameRequiredDescriptionDefault
bubbleNotrue: build the floating call bubble on this Mac with swiftc (about 10 s; macOS). Ask the user first.
kokoroNotrue: install the optional Kokoro voice — a natural-sounding neural voice that runs on this Mac (kokoro-js via npm and a one-time model download, about 1 GB on disk). Ask the user first.
installNofalse (default): only check. true: brew install missing packages and download the model. Ask the user first.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is partly covered. The description still adds real behavior: existing installs are reused, a model found elsewhere on disk is symlinked rather than re-downloaded, brew install runs for missing packages only, and nothing is ever uninstalled. The one notable gap is what the check actually returns beyond the INSTALLING state.

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

Conciseness4/5

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

The purpose is front-loaded in the first clause and each following sentence covers a distinct concern: reuse of existing installs, the consent gate, kokoro, bubble, and the background INSTALLING state. The main defect is redundancy with the schema — the ~1 GB Kokoro size and 'ask the user first' warnings appear twice — plus an odd line-break inside the first sentence.

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 three-flag, open-world setup tool with no output schema, it covers the essentials: prerequisites, consent, side effects, non-destructiveness, and the asynchronous INSTALLING state. What it does not specify is the shape of the check result (how the missing pieces are reported), which is the one thing an agent must parse on the very first call.

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 coverage is 100%, so all three booleans are already described in the input schema, including the 'ask the user first' caveat. The description adds workflow meaning ('install=false is the default, call it first') and the post-install consequence that Kokoro is used automatically with the built-in voice as fallback, but it largely restates the schema's own parameter text, so a baseline 3 is right.

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?

The description names a specific verb+resource: checks the machine for the prerequisites speak_and_listen needs (TTS, SoX, whisper.cpp, speech model) and optionally installs what is missing. It explicitly ties itself to the sibling speak_and_listen, so an agent can place it in the tool set without opening a schema.

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

Usage Guidelines5/5

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

It gives a hard ordering rule: call with install=false (the default) first, report what is missing, and only then call install=true after the user agrees. It extends the same consent gate to kokoro and bubble, and adds a re-entry rule for the INSTALLING state (wait a minute and call again).

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. 1 tool updatev0.9.0
    • Changedvoice_setup1 field changed
      • addedInput schema / properties / bubble
        Added value: +{
        +  "description": "true: build the floating call bubble on this Mac with swiftc (about 10 s; macOS). Ask the user first.",
        +  "type": "boolean"
        +}
  2. 3 tool updatesv0.8.0
    • Addedcall
    • Addedlisten
    • Addedsay
  3. 1 tool updatev0.6.0
    • Changedspeak_and_listen1 field changed
      • changedInput schema / properties / listen / description
        Previous value: -"Default true. false: only speak, without opening the microphone — for a one-way announcement, or to say goodbye when the user ends voice mode."New value: +"Default true. false: only speak, without opening the microphone — for a one-way announcement, or to say goodbye when the user ends voice mode. It returns right away and speaks while you carry on."
  4. 1 tool updatev0.4.0
    • Changedvoice_setup1 field changed
      • addedInput schema / properties / kokoro
        Added value: +{
        +  "description": "true: install the optional Kokoro voice — a natural-sounding neural voice that runs on this Mac (kokoro-js via npm and a one-time model download, about 1 GB on disk). Ask the user first.",
        +  "type": "boolean"
        +}
  5. 1 tool updatev0.3.1
    • Changedspeak_and_listen1 field changed
      • addedInput schema / properties / listen
        Added value: +{
        +  "description": "Default true. false: only speak, without opening the microphone — for a one-way announcement, or to say goodbye when the user ends voice mode.",
        +  "type": "boolean"
        +}
  6. 2 tool updatesv0.1.0
    • First observedspeak_and_listen
    • First observedvoice_setup

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct role: call manages the session, listen and say operate during a call, speak_and_listen handles a standalone spoken turn, and voice_setup handles installation. The main possible confusion is between say and speak_and_listen because both produce speech, but the descriptions clarify that say is call-only while speak_and_listen is for non-call use.

Naming Consistency3/5

The names are all lowercase and readable, but they mix conventions: bare verbs (call, listen, say), a noun-like setup name (voice_setup), and a compound verb phrase (speak_and_listen). There is no single predictable verb_noun or action pattern, though the set is small enough that the inconsistency does not make it chaotic.

Tool Count5/5

Five tools is well-scoped for a voice interaction server. Each tool has a clear role: setup, call lifecycle, in-call speaking/listening, and standalone speak-and-listen. No tool appears redundant or unnecessary.

Completeness4/5

The surface covers the core voice workflow: checking/installing dependencies, starting and ending calls, speaking, listening, and standalone spoken turns. Minor gaps exist around interrupting speech, muting during a call, or inspecting voice/session status, but these are not fatal for the stated purpose.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables hands-free voice conversations with Claude using real-time speech recognition and text-to-speech on macOS. Creates a self-sustaining conversation loop where Claude can autonomously listen, respond, and continue the interaction without keyboard input.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables bidirectional voice interaction for Claude Code using local speech-to-text and text-to-speech models optimized for Apple Silicon. It provides tools to listen to user speech via microphone and speak responses aloud through system speakers.
    16
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Voice interface for Claude Code enabling hands-free, conversational interaction entirely on-device for Apple Silicon Macs. It provides push-to-talk transcription and automatic spoken responses via local AI models.
    MIT