Sheet Music OMR
Converts photos or scans of printed sheet music to MusicXML with optical music recognition
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
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>"
}
}
}
}
Variables d'environnement
OMR_AUDIVERIS_HOMEDirectory Audiveris is downloaded to on first use (default ~/.cache/omr-mcp/audiveris)
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
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
Questions fréquentes
Qu'est-ce que Sheet Music OMR ?
Converts photos or scans of printed sheet music to MusicXML with optical music recognition
Comment installer Sheet Music OMR ?
Il s'exécute sur votre machine. Dans Claude Code : claude mcp add sheet-music-omr -e 'OMR_AUDIVERIS_HOME=<OMR_AUDIVERIS_HOME>' -- uvx omr-mcp==0.2.2. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour Sheet Music OMR ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
Sheet Music OMR est-il open source ?
Oui. Son code est sur GitHub sous licence MIT.
Qui maintient Sheet Music OMR ?
Il est publié par raulkivi. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.