Electra-one-mcp — a Claude Code plugin for end-to-end EL1 widget development

Hi all,

I’ve just released a Claude Code plugin (MCP server + skill + indexed docs) that lets you develop and push custom widgets to an Electra One MK2 / Mini directly from Claude Code, or other Dev LLMs

MIT licensed, source on GitHub::link: GitHub - roomi-fields/electra-one-mcp: MCP server + Claude Code skill + indexed docs for developing Electra One MK2/Mini widgets and presets · GitHub

:package: Install: `/plugin marketplace add roomi-fields/claude-plugins` then `/plugin install electra-one@roomi-fields`

What it does

20 MCP tools grouped by need:

- Push — `push_to_device(preset_path, bank, slot)` runs the full pipeline: switch slot → upload preset → upload Lua → slot-flip reload (since `08 08 Reload Preset Slot` NACKs on 4.1.4, see below). Auto-converts the widget repo’s “tiles” schema to the device’s “controls” schema, splits inlined Lua into a separate `01 0C` upload. Verified on hardware with a 25 KB preset + 40 KB Lua bundle.

- Read — `execute_lua(source)` for a live REPL (e.g. `print(parameterMap.get(99))`), captures `print()` output via `7F 00`. `device_state(seconds)` is a passive listener that classifies the `7E XX` event vocabulary (preset switch, page, control set, pot touch, list-change notifications) and tracks client-side what’s on screen. `pull_preset(bank, slot, out_path)` does the reverse direction — preset + lua download, reverse-converts back to repo format.

- Compute — `bundle_widget`, `validate_preset`, `screenshot_widget` (via headless emulator).

- Doc lookup — `get_sysex_command(query)` queries a catalog of all 62 documented SysEx commands extracted from the bundle + official docs. `search_docs`, `get_api`, `list_constants` cover the 79-page mirror of `docs.electra.one`.

Why I built it

Two specific points of friction:

1. The widget JSONs people typically work with use a “tiles” schema (`schemaVersion`, `tiles[]`, `targetDevice`…) that the device firmware doesn’t parse directly via SysEx — `01 01 Upload Preset` ACKs at the transport level but the device’s preset parser silently rejects it. The web editor at `app.electra.one` converts to the documented “controls” schema (`version`, `controls[]`, `groups[]`…) before sending. I ported that converter to Python (byte-identical, verified against a live MIDI sniff), so the same widget JSON can now be pushed straight to hardware.

2. Many of the practical workarounds I found where scattered in staff replies on this forum. I’ve consolidated them with direct quotes in a `docs/FORUM_REFERENCES.md` file shipped with the plugin: threads #592 (file transfer chunking — Martin’s “well under 4 kB”), #410 (Preset Transfer Failed retry), #2370 (parser size limits), #4172 (multi-pot custom tiles), #4116 / #4185 (no `onPotClick`), #807 (Lua-not-running after slot switch), #3590 (external Lua editor pattern), #2022 (default-preset recovery), #4259 (4.1.4 release notes).

Known caveats (firmware 4.1.4 on my test rig)

- `08 08 Reload Preset Slot` NACKs — the plugin uses a slot-flip workaround (`09 08 bank (slot XOR 1)` then back) which forces a clean reinit.

- File Transfer API (`01 2D / 2E / 2F / 04 2D`) commit silently rolls back when uploading `type:“preset”`. I exposed it as `mode=“ft”` for completeness + for Lua module uploads where it’s the only path, but default to the simple `01 01` + `01 0C` route (what the web editor uses per the JS bundle).

- On Windows, big single `midiOutLongMsg` calls fragment unreliably since the late-2025 Windows updates KB5077181/KB5074105. Working around by keeping the preset.json small (< 1 KB without inlined Lua) and uploading Lua separately.

All caveats with their workarounds are in `docs/DEV_GUIDE.md`.

Acknowledgements

- Martin Pavlas and kris — for the publicly documented Lua API + the staff replies on this forum that made the undocumented behaviour debuggable.

- `xot/ElectraOne` (Codeberg), `johnnyclem/electra-one`, `elliotwoods/simularca-electra-one-plugin` — reference open-source consumers of the SysEx protocol I used to cross-check the simple `01 01` + `01 0C` upload path.

Feedback / bug reports / PRs very welcome. I’d especially love to hear from anyone who can confirm or refute the empirical behaviour I observed on firmware 4.1.4 (the `08 08` NACK in particular — is this device-specific, or universal on this firmware?).

Romi

5 Likes

Very nice. Will have to check this out.

I was about to turn my “edit locally on file system” sync proxy into an MCP server, but this makes it irrelevant.

Does this work with the E1 Editor or does it go direct to Controller only?

Thanks! It goes direct to the Controller over USB SysEx

For the moment, I don’t need, for my own use, to pass through editor, but it can make sense.

I have a little reverse-ingeenered the editor to understand some behaviors, and to interact with it, there are two Ways:

  1. The cleanest one : @martin to expose an API to connect to the editor
  2. To use playwright / web interactions to simulate user behaviors. This one is feasible I already did it for my NotebookLM MCP but is most sensitive to UI redesign and heavy to code.

WOW wish I would have found this a while ago. thanks a bunch. I’m VERY new to using Claude and currently only use the chat function to build things and it took forever to get the Kawai XD-5 preset built. Any tips you can provide would be greatly appreciated - like… forgve me. “:package: Install: `/plugin marketplace add roomi-fields/claude-plugins` then `/plugin install electra-one@roomi-fields`” what does this mean and where do I install this in Claude?

I assume I should be using Claude Code rather than the chat.

Welcome — and yes, you’d want Claude Code, the CLI (or desktop app), not the chat web UI. The plugin is a Claude Code plugin: it adds the MCP server, the skill, and the indexed docs straight into your Claude Code session, so Claude already knows the El1 Lua API, the SysEx commands and the device-side gotchas before you even start.

Step by step:

  1. Install Claude Code if you don’t have it yet — instructions on Claude Code by Anthropic | AI Coding Agent, Terminal, IDE. On macOS / Linux it’s npm install -g @anthropic-ai/claude-code (Node 18+). On Windows the easiest path is WSL.

  2. Open a terminal in any folder (a new empty one is fine for a first try) and run claude. That drops you into the Claude Code prompt.

  3. Inside that prompt, type:

    • /plugin marketplace add roomi-fields/claude-plugins — this registers my GitHub repo as a plugin source.
    • /plugin install electra-one@roomi-fields — installs the plugin from that source.
  4. Plug your Electra One in over USB. Then just ask in plain language, e.g. “push the Kawai XD-5 preset on bank 1 slot 1” or “build me a widget that shows the 8 envelope params as faders”. The skill auto-loads and Claude uses the MCP tools (push_to_device, validate_preset, search_docs, execute_lua…) on its own.

For the widget side, the repo https://github.com/roomi-fields/electraone-widgets is a starter kit with the bundler, the emulator and 16 worked examples that match the design system — Claude Code is much faster when it has those references in the working directory.

If your XD-5 preset took forever in the chat, the typical reason is that the chat doesn’t see the device, can’t push, can’t read back errors, and doesn’t know the firmware-specific quirks (08 08 NACK on 4.1.4, 1-pot-per-custom-tile limit, etc.). Claude Code with this plugin closes all three loops.

Happy to help debug the XD-5 if you share what’s blocking.

Romi

2 Likes

Thank you Romain… I’m working on the TG77 now. Your tools and the RTFM are SO HELPFUL. I gratefully accept your help and will bring the XD-5 back on the desk very shortly.

1 Like

@stevenclements thank you for this feedback.
It’s precious to konw that my work cnotributes to someone else work.

And thank you also to give me this feedback for RTFM, this tool is really powerfull and with no existing alternative, but I’m really not able to make it visible by the vibecoding community.
So don’t hesitate to star it on GitHub, it will help me.

1 Like

If I could give you more stars I would! I’m amazed at how much RTFM really sped up working with Claude CODE

1 Like

Dang I was so happy I just got Claude Code to transfer without the web app ! But it turns out you went a lot deeper than I did! Its been really making life a lot easier for my Elektra projects. better than easier -superhuman! now i can focus on ideas and music rather than hexidecimal 7 bit headaches! truly one step closer to the midi tricorder of my dreams!

comparing our patch upload algos with -what else- Claude Code!!

:slight_smile:

2 Likes

one useful trick was setting up the iphone above the screen so it could work better with changing the interface. also letting it have access to midimonitor and sendmidi CLI helped a lot. i made my first programs in the Claude GUI and had to upload with the web app, a real pain when iterating a lot so this is all really good we have found a way to do it in CLI.