MuseScore MCP Server
MuseScore MCP Server lets an AI client control MuseScore over WebSocket to read, edit, analyse, format and restructure scores.
Compose and edit music: add notes, chords, ties, rests, tuplets and lyrics; set tempo, time signatures, instruments and staff mute/sound.
Navigate and read scores: move the cursor, select measures/ranges, and read the score in paged LilyPond or JSON, optionally per staff.
Manage measures: insert, append, delete and undo measure changes.
Find and apply repeats: detect repeated passages, add repeat barlines, voltas, measure-repeat signs and collapse repeated runs into play counts.
Build drum charts: map grooves, fills and sections, simplify cymbal rolls, handle ghost notes, beam over rests and add articulations.
Format and annotate: color ranges, highlight bars/notes/symbols/markings, add labels, rehearsal marks, free text and section bar counts.
Control bar numbering: number bars as played, exclude bars, set individual measure-number offsets.
Prepare chart documents: create part-only scores, tidy the title frame, print end notes and a song-structure page.
Batch operations: run multiple score commands in one
processSequencecall.View and recover: display rendered score in an interactive viewer and restore backups after file-level edits.
Supports MIDI pitch input for note creation, with reference values for various notes and scales to facilitate music composition.
Provides programmatic control over MuseScore through a WebSocket plugin, allowing composition of music, adding lyrics, navigating scores, and controlling MuseScore directly.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MuseScore MCP Server add a quarter note C followed by a half note G to the current measure"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.

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
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 syncInstall the MuseScore plugin: copy
musescore-mcp-websocket.qmlinto your MuseScore plugins folder (usually~/Documents/MuseScore4/Plugins), then enable MuseScore API Server under Plugins → Plugin Manager.Register the server with Claude Desktop (run this in the repository folder):
uv run fastmcp install claude-desktop server.py --name musescore --project .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:
Songsterr → Guitar Pro. Open the song on Songsterr and export it as a Guitar Pro file (
.gp,.gp5…).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.
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.Start the plugin: Plugins → MuseScore API Server.
Call the skill. In Claude Desktop, ask "make a drum chart from the open score".
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.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.
Export to PDF: save (Ctrl+S), then File → Export → PDF.
Documentation
Page | What's in it |
Prerequisites, installing the plugin, registering the server with Claude Desktop (with | |
Reading and navigating the score, notes, measures, tempo, instruments, highlighting and coloring, batch operations, the score viewer, version requirements, examples | |
Compressing a score with repeats, drum-chart tools, measure-repeat signs and how they are written, drum notation, chart examples | |
The bundled skills and how to install them in Claude Desktop or Claude Code | |
Tests, the mock plugin, running the real plugin headless, console output, file structure | |
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 coverageBefore 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 checkandmake testrun 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 addand commituv.lock; the commit hook regeneratesrequirements.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 toolsadd_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 ScoreARead-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
Scored across 63 tools
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.
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.
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.
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
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
ScoreStarling is an all-in-one AI sheet music assistant. Ask for anything to do with sheet music: transcribe a song from audio, video or a link, read a PDF or photo, add chords, change the key, make it easier, turn it into guitar TAB or jianpu, or arrange it for another instrument. Every change lands on a real score you can hear, fix and download (PDF, MIDI, MusicXML, guitar TAB, jianpu, audio). Hosted remote server with OAuth sign-in. Free accounts get monthly credits and free previews; prices are at scorestarling.com/pricing. Setup: https://scorestarling.com/mcp
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
A Model Context Protocol server for Wix AI tools
Related MCP Servers
- AlicenseCqualityDmaintenanceA Model Context Protocol server that enables real-time interaction with Ableton Live, allowing AI assistants to control song creation, track management, clip operations, and audio recording workflows.23133 npm94MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI assistants like Claude to generate lyrics, songs, and background music through Mureka's APIs.73 PyPI123MIT
- AlicenseBqualityBmaintenanceA Model Context Protocol server that enables AI agents to create fully mixed and mastered tracks in REAPER DAW, supporting project management, MIDI composition, audio recording, and mixing automation.61185MIT
- AlicenseAqualityBmaintenanceAI-powered music notation server that lets you create and edit scores using natural language, integrating with MuseScore for live manipulation.2349 PyPI32MIT