Skip to main content
Glama
m8-tracker-mcp

m8-tracker-mcp

by cocopon

m8-tracker-mcp

Unofficial MCP server for controlling a Dirtywave M8 over USB.

https://github.com/user-attachments/assets/da976470-4959-4849-9671-ee1f7610f04a

Requirements

  • Node.js 20 or later

  • M8 connected over USB

Tested with M8 Model:01 on firmware 6.6.3 (macOS). Cursor detection assumes firmware 6.x.

Only one app can open the M8's serial port at a time. Close m8c or other clients, or call disconnect first.

Related MCP server: clawtouch-mcp

Tools

Tool

Description

get_screen

Read the screen as text

press_buttons

Press buttons

press_sequence

Press a series of buttons

press_note

Press a note key (keyjazz)

get_system_info

Get the model and firmware version

connect / disconnect

Open or release the serial port

Screen format

get_screen returns the palette, the screen, and the cursor position:

=== Palette ===
a fg=#787c90 bg=#303440
b fg=#404050 bg=#303440
c fg=#f0f0f0 bg=#303440
d fg=#b0b0c0 bg=#303440
e fg=#98fcf8 bg=#303440
f fg=#00fcf8 bg=#303440

=== Screen ===
                                        
                                        
 {e}SONG                                   
                                        
    1  2  3  4  5  6  {f}7  {a}8        T>120 
 00 {b}-- -- -- -- -- -- -- --             
 01 {b}-- -- -- -- -- -- -- --       {a}1 {b}--- 
 02 {b}-- -- -- -- -- -- -- --       {a}2 {b}--- 
 03 {b}-- -- -- -- -- -- -- --       {a}3 {b}--- 
 04 {b}-- -- -- -- -- -- -- --       {a}4 {b}--- 
 05 {b}-- -- -- -- -- -- -- --       {a}5 {b}--- 
 06 {b}-- -- -- -- -- -- -- --       {a}6 {b}--- 
 07 {b}-- -- -- -- -- -- -- --       {f}7 {b}--- 
 {f}08 {b}-- -- -- -- -- -- {f}-- {b}--       {a}8 {b}--- 
 09 {b}-- -- -- -- -- -- -- --             
 0A {b}-- -- -- -- -- -- -- --             
 0B {b}-- -- -- -- -- -- -- --             
 0C {b}-- -- -- -- -- -- -- --             
 0D {b}-- -- -- -- -- -- -- --       {a}P     
 0E {b}-- -- -- -- -- -- -- --       {f}S{a}CPIT 
 0F {b}-- -- -- -- -- -- -- --       {a}V     
                                        
                                        

=== Cursor ===
line 14, columns 23-24: "--"

Development

npm install
npm run dev
npm run build
npm test

Tests replay serial data recorded from a real M8 in fixtures/. To record a new one, run npm run capture -- <name> and check <name>.txt against the device.

Acknowledgments

Serial protocol handling was implemented with reference to m8c by Jonne Kokkonen.

License

MIT License. See LICENSE for more information.

Available Tools

7 tools
connectConnect to M8A

Open the USB serial connection to the M8. Other tools connect automatically, so this is only needed to reconnect explicitly or to check that the M8 is reachable.

Inputs: no named parameters.

disconnectDisconnect from M8A

Close the USB serial connection so other apps (m8c, TyUploader for firmware updates, etc.) can use the M8. The next M8 tool call reconnects automatically.

Inputs: no named parameters.

get_screenGet M8 screen textA

Returns the current M8 screen as text with inline color tags. A Palette section maps slot letters to fg/bg colors. In the Screen section, "{x}" switches the color to slot x until the next tag; each line starts in slot "a". Spaces do not trigger tags. The Cursor section gives the line (1-based within the Screen section), the columns (1-based, not counting {x} tags) and the text inside the cursor frame.

Inputs: no named parameters.

get_system_infoGet M8 system infoA

Returns hardware model, firmware version, and font mode of the connected M8.

Inputs: no named parameters.

press_buttonsPress M8 buttonsA

Press one or more M8 buttons simultaneously for a short duration (default 50ms), then release, optionally several times. Use arrays to combine modifier-style inputs; names match the M8 hardware labels. E.g. ["shift","right"] for SHIFT+RIGHT (move to the next screen), ["edit","up"] with repeat 3 to raise a hex value by 0x30.

Inputs: buttons (required), repeat, duration_ms.

press_notePress a note key (keyjazz)A

Press a note key as if on a keyboard for duration_ms, then release it. The M8 uses the current instrument (the instrument number last set in a phrase), not the instrument on the cursor row. On the PHRASE screen with the cursor on the note column, this enters the note and the current instrument into that row; elsewhere it only plays the note. Move the cursor off the note column to only listen. Note numbers: 36 is C-4, 48 is C-5.

Inputs: note (required), duration_ms (required), velocity.

press_sequencePress a sequence of M8 buttonsA

Run several button presses in order in one call, each like press_buttons (pressed together, released, optionally repeated). Use it for multi-step edits, e.g. setting the three RGB values of a theme row. The user may move the cursor on the device between calls, so read the screen right before running a sequence to confirm where the cursor is, and read it again afterwards to confirm the result.

Inputs: steps (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 7 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes: connect/disconnect manage the serial link, get_screen and get_system_info read state, and press_note is specialized for note entry. The main overlap is between press_buttons and press_sequence, since press_sequence is essentially a batched version of press_buttons, but the descriptions explain when to use each.

    Naming Consistency4/5

    Names consistently use snake_case and are mostly verb_noun (press_sequence, press_note, get_screen, get_system_info, press_buttons). connect and disconnect are verb-only exceptions, but they remain readable and predictable.

    Tool Count5/5

    Seven tools is well-scoped for an M8 hardware-control server: connection management, screen reading, system info, and three input mechanisms. Each tool earns its place without redundancy.

    Completeness5/5

    The surface covers the full interaction lifecycle: connecting/disconnecting, reading screen and system state, and sending button, note, and sequenced inputs. For UI-automation-style control of the M8, there are no obvious missing operations.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Turns Ableton Live into an MCP-accessible control surface, providing tools for controlling transport, tracks, clips, and devices, as well as resources for reading live state.
      5
      100
      35 PyPI
      3
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Turns a real USB HID device — a Raspberry Pi Pico 2 running open-source firmware — into MCP tools (move, click, drag, type, key combos, scroll) for any MCP client. Includes a --mock mode to try every tool with no hardware.
      16
      51 PyPI
      13
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      MCP server that enables full control of a Flipper Zero device over USB, including screenshots, radio protocols, and app development without requiring a COM port.
      35
      MIT