Search MuseScore sheet music and read score metadata via MCP. Triggers on phrases like "find sheet music for", "search MuseScore for", "is there a free arrangement of", "what's the license on this MuseScore score", "how many pages is", or any request involving MuseScore scores, arrangements, or sheet-music metadata. Requires musescore-mcp installed and the fetchproxy extension active with a signed-in musescore.com tab (see Setup).
浏览器
musescore-fpx
试用Query musescore.com (sheet music search, score/license metadata, official download links) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the musescore-mcp server — one-shot HTTP calls through a signed-in browser tab. Use when you want MuseScore data without the MCP, in a script, or on a machine where the MCP isn't installed.
它能做什么
Query musescore.com (sheet music search, score/license metadata, official download links) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the musescore-mcp server — one-shot HTTP calls through a signed-in browser tab. Use when you want MuseScore data without the MCP, in a script, or on a machine where the MCP isn't installed.
技能文档
MuseScore via fpx (no MCP)
musescore.com has no public API (the old one was shut down) and sits
behind a Cloudflare managed challenge ("Just a moment…") that 403s any plain
curl/Node request. fpx routes the request through the user's own
signed-in browser tab (the Transporter extension), which has already cleared
the challenge, so the same page loads that a browser would get. No MuseScore
login is required for search/metadata — just a normal open tab.
This is the same data the musescore_search / musescore_get_score /
musescore_download MCP tools return, reached with one CLI call instead of a
running server.
One-time setup
npm install -g @fetchproxy/cli # provides `fpx`
fpx profile add musescore --domain musescore.com
fpx pair -p musescore # prints a pair code → approve in Transporter
Requirements: the Transporter browser extension installed, with an open
musescore.com tab (apex host — no www) that has cleared the Cloudflare
challenge, and its Chrome Site access allowing musescore.com. Pairing
persists — after the first approval every later fpx call reuses it.
Core call — and the JSON-store extraction it needs
Every page is a plain GET, HTML in, HTML out:
fpx get 'https://musescore.com/sheetmusic?text=zelda&recording_type=free-download' -p musescore \
> /tmp/search.html
The fetched HTML has no result cards — MuseScore hydrates the DOM
client-side. The real data is an HTML-entity-encoded JSON store embedded
in the markup (MuseScore's analogue of a Next.js __NEXT_DATA__ blob). jq
alone can't read it — decode the entities and bracket-match the array/object
you want first. references/extract-store.js is a small, dependency-free
Node script that does exactly that (mirrors src/store.ts's
recoverJson/findArrayByKey/findEnclosingObject); pipe the saved HTML
through it, then jq:
node references/extract-store.js scores < /tmp/search.html | jq '.[] | {id, title, composer_name}'
Ready-to-run URL patterns (search, score detail, static render assets) and
their jq projections are in references/endpoints.md.
The one rule: search returns ids, detail needs both ids
A score's canonical path is /user//scores/ — search cards
carry id (score id) and user.id (uploader id), so resolve those from a
search hit before fetching the detail/download page:
node references/extract-store.js scores < /tmp/search.html \
| jq -r '.[0] | "\(.user.id)\t\(.id)\t\(.title)"'
# 12345 67890 Zelda Theme (arr.)
Downloads: fpx can only RESOLVE the URL, never fetch the bytes
The score-detail store's type_download_list array carries the official
download link (musescore.com/score/download/index?score_id=…&type=…&h=…).
That endpoint is Cloudflare-walled AND 302-redirects cross-origin to a
presigned S3 URL. A browser-tab fetch() (what fpx get/request does) hits
the bot wall on that endpoint and, even if it didn't, can't read an opaque
cross-origin redirect. The MCP works around this with a download bridge
capability (chrome.downloads.download, which issues the request from the
browser's own network stack) — fpx has no equivalent verb, so from the
shell you can only resolve the URL, not save the file. Print it and open it
yourself in the signed-in tab:
node references/extract-store.js type_download_list < /tmp/score.html \
| jq -r '.[] | select(.type=="pdf") | .url'
Entitlement to check before trusting that link will actually download:
is_free === true OR hasAccess === true (see references/endpoints.md).
Exit codes (fpx verbs)
0— success.2— bridge unavailable: extension not connected or pairing pending → runfpx pair -p musescore, confirm a musescore.com tab is open.3— bot wall: the tab hasn't cleared Cloudflare → open/refresh amusescore.comtab and retry.4— upstream non-2xx from MuseScore.
Notes
- Anonymous reads only — search, score metadata, and download-URL resolution need no MuseScore account. Stay within musescore.com's terms; never automate a purchase.
fpx health -p musescoreshows bridge connection state when a call fails.- The rendered page-1 SVG/PNG assets (
musescore.com/static/musescore/scoredata/g//score_0.svg|png@0) are session + Referer-gated — they only work fetched viafpx(through the tab), never a plaincurl. Seereferences/endpoints.md. - This project is developed and maintained by AI (Claude).
相关技能
Search MuseScore sheet music and read score metadata via MCP. Triggers on phrases like "find sheet music for", "search MuseScore for", "is there a free arran...
Search and browse the MusicBrainz music encyclopedia (artists, releases, recordings, labels, works), fetch Cover Art Archive images, resolve musicbrainz.org URLs, and — with OAuth configured — submit your own tags, ratings, and collection edits. Use when the user asks about music metadata, discographies, album/artist/recording details, MBIDs, cover art, or wants to tag/rate music on MusicBrainz.
Verify score facts, then generate and review two-hand fingering
Query and update setlist.fm from a shell without running the setlist-mcp server — search/read concert setlists, artists, venues, cities, and users via plain curl against the public REST API (an x-api-key header), and toggle "I was there" attendance on a setlist via the authenticated website, using an fpx-captured session cookie. Use when you want setlist.fm data or want to mark/unmark attendance without the MCP, in a script, or on a machine where the MCP isn't installed.
Query compass.com (US real-estate portal) from a shell with the fpx CLI (@fetchproxy/cli) instead of running the compass-mcp server — search listings, get property/agent detail, price history, and resolve street addresses through one-shot fetches over a signed-in browser tab. Use when you want Compass data without the MCP, in a script, or on a machine where the MCP isn't installed.