Skip to main content
Glama

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.wav of 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_LOCALE to 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 uv

  • Xcode Command Line Tools (to compile the capture helper): xcode-select --install

  • About 650 MB of disk space for the models.

Quick install

  1. 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-setup
  2. Register the server in Claude Code:

    claude mcp add call-recorder -s user -- uvx --from git+https://github.com/morganseznec/call-recorder-mcp call-recorder-mcp

    For Claude Desktop, add the same command to ~/Library/Application Support/Claude/claude_desktop_config.json and restart it:

    {
      "mcpServers": {
        "call-recorder": {
          "command": "/opt/homebrew/bin/uvx",
          "args": ["--from", "git+https://github.com/morganseznec/call-recorder-mcp", "call-recorder-mcp"]
        }
      }
    }
  3. 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"

start_recording(source="whatsapp")

"The call is over, transcribe it"

stop_recording() returns the transcript

"Record the Teams meeting, there are 4 people on the other side"

start_recording(source="teams", speakers=4)

"Speaker 1 is Alice, speaker 2 is Bob"

rename_speakers({"Speaker 1": "Alice", "Speaker 2": "Bob"})

"Transcribe this voice note ~/Downloads/note.opus"

transcribe_file(path=...)

"Transcribe the last call again, in Spanish"

transcribe_recording(language="es")

"Is it recording properly?"

recording_status() shows live levels for both sides

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-server keeps 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.md
  • Capture. CallRecorder.app is 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 through open so 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 avconferenced service, not by WhatsApp itself. The whatsapp source includes it.

  • Transcription runs in a detached process, so a long call never times out a tool call: stop_recording waits up to 30 s, then Claude polls get_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

CALL_RECORDER_DIR

~/CallRecordings

Where recordings and transcripts go

CALL_RECORDER_LOCALE

your Mac's language

Language of replies and transcript labels: ar, de, en, es, fr, hi, id, it, ja, ko, nl, pt-BR, pt-PT, ru, sw, th, tr, vi, zh-Hans, zh-Hant (others fall back to English)

CALL_RECORDER_LANGUAGE

same as the locale

Default transcription language, as a Whisper code (en, fr, zh, auto...)

CALL_RECORDER_VOCABULARY

<home>/vocabulary.txt

Vocabulary file

CALL_RECORDER_HOME

~/Library/Application Support/call-recorder-mcp

Helper app, models, vocabulary

CALL_RECORDER_WHISPER_MODEL

<home>/models/ggml-large-v3-turbo-q5_0.bin

Any whisper.cpp model

CALL_RECORDER_SIGN_IDENTITY

first Apple Development identity

Code signing identity used by call-recorder-setup

Each recording gets its own folder, <CALL_RECORDER_DIR>/<date>_<time>_<title>/:

File

Content

transcript.md, transcript.json

The transcript, for people and for programs

conversation.wav

Both sides mixed

mic.wav, remote.wav

Your microphone, the other side (or audio.wav for an imported file)

meta.json, capture.json, transcription.json

Title, settings and state

Recordings stop automatically after 4 hours.

Tool reference

Tool

Purpose

start_recording(source, title, include_mic, language, speakers, live)

Start recording. source: system (default), whatsapp, teams, zoom, slack, facetime, browser, chrome, safari, firefox, arc, edge, or a bundle ID prefix. live=true also transcribes as the call goes

get_live_transcript(since, wait_seconds)

What was said since the cursor since, waiting up to wait_seconds for new speech; returns the next cursor

recording_status()

Elapsed time, captured apps, live levels (-120 dB on a side means nothing is captured)

stop_recording(transcribe, language, speakers, wait_seconds)

Stop, mix conversation.wav, start the transcription and return it when ready

get_transcript(recording, wait_seconds)

Transcript of a recording (latest or folder name), waiting if still running

transcribe_recording(recording, language, speakers, wait_seconds)

Transcribe again, e.g. in another language or to separate voices

transcribe_file(path, title, language, speakers, wait_seconds)

Transcribe an existing audio or video file

rename_speakers(names, recording)

Replace "Speaker 1"... with real names

list_recordings(limit)

Latest recordings and their transcription state

list_audio_sources()

Apps currently using audio, default microphone and output

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.swift

To run your checkout in Claude Code instead of the published version:

claude mcp add call-recorder -s user -- uv run --directory "$PWD" call-recorder-mcp

Versioning and changelog

Semantic Versioning. See CHANGELOG.md.

License

MIT

Available Tools

10 tools
get_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.

NameRequiredDescriptionDefault
sinceNo
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
recordingNolatest
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden 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.

Conciseness5/5

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.

Completeness3/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 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/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. 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.

Conciseness3/5

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.

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 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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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).

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. 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
namesYes
recordingNolatest

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

NameRequiredDescriptionDefault
liveNo
titleNo
sourceNosystem
languageNo
speakersNo
include_micNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It 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.

Conciseness4/5

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.

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 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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
languageNo
speakersNo
transcribeNo
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/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-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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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...).

NameRequiredDescriptionDefault
pathYes
titleNo
languageNo
speakersNo
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/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 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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

NameRequiredDescriptionDefault
languageNo
speakersNo
recordingNolatest
wait_secondsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/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 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.

Parameters2/5

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.

Purpose4/5

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

The description states a specific verb and resource: 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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv1.3.0
    • Addedget_live_transcript
    • Changedstart_recording1 field changed
      • addedInput schema / properties / live
        Added value: +{
        +  "default": false,
        +  "title": "Live",
        +  "type": "boolean"
        +}
  2. 9 tool updatesv0.1.0
    • First observedget_transcript
    • First observedlist_audio_sources
    • First observedlist_recordings
    • First observedrecording_status
    • First observedrename_speakers
    • First observedstart_recording
    • First observedstop_recording
    • First observedtranscribe_file
    • First observedtranscribe_recording

TDQS

A3.5/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers