MCP server for controlling Sequentix Cirklon hardware MIDI sequencer
Cirklon MCP has well-structured tools with mostly clear naming and good descriptions. All 18 tools have descriptions and visible input schemas. However, several tools lack parameter descriptions, output schemas are not documented, and some parameter constraints are missing or insufficiently specified. The server follows basic tool patterns but lacks production-grade error guidance and falls short of A/B-tier definition quality standards.
Send All Notes Off (CC#123) to all channels or a specific channel.
Connect to Cirklon MIDI ports. Args: output_port: Port name substring or index (e.g. "Cirklon" or "0"). If empty, uses CIRKLON_OUTPUT_PORT from .env. input_port: Port name substring or index. If empty, matches output.
Disconnect from Cirklon MIDI ports.
Get recent MIDI messages received (if monitoring enabled).
List all available MIDI input and output ports.
Enable or disable monitoring of MIDI input messages.
Select a Cirklon scene (0-127) via Program Change on the remote channel. Args: scene: Scene number 0-127.
Output schemas not documented. Tools return strings without explaining response structure. LLMs cannot plan downstream calls or extract relevant data from responses.
Parameter constraints missing or vague. 'scene' in select_scene accepts 0-127 but no enum/constraint enforces this. 'semitones' range in set_transpose (-60 to +67) documented but not schema-enforced. 'bpm' in send_clock accepts float with no minimum/maximum validation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Send a Control Change (CC) message to an instrument channel.
Start sending MIDI clock at given BPM. The Cirklon is usually clock master, but this lets Claude be master if needed. Sends 24 pulses per quarter note. Args: bpm: Tempo in BPM. 0 = stop clock. Default uses config BPM. bars: Number of bars to send (0 = continuous until stopped).
Send a note (Note On, wait, Note Off) to an instrument channel. Args: channel: MIDI channel 1-16. note: MIDI note number 0-127 (60 = middle C). velocity: Note velocity 0-127. duration_ms: Note duration in milliseconds.
Send a pitch bend message to an instrument channel.
Send Program Change to an instrument channel, with optional bank select. Args: channel: MIDI channel 1-16. program: Program number 0-127. bank_msb: Bank select MSB (CC#0). -1 to skip. bank_lsb: Bank select LSB (CC#32). -1 to skip.
Send a SysEx message to the Cirklon.
Set scene transpose via Note On on the remote channel. Args: semitones: Semitones offset. 0 = middle C (note 60). Range: -60 to +67.
Send MIDI Continue (0xFB) to resume Cirklon from current position.
Send MIDI Start (0xFA) to begin Cirklon playback from the top.
Send MIDI Stop (0xFC) to stop Cirklon playback.
Block and wait for SysEx response from Cirklon.
No error handling guidance. Tools lack actionable error messages. If connect_cirklon fails (port not found), the response should suggest calling list_midi_ports or available alternatives, not a bare error.
Stateful clock management via lifespan context (clock_task). While functional, the implementation reliesfully on thread lifespans and module-level state that could break across session boundaries. Consider stateless design with explicit start/stop tracking returned in responses.
'connect_cirklon' mixes multiple concerns: port lookup, type conversion (int vs string), and connection logic. LLMs cannot know whether to pass 'Cirklon' or '0' without trial-and-error. Separate into lookup/connect or enforce enum of valid port names.
Parameter descriptions insufficient for MIDI-specific concepts. 'cc' in send_cc documented as 'CC number 0-127' but does not explain what CC#0, CC#32, CC#123 do or when to use each. MIDI users need actionable context.
'get_midi_log' lacks output schema. Returns 'limit' parameter and presumably a list, but structure is unknown. LLMs cannot extract individual messages or reconstruct MIDI history without documented field names.
No tool composition for common workflows. Connecting, starting playback, and selecting scene require 3 separate calls. Consider a 'prepare_scene(scene_number)' wrapper that combines connect + select + start in one atomic operation for better UX and reduced round-trips.