Labsco
MCP SERVER

Muninn

by bnomei

macOS menu-bar dictation tuned for code — plus a local MCP server so a script or agent can start, stop and check the recording.

Speech Synthesis & Transcription
Summary
The MCP server is a remote control for dictation, not a transcription endpoint.

Status, start, stop and cancel drive the same recording a hotkey or the tray icon drives, which makes this useful for scripting hands-free capture rather than for sending audio somewhere to be transcribed. Two settings decide whether that is comfortable on your machine: the server is disabled until mcp_enabled is true and will bind nowhere but loopback, and external starts stay blocked until you also set start_recording_enabled, because that call switches the microphone on. Both are read at launch, so restart Muninn after changing either.

What it is

Muninn is a macOS menu-bar dictation app for developer text: it records speech, transcribes it through a local-first provider route, runs the transcript through a configurable pipeline, and types the result into whatever app is focused. Its MCP surface is deliberately narrow — a loopback HTTP server exposing recording control, off until you turn it on.

What you get
  • Four tools over MCP: get_status, start_recording, stop_recording and cancel_recording
  • get_status is read-only and returns the current state — idle, recording_active, permission_blocked, already_running or failed — together with whether Microphone, Accessibility and Input Monitoring have been granted
  • The same vocabulary is reachable from the packaged app through muninn://record, muninn://stop, muninn://toggle and muninn://cancel
  • Behind those calls: capture to a temporary WAV at 16 kHz mono, then a route that tries Apple Speech and whisper.cpp locally before Deepgram, OpenAI, Google and xAI
  • The built-in refine step applies a conservative developer-dictation prompt aimed at commands, flags, package names, file paths, environment variables and acronyms — the tokens general dictation tends to rewrite
  • Pipeline steps can be any Unix filter, each with an id, cmd, args, timeout_ms and an on_error of continue, fallback_raw or abort
  • Profiles match the frontmost app by bundle id or window title and swap both the refine behaviour and the tray glyph, so dictating into Terminal and into an editor can be shaped differently
  • whisper.cpp defaults to tiny.en and downloads it on first use into ~/.local/share/muninn/models
Requirements

macOS, with Rust 1.88.0 or newer to build; cargo install muninn-speech-to-text installs the muninn binary. The app itself needs Microphone, Accessibility and Input Monitoring permissions, and macOS attaches those to the exact binary or .app, so put it at a stable path before granting them. Apple Speech additionally needs macOS 26+. The MCP server stays off until external_control.mcp_enabled = true, then serves at http://127.0.0.1:2769/mcp — it has no authentication, refuses any non-loopback bind address, and starts only at app launch. Starting a recording from outside is separately gated behind start_recording_enabled = true. Cloud providers read OPENAI_API_KEY, DEEPGRAM_API_KEY, GOOGLE_API_KEY, GOOGLE_STT_TOKEN or XAI_API_KEY; Apple Speech and whisper.cpp need none.

Setup effort

One command — cargo install muninn-speech-to-text