# SonicCraft (oci · ghcr.io/user-github-me/soniccraft)

Compile timelines of TTS speech, music and SFX into ducked, loudness-mastered audio with subtitles

- Trust score: 39/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- oci · `ghcr.io/user-github-me/soniccraft`: 39/100 (this document), [markdown](https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft.md), [page](https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/user-github-me/soniccraft`
- Version: `0.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 3 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3462 tokens (~577/item across 6 items; 6 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 6 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the SonicCraft MCP server?

SonicCraft runs locally as a container image, launched with docker run --rm -i -e ELEVENLABS_API_KEY -e OPENAI_API_KEY -e CARTESIA_API_KEY ghcr.io/user-github-me/soniccraft:0.1.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add user-github-me-soniccraft -- docker run --rm -i -e ELEVENLABS_API_KEY -e OPENAI_API_KEY -e CARTESIA_API_KEY ghcr.io/user-github-me/soniccraft:0.1.0
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "user-github-me-soniccraft": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ELEVENLABS_API_KEY",
        "-e",
        "OPENAI_API_KEY",
        "-e",
        "CARTESIA_API_KEY",
        "ghcr.io/user-github-me/soniccraft:0.1.0"
      ]
    }
  }
}
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "user-github-me-soniccraft": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ELEVENLABS_API_KEY",
        "-e",
        "OPENAI_API_KEY",
        "-e",
        "CARTESIA_API_KEY",
        "ghcr.io/user-github-me/soniccraft:0.1.0"
      ]
    }
  }
}
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add user-github-me-soniccraft -- docker run --rm -i -e ELEVENLABS_API_KEY -e OPENAI_API_KEY -e CARTESIA_API_KEY ghcr.io/user-github-me/soniccraft:0.1.0
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "user-github-me-soniccraft": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "ELEVENLABS_API_KEY",
        "-e",
        "OPENAI_API_KEY",
        "-e",
        "CARTESIA_API_KEY",
        "ghcr.io/user-github-me/soniccraft:0.1.0"
      ],
      "enabled": true
    }
  }
}
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  user-github-me-soniccraft:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "ELEVENLABS_API_KEY", "-e", "OPENAI_API_KEY", "-e", "CARTESIA_API_KEY", "ghcr.io/user-github-me/soniccraft:0.1.0"]
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "user-github-me-soniccraft": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ELEVENLABS_API_KEY",
        "-e",
        "OPENAI_API_KEY",
        "-e",
        "CARTESIA_API_KEY",
        "ghcr.io/user-github-me/soniccraft:0.1.0"
      ]
    }
  }
}
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "user-github-me-soniccraft": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ELEVENLABS_API_KEY",
        "-e",
        "OPENAI_API_KEY",
        "-e",
        "CARTESIA_API_KEY",
        "ghcr.io/user-github-me/soniccraft:0.1.0"
      ]
    }
  }
}
```

This image reads ELEVENLABS_API_KEY, OPENAI_API_KEY and CARTESIA_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 39, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 38)

First indexed and scored.

## MCP tools (6)

### `soniccraft_validate_timeline` (~640 tokens)

Validate timeline

Validate a SonicCraft audio timeline (YAML or JSON) without rendering. Parses it and checks every field, reference, timing anchor and the environment (asset files exist, TTS providers available, API keys present, ffmpeg for ogg/opus/m4a), reporting ALL problems in one pass. Call it after every edit, before soniccraft_dry_run and soniccraft_render. Pass exactly one of `yaml_content` (the document text) or `yaml_path` (a file; `path` also works). Returns a ValidationReport {valid, diagnostics, summary}; an invalid timeline is still a successful call, with valid: false. Each diagnostic has a severity, a stable `code`, a `path` such as tracks[1].sequence[0].start_relative.after_cue, the line and column, a `message` and usually a `hint` you can apply mechanically (rename `fade_in` to `fade_in_ms`, use a suggested id): fix every error, then validate again until valid is true. Warnings and infos do not block rendering. A report with many diagnostics comes back compact (every error and warning up to 50, plus counts); `detail: "full"` returns all. Never calls paid APIs; `check_credentials: true` sends one free authenticated request per provider to test its key. API keys only ever go to the provider's official API host, a server on this machine (the provider's own key variable only), or a host listed in SONICCRAFT_ALLOWED_HOSTS.

Input parameters:

- `base_dir` (string): Directory that relative `yaml_path`, `output_path` and the paths inside `yaml_content` resolve against. Default: the server's base directory (`soniccraft mcp --base-dir`, else env CLAUDE_PROJECT_DIR,…
- `check_credentials` (boolean): Also verify each provider's API key with one cheap authenticated request (network access, never synthesizes, costs nothing). Default false: keys are only checked for presence in the environment.
- `detail` (string): How much of the report to return. `auto` (default): the whole report while it is small, else a compact one (counts and every error and warning, up to 50); `summary`: always the compact report; `full`…
- `path` (string): Synonym of `yaml_path`, accepted so either name works. Pass only one of the two.
- `yaml_content` (string): The timeline document itself, as YAML or JSON text (the same format as a .yaml/.json timeline file). Relative paths inside it (clip `source:` files, `output.path`) resolve against `base_dir`. Pass ex…
- `yaml_path` (string): Path of a timeline file (.yaml, .yml or .json). A relative path resolves against `base_dir`; absolute paths are safest. Paths inside the file resolve against the file's own directory. Pass exactly on…

### `soniccraft_dry_run` (~624 tokens)

Dry-run timeline

Plan a SonicCraft timeline without synthesizing audio: free, never calls paid TTS APIs. Lays out every cue, pause and clip with cached or estimated speech durations (mock voices are measured exactly), applies the speech-overlap policy and computes the ducking regions. Returns a PlanReport: valid, diagnostics, duration_ms (estimated total length), items (id, kind, track_id, start_ms, end_ms, duration_source, and pushed_from_ms for cues the overlap policy moved), ducking regions per ducked track, synthesis (cues, cached, characters_to_synthesize, i.e. what a render will bill) and an ASCII timeline diagram, which the text result also shows. A long timeline (more than about 40 items) gets a compact report: totals, cost, ducking, errors and warnings, the diagram's track lanes, the first and last 10 items and every item the overlap policy moved or a diagnostic names (items_total and items_truncated say what was left out); pass `detail: "full"` for every item. Call it after validation passes and before soniccraft_render to check order, timing and cost; show the diagram to the user when timing matters. Estimates are within about ±15%; a render measures exact durations and lays out again. Takes `yaml_content` or `yaml_path` like soniccraft_validate_timeline; an invalid timeline is a successful call with valid: false.

Input parameters:

- `base_dir` (string): Directory that relative `yaml_path`, `output_path` and the paths inside `yaml_content` resolve against. Default: the server's base directory (`soniccraft mcp --base-dir`, else env CLAUDE_PROJECT_DIR,…
- `detail` (string): How much of the plan to return. `auto` (default): the whole PlanReport while it is small (about 12,000 characters, some 40 items), else a compact report with the totals, synthesis cost, ducking, erro…
- `path` (string): Synonym of `yaml_path`, accepted so either name works. Pass only one of the two.
- `yaml_content` (string): The timeline document itself, as YAML or JSON text (the same format as a .yaml/.json timeline file). Relative paths inside it (clip `source:` files, `output.path`) resolve against `base_dir`. Pass ex…
- `yaml_path` (string): Path of a timeline file (.yaml, .yml or .json). A relative path resolves against `base_dir`; absolute paths are safest. Paths inside the file resolve against the file's own directory. Pass exactly on…

### `soniccraft_render` (~1086 tokens)

Render timeline

Render a SonicCraft timeline to a mastered audio file. Synthesizes the speech (cached by content hash, so re-renders only pay for changed cues), places every item sample-accurately, ducks music under speech, normalizes to the loudness target (EBU R128) with a true-peak limiter, encodes (wav, mp3, flac; ogg, opus and m4a need ffmpeg) and writes the subtitles, stems and manifest the timeline or arguments ask for. It writes files (inside the base directory unless `output_path` names another place) and may call paid TTS APIs; API keys go only to each provider's official host, servers on this machine (own key variable only), or SONICCRAFT_ALLOWED_HOSTS. Programs named by a timeline (`command` providers, a piper `command`) run only if the server was started with --allow-command. Run soniccraft_validate_timeline and soniccraft_dry_run first. Pass `yaml_content` or `yaml_path`; `output_path` chooses the file and `format` the encoding (`format: mp3` for an .mp3 path when the timeline sets another format). Returns a RenderReport: output {path (absolute), format, sample_rate, channels, duration_ms, bytes}, loudness {integrated_lufs vs target_lufs, true_peak_dbtp vs true_peak_target_dbtp, measured on the delivered file; for mp3, ogg, opus and m4a, pre_encode has the master's values}, files {subtitles, stems, manifest} with absolute paths, synthesis, diagnostics and items with exact timings (a long timeline lists the first and last 10; `detail: "full"` lists all), plus links to the files (audio is never inlined). A failure returns isError: true with {message, diagnostics}: fix what they name and render again. Long renders report progress, may first wait for another render to finish, and stop cleanly when the call is cancelled. Files are put in place only when the whole render succeeds: a failed or cancelled render removes its partial files and leaves earlier outputs untouched.

Input parameters:

- `base_dir` (string): Directory that relative `yaml_path`, `output_path` and the paths inside `yaml_content` resolve against. Default: the server's base directory (`soniccraft mcp --base-dir`, else env CLAUDE_PROJECT_DIR,…
- `detail` (string): How much of the render report to return. `auto` (default): the whole RenderReport while it is small, else a compact report with the output file, loudness, side files, synthesis, ducking, errors and w…
- `export_subtitles` (boolean): Override the timeline's `output.export_subtitles`: true writes subtitle files next to the output (WebVTT + SRT unless the timeline lists its own formats), false writes none. Omit to follow the timeli…
- `format` (string): Output format, overriding the timeline's `output.format`: wav, mp3 or flac (built in), or ogg, opus or m4a (these need ffmpeg). Pass the format that matches `output_path` (for example `mp3` with `out…
- `no_cache` (boolean): Ignore cached TTS audio and synthesize every cue again (results still refresh the cache). Costs provider credits; only use it when cached audio is stale. Default false.
- `output_path` (string): Output audio file; overrides `output.path` in the timeline. A relative path resolves against `base_dir`. Its extension (.wav, .mp3, .flac, .ogg, .opus, .m4a) selects the format unless the timeline se…
- `path` (string): Synonym of `yaml_path`, accepted so either name works. Pass only one of the two.
- `yaml_content` (string): The timeline document itself, as YAML or JSON text (the same format as a .yaml/.json timeline file). Relative paths inside it (clip `source:` files, `output.path`) resolve against `base_dir`. Pass ex…
- `yaml_path` (string): Path of a timeline file (.yaml, .yml or .json). A relative path resolves against `base_dir`; absolute paths are safest. Paths inside the file resolve against the file's own directory. Pass exactly on…

### `soniccraft_get_schema` (~229 tokens)

Get timeline schema

Get the SonicCraft timeline DSL (v1.0): a compact quick reference (document rules, every field with its default, timing and anchor rules, ducking, loudness presets, providers, a complete example and the common diagnostic fixes) as text. structuredContent is {dsl_version, schema_id, quick_reference}. Pass `detail: "full"` to also get the complete JSON Schema (draft 2020-12, about 35,000 characters) as text and as structuredContent.schema; the quick reference is enough to write timelines. Call it once before writing your first timeline; afterwards rely on soniccraft_validate_timeline, whose diagnostics name the exact field to fix.

Input parameters:

- `detail` (string): How much to return. `auto` (default) and `summary`: the DSL quick reference, which covers every field, default and rule (the JSON Schema is left out while the whole result would be too large for an a…

### `soniccraft_list_providers` (~181 tokens)

List TTS providers

List the built-in TTS providers (elevenlabs, openai, cartesia, kokoro, piper, macos_say, command, mock) and whether each can be used right now: API key present in the environment, local binary found, local server answering (a quick probe of at most 300 ms), operating system supported. Returns {providers: [{name, aliases, display_name, local, word_timestamps, available, status, api_key_env, default_voice, default_model, notes}]}. `mock` (deterministic synthetic voice, any OS) and `macos_say` (macOS) need no API key. Call it before choosing `provider:` values. If a provider lacks its key, ask the user to export the environment variable named here; never put API keys in a timeline.

### `soniccraft_list_voices` (~197 tokens)

List provider voices

List the voices of one TTS provider, given its built-in name or alias (e.g. elevenlabs, openai, cartesia, kokoro, piper, macos_say, mock). Returns {provider, voices: [{id, name, language, gender, description}]}; put a voice's `id` into `voice_id` in the timeline. Cloud providers are queried over their API (needs the provider's API key in the environment); local providers list what is installed.

Input parameters:

- `provider` (string, required): Built-in provider name or alias: elevenlabs, openai, cartesia, kokoro, piper, macos_say, command or mock (aliases: eleven_labs, 11labs, open_ai, local_kokoro, kokoro_fastapi, say, system). Instance n…

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft#diagnostics

## Score history

- 2026-10-23: 39
- 2026-10-22: 39
- 2026-10-21: 38
- 2026-10-20: 38

## Common questions

### What is the SonicCraft MCP server?

SonicCraft is an MCP server listed in the public MCP registry as io.github.user-github-me/soniccraft. Compile timelines of TTS speech, music and SFX into ducked, loudness-mastered audio with subtitles. This page covers its container image (ghcr.io/user-github-me/soniccraft).

### Is the SonicCraft MCP server safe to use?

SonicCraft scores 39 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the SonicCraft MCP server expose?

SonicCraft exposes 6 tools: soniccraft_validate_timeline, soniccraft_dry_run, soniccraft_render, soniccraft_get_schema, soniccraft_list_providers, soniccraft_list_voices. Their descriptions and schemas cost roughly 2,957 tokens of context every time the server is loaded.

### Is the SonicCraft MCP server still maintained?

SonicCraft is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the SonicCraft MCP server under?

SonicCraft declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- GitHub Container Registry: https://ghcr.io/user-github-me/soniccraft
- Repository: https://github.com/user-github-me/soniccraft
- Changelog RSS feed: https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft.xml
- Changelog JSON feed: https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft.json
- HTML version of this page: https://verifymcp.io/servers/user-github-me-soniccraft/ghcr-io-user-github-me-soniccraft
