Skip to content
Back to skills

Soundcraft

ASecurity

Unofficial third-party skill. Drive SoundCraft (open-source Pro Tools-style app) through its MCP server - generate or import audio onto tracks, set volume, pan, mute, automation and markers, bounce WAV/AIFF/FLAC with peak and LUFS, save and reopen .scraft sessions. Use when the user wants a multitrack mix built, measured or bounced.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
ai-agentsgoshell

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned November 7, 2026

npx -y skills add sawizzle/creative-apps-claude-plugin --skill soundcraft --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Soundcraft?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Soundcraft
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/sawizzle-soundcraft/badge)](https://www.skillsdirectory.com/skills/sawizzle-soundcraft)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: soundcraft
description: Unofficial third-party skill. Drive SoundCraft (open-source Pro Tools-style app) through its MCP server - generate or import audio onto tracks, set volume, pan, mute, automation and markers, bounce WAV/AIFF/FLAC with peak and LUFS, save and reopen .scraft sessions. Use when the user wants a multitrack mix built, measured or bounced.
---

# SoundCraft via MCP

Server: `soundcraft` (`soundcraft-cli mcp`). Tested with soundcraft-cli 0.16.0 on Windows 11 (the plugin's regression steps; written against 0.15.0).

- Headless engine. `new_session {"template":"demo"}` loads a 9-track demo (5 audio, 2 instrument, the aux `Verb` and `Master 1`) with 4 markers.
- **No headless picture.** `screenshot`, `ui_*`, `menu_invoke`, `click`, `drag` and `key` fail with "needs the desktop app". To preview, bounce and read `peak_db`/`lufs`.
- Live app (from the app's docs, not tested): `soundcraft --control 0` prints a port, then `mcp --connect PORT`. With nothing listening, calls fail with "connection timed out". `--connect` with a root flag exits 2.

## File access

In this plugin the server is locked to folders. It writes only to the output folder (plugin option `write_root`, default `~/CreativeApps`) and reads from the output folder plus, by default, the user's Desktop, Documents, Downloads, Pictures, Videos and Music folders (option `read_scope`: `write-root-only` drops those, `home` opens the whole home folder; `extra_read_root` adds one more). It starts in the output folder. Use absolute paths. The `creative-apps-setup` skill has the details.
- `--automation-read-root DIR` covers open, import and preset loads. `--automation-write-root DIR` covers save, bounce and exports. Both repeat. A missing root folder stops the server (exit 1).
- **With no root flag nothing is confined** (stderr then lacks the `files confined:` line). With any root flag, a kind left out is refused with "automation filesystem access is not granted: write authority is absent" (or read).
- **The write root is not readable.** To reopen a session or re-import a bounce, its folder must also be a read root.
- "automation path rejected" refuses paths outside the roots, a `..` that leaves a root, and junctions pointing out. A UNC path to a missing share fails with "cannot resolve" (a reachable share was not tested). Device names (`NUL.wav`, `CON`) are refused.
- **Relative paths resolve against the server's working directory**, then are checked against the roots like any other path: a relative read is refused when the working folder is not a read root. Replies echo them unresolved. A leading `/` is the current drive's root, so use `C:/...` paths.
- **Never put `:` in a path** except right after the drive letter.
- **Hard links:** `track.save_preset`, and `export_session_text` with `replace:true`, write through a hard link in place, so don't make hard links in the write root.

## Workflow (tested)
1. `new_session {"name":"Mix","template":"blank","sample_rate":48000}`.
2. `execute {"command":"track.new","params":{"name":"Tone","format":"mono"}}` → `{"tracks":[1]}`.
3. `execute audiosuite.process {"process":"signal_generator","tracks":[1],"start":0,"end":{"seconds":2},"params":{"waveform":0,"freq":1000,"level":-12}}` → `{"clips":[3],"processed":1}`.
   - `waveform` 0-5 is Sine, Square, Saw, Triangle, White Noise, Pink Noise. `level` is in dB (default -20).
4. `import_audio {"path":"C:/abs/clip.mp4"}` → `{"imported":[{track, clip, source, frames, channels}]}`. The new track is named after the file stem.
5. Mix with `execute`; replies confirm the call, not the state.
   - `mix.volume {"tracks":[1],"db":-6}`, `mix.pan {"tracks":[1],"pan":-1}`, `mix.mute {"tracks":[5],"value":true}`
   - `markers.add {"name":"Hit","at":{"seconds":1}}` → `{"id":7,"number":1}`
   - Times can be samples, `{"seconds":x}`, `"0:01.500"` or `"bars_beats:2|1|000"`.
6. Read back with `execute track.inspect {"track":1}` (clips in samples, `mute`, `pan`, `volume_db`) and `inspect_session {"detail":"summary"}` (markers, sources, `dirty`).
7. `bounce_mix {"path":"C:/abs/mix.wav","start":{"seconds":0},"end":{"seconds":2},"bit_depth":"24"}` → `{bytes, path, seconds, peak_db, true_peak_db, lufs}`.
   - Steps 3 and 5 give -18.0 dBFS and -21.0 LUFS.
   - `"format":"flac","bit_depth":"16"` writes a 16-bit FLAC.
8. `save_session {"path":"C:/abs/mix.scraft","replace":true}` → `{audio_files_written, path}`: JSON plus `Audio Files/` (32-bit float WAVs). Nothing is on disk before the first save. Identical audio already there is reused (counted 0); different audio with the same name gets `_01`.
9. In a fresh process, `open_session {"path":...}` → `{"missing":[],"name":"mix","tracks":2}`. Volume, pan, mute and markers survive, and a bounce after reopening nulls against the first (sample-identical).
10. `execute file.export_session_text {"path":"C:/abs/info.txt","replace":true}` lists tracks, clips, mutes and markers, but not volume or pan. Shell: `soundcraft-cli info <.scraft or audio file>`.

## Traps
- **Pan law:** mono at centre is -3 dB per side; hard-panned, 0 dB on its side.
- **Misspelled optional keys are ignored:** `bitdepth` wrote 24-bit, and `lvl` or `"level":"loud"` gave -20 dB. Missing required keys fail (`mix.volume` needs `db`, or `delta_db` for a relative change, and a bounce needs `path`).
- **Bounce:**
  - The default is 24-bit and `"32f"` writes float. `.aiff` and `.flac` write 24-bit. mp3 is refused.
  - `format` overrides the extension: `x.wav` with `"format":"aiff"` writes AIFF.
  - With no `start`/`end` it bounces the whole session. `normalize:true` peaks at -0.1 dBFS.
  - Dither leaves 1 LSB (-138 dBFS) on a silent side. `"dither":false` gives zeros and is accepted, although the schema does not list it.
  - Bounces overwrite silently. A missing folder fails (os error 3).
- **Save:** `save_session {}` fails until a path is set. Overwriting another file (or an `export_session_text` file) needs `replace:true`; the session's own path does not. Old content goes to `Backups/<stem> backup N.scraft`. Missing folders are created, and the session takes the file stem as its name. `track.save_preset` overwrites an existing file without `replace`.
- **AAC/M4A/MP4 imports land 1024 samples (21 ms) late** compared with ffmpeg. Convert to WAV first when sync matters.
- **Master:** `track.new {"kind":"master","name":"Master"}` is named `Master 1`, so use the returned id. Master `mix.volume` works; master `mix.trim` returns ok but does nothing. Track trim works but is not in `track.inspect`.
- **Automation:** `automation.write_range {"track":"A","param":"volume","start":0,"end":{"seconds":1},"value":-20}` replaces the fader level: -18 dBFS at -6 dB became -32. `automation.clear {"track":"A","param":"volume"}` restores it.
- **`batch {"calls":[...]}`** stops at the first error (isError, with a per-call `ok`), and earlier calls stay applied. `keep_going:true` runs the rest, but the reply is still an error if any call failed.
- **Discovery:** `list_commands` lists 482 commands (`{"filter":"mix"}` narrows it). `execute engine.plugins` lists 30 plugins.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.