Skip to main content
Glama

musescore-mcp

A tool that wraps the MuseScore CLI as a Model Context Protocol (MCP) server, allowing Claude AI to directly convert, edit, and analyze music score files.


Purpose

Enables Claude AI (Claude Desktop, Claude Code, etc.) to handle MuseScore files (.mscz, .musicxml, MIDI, etc.) using natural language commands.

Features:

Category

Capabilities

Conversion & Export

Convert to PDF, PNG, MusicXML, MIDI, MP3, etc.; extract parts; export multi-page PNGs

Editing

Transpose by key or interval; instrument-specific transposition; change tempo; change time signature

Analysis

Score metadata (title, composer, time signature, key, measure count); list key signature changes; instrument and range analysis; harmony analysis (Roman numeral)

Advanced

Apply MuseScore style files (.mss); run QML plugins; create scores from MusicXML strings; MIDI → score conversion; auto-convert files in a watched folder


Requirements

  • Python 3.10 or higher

  • MuseScore 4 (or MuseScore 3) installed

    • Windows: musescore.org or Microsoft Store

    • If the installation path is not standard, specify the executable path in the MSCORE_PATH environment variable


Installation

1. Clone the repository

git clone https://github.com/strongbeen04/musescore-mcp.git
cd musescore-mcp

2. Create a virtual environment and install packages

python -m venv .venv

# Windows
.venv\Scripts\activate

# macOS / Linux
source .venv/bin/activate

# 기본 설치
pip install -e .

# 화성 분석 기능(music21) 포함 설치
pip install -e ".[harmony]"

3. Register the MCP server

Claude Desktop (Windows Store version)

Add to the %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json file:

{
  "mcpServers": {
    "musescore": {
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

Claude Desktop (Standard installation)

Add to the %APPDATA%\Claude\claude_desktop_config.json file:

{
  "mcpServers": {
    "musescore": {
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

Claude Code (CLI)

Add to the ~/.claude.json file:

{
  "mcpServers": {
    "musescore": {
      "type": "stdio",
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

For macOS / Linux, change command to .venv/bin/musescore-mcp.

After saving the settings, restart Claude to connect the musescore server.


Usage

Attach a score file or provide its path while chatting with Claude. Claude will call the MCP tools internally.

Usage Examples:

"이 mscz 파일을 PDF로 변환해줘."
"악보를 Bb 클라리넷 기준으로 이조해줘."
"이 악보의 조성과 마디 수를 알려줘."
"MusicXML을 mscz 파일로 만들어줘."

Available MCP Tools

Tool

Description

get_musescore_path

Check MuseScore executable path

convert_score

Convert single file format

batch_convert

Batch convert multiple files

export_parts

Extract individual parts

export_png_pages

Export multi-page PNGs

transpose_by_key

Transpose by key

transpose_by_interval

Transpose by interval

transpose_for_instrument

Transpose for specific instrument

change_tempo

Change tempo (BPM)

change_time_signature

Change time signature

get_score_info

Return basic score information

get_key_signature

List key signature changes

list_instruments

Instrument arrangement and range

update_metadata

Modify metadata such as title and composer

analyze_harmony

Analyze harmony progression (requires music21)

apply_style

Apply MuseScore style (.mss)

run_plugin

Run QML plugin

create_from_musicxml

Convert MusicXML string → mscz

midi_to_score

Convert MIDI → mscz

watch_folder

Auto-convert after folder monitoring


Purpose

musescore-mcp is an MCP (Model Context Protocol) server that wraps the MuseScore CLI, enabling Claude AI (Claude Desktop, Claude Code, etc.) to convert, edit, and analyze music score files through natural language commands.

Features:

Category

Capabilities

Conversion & Export

Convert to PDF, PNG, MusicXML, MIDI, MP3, and more; extract individual parts; export multi-page PNGs

Editing

Transpose by key or interval; instrument-specific transposition; change tempo and time signature

Analysis

Score metadata (title, composer, key, time signature, measure count); key signature changes; instrument ranges; harmony analysis with Roman numerals

Advanced

Apply MuseScore style files (.mss); run QML plugins; create scores from MusicXML strings; convert MIDI to score; auto-convert files in a watched folder


Requirements

  • Python 3.10 or higher

  • MuseScore 4 (or MuseScore 3) installed

    • Windows: musescore.org or Microsoft Store

    • If installed to a non-standard path, set the MSCORE_PATH environment variable to the executable path


Installation

1. Clone the repository

git clone https://github.com/strongbeen04/musescore-mcp.git
cd musescore-mcp

2. Create a virtual environment and install

python -m venv .venv

# Windows
.venv\Scripts\activate

# macOS / Linux
source .venv/bin/activate

# Base install
pip install -e .

# With harmony analysis support (music21)
pip install -e ".[harmony]"

3. Register the MCP server

Claude Desktop (Windows Store)

Edit %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "musescore": {
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

Claude Desktop (Standard install)

Edit %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "musescore": {
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

Claude Code (CLI)

Edit ~/.claude.json:

{
  "mcpServers": {
    "musescore": {
      "type": "stdio",
      "command": "C:\\path\\to\\musescore-mcp\\.venv\\Scripts\\musescore-mcp.exe"
    }
  }
}

On macOS / Linux, change command to .venv/bin/musescore-mcp.

Restart Claude after saving the config to connect the server.


Usage

Attach a score file in your Claude conversation or describe its path, and ask in natural language. Claude will call the appropriate MCP tools automatically.

Examples:

"Convert this mscz file to PDF."
"Transpose this score for Bb clarinet."
"What is the key and measure count of this score?"
"Create an mscz from this MusicXML."

Available MCP Tools

Tool

Description

get_musescore_path

Return the detected MuseScore executable path

convert_score

Convert a single score to another format

batch_convert

Convert multiple files in one call

export_parts

Export each instrument part as a separate file

export_png_pages

Export all pages as individual PNG images

transpose_by_key

Transpose to a target key

transpose_by_interval

Transpose by a specific interval

transpose_for_instrument

Rewrite transposition for a given instrument

change_tempo

Set a new tempo (BPM)

change_time_signature

Change the time signature

get_score_info

Return title, composer, key, time sig, tempo, parts, measure count

get_key_signature

List all key signature changes with measure numbers

list_instruments

Return instrument names, transpositions, and pitch ranges

update_metadata

Edit title, composer, lyricist, and copyright fields

analyze_harmony

Analyze chord progressions (requires music21)

apply_style

Apply a MuseScore style file (.mss)

run_plugin

Execute an installed MuseScore QML plugin

create_from_musicxml

Create an mscz from a MusicXML string

midi_to_score

Convert a MIDI file to mscz

watch_folder

Monitor a folder and auto-convert new .mscz files


License

MIT

Available Tools

20 tools
analyze_harmonyA

Analyze chord progressions and tonal center using music21.

Requires pip install music21.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz".

Returns: Dict with detected_key, confidence, and a list of chords [{offset, measure, chord, roman_numeral}, ...].

Inputs: score_b64 (required), input_suffix (required).

apply_styleB

Apply a MuseScore style file (.mss) to a score and re-export.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". style_b64: Base64-encoded .mss style file content.

Returns: Base64-encoded mscz with the style applied.

Inputs: score_b64 (required), input_suffix (required), style_b64 (required). Returns: result

batch_convertA

Convert multiple score files in a single MuseScore process using -j.

Each job dict must have:

  • in_b64 (str): base64-encoded input file

  • in_suffix (str): input extension, e.g. "mscz"

  • out_format (str): output format, e.g. "pdf"

Returns results in the same order as jobs.

Inputs: jobs (required). Returns: result

change_tempoB

Change the tempo by modifying MusicXML and elements.

Replaces all existing tempo markings in the score.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". bpm: New tempo in beats per minute (1–400). beat_unit: Beat unit for the metronome marking: quarter, half, eighth, whole.

Returns: Modified MusicXML as a UTF-8 string.

Inputs: score_b64 (required), input_suffix (required), bpm (required), beat_unit. Returns: result

change_time_signatureA

Change the time signature by modifying MusicXML elements.

Note: only the time signature element is changed — notes and beaming are not automatically adjusted.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". beats: Beats per measure (e.g. 3 for 3/4). beat_type: Note value of one beat (1, 2, 4, 8, 16, or 32).

Returns: Modified MusicXML as a UTF-8 string.

Inputs: score_b64 (required), input_suffix (required), beats (required), beat_type (required). Returns: result

convert_scoreA

Convert a score file to another format.

Args: score_b64: Base64-encoded content of the input file. input_suffix: Extension of the input file without dot, e.g. "mscz". output_format: Target format — pdf | musicxml | mid | mp3 | wav | flac | ogg | png | svg.

Returns: PNG (multi-page): {"format": "png", "pages": N, "data": [b64, ...]} Text formats (musicxml, svg): {"format": str, "data": str} Binary formats: {"format": str, "data": b64}

Inputs: score_b64 (required), input_suffix (required), output_format (required).

create_from_musicxmlA

Convert a MusicXML string into a MuseScore .mscz file.

Useful for creating MuseScore files from externally generated MusicXML.

Args: musicxml: MusicXML content as a UTF-8 string.

Returns: Base64-encoded mscz file.

Inputs: musicxml (required). Returns: result

export_partsA

Export each instrument part from a score as a separate file.

First converts to MusicXML to discover part names and count, then uses MuseScore's JSON job format to export each part by index.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". output_format: Format for each part output (pdf, musicxml, png, etc.).

Returns: List of {"part_index": int, "part_name": str, "format": str, "data": ...}.

Inputs: score_b64 (required), input_suffix (required), output_format. Returns: result

export_png_pagesA

Export each page of a score as a PNG image.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". dpi: Output resolution in dots per inch (1–2400, default 150). trim: If True, trim whitespace borders (0 px margin).

Returns: List of base64-encoded PNG strings, one per page, in order.

Inputs: score_b64 (required), input_suffix (required), dpi, trim. Returns: result

get_key_signatureA

Return all key signature changes in the score with their measure positions.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz".

Returns: List of {"measure": int, "key": str, "mode": str, "fifths": int}, ordered by measure number.

Inputs: score_b64 (required), input_suffix (required). Returns: result

get_musescore_pathA

Return the detected MuseScore executable path on this machine.

Inputs: no named parameters. Returns: result

get_score_infoA

Return basic metadata and structural info about a score.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz".

Returns: Dict with title, composer, initial key, time signature, tempo, part names, and measure count.

Inputs: score_b64 (required), input_suffix (required).

list_instrumentsA

Return instrument/part info including transposition and pitch range.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz".

Returns: List of dicts with part_index, name, abbreviation, is_transposing, transpose (chromatic/diatonic), range (lowest/highest MIDI note name).

Inputs: score_b64 (required), input_suffix (required). Returns: result

midi_to_scoreA

Convert a MIDI file to a MuseScore .mscz file.

Args: midi_b64: Base64-encoded MIDI (.mid) file content. quantization: Quantization resolution as a note value denominator (4=quarter, 8=eighth, 16=sixteenth, 32=thirty-second). Default is "16". midi_import_options_b64: Optional base64-encoded MIDI import options JSON file (MuseScore's -M flag format).

Returns: Base64-encoded mscz file.

Inputs: midi_b64 (required), quantization, midi_import_options_b64. Returns: result

run_pluginA

Run a MuseScore QML plugin on a score.

The plugin must already be installed in MuseScore's plugin directory. Plugins can perform score manipulations (e.g. note coloring, analysis).

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". plugin_name: Name of the plugin as registered in MuseScore (without .qml).

Returns: Base64-encoded mscz after plugin execution.

Inputs: score_b64 (required), input_suffix (required), plugin_name (required). Returns: result

transpose_by_intervalA

Transpose a score by a fixed number of semitones via the MuseScore CLI.

Requires MuseScore 3.3+ with --score-transpose support.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". semitones: Number of semitones to transpose (1–24). direction: "up" or "down".

Returns: Base64-encoded mscz of the transposed score.

Inputs: score_b64 (required), input_suffix (required), semitones (required), direction. Returns: result

transpose_by_keyA

Transpose a score to a target key using the MuseScore CLI.

Requires MuseScore 3.3+ with --score-transpose support.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". target_key: Target major key — C G D A E B F# C# F Bb Eb Ab Db Gb Cb. direction: "up", "down", or "closest" (default).

Returns: Base64-encoded mscz of the transposed score.

Inputs: score_b64 (required), input_suffix (required), target_key (required), direction. Returns: result

transpose_for_instrumentA

Adjust the transposition offset for a transposing instrument part.

Modifies the MusicXML element — useful for converting between transposing instruments (e.g. Bb clarinet ↔ concert pitch, alto sax → tenor sax).

Pass either instrument (shorthand) or explicit chromatic + diatonic. Known instruments: concert, bb_clarinet, bb_trumpet, bb_soprano_sax, bb_tenor_sax, eb_alto_sax, eb_baritone_sax, f_horn, a_clarinet.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". instrument: Instrument shorthand name (optional). chromatic: Semitone offset written→sounding (optional). diatonic: Diatonic step offset written→sounding (optional). part_index: Which part to affect (0-based). None = all parts.

Returns: Modified MusicXML as a UTF-8 string.

Inputs: score_b64 (required), input_suffix (required), instrument, chromatic, +2 more. Returns: result

update_metadataA

Update score metadata fields and return the modified MusicXML.

Only fields explicitly provided (non-None) are changed.

Args: score_b64: Base64-encoded score file. input_suffix: Input extension, e.g. "mscz". title: Work title. subtitle: Movement title / subtitle. composer: Composer name. lyricist: Lyricist name. copyright: Copyright / rights string.

Returns: Modified MusicXML as a UTF-8 string.

Inputs: score_b64 (required), input_suffix (required), title, subtitle, +3 more. Returns: result

watch_folderA

Watch a folder for new .mscz files and auto-convert them.

Monitors the folder for up to duration_seconds, converting any new .mscz files that appear into the requested output formats.

Args: folder_path: Absolute path to the folder to watch. output_formats: List of output formats, e.g. ["pdf", "musicxml"]. output_folder: Where to write converted files. Defaults to folder_path. duration_seconds: How long to watch (max 300s).

Returns: {"converted": [{"source": str, "outputs": [str, ...]}, ...], "errors": [{"source": str, "error": str}, ...]}

Inputs: folder_path (required), output_formats (required), output_folder, duration_seconds.

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 20 tools

    Disambiguation5/5

    Each tool targets a distinct operation (e.g., convert, export, transpose, analyze). Transposition tools are separated by interval, key, and instrument, and other potential overlaps like batch vs single convert are clearly differentiated. No two tools could be easily confused.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., convert_score, export_parts, get_score_info). Even compound names like batch_convert and transpose_by_interval maintain the pattern. No mixing of styles.

    Tool Count5/5

    With 20 tools, the server covers a broad range of functionality (conversion, analysis, transposition, metadata, etc.) without being bloated. Each tool serves a clear purpose, and the count is well-scoped for a music notation MCP server.

    Completeness4/5

    The tool set covers most core operations like conversion, metadata editing, transposition, and harmony analysis. Minor gaps exist (e.g., direct note editing, measure manipulation), but these are reasonable given the CLI-based approach and the server's intended scope.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    • ScanSing reads printed sheet music. Give Claude a PDF or a photo of a score and it gets back MusicXML, the format MuseScore, Sibelius, Finale and Dorico open. It is the recogniser inside the ScanSing app for choir singers, offered as a connector. Once a score is recognised, Claude can answer questions about it without recognising it again: - what the key, time signature, tempo and length are, and each part's range, clefs and lyrics; - one voice on its own, for example just the alto line of a choir piece; - the score or a part moved to another key, with notes respelled for the new key signature; - a MIDI file, one track per part, to listen to or rehearse with; - a short-lived download link to open the result in a browser or notation app. It handles PDFs up to 40 pages and PNG, JPEG, HEIC, TIFF and WebP images, can recognise selected pages of a long PDF, and can split a songbook into one MusicXML per piece. A file can be given as a web link or a small image; in Claude Code, a file on your computer is sent through a one-time upload link. Recognition spends pages from your ScanSing plan, so it is the only tool that is not read-only. Everything else works on the stored result and is free. The first connection with a new email comes with 20 free pages; paid plans start at $9 a month for 300 pages. Scores and results are deleted about an hour after recognition and are never used for training.

      https://mcp.scansing.app/mcp
    • 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

      https://mcp.scorestarling.com/mcp
    • Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.

      https://www.lacuna.fm/mcp
    • Convert MusicXML, MIDI, ABC, MEI and Humdrum, print sheet music, and verify every note survived.

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables musical analysis of MIDI and musicXML files using music21, providing tools for key detection, harmony, melody, rhythm, form analysis, counterpoint checking, and motif extraction.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude to compose real music from chord-symbol descriptions into MIDI files and audio previews, with musicology cross-checks on every chord.
      1
      AGPL 3.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables Claude Desktop to drive FL Studio 2025 and 2026 through natural language, diagnosing and repairing mixes, configuring plugins, writing notes and chords in any scale, exporting arrangements to MIDI, and analyzing audio for tempo, key, and melody.
      MIT