apple-voice-memos-mcp
v2.0.2
Published
MCP server for Apple Voice Memos on macOS — AssemblyAI diarization, whisper.cpp fallback, auto-saved transcripts, bundled app + one-command setup
Maintainers
Readme
apple-voice-memos-mcp
MCP server for Apple Voice Memos (Memo Vocali) on macOS — with speaker diarization (AssemblyAI), whisper.cpp fallback, auto-saved transcripts and a one-command setup.
Quick start
1. Add to your MCP config
{
"mcpServers": {
"apple-voice-memos": {
"command": "npx",
"args": ["apple-voice-memos-mcp"],
"env": {
"ASSEMBLYAI_API_KEY": "your-assemblyai-key"
}
}
}
}AssemblyAI is optional but recommended: it provides speaker diarization. Without a key, transcription falls back to whisper.cpp (local, no diarization). You can also put the key in
~/Library/apple-voice-memos-mcp/config.jsoninstead of env:{"assemblyai": {"apiKey": "..."}}
2. First run — auto setup
npx apple-voice-memos-mcp --setupThe setup:
- Installs the bundled app —
VoiceMemosMCP.appships inside the npm package (pre-built, pre-signed, self-contained: no compilation, no Homebrew node dependency). It is extracted to~/Library/apple-voice-memos-mcp/. - Registers the LaunchAgent daemon — a small TCP daemon (
127.0.0.1:8917) that spawns the MCP server per-connection inside the app, so it inherits the Full Disk Access. - Opens the Full Disk Access panel automatically and waits for you — poll every 5s and confirms the moment you grant it.
The only manual step macOS requires: drag VoiceMemosMCP.app into Full Disk Access (~10 seconds, once). This is a hard macOS privacy requirement for Voice Memos data — no MCP can bypass it.
3. Use it
Restart your MCP client (or /reload). Tools:
| Tool | Description |
|---|---|
| list_voice_memos | list memos (limit/offset/search) |
| get_voice_memo | full metadata of one memo |
| get_audio | audio file (path or base64) |
| get_transcript | Apple's embedded transcript, if present |
| transcribe_memo | full transcription with diarization, auto-saved |
Transcription pipeline
transcribe_memo uses the first available provider:
- AssemblyAI (if
ASSEMBLYAI_API_KEYset) → speaker-labeled transcript (utteranceswithspeaker,text, timestamps) - whisper.cpp (fallback, local) → plain transcript with timestamps (needs
brew install whisper-cpp+ model, see below) - Apple SFSpeechRecognizer helper (legacy,
VOICE_MEMO_TRANSCRIBER_PATH)
Results are auto-saved in the transcripts folder as:
YYYY-MM-DD - <title> (id-N).md— readable diarized transcriptYYYY-MM-DD - <title> (id-N).json— structured utterances
Pass "noSave": true to skip saving. Default folder: ~/Documents/VoiceMemosTranscripts (change via VOICE_MEMOS_TRANSCRIPTS_DIR env or config.json → transcripts.dir).
whisper.cpp fallback setup (optional)
brew install whisper-cpp
mkdir -p ~/.cache/whisper.cpp
curl -L -o ~/.cache/whisper.cpp/ggml-small.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.binConfiguration reference
~/Library/apple-voice-memos-mcp/config.json:
{
"assemblyai": { "apiKey": "..." },
"transcripts": { "dir": "~/Documents/VoiceMemosTranscripts" },
"whisper": { "cliPath": "/opt/homebrew/bin/whisper-cli", "modelPath": "~/.cache/whisper.cpp/ggml-small.bin" }
}Environment variables (higher precedence): ASSEMBLYAI_API_KEY, VOICE_MEMOS_TRANSCRIPTS_DIR, VOICE_MEMO_TRANSCRIBER_PATH.
Status & troubleshooting
npx apple-voice-memos-mcp --status- "unable to open database file" → Full Disk Access missing: run
npx apple-voice-memos-mcp --setup(it reopens the panel) - daemon not running →
launchctl load ~/Library/LaunchAgents/it.otomatik.voicememosmcp.plist - after a package update the permission is lost → new app version = new code signature; re-run
--setupand re-grant once
Why the daemon + bundled app?
macOS TCC evaluates the responsible process for privacy checks. A plain node child of your MCP client inherits the client's permissions (none for Voice Memos). The LaunchAgent runs the server inside the signed, user-authorized VoiceMemosMCP.app, which makes the permission stick reliably.
Requirements
- macOS 14+ (Voice Memos opened at least once)
- Node.js 18+ (any version — the daemon app ships its own runtime)
- Xcode CLT not required (launcher is prebuilt in the package)
Credits
Server core forked from jwulff/apple-voice-memo-mcp, with:
- Node 26 compatibility fix (better-sqlite3 13, prebuilds)
- TCC/LaunchAgent architecture with bundled pre-signed app
- AssemblyAI diarization + whisper.cpp fallback + transcript auto-save
License
MIT
