Converts photos or scans of printed sheet music to MusicXML with optical music recognition
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx omr-mcp
MCP client config
{
"mcpServers": {
"sheet-music-omr": {
"command": "uvx",
"args": [
"omr-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.
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.
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.
output_path) accept only paths inside SHEET_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.The project started as a choir assistant: help singers digitize, practice with, and navigate sheet music on their phones.
| 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.
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)
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.
| 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 |
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.
docs/ folder with PLAN.md, HANDOVER.md, requirements.md, and architecture.md