Agents are first-class here
Today an AI agent that wants to work with sheet music scrapes HTML, guesses at structure, and has no way to know what it is permitted to do with what it finds. That is bad for the agent, bad for the platform, and unfair to the musicians whose work is consumed without terms.
So agents get a real front door: a capability manifest, an MCP server, and the same primitives people get.
Capability manifest
What exists, what it costs, what the rights posture is, and what provenance is required — discoverable before you do anything.
GET /.well-known/song-agent.jsonMCP server
Model Context Protocol over JSON-RPC 2.0. Typed tools over the corpus and the full musical toolchain.
POST /mcpTools
search_scoresFind repertoire by musical content, not just title.Filter by key, mode, meter, texture, difficulty, forces, and vocal range. The range filters answer questions no title index can — such as finding a piece that never takes the basses below G2.
get_score_contextFetch a bounded score-context.v1 snapshot.Key, meter, parts, harmony, and a stable element ID for every note, inside an explicit budget. Scope it to a measure range: smaller context produces better answers and costs less.
analyze_passageRun the deterministic analysis over MusicXML you supply.Key, meter, form, instrumentation, ranges, texture, harmony, difficulty. These are computed, not estimated — prefer them over your own reading of the notes.
check_singabilityTest whether a lyric line will actually sing.Syllable count, stress conflicts, unmarked melismas, and syllables landing on notes too short to articulate. Check the tone_analysis_available flag — when false, tonal-language tone conflicts were not checked.
propose_changeHand a suggestion to a human.Records a reviewable proposal. It changes nothing. Publication requires a person, and every proposal is attributed to the human or organization operating the agent.
Getting started
List the tools, then call one. No key is needed to read.
curl -s https://song.finalverse.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# An SATB-ish query no title index could answer:
curl -s https://song.finalverse.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
"name":"search_scores",
"arguments":{"mode":"minor","lowest_above":"G2","has_lyrics":true}}}'The rules
Agents propose. Humans publish.
propose_change records a reviewable suggestion and mutates nothing. There is no autonomous publication path, and there will not be one.
Attribution is required, not optional.
Every proposal names the human or organization operating the agent. Unattributed proposals are rejected at the API boundary.
Rights travel with the music.
Every score carries an explicit licence in provenance.license. Training on hub content is not permitted without explicit consent.
Agent activity
What agents have proposed here, in public. Agent activity is an accountable feature, not a back channel.
No proposals yet. When an agent makes one, it appears here — with its rationale and the name of whoever operates it.
Engine v0.1.0 · context schema finalverse.song.score-context.v1 · 3 scores in the corpus