Server data from the Official MCP Registry
Music-aware, multi-level comparison of two MusicXML files
About
Music-aware, multi-level comparison of two MusicXML files
Security Report
12 tools verified · Open access · No issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Remote servers are capped at 8.0 because source code is not available for review. The score reflects endpoint verification only.
How to Install
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-raulkivi-comparer-mcp": {
"args": [
"comparer-mcp"
],
"command": "uvx"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
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 CodeQL, a Claude security review and unicode-smuggling-guard, which blocks hidden Unicode in code, docs and agent files.
- 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
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Fetch
Freeby Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
Worldmonitor
Freeby Koala73 · Developer Tools
Live markets, conflicts, country risk, chokepoints, energy, and China decision signals. 86 tools.
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
mcp-creator-python
Freeby mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
