Sheet Music OMR
Converts photos or scans of printed sheet music to MusicXML with optical music recognition
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
omr-mcpclaude mcp add sheet-music-omr -e 'OMR_AUDIVERIS_HOME=<OMR_AUDIVERIS_HOME>' -- uvx omr-mcp==0.2.2
{
"mcpServers": {
"sheet-music-omr": {
"command": "uvx",
"args": [
"omr-mcp==0.2.2"
],
"env": {
"OMR_AUDIVERIS_HOME": "<OMR_AUDIVERIS_HOME>"
}
}
}
}
Environment variables
OMR_AUDIVERIS_HOMEDirectory Audiveris is downloaded to on first use (default ~/.cache/omr-mcp/audiveris)
Documentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
sheet-music-mcp
Six MCP servers that let an AI assistant work with sheet music: read a photo of a score, render it, play single voice parts, edit it as text, compare editions and follow a singer in real time. Built for choir rehearsal.
"Here is a photo of page 1. Convert it to MusicXML and play me the alto part at 80% tempo."
The assistant calls omr-mcp to recognise the page, then synth-mcp to render the alto line to a WAV file.
Servers
Each server is a separate PyPI package, listed in the MCP Registry as io.github.raulkivi/<server>.
| Server | What it does | Run | Needs |
|---|---|---|---|
| omr-mcp | Photo or scan of printed sheet music → MusicXML (oemer, or Audiveris for SATB scores) | uvx omr-mcp | ~100 MB model download on first use |
| render-mcp | MusicXML → PDF, PNG or SVG | uvx render-mcp | Cairo (libcairo2) |
| synth-mcp | MusicXML → WAV, selected voice parts, adjustable tempo | uvx synth-mcp | FluidSynth, an SF2 soundfont |
| musicxml-abc-mcp | MusicXML ↔ ABC notation, so the model can read and edit the score as text | uvx musicxml-abc-mcp | |
| pitch-mcp | Follows a singer through a score from the microphone; reports position and pitch accuracy | uvx pitch-mcp | Python 3.12+, PortAudio, a microphone |
| comparer-mcp | Music-aware diff of two MusicXML files: editions, arrangements, OMR output against a reference | uvx comparer-mcp |
All servers use stdio and need Python 3.11+ (3.12+ for pitch-mcp) and uv.
Quick start
Add the servers you need to your MCP client configuration (claude_desktop_config.json, Cursor's mcp.json and similar):
{
"mcpServers": {
"omr": { "command": "uvx", "args": ["omr-mcp"] },
"render": { "command": "uvx", "args": ["render-mcp"] },
"synth": {
"command": "uvx",
"args": ["synth-mcp"],
"env": { "SYNTH_SOUNDFONT_PATH": "/path/to/soundfont.sf2" }
}
}
}
Claude Code:
claude mcp add omr -- uvx omr-mcp
Each server's SETUP.md walks through installation for non-developers, and examples/ has ready-made configs for Claude Desktop, Cursor, Windsurf, Continue and Zed. Every server has a health_check tool that reports missing system libraries or files.
Security
- PyPI releases use Trusted Publishing from GitHub Actions and carry PEP 740 attestations; no API tokens are stored.
- Workflow actions are pinned to commit SHAs; Dependabot keeps them and the Python dependencies current.
- Pull requests run a Claude security review and unicode-smuggling-guard, which blocks hidden Unicode in code, docs and agent files.
- Tools that write files (
output_path) accept only paths insideSHEET_MUSIC_OUTPUT_ROOT(default: the server working directory), with the expected file extension, and never overwrite an existing file. The omr-mcp Audiveris download is verified against a pinned SHA-256. - Secret scanning and push protection are on.
- Report vulnerabilities privately: see SECURITY.md.
Background
The project started as a choir assistant: help singers digitize, practice with, and navigate sheet music on their phones.
Goals
- Digitize paper sheet music (photograph → digital score)
- Export sheet music as a PDF
- Play sheet music in individual voices (Soprano, Alto, Tenor, Bass) or combined
- Show the current position in the score while singing (tempo tracking)
- Show pitch accuracy in real time (too high / too low / on pitch)
- Identify where in a score a singer currently is based on a hummed or sung melody
- Compare two scores (editions, arrangements, OMR output vs. reference) and report structured diffs
Delivery phases
| Phase | Description | Status |
|---|---|---|
| Phase 1 — MCP servers | Six independent MCP servers, each covering one capability | ✅ All six released on PyPI; see known limitation below |
| Phase 2 — Web PoC | Web app orchestrating the MCP servers for full UX validation | Planned |
| Phase 3 — Android app | Native Kotlin app for rehearsal use on phones | Planned |
Known limitation: omr-mcp's default engine (oemer) flattens multi-staff SATB scores into one part. Pass engine="audiveris" for choir scores; it needs 300+ DPI images.
Data flow
Paper score
│ (photo)
▼
[omr-mcp]
│ MusicXML
├──────────────────────────► [render-mcp] ──► PDF / PNG (goal 2)
│
├──────────────────────────► [synth-mcp] (goal 3)
│ │ voice selection + tempo
│ ▼
│ Audio file
│
├──────────────────────────► [musicxml-abc-mcp]
│ │ ABC text
│ ▼
│ Claude (reads / edits)
│ │ ABC text (edited)
│ ▼
│ [musicxml-abc-mcp]
│ │ MusicXML (AI-edited)
│ ▼
│ (back into pipeline)
│
├──────────────────────────► [pitch-mcp]
│ │ loads reference score
│ ▲ microphone audio stream
│ │
│ score position + pitch accuracy (goals 4, 5, 6)
│
└──────────────────────────► [comparer-mcp] (also compares against any MusicXML)
│ reference score
▲ second MusicXML (edition / arrangement / OMR output)
│
structured diff (goal 7)
Why ABC notation?
ABC is a compact, text-based music notation format that LLMs can read and edit directly (unlike the
verbose XML of MusicXML). The musicxml-abc-mcp server enables AI-assisted score editing:
MusicXML → ABC → Claude edits → ABC → MusicXML.
Technology stack
| Layer | Choice | Rationale |
|---|---|---|
| Language | Python 3.11+ (3.12+ for pitch-mcp) | Best library ecosystem for music, audio, and ML |
| Package manager | uv | Fast, reproducible builds |
| MCP framework | mcp Python SDK 2.x | Official SDK; stdio transport for local deployment |
| OMR | oemer on ONNX Runtime; Audiveris (opt-in) | Sheet music recognition; Audiveris keeps SATB parts apart |
| Rendering | Verovio + cairosvg + pypdf | No external CLI dependency |
| Synthesis | pyfluidsynth + music21 | In-process, no subprocess |
| Pitch detection | librosa pYIN + sounddevice | Pure Python, excellent for singing voice |
| Comparison | music21 | Structural / musical diffing of scores |
| Testing | pytest + pytest-asyncio | Standard async-capable testing |
Development
Each server has its own virtual environment managed by uv. Never share venvs between servers, and use uv sync / uv add rather than pip install.
cd synth-mcp
uv sync --extra dev
uv run pytest -m "not integration" # what CI runs, on Python 3.12 and 3.13
uv run pytest -m integration # needs the real OMR/audio backends
System libraries for local development:
| Library | Package (Debian/Ubuntu) | Used by |
|---|---|---|
| FluidSynth | libfluidsynth3 | synth-mcp |
| Cairo | libcairo2 | render-mcp |
| PortAudio | libportaudio2 | pitch-mcp |
Free SF2 soundfonts are listed in synth-mcp/README.md.
Releases: bump the version in pyproject.toml, __init__.py, uv.lock and server.json, then push a <server>/vX.Y.Z tag. publish.yml publishes to PyPI and the MCP Registry.
Documentation
- docs/conventions.md — coding and structural conventions shared across all servers
- docs/sources.md — references and sources
- docs/SETUP_UX_PLAN.md — end-user packaging plan (PyPI, installers, setup docs)
- Each server has its own
docs/folder withPLAN.md,HANDOVER.md,requirements.md, andarchitecture.md
License
Frequently asked questions
What is Sheet Music OMR?
Converts photos or scans of printed sheet music to MusicXML with optical music recognition
How do I install Sheet Music OMR?
It runs on your machine. In Claude Code: claude mcp add sheet-music-omr -e 'OMR_AUDIVERIS_HOME=<OMR_AUDIVERIS_HOME>' -- uvx omr-mcp==0.2.2. For other clients, paste the JSON configuration from this page into their MCP settings.
Does Sheet Music OMR need an API key?
Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.
Is Sheet Music OMR open source?
Yes. Its code is on GitHub under the MIT license.
Who maintains Sheet Music OMR?
It is published by raulkivi. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.