MCP server for controlling Expert Sleepers Disting NT multi-algorithm DSP module
The server has 46 tools with consistent naming patterns (all start with action verbs: get_, set_, list_, connect_, disconnect_, add_, remove_, etc.). Descriptions are present for all tools and most parameters, ranging from 40 - 150 characters, adequate but tending toward generic. Parameter schemas are well-defined with types (string, integer, array, boolean) and descriptions. However, output schemas are NOT documented in the source code (only implied by return types like 'str', implying unstructured text output). No tool demonstrates structured output with typed fields. Error handling is minimal, most tools either succeed silently or return generic error strings. The server implements domain-specific MIDI control well (46 tools covering algorithm management, parameter editing, preset control, display, routing, and monitoring), but lacks the output documentation and recovery guidance expected of production-grade agent tools. Tool composition is reasonable, each tool does one task, but chaining is brittle because responses are strings, not structured objects with IDs and references. Security is adequate (no exposed secrets in tool params, MIDI is isolated to MIDI ports), but no audit logging or permission gates are visible.
Load an algorithm by its 4-character GUID with optional spec values (CMD 0x32).
Clear the MIDI message log.
Connect to Disting NT MIDI ports. Auto-detects "Disting NT" if no port specified.
Disconnect from Disting NT MIDI ports.
Execute inline Lua code on the Disting NT (CMD 0x08).
Query a library algorithm by index: GUID, name, specs (CMD 0x31).
Get all parameter values for an algorithm slot as a list (CMD 0x44).
Output schemas not documented. Tools return unstructured strings (e.g. 'No response from Disting NT', 'Display mode: parameters'), making it impossible for LLMs to extract structured data for downstream tool calls. This violates the response-shaper and tool-chain patterns. Agents cannot reliably parse responses to chain calls.
No error recovery guidance. When tools fail (e.g. 'Not connected to Disting NT'), the error is a bare ValueError with a suggestion to call connect_disting_nt. However, this guidance is not discoverable in the tool description, LLMs may not know to retry with a different tool. See pattern:recovery-guide.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 17 | - | v1 |
Get current DSP CPU load as a percentage (CMD 0x62).
Get enum option labels for a parameter (CMD 0x49).
Get the Disting NT firmware version (CMD 0x22).
Query what algorithm is in a specific slot: GUID, name (CMD 0x40).
Get how many algorithm slots are occupied in the current preset (CMD 0x60).
Query all CV/MIDI/I2C mappings (CMD 0x4B).
Retrieve the log of received MIDI messages (up to 1000 most recent).
Get the total number of algorithms available in the Disting NT library (CMD 0x30).
Get the number of parameters for an algorithm slot (CMD 0x42).
Query parameter metadata: name, type, range, unit (CMD 0x43).
Get a single parameter's current value (CMD 0x45).
Get the human-readable string representation of a parameter value (CMD 0x50).
Get the current preset name (CMD 0x41).
Get the current inter-algorithm routing state (CMD 0x61).
Get the unit string for all parameter types (CMD 0x48).
Upload a keyboard mapping file to the Disting NT (CMD 0x12).
Install a persistent Lua script to an algorithm slot (CMD 0x09).
Upload a Scala tuning file to the Disting NT (CMD 0x11).
List all available MIDI input and output ports.
Load a preset by name from storage (CMD 0x34).
Reorder algorithms by moving one slot to another position (CMD 0x37).
Clear all algorithm slots and start fresh (CMD 0x35).
Reboot the Disting NT module (CMD 0x7F).
Remove an algorithm from a slot (CMD 0x33).
Save the current state as a preset (CMD 0x36).
Send a raw MIDI message to the Disting NT.
Map a CV input to a parameter (CMD 0x4D).
Switch the Disting NT display mode (CMD 0x20).
Focus the Disting NT display on a specific algorithm slot (CMD 0x4A).
Map an I2C control to a parameter (CMD 0x4F).
Map a MIDI CC to a parameter (CMD 0x4E).
Set a single parameter to a new value (CMD 0x46).
Rename the current preset (CMD 0x47).
Set the Disting NT's real-time clock (CMD 0x04).
Rename an algorithm slot (CMD 0x51).
Start listening to incoming MIDI messages from Disting NT.
Stop listening to incoming MIDI messages.
Capture the Disting NT 256x64 display as ASCII art (CMD 0x01 → 0x33). Returns a text representation of the screen pixels.
Wake the Disting NT from sleep (CMD 0x07).
Destructive operations lack confirmation or dry-run. Tools like remove_algorithm, new_preset, and reboot are marked DESTRUCTIVE but have no confirmation step or preview. An LLM could accidentally wipe a preset or reboot the device. See pattern:confirmation-request.
Many query tools return bare string summaries without structured data. For example, get_algorithm_info returns formatted text like '=== Algorithm 0 ===\n GUID: VCO1\n Name: Oscillator' instead of a JSON object {algorithm_index: 0, guid: 'VCO1', name: 'Oscillator', specifications: [...]}. This forces LLMs to parse freeform text, wastes tokens, and breaks chaining. See pattern:structured-output.
Tool descriptions lack context on when to use them. For example, get_parameter_value vs get_all_parameter_values, the description does not explain when to call one vs the other. Similarly, load_preset has an 'append' flag but no explanation of when to use append=true vs false. See pattern:tool-description.
Parameter ranges and constraints not documented. Many integer parameters (e.g. algo_index, slot_index, param_index) lack min/max bounds in descriptions. LLMs may pass out-of-range values causing silent failures or crashes. See pattern:constrained-input.
No pagination or result limits on discovery tools. Tools like list_midi_ports, get_mappings, get_unit_strings could return arbitrarily large lists in the MIDI port universe or full algorithm library, bloating responses and context windows. No limit or offset/page parameters visible. See pattern:paginated-result.
File path inputs (install_scala_tuning, install_keyboard_mapping) exposed as string parameters. LLMs could hallucinate invalid paths or traverse outside safe directories. See pattern:tool-gateway.
send_midi_message accepts raw byte array as a parameter. LLMs may construct invalid MIDI messages, corrupt device state, or trigger unintended side effects. No validation or schema for MIDI message structure visible. See pattern:tool-gateway.
Implicit dependencies between tools undocumented. For example, set_parameter_value requires knowing slot_index and param_index, which must come from prior calls to get_loaded_algorithm and get_parameter_info. Tool descriptions do not hint at this prerequisite chain. See pattern:tool-description.