MURMUR MCP: LOCAL VOICEOVER SETUP AND RECOVERY CHECKLIST Guide: https://www.murmurtts.com/blog/resources/connect-murmur-mcp-local-voiceover Prepared October 9, 2026. This is a manual setup recipe. Read each section and run only the commands you need. Registration changes your chosen client's configuration. Replace all placeholder paths and IDs; do not paste the entire document into a shell. VERIFIED SCOPE - Current Murmur source contract and official client documentation were checked. - Local help was inspected: Codex CLI 0.159.0 and Claude Code 2.1.295. - An isolated development helper initialized MCP and exposed ten tools. - The launcher below was syntax-checked and invoked from outside a project whose directory name contained spaces. Its process cwd matched that project. - With the default missing helper, the launcher exited 1 with a clear stderr diagnostic. With the development fixture's app path, discovery succeeded. - A malformed job UUID returned isError:true and "job_id must be a valid UUID." - No real Claude Code/Codex registration or connection was tested. - The installed public app's helper and release parity were not verified. - The sample generation request below was not executed for this guide. 1. RECORD YOUR APP AND PROJECT [ ] Apple Silicon Mac; macOS 15 or later. [ ] Locate the Murmur app you actually opened in Finder. [ ] Finish app setup and activate the license. [ ] Enable Settings > Automation > Allow local automation. [ ] If desired, use Install CLI to link ~/.local/bin/murmur to this app. MCP can call the bundled helper without that symlink or a PATH change. [ ] Inspect an old symlink before relying on it: it can point at another app. [ ] Choose one project folder for all MCP input and output. App location: ____________________________________________ Project absolute path: ___________________________________ App version from status: _________________________________ Preflight in Terminal: MURMUR_APP="/Applications/Murmur.app" MURMUR_HELPER="$MURMUR_APP/Contents/Helpers/murmur" # Change MURMUR_APP to the actual app location before continuing. ls -l "$MURMUR_HELPER" The /Applications path is conditional. If the helper is missing or not executable, stop and obtain a build that includes automation. Do not register that missing path. Run the following only for the helper you verified: "$MURMUR_HELPER" --help "$MURMUR_HELPER" status --json Require a succeeded snapshot with status.appRunning, status.setupComplete, status.licensed and status.automationEnabled true. Record status.appVersion. Status can describe missing readiness even while automation is disabled. Models, voices and generation require setup, a license and automation access. 2. SAVE A PROJECT LAUNCHER Create a new file named murmur-mcp-launcher.sh in the chosen project folder. Preserve an existing file with that name rather than silently replacing it. Copy only the text between BEGIN LAUNCHER and END LAUNCHER into the file. Edit MURMUR_APP to your verified app path. BEGIN LAUNCHER #!/bin/sh set -eu MURMUR_APP="/Applications/Murmur.app" MURMUR_HELPER="$MURMUR_APP/Contents/Helpers/murmur" if [ ! -x "$MURMUR_HELPER" ]; then printf '%s\n' "Murmur helper missing or not executable: $MURMUR_HELPER" >&2 exit 1 fi MURMUR_PROJECT="$(CDPATH= cd "$(dirname "$0")" && pwd -P)" cd "$MURMUR_PROJECT" exec "$MURMUR_HELPER" mcp serve END LAUNCHER The launcher pins Murmur's workspace to its own folder. The current server uses process cwd, not the assistant's roots/list or additional-directory permissions. Do not place this launcher in your home folder unless that entire folder is the intended workspace. Keep protocol stdout clean; send diagnostics to stderr. 3. REGISTER WITH ONE CLIENT Change to your project before registration, so $PWD resolves to its absolute path. These are manual host-configuration actions. cd "/absolute/path/to/Voiceover Project" /bin/sh -n "$PWD/murmur-mcp-launcher.sh" Choose Claude Code OR Codex. First inspect an existing server named murmur. Use a distinct name if that definition belongs to another project. Claude Code: claude mcp get murmur claude mcp add --transport stdio --scope local murmur -- /bin/sh "$PWD/murmur-mcp-launcher.sh" claude mcp get murmur The local scope is private to this project. Start a new Claude Code session there, then inspect /mcp. A saved configuration is not proof of a live tool call. Codex: codex mcp get murmur codex mcp add murmur -- /bin/sh "$PWD/murmur-mcp-launcher.sh" codex mcp get murmur This adds to the current Codex host configuration. Restart the client; inspect /mcp in the terminal UI. The server still writes inside the launcher's folder when you use Codex elsewhere. Use a separate name/launcher for another project. [ ] Stored command is /bin/sh and launcher argument is the intended absolute path. [ ] Client shows a connection, then actually calls murmur_status. [ ] No missing helper, pending approval, or connection failure is left unresolved. 4. DISCOVER MODELS AND VOICES IN THE ASSISTANT These are MCP tool calls, not Terminal commands. murmur_status arguments: {} murmur_list_models arguments: {} Read structuredContent.models. Choose a returned id with installationState "bundled" or "installed". The other states are "notInstalled", "installing", "removing", and "failed". A catalog entry or cache file does not prove usability. Check capabilities and languages for the requested task. murmur_list_voices arguments: {"model_id":"YOUR_MODEL_ID"} Choose a returned kind:"preset" voice for the first check. A kind: "reference-profile" entry uses its UUID in reference_profile_id and needs a compatible speech model. Review the returned artifact voice after generation. Chosen model id: __________________________________________ Chosen preset voice id: ___________________________________ Discovery time: __________________________________________ If a needed model is absent: - Review the model's estimatedDownloadBytes and available disk space. - Install it in Murmur Settings > Models, or deliberately submit: murmur_install_model arguments: {"model_id":"YOUR_MODEL_ID","wait":false} - Poll that installation job, then refresh murmur_list_models. - Do not remove models or change defaults merely to establish a connection. 5. SUBMIT ONE SMALL TAKE Send the following as arguments to murmur_generate_speech. Replace BOTH placeholder IDs with actual discovered values. The output is relative to the launcher's folder. { "text": "This is a short connection check for local narration.", "model_id": "YOUR_MODEL_ID", "voice_id": "YOUR_PRESET_VOICE_ID", "output_path": "audio/mcp-connection-take-01.wav", "force": false, "wait": false } This is an illustrative request, not a measured generation result for this guide. Accepted generation input is inline text or a UTF-8 input_path. Use an output_path ending in .wav or .m4a within the workspace. [ ] Retain structuredContent.id from the returned job snapshot. [ ] Do not call generation again just because the job is queued. Returned job UUID: ________________________________________ 6. POLL AND INTERPRET THE SNAPSHOT murmur_get_job arguments: {"job_id":"THE_RETURNED_UUID"} Poll at a modest interval such as 2 seconds, using the same UUID. Inspect structuredContent.state, message, error and artifacts. queued/running: continue polling the same job. succeeded: inspect the returned artifact, then verify the actual file. failed: read error/message; fix the cause before making a new request. cancelled: do not mark the take complete; inspect any listed artifacts. IMPORTANT: isError:false describes a valid tool response. A failed job can still be retrieved in that response. Require snapshot state:"succeeded", not merely an error-free MCP envelope or a progress message. To stop a queued or running job: murmur_cancel_job arguments: {"job_id":"THE_RETURNED_UUID"} A cancellation request is not yet a terminal result. Continue polling. A malformed UUID is a tool error. A valid but unknown UUID also cannot identify your submitted job. Copy the exact returned ID instead of inventing one. 7. CHECK THE REAL AUDIO [ ] Job state is succeeded. [ ] Artifacts includes the intended output path. [ ] File exists at that exact path and opens. [ ] Model ID and voice match the intended take. [ ] Listen to the whole clip: words, pronunciation, pacing and ending. [ ] Record the returned durationSeconds. [ ] Keep the take and job ID with your project before making revisions. Artifact path: ____________________________________________ Model and voice returned: _________________________________ DurationSeconds: __________________________________________ Listening review: ________________________________________ Optional: if FFmpeg is already available, inspect and completely decode the artifact. Replace the path below with the actual artifact path. ffprobe -v error -show_entries format=duration:stream=codec_name,sample_rate,channels -of json "/absolute/path/to/audio/mcp-connection-take-01.wav" ffmpeg -v error -i "/absolute/path/to/audio/mcp-connection-take-01.wav" -f null - Decode success checks file integrity; it does not validate spoken words. 8. RECOVERY CHECKLIST Helper missing/client cannot launch: Check the actual app, helper executable, and stored launcher path. Recheck paths after moving the app or project. Readiness fails: Read murmur_status. Finish setup, license, and in-app automation permission. Model unavailable: Refresh discovery; select bundled/installed or complete an intended download. Voice or language rejected: Refresh voices for the chosen model. Check its listed capabilities/languages. Workspace rejection: Put input/output inside the launcher's folder. Symlinks do not grant access outside that root. Adding directories to the assistant does not expand it. Existing output: Use mcp-connection-take-02.wav or another new filename. Set force:true only when replacement is deliberate. Prolonged queue/client timeout: Preserve the job UUID. Verify the intended app is open. Query that same job before retrying. A timeout does not prove the work failed. If the app stopped, inspect the job; a failed/interrupted job needs a new request after the underlying cause is fixed. 9. PRIVACY AND ACCESS - Speech runs locally in Murmur. Its generation paths are limited to the pinned workspace. Job metadata is also stored under Murmur's Application Support. - This is not a sandbox for every action the assistant can perform. - Hosted assistant conversations can include scripts, paths, voice names and tool results. Review the client's data settings before using private material. - Model downloads and hosted assistant access can still require a network and have separate charges/limits. - Keep credentials out of shared scripts and configuration. - Use a neutral test sentence first and material you can authorize afterward. - Ordinary browser chat does not automatically launch this local stdio helper. PRIMARY REFERENCES, CHECKED OCTOBER 9, 2026 Murmur automation: https://www.murmurtts.com/docs/automation Claude Code MCP: https://code.claude.com/docs/en/mcp OpenAI local Codex MCP: https://learn.chatgpt.com/docs/extend/mcp?surface=cli Murmur requirements and website edition: https://www.murmurtts.com/ The website edition is $49 one-time, with no free trial and a 7-day refund policy. Verify that the app build you intend to use includes automation.