Skip to main content
Glama

macwhisper-mcp-server

Local MCP server that connects MacWhisper to Claude Desktop.

What it does: Drop an audio file on your Desktop, then ask Claude to transcribe it, summarise it, or pull out action items — in one step. MacWhisper does the transcription on your Mac; Claude does the thinking. Nothing leaves your machine. No cloud APIs. No data ever leaves your Mac.

Audio file  →  MacWhisper CLI  →  MCP server  →  Claude Desktop

CI CodeQL PyPI version License: MIT


Claude Desktop transcribing an audio file


Requirements

  • macOS (MacWhisper is macOS-only)

  • MacWhisper — installed and licensed

  • MacWhisper CLI enabled: open MacWhisper → Settings → Advanced → Command-Line Tool → Install. This places mw at /usr/local/bin/mw.

  • Python 3.13.x via pyenv

  • Claude Desktop

Installing MacWhisper via Homebrew:

brew install --cask macwhisper

After installation, enable the CLI in MacWhisper Settings as above. When you later run brew upgrade --cask macwhisper, the CLI symlink updates automatically — no re-install needed.


Related MCP server: ClassNotes MCP

Install

brew tap docdyhr/tap
brew install docdyhr/tap/macwhisper-mcp-server

This installs the macwhisper-mcp binary into your Homebrew prefix. Upgrade later with brew upgrade docdyhr/tap/macwhisper-mcp-server.

Option B — pip / source

pip install macwhisper-mcp-server

Or from source:

git clone https://github.com/docdyhr/macwhisper-mcp-server.git
cd macwhisper-mcp-server

pyenv install 3.13.13   # skip if already installed
pyenv local 3.13.13
python -m venv .venv
source .venv/bin/activate
pip install -e .

Verify the MacWhisper CLI is reachable:

mw version

Configure Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add:

{
  "mcpServers": {
    "macwhisper": {
      "command": "macwhisper-mcp",
      "args": [],
      "env": {
        "MACWHISPER_ALLOWED_PATHS": "~/Desktop:~/Downloads",
        "FASTMCP_CHECK_FOR_UPDATES": "off"
      }
    }
  }
}

Restart Claude Desktop.

Note: Audio files must be saved to your Mac's filesystem (Desktop, Downloads, or another allow-listed folder) before asking Claude to transcribe them. Files uploaded directly to the Claude chat window live in Claude's container and are not accessible to the local MacWhisper CLI.

Verify it works

In Claude Desktop, ask:

Transcribe ~/Desktop/memo.m4a

You should see a transcribe_audio tool call appear, followed by the transcript.


Available tools

Tool

Description

transcribe_audio(path, model?, language?, persist?, engine?)

Transcribe an audio file and return the transcript as plain text. language is an ISO 639-1 code (e.g. da) or auto; overrides any per-directory default. persist=true saves to MacWhisper history (MacWhisper engine only). engine is "macwhisper" (default) or "whisper-cpp" — see Alternative engine below.

list_models()

List transcription models installed in MacWhisper, plus whisper-cpp models if MACWHISPER_WHISPERCPP_MODEL_DIR is configured; active MacWhisper model is marked

cancel_transcription()

Cancel the currently running transcription

list_allowed_paths()

Return the directories the server is allowed to read from

start_watch(folder)

Watch a folder and auto-transcribe new audio files into ../done/

stop_watch()

Stop the active folder watcher

get_watch_results()

Return completed watch-folder transcriptions and clear the queue

Supported audio formats: .m4a .mp3 .mp4 .mov .wav .aiff .flac


Configuration

All configuration is via environment variables. Pass them through the env dict in claude_desktop_config.json (for Claude Desktop) or set them in .env for local development.

Env var

Default

Description

MACWHISPER_ALLOWED_PATHS

~/Desktop

Colon-separated list of directories the server may read from

MACWHISPER_CLI

auto-detected

Path to the mw binary. Defaults to /Applications/MacWhisper.app/Contents/MacOS/mw if that file exists, otherwise mw on PATH

MACWHISPER_LOG_PATH

~/Library/Logs/macwhisper-mcp.log

Log file path (never stdout — that's reserved for MCP)

MACWHISPER_LANGUAGE_DEFAULTS

none

Colon-separated dir=lang pairs (ISO 639-1, or auto) — files in a matching directory get --language automatically. Most specific directory wins; an explicit language argument always overrides.

MACWHISPER_WHISPERCPP_BINARY

whisper-cli on PATH

Path to the whisper-cli binary, if not on PATH. Only used when engine="whisper-cpp".

MACWHISPER_WHISPERCPP_MODEL_DIR

none

Directory containing your GGML .bin model files. Required to use engine="whisper-cpp" at all — see below.

Local development: copy .env.example to .env and adjust. With direnv, .envrc exports .env automatically. Without direnv: source .env.

Per-directory language defaults

If you regularly transcribe recordings in a specific language, map a subfolder to it instead of passing language on every call:

"MACWHISPER_LANGUAGE_DEFAULTS": "~/Desktop/DK=da:~/Desktop/DE=de"

Drop a file in ~/Desktop/DK/ and transcribe_audio passes --language da automatically. An explicit language argument on the tool call always wins over the directory default.

Alternative engine: whisper.cpp

transcribe_audio(..., engine="whisper-cpp") transcribes using a standalone whisper.cpp binary instead of MacWhisper — useful if you don't have a MacWhisper license, or want a fully open-source local path. It does not touch MacWhisper in any way.

Setup:

brew install whisper-cpp

Homebrew installs the whisper-cli binary only — no models. Download a GGML model yourself (this server never downloads anything over the network) from huggingface.co/ggerganov/whisper.cpp, e.g. ggml-base.en.bin, into a directory of your choice, then point the server at it:

"MACWHISPER_WHISPERCPP_MODEL_DIR": "~/whisper-models"

Then call the tool with the model's filename (not a MacWhisper engine:model-id string):

Transcribe ~/Desktop/memo.wav using the whisper-cpp engine with model ggml-base.en.bin

Limitations (v1):

  • Input formats: .wav, .mp3, .flac only — not .m4a/.mp4/.mov/.aiff. This is whisper.cpp's own native format support; convert other formats first (e.g. with ffmpeg) or use the default MacWhisper engine, which handles all supported formats.

  • persist=true is not supported — whisper.cpp has no history mechanism.

  • Default language is English (en) if neither language nor a directory default is set — unlike MacWhisper, which defers to the app's own language selection.


Development

source .venv/bin/activate
pip install -e ".[dev]"

# Tests
pytest -q

# Lint + format
ruff check .
ruff format .

# Pre-commit hooks (one-time setup)
pip install pre-commit
pre-commit install

# Smoke-test against a real audio file (server must not be running in Claude Desktop)
python scripts/smoke_test.py ~/Downloads/Test.m4a

Logs

tail -f ~/Library/Logs/macwhisper-mcp.log

Security

  • All file paths are resolved (symlinks followed) and checked against the MACWHISPER_ALLOWED_PATHS allow-list before anything reaches the CLI.

  • subprocess.run is always called with an argv list — never shell=True.

  • No network calls. Ever.

See PRD §7 for the full threat model.


Known limitations

  • Uploaded files: Files dragged into the Claude chat window live in Claude's container and are not accessible to the local MacWhisper CLI. Save the file to your Desktop or Downloads folder (or another allow-listed directory), then ask Claude to transcribe it from there.

  • Danish letter names: Whisper may phonetically approximate letter names (e.g. "Æ, Ø, Å" → "E, Y, U") when they are spoken in isolation. Letters inside words transcribe correctly. This is a Whisper engine limitation, not a bug in this wrapper. See PRD §12.

  • Cold-start latency: First transcription after MacWhisper launches takes ~13s (model load). Subsequent calls are ~2s.


License

MIT — see LICENSE.

Available Tools

7 tools
cancel_transcriptionCancel TranscriptionA

Cancel the currently running transcription, if any.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. 'If any' usefully discloses that the call is a no-op when nothing is running, but it says nothing about what happens to partial results, whether cancellation is immediate, or any auth requirements. Output schema covers the return value, softening the gap.

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?

A single front-loaded sentence with no filler; every word earns its place.

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 zero-parameter cancel tool with an output schema documenting the response, the description covers the essential purpose and the idle no-op case. Only minor behavioral detail about the fate of an in-flight transcription 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies.

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?

Specific verb ('Cancel') plus resource ('the currently running transcription'), so an agent immediately knows the operation. It is implicitly distinct from sibling transcribe_audio, but the description never names or contrasts with any sibling, keeping it short of a 5.

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?

The phrase 'if any' implies the tool is safe to call whenever a transcription might be running, which is a usable invocation cue. However, it gives no explicit when-to-use guidance relative to siblings like transcribe_audio or start_watch, leaving the agent to infer the context.

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

get_watch_resultsGet Watch ResultsA

Return completed watch-folder transcriptions and clear the queue.

Each entry contains: file, transcript, destination, error.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/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 critical non-obvious trait: calling it CLEARS the queue, i.e. a destructive side effect that consumes results. It does not mention auth requirements, idempotency, or behavior when no transcriptions are ready, but the key destructive behavior is surfaced.

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?

Two tight sentences, front-loaded with the action and the destructive queue-clearing side effect before the return fields. The second sentence duplicates the output schema slightly but is short and useful for a quick scan.

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?

An output schema exists, so return values needn't be explained, and with zero parameters the description's main job is behavioral context — which it partly delivers by flagging the queue clearing. The main gap is workflow context (that it pairs with start_watch/stop_watch) rather than call mechanics.

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?

The tool takes zero parameters, so the schema leaves nothing to interpret and the baseline of 4 applies. The description's enumeration of return fields is redundant with the output schema but not harmful.

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+resource combination: returning completed watch-folder transcriptions. The 'watch-folder' qualifier distinguishes it from sibling transcribe_audio, though no sibling is named explicitly.

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?

Usage is only implied: 'completed watch-folder transcriptions' signals this is called after start_watch to harvest output, but there is no explicit when-to-call, polling guidance, or statement about what to do when the queue is empty. No alternatives are named.

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

list_allowed_pathsList Allowed PathsA

Return the directories this server is allowed to read audio from.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/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 disclosure burden. 'Return' implies a non-mutating read, but it does not explicitly state read-only behavior, permission requirements, or whether results are cached/static. For a zero-parameter listing call the risk is low, so the gap is moderate rather than severe.

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?

A single front-loaded sentence naming the resource and its scope, with zero filler. Nothing could be removed without losing meaning.

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?

An output schema exists, so the description need not explain return values, and the tool is parameterless and simple. The only missing element is a note on when this read-only inspection is appropriate relative to siblings, which is minor for a tool of this complexity.

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?

The tool takes zero parameters, so the baseline is 4. There are no parameter semantics that could be clarified further, and no input-side ambiguity exists.

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 (Return/List) and resource (directories the server may read audio from), which is concrete and unambiguous. It is distinguishable from siblings like transcribe_audio or list_models by content, though it never explicitly contrasts itself with them.

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?

There is no guidance on when to call this versus alternatives such as list_models, nor any mention of prerequisites or context of use. The agent must infer that this is a configuration-inspection call.

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

list_modelsList ModelsA

Return the transcription models available across all engines.

MacWhisper entries are formatted as engine:model-id — Display Name [active] where [active] marks the model currently selected in MacWhisper; pass the engine:model-id string as model with the default engine="macwhisper". whisper-cpp entries (if MACWHISPER_WHISPERCPP_MODEL_DIR is configured) are formatted as filename [whisper-cpp]; pass the filename as model with engine="whisper-cpp". Requires the MacWhisper CLI to be reachable even if you only intend to use the whisper-cpp engine.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/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 useful work: it discloses that whisper-cpp entries only appear when MACWHISPER_WHISPERCPP_MODEL_DIR is configured and warns that the MacWhisper CLI must be reachable even if only the whisper-cpp engine is intended. It does not cover failure modes or what happens when the CLI is unreachable, so not a full 5.

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

Conciseness3/5

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

Purpose is front-loaded and the two engine formats are clearly separated, but a large share of the text re-describes the output string format even though an output schema already exists, making it longer than the tool's single-action nature warrants.

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?

For a zero-parameter, read-only listing tool with an output schema, the description is more than complete: it explains the engine-specific formatting, the environment-variable dependency, and the CLI reachability requirement an agent needs in order to use results correctly.

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?

The tool takes zero parameters, which sets a baseline of 4, and the description appropriately uses its space to explain how the returned identifiers feed the parameters of other tools rather than inventing input semantics that do not exist.

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 ('Return') and resource ('the transcription models available across all engines'), with the scope made explicit. An agent can immediately distinguish this discovery tool from the sibling action tools like transcribe_audio and cancel_transcription.

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?

The description clearly explains the context of use by tying the returned strings back to the 'model' and 'engine' arguments needed for transcription, so an agent knows this is a prerequisite discovery step. It stops short of naming alternative tools or explicit when-not-to-use conditions, so it does not reach a 5.

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

start_watchStart WatchA

Start watching a folder for new audio files to auto-transcribe.

New audio files dropped into folder are transcribed automatically and moved to a "done" directory. By default this is <folder>/../done; override it with the MACWHISPER_WATCH_DONE_DIR env var. Both the incoming folder and the done directory must be inside the configured allow-list, otherwise the call is rejected. Call get_watch_results() to retrieve completed transcriptions.

NameRequiredDescriptionDefault
folderYesAbsolute or ``~``-prefixed path to the incoming directory.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/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 load and does well: it discloses the auto-transcription side effect, that files are moved to a done directory, the default done path, the env-var override, and that out-of-allow-list paths cause rejection. It omits what happens if a watch is already running on the same folder or how to stop it (stop_watch).

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 and effect, then constraints, then the follow-up call. No filler and each sentence adds an actionable fact.

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 an output schema (so return values need no explanation), the description covers purpose, side effects, directory constraints, and the results-retrieval path. It leaves minor gaps around duplicate/conflicting watches and error semantics.

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%, so baseline is 3, but the description adds real meaning for the single parameter: the folder must be inside the configured allow-list or the call is rejected, and it explains the related done-directory path and its override. That is more than the schema's path-format description provides.

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 (start watching), resource (a folder), and outcome (auto-transcribe new audio files), which cleanly separates it from stop_watch, get_watch_results, and one-shot transcribe_audio. An agent can identify the operation without opening the 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?

It routes the agent forward explicitly ('Call get_watch_results() to retrieve completed transcriptions'), giving clear post-invocation context. It does not, however, state when to prefer this persistent watch over the sibling transcribe_audio for a single file, so the exclusion guidance is incomplete.

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

stop_watchStop WatchB

Stop the active folder watcher.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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 disclosure. It does not say whether stopping preserves or discards watch results, whether the operation is reversible, or what happens if no watcher is running — meaningful gaps for a state-changing tool.

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?

A single front-loaded sentence with no filler. It is appropriately brief, though it is so short that it leaves behavioral questions unanswered rather than being maximally informative per word.

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

Completeness3/5

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

The output schema covers return values and there are no parameters to document, so the description needn't explain results. However, with no annotations and only one sentence, the state transition (what stopping does to watch results) is underspecified for a tool sitting alongside get_watch_results.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the schema already declares an empty object with additionalProperties=false. Baseline of 4 applies for a parameterless tool.

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 (Stop) and resource (the active folder watcher), which cleanly distinguishes it from the sibling start_watch. It does not explicitly name siblings or restate scope, but the action is unambiguous.

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?

Usage is only implied: an agent infers it should call this to halt an already-running watcher. There is no guidance on behavior when no watcher is active, nor any reference to alternatives like get_watch_results for retrieving accumulated output.

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

transcribe_audioTranscribe AudioA

Transcribe a local audio file and return the transcript.

IMPORTANT: path must be a file on the user's Mac filesystem inside the configured allow-list (typically ~/Desktop or ~/Downloads). Files uploaded to the Claude chat window are NOT accessible — ask the user to save the file to their Desktop or Downloads folder first.

If this tool returns an access-denied error, do NOT attempt to transcribe the file by any other means (e.g. downloading a model, calling an external API, or using in-process speech recognition). Simply tell the user to save the file locally and retry with this tool.

NameRequiredDescriptionDefault
pathYesAbsolute or ``~``-prefixed path to an audio file on the local Mac filesystem inside the configured allow-list. Supported formats: m4a, mp3, mp4, mov, wav, aiff, flac (whisper-cpp engine only: wav, mp3, flac).
modelNoOptional model override. For the default ``engine="macwhisper"``, an engine:model-id string, e.g. "whisperkit:openai_whisper-large-v3-v20240930" — use ``list_models()`` to see what is installed. For ``engine="whisper-cpp"``, this is REQUIRED and must be the filename of a GGML model inside ``MACWHISPER_WHISPERCPP_MODEL_DIR`` (not an engine:model-id string).
engineNo"macwhisper" (default) — routes through the MacWhisper CLI, or "whisper-cpp" — an independent local backend that does not use MacWhisper at all. Requires whisper-cpp installed (`brew install whisper-cpp`) and MACWHISPER_WHISPERCPP_MODEL_DIR set.macwhisper
persistNoIf True, save the transcription to MacWhisper's history. Defaults to False. Not supported by the whisper-cpp engine.
languageNoOptional ISO 639-1 code (e.g. "da", "de") or "auto" to force the transcription language. If omitted, a per-directory default is used when the file's folder matches one configured in MACWHISPER_LANGUAGE_DEFAULTS; otherwise the engine's own default applies (MacWhisper: app selection; whisper-cpp: English).

Output Schema

NameRequiredDescription
resultYes

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 behavioral burden and does well: it discloses the local-file allow-list constraint, the inaccessibility of chat uploads, and the required behavior after an access-denied error. It does not describe whether transcription is cancellable or synchronous beyond implying a direct return, but the operational warnings are substantive.

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?

The description is front-loaded with the core action, followed by two focused paragraphs that each add necessary operational guidance. There is no filler, and the emphasis on path constraints and error handling is well placed.

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?

Given five parameters, full schema coverage, and an output schema, the description is largely complete for invoking the tool correctly. It covers the critical local-path limitation and failure mode, though it could mention preparatory sibling tools such as list_allowed_paths or list_models for model discovery.

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 five parameters including path, model, engine, persist, and language. The description adds practical meaning to path by emphasizing local allow-list access and ruling out uploaded files, which is useful but only covers one parameter beyond the schema baseline.

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 verb and resource: transcribe a local audio file and return the transcript. It also establishes scope through the local-filesystem allow-list requirement, making it easy to distinguish from sibling tools such as start_watch or list_models.

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 provides clear usage context and prerequisites: the file must be on the Mac filesystem inside the allow-list, uploaded chat files are not accessible, and access-denied errors should not be worked around. However, it does not explicitly compare this tool to siblings like start_watch or suggest list_allowed_paths as a preparatory step.

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 updatev1.2.0
    • Changedtranscribe_audio5 fields changed
      • addedInput schema / properties / engine
        Added value: +{
        +  "default": "macwhisper",
        +  "description": "\"macwhisper\" (default) — routes through the MacWhisper CLI, or\n\"whisper-cpp\" — an independent local backend that does not use\nMacWhisper at all. Requires whisper-cpp installed\n(`brew install whisper-cpp`) and MACWHISPER_WHISPERCPP_MODEL_DIR set.",
        +  "type": "string"
        +}
      • addedInput schema / properties / language
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional ISO 639-1 code (e.g. \"da\", \"de\") or \"auto\" to force\nthe transcription language. If omitted, a per-directory default is\nused when the file's folder matches one configured in\nMACWHISPER_LANGUAGE_DEFAULTS; otherwise the engine's own default\napplies (MacWhisper: app selection; whisper-cpp: English)."
        +}
      • changedInput schema / properties / model / description
        Previous value: -"Optional model override in MacWhisper engine:model-id format,\ne.g. \"whisperkit:openai_whisper-large-v3-v20240930\". Use\n``list_models()`` to see what is installed. Defaults to the\nmodel currently selected in MacWhisper."New value: +"Optional model override. For the default ``engine=\"macwhisper\"``,\nan engine:model-id string, e.g.\n\"whisperkit:openai_whisper-large-v3-v20240930\" — use ``list_models()``\nto see what is installed. For ``engine=\"whisper-cpp\"``, this is\nREQUIRED and must be the filename of a GGML model inside\n``MACWHISPER_WHISPERCPP_MODEL_DIR`` (not an engine:model-id string)."
      • changedInput schema / properties / path / description
        Previous value: -"Absolute or ``~``-prefixed path to an audio file on the local Mac\nfilesystem inside the configured allow-list.\nSupported formats: m4a, mp3, mp4, mov, wav, aiff, flac."New value: +"Absolute or ``~``-prefixed path to an audio file on the local Mac\nfilesystem inside the configured allow-list.\nSupported formats: m4a, mp3, mp4, mov, wav, aiff, flac (whisper-cpp\nengine only: wav, mp3, flac)."
      • changedInput schema / properties / persist / description
        Previous value: -"If True, save the transcription to MacWhisper's history.\nDefaults to False."New value: +"If True, save the transcription to MacWhisper's history.\nDefaults to False. Not supported by the whisper-cpp engine."
  2. 7 tool updatesv0.1.0
    • First observedcancel_transcription
    • First observedget_watch_results
    • First observedlist_allowed_paths
    • First observedlist_models
    • First observedstart_watch
    • First observedstop_watch
    • First observedtranscribe_audio

TDQS

A4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct action: single-file transcription, cancellation, model listing, path listing, and the watch lifecycle (start/stop/results). The watch tools and direct transcription tools have clearly separated purposes with no overlap. An agent can easily tell them apart.

Naming Consistency5/5

All seven tools follow a consistent snake_case verb_noun pattern (transcribe_audio, cancel_transcription, list_models, list_allowed_paths, start_watch, stop_watch, get_watch_results). Verb choices are precise and predictable.

Tool Count5/5

Seven tools is well-scoped for a focused transcription server. Every tool earns its place: core transcription, lifecycle control, discovery helpers, and the watch-folder feature set.

Completeness4/5

Core lifecycle is covered (transcribe, cancel, watch start/stop/results, model and path discovery). Minor gap: there is no status/progress query for an in-flight transcription beyond cancel, but agents can reasonably work around this.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Local-first meeting capture and transcription for Claude Code. Records audio from meeting apps, transcribes locally with whisper.cpp, and produces structured notes via Claude.
    1
    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
  • A
    license
    A
    quality
    A
    maintenance
    Enables spoken conversations with Claude on a Mac: Claude speaks through speakers, listens to the user's natural replies, and transcribes them locally. No audio leaves the computer, and it includes tools for voice setup and a hands-free voice mode.
    5
    452 npm
    MIT