Call Recorder MCP
This MCP server records macOS calls and locally transcribes them, with live assistance and speaker labeling.
Record both sides of a call from the whole system or a chosen app such as WhatsApp, Teams, Zoom, Slack, FaceTime, a browser, or a bundle ID prefix.
Optionally include or exclude the microphone, choose transcription language, set the number of people on the other side, and enable live transcription.
Follow a live call through a cursor-based live transcript to get quick help on answered questions, vague answers, and follow-ups.
Stop a recording, mix the audio, transcribe it locally with Whisper, and retrieve the transcript or poll until ready.
Re-transcribe an existing recording in another language or with speaker separation.
Transcribe existing audio or video files such as voice notes and meeting recordings.
Rename speaker labels to real names.
Check recording status and sound levels, list recent recordings and their transcription state, and list apps currently using audio to choose a source.
Captures audio from Arc so browser-based calls and meetings can be recorded and transcribed locally.
Captures audio from Firefox so browser-based calls and meetings can be recorded and transcribed locally.
Captures and transcribes Google Meet meetings held in a browser on macOS, using browser/app audio capture and local Whisper transcription.
Captures audio from Safari so browser-based calls and meetings can be recorded and transcribed locally with speaker separation.
Records and transcribes Slack calls on macOS via per-app audio capture, returning local transcripts with speaker labels.
Records and transcribes WhatsApp calls on macOS, including CallKit audio routed through Apple's avconferenced service, with local transcription and speaker separation.
Records and transcribes Zoom meetings on macOS via per-app audio capture, including separate microphone and remote tracks with optional speaker separation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Call Recorder MCPRecord my WhatsApp call and transcribe it when the call ends"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Call Recorder MCP
Model Context Protocol server that records calls on macOS (WhatsApp, Teams, Zoom, Slack, FaceTime, Google Meet or any meeting in the browser) and transcribes them locally with Whisper. Ask Claude to record, say when the call is over, and get the transcript back in the conversation, with who said what.
Audio never leaves your Mac: capture, transcription and speaker separation all run locally. Only the transcript text goes to Claude, when Claude reads it.
Features
Records both sides of a call as two aligned tracks: your microphone and what the apps play. Uses Core Audio process taps (macOS 14.4+), so no virtual audio driver such as BlackHole is needed.
Per-app capture: record only WhatsApp, Teams or the browser, or the whole system output. The capture follows the app if it starts playing late, and survives switching to AirPods mid-call.
Local transcription with whisper.cpp (
large-v3-turbo, Metal accelerated) and Silero voice activity detection, which keeps Whisper from inventing text during silences. About 75 s for 18 minutes of call on an M-series Mac.Live help during a call: Claude follows the conversation about a second behind and, as it goes, tells you which of your questions got answered, where the other side stayed vague, and what to ask next.
Who said what: "Me" (your mic) and "Other side" (what the apps play). Without headphones your mic also hears the other side; those echoes are removed.
Several people on the other side: give their number and their voices are separated (Speaker 1, 2...), then renamed to real names in one call.
Custom vocabulary so product, company and people names are spelled right.
Works with existing files too: WhatsApp voice notes, meeting recordings, any audio or video format ffmpeg reads.
A mixed
conversation.wavof each call, to listen to.20 languages: tool replies, transcript labels ("Me", "Speaker 1"...) and the macOS permission prompts follow your Mac's language, and transcription defaults to it: Arabic, Chinese (Simplified and Traditional), Dutch, English, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Portuguese (Brazil and Portugal), Russian, Spanish, Swahili, Thai, Turkish and Vietnamese. Set
CALL_RECORDER_LOCALEto choose. Transcription itself works in any language Whisper supports.
Related MCP server: macwhisper-mcp-server
Requirements
macOS 14.4 or later. Apple Silicon recommended.
Homebrew packages:
brew install whisper-cpp ffmpeg uvXcode Command Line Tools (to compile the capture helper):
xcode-select --installAbout 650 MB of disk space for the models.
Quick install
Build the capture helper and download the models (run it again after each upgrade):
uvx --from git+https://github.com/morganseznec/call-recorder-mcp call-recorder-setupRegister the server in Claude Code:
claude mcp add call-recorder -s user -- uvx --from git+https://github.com/morganseznec/call-recorder-mcp call-recorder-mcpFor Claude Desktop, add the same command to
~/Library/Application Support/Claude/claude_desktop_config.jsonand restart it:{ "mcpServers": { "call-recorder": { "command": "/opt/homebrew/bin/uvx", "args": ["--from", "git+https://github.com/morganseznec/call-recorder-mcp", "call-recorder-mcp"] } } }On the first recording, macOS asks whether CallRecorder may use the microphone and record audio from other apps. Accept both. If you missed the prompt: System Settings > Privacy & Security > Microphone (and Screen & System Audio Recording).
call-recorder-setup signs the helper with your first "Apple Development" certificate if you have one, so macOS keeps the permissions across upgrades. Without one it uses an ad-hoc signature, and macOS asks again after each rebuild.
Using it from Claude
You never call the tools yourself: talk to Claude and it picks them.
What you say | What happens |
"Record my WhatsApp call" |
|
"The call is over, transcribe it" |
|
"Record the Teams meeting, there are 4 people on the other side" |
|
"Speaker 1 is Alice, speaker 2 is Bob" |
|
"Transcribe this voice note ~/Downloads/note.opus" |
|
"Transcribe the last call again, in Spanish" |
|
"Is it recording properly?" |
|
It works the same in any language: "Enregistre mon appel WhatsApp", "Graba mi llamada de WhatsApp"...
A transcript looks like this:
# Product sync
- Date: 2026-10-27 12:10:37
- Source: teams
- Duration: 00:18:44
- Participants: Alice, Me, Speaker 2
- Language: en
## Transcript
**[00:00:02] Alice**: Hi everyone, let's go over version 2.
**[00:00:06] Me**: On my side the iOS build is ready, it's in TestFlight.Live help during a call
Give Claude the context of the call and the questions you want to ask, then start a live recording:
I'm calling a supplier about the v2 delivery. I want to know the delivery date, the budget and who validates the release. Record the WhatsApp call live and help me dig in when the answers are vague.
Claude starts the recording with live=true, then follows the call with get_live_transcript in a loop, in the same reply. After each exchange it tells you, in a few lines, which questions are covered, which answers stayed vague or evasive, and one or two follow-up questions to ask now. It stops when you stop the recording.
Each sentence reaches Claude about 1 second after it ends: a
whisper-serverkeeps the model in memory and a streaming voice detector (Silero, through sherpa-onnx) cuts each side into sentences as they come.The live text is a draft: no speaker separation, less context per sentence. The final transcript, made when the call ends, is unchanged.
In live mode the transcript goes to Claude continuously during the call.
How it works
Claude ──MCP──> call-recorder-mcp ──open──> CallRecorder.app ──> mic.wav + remote.wav
│
├──> live job (optional): streaming VAD ──> whisper-server ──> live.jsonl
└──> background job: VAD or diarization ──> whisper.cpp ──> transcript.mdCapture.
CallRecorder.appis a small Swift helper (macos/main.swift). It taps the audio of the chosen processes (Core Audio process tap + private aggregate device) and records the microphone (AVAudioEngine), writing two mono 48 kHz tracks kept aligned on the host clock. It is launched throughopenso that macOS asks for the permissions under its own name, whichever MCP client started the server.WhatsApp calls go through CallKit: their audio is played by Apple's
avconferencedservice, not by WhatsApp itself. Thewhatsappsource includes it.Transcription runs in a detached process, so a long call never times out a tool call:
stop_recordingwaits up to 30 s, then Claude pollsget_transcript. Each track is cut into utterances and every utterance is transcribed as its own short file, in a single whisper.cpp run. This keeps timestamps exact and lets the vocabulary apply everywhere.Speaker separation uses sherpa-onnx: pyannote segmentation 3.0 and CAM++ voice embeddings.
Speaker separation: why you give the number of people
Measured on a real 18-minute WhatsApp call between two people, both sides mixed into one file:
Setup | Result |
CAM++ embeddings, number of speakers given | 99.7 % of speaking time attributed to the right person |
WeSpeaker ResNet34 embeddings, number given | about 70 % |
Automatic speaker count, any threshold tried | one person split into 2 to 12 "voices", or distinct voices merged |
Short replies ("ok", "uh-huh") are too brief for a reliable voice signature, so automatic counting over-splits on real calls. With the number of people given, the clustering is reliable. Claude asks you for it on a group call.
Limits: very short interjections and overlapping speech can be misattributed, and two very similar voices can be merged.
Vocabulary
Whisper misspells names it does not know. List them in ~/Library/Application Support/call-recorder-mcp/vocabulary.txt, one per line (# for comments). call-recorder-setup creates it from an example.
Only list words people actually say: Whisper tends to insert listed names where it hears something close.
Configuration
All optional, set with -e NAME=value in claude mcp add:
Variable | Default | Purpose |
|
| Where recordings and transcripts go |
| your Mac's language | Language of replies and transcript labels: |
| same as the locale | Default transcription language, as a Whisper code ( |
|
| Vocabulary file |
|
| Helper app, models, vocabulary |
|
| Any whisper.cpp model |
| first Apple Development identity | Code signing identity used by |
Each recording gets its own folder, <CALL_RECORDER_DIR>/<date>_<time>_<title>/:
File | Content |
| The transcript, for people and for programs |
| Both sides mixed |
| Your microphone, the other side (or |
| Title, settings and state |
Recordings stop automatically after 4 hours.
Tool reference
Tool | Purpose |
| Start recording. |
| What was said since the cursor |
| Elapsed time, captured apps, live levels (-120 dB on a side means nothing is captured) |
| Stop, mix |
| Transcript of a recording ( |
| Transcribe again, e.g. in another language or to separate voices |
| Transcribe an existing audio or video file |
| Replace "Speaker 1"... with real names |
| Latest recordings and their transcription state |
| Apps currently using audio, default microphone and output |
Privacy and consent
Recording a conversation without the other people's consent is illegal in many countries (in France, article 226-1 of the Code pénal). Tell the people you are recording. Audio and transcripts are stored on your Mac, in the folder above; the transcript text is sent to Claude when it reads it, continuously in live mode.
Development
git clone https://github.com/morganseznec/call-recorder-mcp
cd call-recorder-mcp
uv run --extra dev pytest
uv run --extra dev ruff check . && uv run --extra dev ruff format --check .
uv run call-recorder-setup --skip-models # rebuild the helper after editing main.swiftTo run your checkout in Claude Code instead of the published version:
claude mcp add call-recorder -s user -- uv run --directory "$PWD" call-recorder-mcpVersioning and changelog
Semantic Versioning. See CHANGELOG.md.
License
Available Tools
10 toolsget_live_transcriptA
Live transcript of the recording in progress (started with live=true): what was said since
the cursor since, about a second after each sentence ends. Waits up to wait_seconds for new
speech. Rough text: the final transcript after the call is more accurate.
To follow a call and help the user in real time, call it in a loop within the same turn,
passing the returned cursor as since. After each batch, tell the user in a few lines (they
are on the call, keep it short): which of their planned questions got answered, where the
other side stayed vague, evasive or unconvincing, and one or two precise follow-up questions
to ask now. Say nothing when a batch brings nothing useful. Stop when the recording is over.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses polling/latency behavior, cursor advancement, wait behavior, rough text quality, and the stop condition. It does not describe failure behavior when no live recording exists, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and behavior, then gives concise loop and reporting instructions. Despite being longer than a bare definition, every sentence supports correct invocation or use of the returned transcript.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to explain return values, and it covers the live/polling workflow, cursor reuse, accuracy caveat, and stop condition. It is nearly complete, though it could say what happens if no live recording is active.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: `since` is explained as the cursor for speech already heard and as the value returned from prior calls, while `wait_seconds` is explained as the maximum wait for new speech. Both parameters gain clear operational meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific tool action and resource: a live transcript of the recording in progress, limited to speech since the cursor. It also distinguishes itself from the final transcript by saying the post-call transcript is more accurate, so an agent can tell it apart from get_transcript.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage instructions: call in a loop within the same turn, pass the returned cursor as `since`, report useful findings to the user after each batch, and stop when the recording is over. It also states the prerequisite that the recording was started with live=true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transcriptA
Transcript of a recording ("latest" or the folder name), waiting up to wait_seconds if it is still running.
| Name | Required | Description | Default |
|---|---|---|---|
| recording | No | latest | |
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 one important trait: the call is blocking for up to wait_seconds when the recording is still running. It does not say what is returned on timeout (empty transcript, partial result, or error), whether a missing recording errors, or whether the call is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The resource is front-loaded and the conditional wait behavior follows immediately, so the agent gets the essential facts in reading order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. But for a blocking retrieval tool with zero annotations, the timeout outcome and error behavior for a nonexistent recording are unaddressed, leaving an agent unable to predict what happens at the wait boundary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: 'recording' takes "latest" or a folder name, and wait_seconds caps how long it blocks while a recording is still running. Only the default values (schema-supplied) are not restated, which is fine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (transcript) and identifies the input form ("latest" or folder name), so an agent knows this retrieves an existing transcript rather than generating one. It does not explicitly contrast itself with the sibling transcribe_recording, so the get-vs-create distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause "waiting up to wait_seconds if it is still running" implies this is safe to call while a recording is in progress, which is useful context. However, there is no explicit guidance on when to use this versus transcribe_recording or transcribe_file, and no exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_audio_sourcesB
Apps currently using audio (to choose the source), and the default microphone and output.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, and it does not explicitly say this is a read-only enumeration with no side effects. However, with zero parameters and an output schema, the description is not required to explain return values, and a listing operation is low-risk enough that the gap is small.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no padding, but it is a grammatical fragment with a dangling parenthetical ('Apps currently using audio (to choose the source), and the default microphone and output'), which reads ambiguously rather than being front-loaded with a clear verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and zero parameters, the definition covers the essentials of what the call returns, so an agent can invoke it. It still omits that the call is read-only and does not state explicitly that it should precede start_recording to select a source.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies the call is argument-free.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase enumerating what is returned (apps using audio, default microphone, default output) rather than stating 'List audio sources', though the intent is inferable. It does distinguish itself from the recording siblings by being device/source discovery, but the phrasing is fragmentary enough that an agent must read the tool name to confirm the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(to choose the source)' implies the tool is meant to be called when the agent needs to pick a capture device, likely ahead of start_recording. That is an implied workflow hint rather than an explicit when-to-use/when-not statement, and no alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recordingsC
Latest recordings and their transcription state.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that transcription state is included in the result, but says nothing about read-only safety, ordering (how 'latest' is determined), pagination beyond the limit, or whether all recordings or only recent ones are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no waste, but it is under-specified rather than efficient. The sentence leads with the resource rather than an action, so front-loading is weak.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a zero-required-parameter listing tool, the description's one piece of added information (transcription state is included) is close to sufficient, though it omits the limit behavior and the 'latest' ordering semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single `limit` parameter, and the description never mentions it. The agent cannot learn the default (10), maximum, or what happens if it is omitted from the description or schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (recordings) and notes it returns the latest ones along with their transcription state, which is informative. But it is a bare noun phrase with no verb (list/retrieve) and no scope qualifiers, so it only vaguely signals the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this versus siblings like recording_status, get_transcript, or transcribe_recording. An agent must infer from the name alone that this is the discovery/listing entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recording_statusA
Whether a recording is in progress, for how long, and the recent sound levels of each side (-120 dB on the other side means no sound is being captured).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It helpfully explains what is returned and interprets the -120 dB value as no captured sound, but it does not explicitly confirm that the operation is read-only or describe auth/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured sentence that front-loads the core status information and uses a parenthetical only where it adds interpretive value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a zero-parameter status tool with an output schema, the description covers the essential query outcome and explains the most ambiguous value (dB level meaning). It could be slightly more complete by stating that it is a read-only check or when it is appropriate to call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, which is the baseline for a 4. The description does not need to explain parameter semantics, and no misleading parameter context is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource and the information returned: whether recording is in progress, its duration, and recent per-side sound levels. It is specific enough to distinguish from siblings like start_recording or get_transcript, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: checking live recording state and levels. However, the description does not explicitly say when to use this tool versus list_recordings or stop_recording, nor does it mention prerequisites such as an active recording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_speakersC
Replace speaker labels in a transcript with real names, e.g. {"Speaker 1": "Alice"} (labels are in the user's language, as shown in the transcript). Returns the updated transcript.
| Name | Required | Description | Default |
|---|---|---|---|
| names | Yes | ||
| recording | No | latest |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the mutation and that an updated transcript is returned, but it does not say whether the stored transcript is modified in place, what permissions are required, what happens to unmatched labels, or how errors are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core purpose, gives a compact example, and ends with the return behavior. Every sentence contributes useful information without repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists and reduces the need to explain return values, this is an unannotated mutation tool with a nested-object parameter. The description does not cover the recording parameter, persistence semantics, permissions, or error cases, leaving important gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully explains the required names mapping with an example and notes that labels are in the user's language, but it entirely omits the optional recording parameter, including its default of 'latest' and accepted identifier format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Replace speaker labels in a transcript with real names.' It is clear what the tool does, but it does not explicitly distinguish itself from transcript-related siblings such as get_transcript or transcribe_recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'in a transcript'; there is no explicit guidance on when to use this instead of alternatives, prerequisites, or whether the transcript must already exist. The description does not mention the recording parameter or how to choose a recording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_recordingA
Start recording a call or a conversation.
source: "system" (all the Mac's audio, the safest), "whatsapp", "teams", "zoom", "slack", "facetime", "browser" (all browsers), "chrome", "safari", "firefox", "arc", "edge", or a bundle ID prefix (e.g. "com.microsoft.teams2"). title: name of the conversation (used for the folder name). include_mic: also record the microphone (the user's voice). language: transcription language ("en", "fr", "auto"...). Defaults to the user's language. speakers: number of people on the other side (default 1). Above 1, their voices are separated in the transcript (Speaker 1, Speaker 2...). live: also transcribe as the call goes, to follow it with get_live_transcript. Use it when the user wants help during the call (questions to ask, answers to dig into).
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| title | No | ||
| source | No | system | |
| language | No | ||
| speakers | No | ||
| include_mic | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add real behavioral context: source choices with a safety recommendation, that title becomes a folder name (a filesystem side effect), and that live transcription feeds get_live_transcript. It omits important behavior for a mutation tool: required macOS audio-capture permissions, what happens if a recording is already in progress, and how the recording ends.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then a compact per-parameter glossary. Every line corresponds to a parameter that the schema leaves undocumented, so little is wasted, though the multi-line wrapping of the source list is slightly noisy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all six parameters are covered. The remaining gap is operational context around a stateful capture tool — permissions and concurrent-recording behavior — which is a real but moderate omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all six parameters, and it does: source (with an enumerated list of valid values and bundle-ID fallback), title, include_mic, language, speakers (with the default and the Speaker 1/Speaker 2 consequence), and live. This is meaningfully richer than the bare schema types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Start recording a call or a conversation.' It is unambiguous against siblings like stop_recording and recording_status, though it never explicitly names those siblings or distinguishes itself from transcribe_file/transcribe_recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is given at the parameter level ('live ... Use it when the user wants help during the call') and a recommendation is embedded for source ('system ... the safest'). However, there is no tool-level guidance on when to use this versus transcribe_file or transcribe_recording, and no stated prerequisites or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_recordingB
Stop the recording in progress and start its transcription.
speakers: number of people on the other side, if different from the one given at start (0 = unchanged). For a group call, ask the user. language: overrides the language chosen at start. Returns the transcript if it is ready within wait_seconds, otherwise says to call get_transcript later.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | ||
| speakers | No | ||
| transcribe | No | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses that stopping also starts transcription and that the result depends on wait_seconds, but it omits permission requirements, behavior when no recording is in progress, and whether the stop action is irreversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the main action before parameter notes. The parameter section is somewhat terse and fragmentary, but it does not waste much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are not fully required in the description. Still, for a mutation tool with no annotations and four undocumented schema parameters, the description should say more about transcribe semantics and edge cases such as stopping when no recording is active.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all four parameters. It covers speakers and language and refers to wait_seconds indirectly, but it never explains the transcribe boolean, leaving a meaningful parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: "Stop the recording in progress and start its transcription." That is enough for an agent to understand the operation, but it does not explicitly distinguish this tool from related siblings such as recording_status or transcribe_recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "recording in progress" and the fallback instruction to call get_transcript later, plus a note to ask the user for group-call speaker count. However, it does not explicitly say when to use stop_recording versus recording_status, start_recording, or transcribe_recording, nor does it give clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_fileB
Transcribe an existing audio or video file (WhatsApp voice note .opus, .m4a, .mp3, .mp4, meeting recording...), copied into a new recording folder.
speakers: total number of people speaking in the file (above 1, their voices are separated into Speaker 1, Speaker 2...).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| title | No | ||
| language | No | ||
| speakers | No | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden; it does disclose that the source is copied into a new recording folder and that speakers above 1 trigger voice separation. However, it says nothing about wait_seconds behavior (blocking vs async), whether transcription is synchronous, or what happens on unsupported formats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core action and followed by the one parameter that has non-obvious semantics. No filler sentences, though the parenthetical format list runs slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and the file-format hints help. But with 5 parameters at 0% schema coverage, the unexplained wait_seconds (a timing/blocking concern) and language defaults leave real gaps for an agent deciding how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. Only 'speakers' is given real meaning ('total number of people speaking... separated into Speaker 1, Speaker 2'); title, language, and wait_seconds remain entirely unexplained, and 'path' format is only loosely implied by the listed extensions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('Transcribe an existing audio or video file') and enumerates concrete file formats, which distinguishes it from the recording-oriented siblings without naming them. The addition of 'copied into a new recording folder' clarifies the scope is an existing on-disk file rather than a live capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'existing' implicitly points to file input versus the record-then-transcribe flow of transcribe_recording, but no sibling is named and no when-to-use/when-not guidance is given. An agent must infer the routing from the word 'existing' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_recordingB
Transcribe an existing recording again, e.g. in another language, or to separate voices: speakers = number of people on the other side (0 = unchanged).
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | ||
| speakers | No | ||
| recording | No | latest | |
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does not disclose whether re-transcription overwrites the existing transcript, whether the operation is asynchronous or blocking, what wait_seconds controls, or what permissions/side effects apply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and has no wasted sentences, but it is under-specified rather than appropriately concise given four undocumented parameters and no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but the description leaves critical gaps around parameter semantics and behavioral side effects for a tool that reprocesses recordings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all four parameters. It only explains speakers; language, recording, and wait_seconds remain undocumented beyond their names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: re-transcribing an existing recording. The word "again" helps distinguish it from first-time transcription or file transcription, but it does not explicitly name siblings like transcribe_file or get_transcript.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage scenarios: re-transcribing in another language or separating voices. It does not explicitly state when not to use it or name alternatives, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.3.0- Added
get_live_transcript - Changed
start_recording1 field changed- added
Input schema / properties / liveAdded value: +{ + "default": false, + "title": "Live", + "type": "boolean" +}
9 tool updates
v0.1.0- First observed
get_transcript - First observed
list_audio_sources - First observed
list_recordings - First observed
recording_status - First observed
rename_speakers - First observed
start_recording - First observed
stop_recording - First observed
transcribe_file - First observed
transcribe_recording
TDQS
Scored across 10 tools
Most tools target distinct actions in a clear lifecycle (start/stop/status/list/transcribe/rename). The closest pair is get_transcript vs get_live_transcript and transcribe_recording vs get_transcript, but descriptions clearly separate retrieving an existing transcript, following a live call, and re-transcribing an existing recording.
Nine of ten tools follow a verb_noun snake_case pattern (start_recording, stop_recording, get_transcript, list_recordings, etc.). The only deviation is recording_status, a noun-only name, which is still readable but slightly breaks the pattern.
Ten tools is well within the ideal range and each maps to a distinct step: capture setup, recording control, live monitoring, transcription, and speaker labeling. No tool feels redundant or filler.
The surface covers the full capture-to-transcript lifecycle including live follow-along and re-transcription in another language. Minor gaps exist around housekeeping (deleting recordings, exporting/editing transcripts), but agents can work around these.
Maintenance
Related MCP Connectors
- RoomtoneOAuthio.roomtone
Ask Claude about your meetings: summaries, action items and transcripts from Roomtone
Turn calls and notes into process flow diagrams in Claude, ChatGPT, VS Code, Cursor, and Teams.
Transcribe audio and video into speaker-labelled transcripts, subtitles, clips, and cited Q&A.
Transcribe audio and video and work with your transcript library from any AI app. 119 languages.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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.16Apache 2.0
- AlicenseAqualityAmaintenanceEnables transcription, summarization, and action item extraction from audio files on your Mac using MacWhisper and Claude Desktop, all locally without any cloud APIs.752 PyPI3MIT
- AlicenseAqualityCmaintenanceCaptures and transcribes system audio in real-time using OpenAI Whisper, enabling meeting transcription, content creation, and accessibility through natural language.828 npm3MIT
- AlicenseNot gradedqualityCmaintenanceLocal-first meeting capture and transcription for Claude Code. Records audio from meeting apps, transcribes locally with whisper.cpp, and produces structured notes via Claude.1Apache 2.0