Skip to main content
Glama
MuseScore MCP Server

MuseScore MCP Server

by ghchen99

MuseScore MCP Server

A Model Context Protocol (MCP) server that provides programmatic control over MuseScore, via a WebSocket-based plugin system. This allows AI assistants like Claude to compose music, add lyrics, navigate and analyse scores, restructure them with repeats, and mark them up with colors and highlights, directly in MuseScore.

Demo GIF

What you can do

Ask Claude in plain language; it picks the tools. For example:

  • Compose and edit: "Write a C major arpeggio in bar 3", "Add the lyrics 'Twin-kle twin-kle' from bar 1", "Set the tempo to 90 at bar 17".

  • Read large scores: the score is read 16 bars at a time as compact LilyPond, optionally only some staves, so even a 20-staff score fits.

  • Compress a score with repeats: "Find the repeated passages and put them between repeat barlines". The server finds bars and passages that repeat, adds repeat barlines, 1st/2nd endings and play counts, and removes the duplicate bars.

  • Build drum charts: "Map the sections of the drum part" gives a road map (groove bar, exact and near copies, fills, and where the crashes fall). "Turn the copies into repeat signs" writes 1-, 2- or 4-bar measure-repeat signs automatically. "Make a drums-only chart with the groove written once and a 7x count" copies the score, keeps only the drums and collapses each run of identical bars. With the drum-chart skill, "make a drum chart from the open score" runs the whole workflow (see the example use case).

  • Keep the song's bar numbers: "Number the bars as played" makes the displayed numbers count repeated bars, so a compact chart still matches the original song.

  • Highlight and color: "Highlight the crash hits", "Box the dynamics", "Highlight the repeat signs and time signatures in light blue", "Color the fill on beats 3-4 of bar 13 green", "Label bar 6 'Groove x7'", "Add these cues in small grey italics at the start of each section: ...".

  • Finish the page: "Tidy the title and call it a drum chart" cleans up the title frame; "Print what changed at the end" adds a summary of the differences from the original after the last bar, so it ends up in the PDF.

  • Iterate: everything the tools add can be removed again ("remove the ** marks", "clear the crash highlights", "reset the bar numbers"), so you can refine the result step by step.

Related MCP server: Mureka MCP Server

Requirements

  • MuseScore 4.7 or newer. See Version requirements.

  • uv, which installs Python 3.13 or newer for you. Without uv you need Python 3.13+ and pip; see Setup and running.

  • An MCP client, such as Claude Desktop or Claude Code.

Quick start

  1. Get the code and its dependencies (uv also installs a matching Python if needed):

    git clone https://github.com/ghchen99/mcp-musescore.git
    cd mcp-musescore
    uv sync
  2. Install the MuseScore plugin: copy musescore-mcp-websocket.qml into your MuseScore plugins folder (usually ~/Documents/MuseScore4/Plugins), then enable MuseScore API Server under Plugins → Plugin Manager.

  3. Register the server with Claude Desktop (run this in the repository folder):

    uv run fastmcp install claude-desktop server.py --name musescore --project .
  4. Start it: open a score in MuseScore and run Plugins → MuseScore API Server. Then restart Claude Desktop and ask it to work on your score. The plugin has to be running whenever Claude uses the tools.

Other MCP clients, a manual configuration, platform notes and the setup without uv are in Setup and running.

Example use case: a drum chart from a Songsterr tab

How the drum-chart skill is used day to day, from a song on Songsterr to a printable drum chart.

Once: set up the plugin and the server (Setup), then install the skill in Claude Desktop (Installing a skill).

For each song:

  1. Songsterr → Guitar Pro. Open the song on Songsterr and export it as a Guitar Pro file (.gp, .gp5…).

  2. Import it in MuseScore with File → Open. Don't save it: the skill never saves the full score. If MuseScore says the file is corrupted, carry on: the damage is usually in another instrument, which the skill removes.

  3. Focus on the drum part. Open the drum part in its own tab (Parts, then the drum kit), or stay on the full score. Either way the skill keeps only the drum staff, after backing up the full score to ~/.mcp-musescore/backups.

  4. Start the plugin: Plugins → MuseScore API Server.

  5. Call the skill. In Claude Desktop, ask "make a drum chart from the open score".

  6. Answer when prompted. Claude proposes a section map (sections, bar ranges, which grooves and phrases collapse into "× N") and asks, in one message:

    • which near copies to merge, and what each merge would drop (e.g. "bar 24 like 26: drops the kick on 5.5");

    • whether to remove the ghost notes;

    • where the hi-hat is half-open;

    • which cymbal rolls to simplify.

    After your OK it works on its own. The first time it saves the chart, MuseScore asks where (an imported score has no file yet): pick a name like <song> - drums.mscz.

  7. The chart, in the same MuseScore tab:

    • each groove or phrase written once between repeat barlines, with its play count;

    • section labels with their bar counts, e.g. "Chorus 1 (2x4)";

    • fills in green, stops in red, crashes, dynamics and time signatures highlighted;

    • bar numbers that still match the song;

    • a tidy title: song, artist, "Drums";

    • the changes from the original after the last bar, and the song structure on its own page.

    To change something, ask in the same chat (e.g. "don't merge bar 24", "the hi-hat is half-open in the bridge too"): Claude redoes only that part.

  8. Export to PDF: save (Ctrl+S), then File → Export → PDF.

Documentation

Page

What's in it

Setup and running

Prerequisites, installing the plugin, registering the server with Claude Desktop (with uv or a virtual environment), Ubuntu notes, starting order, updating, sample scores

Tool reference

Reading and navigating the score, notes, measures, tempo, instruments, highlighting and coloring, batch operations, the score viewer, version requirements, examples

Repeats and drum charts

Compressing a score with repeats, drum-chart tools, measure-repeat signs and how they are written, drum notation, chart examples

Agent skills

The bundled skills and how to install them in Claude Desktop or Claude Code

Development and testing

Tests, the mock plugin, running the real plugin headless, console output, file structure

Troubleshooting

Connection, plugin, server, score-file and skill problems, API limitations

Contributing

Contributions are welcome: fork the repository, work on a branch, and open a pull request against main. To set up and check your changes:

uv sync                            # install the dependencies, including the test tools
uv run prek install                # check every commit (once per clone)
uv run pytest --no-musescore --cov # run the tests with coverage
  • Before every commit, prek checks the dependencies with deptry, the types with ty, and the plugin's syntax when it changed (needs Node.js). The tests run separately. With make, make check and make test run the checks and the tests, as CI does.

  • Without MuseScore, the tests use a mock plugin, and the tests that need MuseScore skip themselves.

  • CI runs the tests twice more with MuseScore: on 4.7.0, the oldest supported version, and on the latest release. So changes to the plugin are checked too.

  • When you change the plugin (musescore-mcp-websocket.qml), it is still quicker to run the tests locally with MuseScore installed first.

  • When you change dependencies, use uv add and commit uv.lock; the commit hook regenerates requirements.txt, and CI checks that the two match.

Development and testing has the details: the checks before committing, the mock plugin, running the real plugin headless, and managing dependencies.

Star History

Available Tools

63 tools
add_articulationAdd ArticulationA

Add an articulation to the chords that contain the chosen drums in a range of bars (and beats): 'half_open' (half-open hi-hat), 'open', 'closed' (hi-hat), 'accent', 'marcato', 'staccato', 'tenuto'. E.g. drums=['hi-hat'], symbol='half_open' marks the hi-hats of bars 72-85 as half-open. Chords that already have it are left alone. Remove with remove_articulations.

Inputs: start_measure (required), drums, symbol, pitches, +5 more.

add_instrumentAdd InstrumentC

Add a new staff/instrument to the score.

Inputs: instrument_id (required).

add_labelAdd LabelA

Add a label in a colored box (a boxed staff text) at the start of a measure, e.g. a section tag like 'Groove x7' or 'Fill'. Saved in the score; remove with clear_highlights.

Inputs: text (required), measure (required), staff, border, +1 more.

add_lyricsAdd LyricsB

Add lyrics to consecutive notes starting from the current cursor position.

Inputs: lyrics (required), verse.

add_noteAdd NoteA

Add a note at the current cursor position with the specified pitch and duration. Sequential notes write a melody. Set add_to_chord=True to stack a pitch on the current chord.

Inputs: pitch, duration, add_to_chord, advance_cursor_after_action.

add_rehearsal_markAdd Rehearsal MarkB

Add a rehearsal mark (section label such as 'A' or 'Verse') at the start of a measure. Experimental: check the score afterwards.

Inputs: text (required), measure (required).

add_restAdd RestC

Add a rest at the current cursor position.

Inputs: duration, advance_cursor_after_action.

add_textAdd TextB

Add free text at a bar (optionally at a beat) with its own look: size, italic/bold, color, above or below the staff. Defaults give a small, italic, light-grey cue, e.g. the first words of a section's lyrics as a reminder for the player. kind='expression' makes it an expression text. Use the text the user provides. Remove with Ctrl+Z, or select the texts in MuseScore and delete them.

Inputs: text (required), measure (required), beat, bold, +6 more.

add_tieAdd TieA

Tie notes of the chord at the cursor to the same pitches in the next chord of that staff. A tie joins two notes of the same pitch into one longer sound. Only pitches in both chords can be tied: by default every such pitch is tied; pass pitches to tie only some of them (e.g. tie C and E of C-E-G into C-E-A with pitches=[60, 64]). Afterwards the cursor is on the second chord, so calling add_tie again continues a tie chain. Note that after add_note the cursor is already on the next position: move back to the first note (e.g. with prev_element) before calling add_tie. Write both chords completely before tying: MuseScore treats tied chords as one, so a pitch added afterwards with add_note(add_to_chord=True) to the second chord is also added, tied, to the first. While writing music, add_tied_note is usually simpler. Fails without changing the score when no pitch can be tied, e.g. when the next element is a rest.

Inputs: pitches.

add_tied_noteAdd Tied NoteA

Write the next note or chord at the cursor, tied to the chord before the cursor: like pressing + in MuseScore's note input. Use it after add_note to hold a note longer, e.g. across a barline. By default the new chord repeats every pitch of the chord before it, all tied; pass pitches to tie only some of them, and extra_pitches for new pitches in the same chord without a tie (e.g. C-E-G into C-E-A: pitches=[60, 64], extra_pitches=[69]). Add new pitches this way, not with add_note(add_to_chord=True) afterwards: MuseScore treats tied chords as one and would also add the pitch, tied, to the chord before. A note longer than the rest of the bar is split at the barline into tied notes, and the cursor moves past all of it. Fails without changing the score when there is no note before the cursor or a pitch is not in it.

Inputs: duration (required), pitches, extra_pitches, advance_cursor_after_action.

add_tupletAdd TupletC

Add a tuplet at the current cursor position.

Inputs: ratio, duration, advance_cursor_after_action.

add_voltaAdd VoltaA

Add a volta (1st/2nd ending bracket) over a range of measures. Experimental: the plugin API has no dedicated volta call, so check the result; if it fails, the measures are selected and the reply says which palette item to click.

Inputs: start_measure (required), text, endings, end_measure.

append_measureAppend MeasureC

Append measures to the end of the score.

Inputs: count.

apply_measure_repeatsApply Measure RepeatsA

Turn bars of one staff into measure-repeat signs (1-, 2- or 4-bar) automatically. MuseScore's plugin API cannot place these signs, so this saves the score, backs the file up, writes the signs into the file and reloads it in MuseScore. The reload resets MuseScore's undo history: use restore_backup to undo. Each sign repeats the bars just before it, and the replaced bars' notes are deleted. Bars with ties or slurs crossing their barlines are skipped and reported. Pass all groups for a staff in one call.

Inputs: staff (required), groups (required), score_path.

beam_over_restsBeam Over RestsA

Beam eighths and shorter across rests inside a beat group (a dotted quarter in 12/8, a beat in 4/4), as drum charts write them: one beamed group per beat with the rest under the beam, instead of separate flags broken at every rest. Only rests with beamable notes before and after them in the same group change. Run it over the whole drum staff once the chart is done. clear=True puts the rests back on automatic beaming.

Inputs: clear, last_staff, end_measure, first_staff, +1 more.

clear_colorClear ColorB

Reset notes and rests in a range of measures and staves (optionally only some beats) to the default black.

Inputs: start_measure (required), end_beat, last_staff, start_beat, +2 more.

clear_highlightsClear HighlightsA

Remove highlights from a range of measures and staves. kinds: 'highlights' = bands and boxes from highlight_bars, highlight_notes and highlight_symbols; 'markings' = boxes behind dynamics (highlight_markings); 'labels' = boxed labels (add_label); 'notes' = small notehead boxes made by older versions. Recolored notes and symbols are reset with clear_color / highlight_symbols(mode='color', clear=True).

Inputs: kinds, last_staff, end_measure, first_staff, +1 more.

collapse_to_repeatCollapse To RepeatA

Collapse a run of repeated bars or phrases into one played N times: keeps the first phrase_bars bars from start, deletes the rest of the run, and puts start/end repeat barlines with a play count around the kept bars (shown as e.g. '7x'). With phrase_bars=2, bars start..end must be a 2-bar phrase repeated (e.g. 28-35 becomes 28-29 x4). This changes every staff, so use it in a score that contains only the part being charted (make_part_score). It refuses when any staff's copies differ in anything but ghost notes and crashes on beat 1, unless force=True. Later measures are renumbered: collapse from the end of the score backwards. Needs MuseScore 4.6+.

Inputs: end (required), start (required), force, phrase_bars.

color_rangeColor RangeA

Color the notes and rests (with their stems, beams, accidentals, dots, ties and grace notes such as flams) in a range of measures and staves, e.g. to highlight a passage. Use start_beat/end_beat to color only part of a bar, e.g. a fill on beats 3-4: notes and rests starting in that span are colored.

Inputs: start_measure (required), color, voices, end_beat, +4 more.

connect_to_musescoreConnect To MusescoreC

Connect to the MuseScore WebSocket API.

Inputs: no named parameters.

delete_measuresDelete MeasuresA

Remove whole measures (on every staff) from the score, like MuseScore's Remove selected range (Ctrl+Del). Works with multi-measure rests on (they are switched off meanwhile) and reports an error if MuseScore deleted fewer measures than asked. Later measures are renumbered, so when removing several ranges start from the last one.

Inputs: start_measure (required), end_measure.

delete_selectionDelete SelectionB

Delete the current selection, or the specified measure.

Inputs: measure.

find_groove_sectionsFind Groove SectionsA

Map the sections of a groove-based part (drums by default): for each section the groove bar, the bars that copy it exactly, near copies (with the hits that differ), and fills. Proposes measure-repeat signs for exact copies only, as ready-made apply_measure_repeats groups, and a collapse_to_repeat range for a 'groove bar x N' chart. Show near copies to the user and only replace them once approved: a repeat sign deletes their differences.

Inputs: staves, tolerance, end_measure, start_measure.

find_repeated_measuresFind Repeated MeasuresA

Find repeated material in the score. Returns (1) per-staff bars that repeat the previous 1, 2 or 4 bars, candidates for measure-repeat signs (these declutter the page but keep the length), and (2) whole-score passages played again right away, candidates for repeat barlines and 1st/2nd endings (these shorten the score once the duplicate measures are deleted). Each passage lists the tool calls that apply it. Reads the score in small chunks, so it works on large scores. Measure numbers refer to the score as it is now: apply passages from the last one backwards.

Inputs: staves, highlight, end_measure, start_measure.

get_cursor_infoGet Cursor InfoB

Get information about the current cursor position.

Inputs: no named parameters.

get_scoreGet ScoreA

Get the notes of the current score as LilyPond (or raw JSON), a range of measures at a time. Without end_measure, returns at most 16 measures starting at start_measure; the header says how many measures the score has, so page through long scores. Use staves to read only some staves of a large score. Each bar ends with '% m.N': N is the bar's position, which is what every tool's measure parameters mean. When the score's displayed bar numbers differ (e.g. they count repeats), the displayed number follows as '(bar M)'; repeat barlines show as '|:' and ':|xN'.

Inputs: format, staves, end_measure, start_measure.

ghost_notesGhost NotesA

List the ghost notes (notes in parentheses) per bar, or remove them (mode='remove'). A chord made only of ghost notes becomes a rest. Show the list to the user before removing: whether a chart keeps ghost notes is their choice.

Inputs: mode, drums, pitches, last_staff, +3 more.

go_to_beginning_of_scoreGo To Beginning Of ScoreB

Navigate to the beginning of the score.

Inputs: no named parameters.

go_to_final_measureGo To Final MeasureA

Navigate to the final measure of the score.

Inputs: no named parameters.

go_to_measureGo To MeasureA

Navigate to a specific measure and select it across all staves. The cursor moves to beat 1 of that measure on the first staff, so the next cursor tool (add_note, add_rest, add_lyrics, set_time_signature...) acts there; use next_staff to move down to another staff.

Inputs: measure (required).

highlight_barsHighlight BarsA

Highlight bars like a highlighter pen: a thick, semi-transparent band behind the notes of each staff in the range, following the bars across line breaks. start_beat/end_beat limit it to part of a bar. Saved in the score; remove with clear_highlights. Experimental: check the result in the score.

Inputs: start_measure (required), color, opacity, end_beat, +4 more.

highlight_markingsHighlight MarkingsA

Highlight markings such as dynamics (f, mf, ff) with a translucent box behind each one. get_score lists the markings in each measure. Remove with clear_highlights.

Inputs: color, types, opacity, last_staff, +3 more.

highlight_notesHighlight NotesA

Highlight individual hits like a highlighter pen: a translucent box around each matching note, as wide as the note and as tall as the whole staff (taller if the note sits above or below it). Hits close enough for their boxes to touch share one box. Use drums (e.g. ["crash"]) or pitches to pick notes in a chord. start_beat/end_beat limit it to part of a bar. Boxes are sized to the current layout: if the layout changes a lot, clear and highlight again. Remove with clear_highlights.

Inputs: start_measure (required), color, drums, opacity, +6 more.

highlight_symbolsHighlight SymbolsA

Highlight or recolor time signatures, repeat barlines (start/end repeat signs with their dots) and measure-repeat signs. mode='highlight' draws a full-staff-height translucent box around each one (pastel light blue by default); mode='color' recolors the symbol itself (clear=True resets it to black).

Inputs: mode, clear, color, kinds, +5 more.

insert_measureInsert MeasureB

Insert a measure at the current position.

Inputs: no named parameters.

label_section_countsLabel Section CountsA

Write each section's bar count (e.g. '2x4+2'). placement='label' (default, the chart style the user chose) puts it in parentheses in the section label (rehearsal mark): 'Chorus 1 (2x4)', and sets the labels to label_size points with label_clearance spaces around them, so MuseScore places and spaces them. placement='beside' writes it in bold red right of the label at the label's height (moved past a text already there or up over notes); MuseScore doesn't leave room for it between systems, so it can run into dynamics of the system above: only on request. Without counts, uses song_structure's counts (the ones already written in the labels where they still add up). Running it again replaces the counts in either form; clear=True removes them.

Inputs: size, clear, color, staff, +4 more.

make_part_scoreMake Part ScoreA

Make a separate score containing only some parts (e.g. the drum kit) to build a chart in: saves the current score, writes a copy of its file without the other instruments (tempo, rehearsal marks, repeats and the title move to the kept staff), closes the original and opens the copy in its place (the plugin can only work in its own window). The original is saved and unchanged; if the copy can't be opened, the original is reopened. Works even when another instrument has a damaged bar. in_place=True instead removes the other instruments from the open score itself, without saving anything first (so a damaged bar in another instrument is never written again) and after backing up the full score (MusicXML export, plus a copy of its .mscz when it can be identified); it reports bars left that don't add up. Staff indices in the new score start again from 0.

Inputs: staves (required), in_place, score_path, output_path.

next_elementNext ElementB

Move cursor to the next element.

Inputs: no named parameters.

next_staffNext StaffB

Move cursor to the next staff.

Inputs: no named parameters.

number_bars_as_playedNumber Bars As PlayedA

Make the displayed bar numbers count repeated bars, as played: after a passage between repeat barlines played N times, the next bar's number jumps by (N - 1) x the passage length. Recomputes all bars (MuseScore's 'Add to measure number'), so it can be run again after changing repeats. exclude_from_count leaves bars out of the count, e.g. [1] for a silent pickup or intro bar. reset=True removes all offsets and exclusions instead (plain 1..N numbering). Voltas are not taken into account. Needs MuseScore 4.6+. Tools keep addressing bars by position.

Inputs: reset, exclude_from_count.

ping_musescorePing MusescoreA

Ping the MuseScore WebSocket API to check connection.

Inputs: no named parameters.

prepare_measure_repeatPrepare Measure RepeatA

Prepare measure-repeat signs: selects the measures that should become repeat signs, on the given staves, and returns what to click in MuseScore. The plugin API cannot place measure-repeat signs itself.

Inputs: start_measure (required), bars, last_staff, end_measure, +1 more.

prev_elementPrev ElementC

Move cursor to the previous element.

Inputs: no named parameters.

prev_staffPrev StaffB

Move cursor to the previous staff.

Inputs: no named parameters.

processSequenceProcesssequenceA

Run several score commands in order in a single call. Each item is {"action": , "params": {...}}, using the same camelCase action names and parameters as the plugin (e.g. "addNote" with pitch, duration, advanceCursorAfterAction). Allowed actions: getScore, addNote, addTie, addTiedNote, addRest, addTuplet, appendMeasure, deleteSelection, getCursorInfo, goToMeasure, nextElement, prevElement, nextStaff, prevStaff, selectCurrentMeasure, insertMeasure, goToFinalMeasure, goToBeginningOfScore, setTimeSignature, addLyrics, addInstrument, setStaffMute, setInstrumentSound, setTempo, selectMeasures, deleteMeasures, setRepeatBarlines, addVolta, colorRange, setStyle, addRehearsalMark, removeParts, addHighlight, addLabel, clearHighlights, highlightNotes, highlightMarkings, highlightSymbols, setMeasureNumbering, numberAsPlayed, addText, removeAnnotations, addArticulation, removeArticulations, ghostNotes, beamOverRests, addSectionCounts. Measure ranges use startMeasure/endMeasure (1-based, inclusive) and startStaff/endStaff (0-based, endStaff exclusive). Processing stops at the first invalid action.

Inputs: sequence (required).

remove_annotationsRemove AnnotationsA

Remove texts and marks from a range of bars, e.g. to redo part of a chart. kinds: 'texts' (add_text: cues, '*' marks, legends), 'labels' (boxed add_label texts), 'rehearsal_marks', 'tempo' (tempo markings, which also changes playback), 'voltas'. contains limits it to texts containing that string, e.g. '**'. Defaults to the whole score. Highlights and note colors are removed with clear_highlights / clear_color instead.

Inputs: exact, kinds, contains, last_staff, +3 more.

remove_articulationsRemove ArticulationsC

Remove articulations (by default the hi-hat symbols half_open, open, closed) from the chords that contain the chosen drums in a range of bars.

Inputs: drums, pitches, symbols, last_staff, +3 more.

restore_backupRestore BackupA

Bring back the version of the open score saved before an apply_measure_repeats edit (the newest backup by default) and reload it in MuseScore. The current version is backed up first.

Inputs: backup, score_path.

select_current_measureSelect Current MeasureC

Select the current measure.

Inputs: no named parameters.

select_custom_rangeSelect Custom RangeA

Select a custom range of ticks across staves. Useful for retrieving continuous phrasing that spans measure boundaries.

Inputs: end_tick (required), end_staff (required), start_tick (required), start_staff (required).

set_end_notesSet End NotesA

Print notes at the end of the score, in a text frame after the last bar: a bold heading and one line per item, e.g. a summary of how a chart differs from the original (what was collapsed, which differences were dropped, what stays written out). Replaces notes added before (the report's previous lists them), so it can be re-run; append=True keeps their lines and adds the new ones; no heading and no lines removes them. Edits the score file and reloads it (undo with restore_backup).

Inputs: lines (required), append, heading, score_path.

set_instrument_soundSet Instrument SoundC

Change the sound of an instrument on a staff.

Inputs: staff (required), instrument_id (required).

set_measure_numberSet Measure NumberA

Set the displayed number of one bar: add_to_number is MuseScore's 'Add to measure number' (the offset carries on to all later bars), exclude_from_count is 'Exclude from measure count'.

Inputs: measure (required), add_to_number, exclude_from_count.

set_repeat_barlinesSet Repeat BarlinesA

Put start and end repeat barlines around a range of measures, or remove them. Needs MuseScore 4.6 or newer; on older versions the measures are selected and the reply says which palette items to click.

Inputs: end_measure (required), start_measure (required), clear, play_count.

set_score_headerSet Score HeaderA

Tidy the title frame at the top of the score: title, subtitle, composer, lyricist and the part name shown top-left in part scores (a long part name such as 'Player | Kit | Drums' runs into the title). Leave a field out to keep it, pass an empty string to remove it. Edits the score file and reloads it (undo with restore_backup).

Inputs: title, composer, lyricist, subtitle, +2 more.

set_song_structureSet Song StructureA

Print the song structure as a table on a new page at the end of the score, after the end notes: the song and artist under the heading (taken from the title frame unless given), then one row per section with its bars (as played), groove and fills, and the total. Get the rows from song_structure and give grooves and fills musical names. Replaces a structure page added before; no rows removes it. Edits the score file and reloads it (undo with restore_backup).

Inputs: rows (required), song, artist, heading, +1 more.

set_staff_muteSet Staff MuteC

Mute or unmute a staff.

Inputs: mute (required), staff (required).

set_tempoSet TempoA

Set the tempo with a tempo marking (in quarter-note beats per minute) at the current cursor position, or at the start of the given measure.

Inputs: bpm (required), measure.

set_time_signatureSet Time SignatureC

Set the time signature.

Inputs: numerator, denominator.

show_scoreShow ScoreA
Read-only

Show the current score as rendered sheet music in an interactive viewer. Use it to check your edits visually. Tuplet brackets and ties are not drawn. Hosts without MCP Apps support only receive a short text summary; use get_score for the note data.

Inputs: last_measure, first_measure.

simplify_rollSimplify RollA

Rewrite a cymbal roll (a run of repeated or tied cymbal notes, e.g. a crash swell) as one long note per bar, tied across barlines, with a tremolo: the same sound with far fewer symbols. The roll starts on start_beat of start_measure (default beat 1; earlier notes in that bar stay as written) and ends at the end of end_measure, or after end_beat in it. Lengths that no single note value can hold are written as tied notes. Notes of the first chord that are not part of the roll (e.g. a kick) move to voice 2 with their own length. Refuses (changing nothing) if other notes or rests sit inside the roll or it doesn't start and end where notes do. Edits the score file and reloads it (undo with restore_backup).

Inputs: staff (required), end_measure (required), start_measure (required), drums, +5 more.

song_structureSong StructureA

Outline the song for a structure page: the sections (from the rehearsal marks) with how many bars each lasts as played (repeats counted), the grooves in it (bars that recur, named Groove A, B... with the drums they use; hi-hat openings, crashes and ghost notes don't make a new groove) and the fills (bars that don't recur). Each section's count is its length in fours as drummers count it (6 -> '4+2', 12 -> '3x4', bars before the first groove bar counted on their own: '2+4+2'); bars excluded from the bar count (a count-in) are left out. suggested_rows can go to set_song_structure as they are, but give the grooves and fills musical names first (e.g. 'Verse shuffle', 'Tom fill into chorus').

Inputs: staff, tolerance.

undoUndoC

Undo the last action.

Inputs: no named parameters.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 63 tools

    Disambiguation3/5

    The tools are grouped by clear domains, but several families overlap: annotation/text (add_text, add_label, add_rehearsal_mark, set_song_structure, set_end_notes), highlighting/clearing, and repeat/structure operations. processSequence also provides a batch alternative to many single-purpose tools, so an agent must read descriptions carefully to choose the right operation.

    Naming Consistency4/5

    Almost all tools use snake_case verb_noun names (add_note, delete_measures, highlight_bars, set_time_signature) with predictable prefixes. The main inconsistency is processSequence, which is camelCase and breaks the otherwise consistent convention.

    Tool Count1/5

    63 tools is far beyond the expected 3-15 range and even beyond the 25+ threshold, indicating an overgrown surface for a single MCP server. Many niche operations are useful, but the count makes the set hard to navigate and increases selection cost.

    Completeness4/5

    The surface covers an impressive breadth of score editing, navigation, annotation, repeat handling, structure analysis, and charting workflows. Some gaps remain for broader MuseScore work, such as explicit save/export, key signature/clef/dynamics/slur operations, and playback control, but core charting tasks are well covered.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers