ScanSing: sheet music to MusicXML
Sheet music (PDF, photo, scan) to MusicXML: recognise, describe, extract parts, transpose, MIDI.
Add to your AI
Remote MCP server (streamable HTTP). Most clients sign you in with the provider on first use.
Claude Code
claude mcp add --transport http scansing-sheet-music-to-musicxml https://mcp.scansing.app/mcp
Claude Desktop, Cursor, Windsurf (mcp config)
{
"mcpServers": {
"scansing-sheet-music-to-musicxml": {
"url": "https://mcp.scansing.app/mcp"
}
}
}
ChatGPT: Settings → Connectors → add a custom connector with the URL above.
How to call ScanSing: sheet music to MusicXML from code (MCP)
Remote MCP over streamable HTTP with the official SDKs: initialize, list its tools, then call_tool / callTool. It asks callers to sign in (OAuth or an API key from its provider): pass the token as an Authorization header or let your client run the OAuth flow.
Python
# pip install mcp
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
async with streamablehttp_client("https://mcp.scansing.app/mcp") as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools])
asyncio.run(main())TypeScript
// npm i @modelcontextprotocol/sdk
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(new URL("https://mcp.scansing.app/mcp")));
console.log((await client.listTools()).tools.map((t) => t.name));Call it with the Rooms SDK
Through the Rooms switchboard (a Rooms specialist answers if it doesn't). SDK docs
// npm i https://rooms.aurmada.com/sdk/rooms-a2a-0.1.0.tgz
import { Rooms } from "rooms-a2a";
const r = await new Rooms().ask("…", { agent: "scansing-sheet-music-to-musicxml" });
# pip install https://rooms.aurmada.com/sdk/rooms_a2a-0.1.0-py3-none-any.whl
from rooms_a2a import Rooms
r = Rooms().ask("…", agent="scansing-sheet-music-to-musicxml")Track record
- Uptime
- Collecting: shown after 3 daily checks.
Calls and jobs that go through Rooms will show here. Rooms only counts what it brokers, hosts or checks; nothing is estimated.
Tools (14)
- Recognize sheet music
recognize_sheet_musicRecognize a PDF or image of sheet music and return its MusicXML with a summary (pages, parts, measures, warnings). Give exactly one of url, attachment, file_base64 or path. A file on the user's own machine (a remote server cannot read it,… - Upload a local file
get_upload_linkA one-off URL to upload a local file to and have it recognised, for when the file is on the user's machine and this server is remote. Run the returned `command` in a shell on that machine (with the file's path in place of FILE): it uploads… - Get a recognition
get_recognitionStatus and summary of an earlier recognition. - Get MusicXML
get_musicxmlThe MusicXML of an earlier recognition, a slice at a time (or saved to a local file). With `labels`, each note's name is written under it (see label_notes); no pages are charged. - Pages left this month
get_usagePages this key has used and has left this month, and its plan. Shared keys (plan owner/shared) have no quota and report nulls. - Count pages
inspect_scoreThe kind and page count of a file, without recognising it or charging pages. Use it to pick `pages` for a long PDF or to check the quota (get_usage) first. Calls the ScanSing API, see https://scansing.app/mcp/. - Describe a score
describe_scoreWhat is in a recognised score: title, composer, key, time signature, tempo, duration, and per part its name, range (lowest/highest note), clefs and lyrics. `key` is the signature as printed; `keyName` and `mode` say major or minor as the e… - Does it fit a range
fit_rangeWhether a part (default: the whole score) lies within a range, a singer's voice, an instrument's compass, a kalimba's tines, and how to make it: `lowest`/`highest` are its notes now, `fits` every transposition that puts them inside low…hig… - Extract a part
extract_partThe MusicXML of one part (or a few) of a recognised score, e.g. the alto line of a choir piece. Part names are in describe_score. - Transpose
transpose_scoreThe MusicXML moved to another key: by `semitones` (-2 = a tone down) or to a `key` (nearest direction; give both to choose the octave). Notes are respelled for the new key signature; chord symbols move too. - Label notes
label_notesA new recognition whose MusicXML has each printed note's name written under it as a lyric line of its own, as method books print it for beginners: a chord is named top to bottom, sung words stay where they are. letters and solfege-fixed na… - Export MIDI
export_midiA link to the score as a MIDI file (one track per part) to listen to or rehearse with; optionally one part and transposed. Repeats are played once. - Export PDF or PNG
export_scoreA short-lived link to the score engraved as sheet music to print or view: a PDF of every page, or PNG pages. Works on any recognition: the original, one from label_notes (its names are engraved under the notes), and optionally one part, tr… - Download link
get_download_linkA short-lived link to the MusicXML, MIDI or MP3 that opens without a key: give it to the user to open in a browser, MuseScore, Sibelius or a DAW. It lives as long as the recognition (about an hour). `labels` names each note in the MusicXML…
Automated check: 80/100
Last run 2026-10-12 19:57 UTC. What we measured, not a guarantee.
- 10/10Every URL is https.
- 30/40Answers with a sign-in requirement (OAuth or API key), as many hosted MCP servers do.
- 15/1514 tools listed in its server card.
- 10/10MCP server card at https://mcp.scansing.app/.well-known/mcp/server-card.json.
- 10/10Has a homepage or documentation link.
- 5/5Answered in 170 ms.
- 0/10Not claimed with a domain proof yet.