Skip to main content
Glama
Space Dust MCP

Space Dust MCP

by jwang47

Space Dust connector

Lets someone shape Space Dust presets by describing the sound they want, instead of by turning knobs or editing files. They say "make the bass darker and give it more bite"; Claude reads the preset, changes the right parameters, and tells them what it did.

Space Dust is a subtractive synthesiser plugin (VST3 / AU / standalone, built with JUCE). This is a companion, not part of the plugin — install the synth first.

Works with the Space Dust you already have installed. Presets are plain XML files, so nothing here needs the plugin's source code or a rebuild.

Install

Requires Space Dust and uv.

git clone https://github.com/jwang47/Space_Dust_Synthesizer_MCP.git
uv tool install ./Space_Dust_Synthesizer_MCP

Then add it to Claude Code:

claude mcp add space-dust -- spacedust-mcp

For the Claude desktop app, add it under Settings → Developer → Edit Config:

{
  "mcpServers": {
    "space-dust": { "command": "spacedust-mcp" }
  }
}

Restart Claude afterwards. Nothing leaves the machine — the server only reads and writes files in the user's own preset folder.

Related MCP server: MCP Synth Controller

What the user can do

  • "What have I got in Space Dust?" — lists their presets

  • "What's going on in Dub Mew Bass?" — reads a preset back in plain language

  • "Make me a bass like that one but darker and punchier" — creates a new preset

  • "Too muddy, back off the low end" — adjusts what they're currently playing

  • "Actually, undo that" — restores the previous version

  • "What's different between these two?" — compares presets

Changes to the preset the plugin currently has loaded are picked up on their own within a second, so the user can keep playing while iterating. A newly created preset still has to be selected once from the preset menu.

Live adjustment needs a plugin build that includes PresetHotReload — it publishes the current sound to current.sdpreset in the plugin's app-data folder and watches the loaded preset for external edits. That folder is ~/Library/Application Support/Space Dust on macOS and %APPDATA%\Space Dust on Windows, matching PresetManager::appDataFolder(). Against older builds every other tool still works; the user just re-selects the preset to hear a change.

Tools

Tool

Purpose

read_current_sound

What the plugin is playing right now, no preset name needed

adjust_current_sound

Change that sound; the plugin applies it within a second

list_presets

Presets in the user's preset folder

read_preset

A preset's settings, grouped by section, defaults omitted

list_parameters

Search parameters, their ranges and defaults

create_preset

New preset from Init or from an existing one

adjust_preset

Change an existing preset in place, saving an undo point

undo_preset

Restore the version before the last change

preset_history

List saved earlier versions

compare_presets

Every setting that differs between two presets

The server's instructions teach Claude the synth's signal flow and how to translate musician language ("wobblier", "more space", "punchier") into parameter moves, so the user never has to learn a parameter name.

Safety rails

These exist because the model, not the user, is choosing the values:

  • Unknown parameter ids are rejected with close matches, never silently ignored.

  • Out-of-range numbers are clamped to the plugin's real range and reported.

  • Switch and menu parameters only accept their actual values (on/off, Low Pass).

  • Preset names can't contain path separators, so writes stay in the preset folder.

  • create_preset refuses to overwrite an existing preset.

  • Every adjust_preset snapshots the previous version first — up to 30 per preset, in ~/Library/Application Support/Space Dust/history/.

  • Presets are always written with all 206 parameters. APVTS::replaceState leaves omitted parameters at their current value, so a partial preset would inherit whatever the plugin happened to have loaded.

Keeping the schema current

Parameter ranges, defaults and choice names live in data/schema.json, generated by parsing createParameterLayout() in the plugin source. Regenerate it whenever the plugin's parameter list changes:

uv run python -m spacedust_mcp.source_parser /path/to/Source/PluginProcessor.cpp

The default path assumes the two repos sit side by side; SPACE_DUST_SOURCE overrides it.

End users never run this — they get the generated file in the package. Longer term the plugin should export this itself at build time, so the two can't drift.

Tests

uv run pytest

Available Tools

10 tools
adjust_current_soundA

Change the sound the user is playing right now, and hear it within a second.

Use this for "make this darker", "less muddy", "more bite" — anything about the sound in front of them rather than a preset by name. Writes to the preset Space Dust currently has loaded; the plugin picks the change up on its own, so the user doesn't have to touch the preset menu.

Needs a preset to be selected in the plugin. If they're on an unsaved sound, ask them to save it as a preset first.

Inputs: changes (required), note. Returns: result

adjust_presetA

Change settings in an existing preset, in place.

changes maps parameter ids to values written the way the plugin shows them —
{"filterCutoff": "180", "softClipperDrive": "0.6"}.

The previous version is saved first, so undo_preset can always take it back. Use
note to record what the user asked for ("darker, more low end").

Inputs: preset (required), changes (required), note. Returns: result

compare_presetsA

Show every setting that differs between two presets.

Inputs: first (required), second (required). Returns: result

create_presetA

Create a new preset and save it to the user's preset folder.

changes maps parameter ids to values written the way the plugin shows them —
{"filterCutoff": "260", "osc1Waveform": "Saw", "subOscOn": "on"}.

based_on is the preset to start from; "Init" starts from the synth's default state.
Starting from an existing preset the user likes is usually the better move.

Refuses to overwrite an existing preset — pick another name, or use adjust_preset.

Inputs: name (required), changes (required), note, based_on. Returns: result

list_parametersA

Look up Space Dust parameters, their ranges and defaults.

Pass a word to filter — a section name like "filter" or "reverb", or part of a parameter name. With no query this returns every parameter, grouped by section.

Inputs: query. Returns: result

list_presetsA

List the presets installed in the user's Space Dust preset folder.

Inputs: no named parameters. Returns: result

preset_historyB

List the saved earlier versions of a preset, newest last.

Inputs: preset (required). Returns: result

read_current_soundA

Show what Space Dust is playing right now, without the user naming a preset.

Use this whenever they say "this sound", "what I'm hearing", "the current patch".

Inputs: no named parameters. Returns: result

read_presetA

Show how a preset is set up, grouped by section.

Only settings that differ from the synth's defaults are listed, which is what makes
the sound what it is. Set include_defaults to see every parameter.

Inputs: preset (required), include_defaults. Returns: result

undo_presetB

Take a preset back to how it was before the last change.

Inputs: preset (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: listing vs reading presets, adjusting named presets vs the current sound, and separate tools for undo, history, and comparison. The descriptions explicitly disambiguate potentially similar pairs like adjust_preset and adjust_current_sound.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun snake_case pattern (e.g., list_presets, read_preset, adjust_current_sound). Verbs are semantically appropriate (list, read, create, adjust, undo, compare), and no mixed naming conventions are present.

    Tool Count5/5

    At 10 tools, the set is well-scoped for a synth preset management server. Each tool covers a distinct capability without redundancy, and the count feels neither sparse nor bloated.

    Completeness4/5

    The core lifecycle of preset management is covered: list, read, create, adjust, undo, history, and compare. However, a delete operation is missing, and saving the current sound as a new preset would require a workaround, leaving minor gaps.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to generate and control real-time audio synthesis through natural language descriptions using SuperCollider. Features 10 built-in synth types, pattern sequencing, audio recording, and server lifecycle management for creating sounds from simple English descriptions.
      11
      2
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI-powered music composition and synthesis by generating Pure Data patches, VCV Rack modules, and MIDI controller mappings through natural language.
      10
      12 npm
      5
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables natural language control of OSC (OpenSoundControl) messages, allowing users to generate, interpret, validate, and debug OSC messages through an LLM interface for parametric control of multimedia devices.
      3
      MIT