Royalty Lock MCP connector
A ten minute guide for reviewers: connect, authorize, and verify with real data.
1. What Royalty Lock is
Royalty Lock is a royalty registration and catalog management platform for independent songwriters, built by Focus Music University. It prepares registrations for The MLC, SoundExchange, the PROs, Luminate, Mediabase, and the US Copyright Office. It never logs into an artist's accounts and never touches their money.
2. Endpoints
MCP endpoint (Streamable HTTP, JSON-RPC 2.0)
POST https://royaltylock.io/mcp
Protected resource metadata (RFC 9728)
GET https://royaltylock.io/.well-known/oauth-protected-resource
Authorization server metadata (RFC 8414)
GET https://cotwilckospymcxvpyuf.supabase.co/auth/v1/.well-known/oauth-authorization-serverAn unauthenticated POST to /mcp returns 401 with a WWW-Authenticate header pointing at the protected resource metadata, which names the authorization server above. Dynamic client registration and the authorization code flow with PKCE are both supported there.
3. Connect in Claude
- Open Claude Settings.
- Go to Connectors.
- Choose Add custom connector.
- Paste https://royaltylock.io/mcp
- Complete the OAuth sign in with the reviewer account in section 5.
4. Tools
| Tool | What it does | Read only |
|---|---|---|
| list_works | Every single in the account with title, status, ISRC, and ISWC. | Yes |
| get_work | One single: full metadata, writers and splits, recording codes, registration rows. | Yes |
| create_work | Create a single with writers and splits. Writer shares must total 100. | No |
| get_registration_status | Per registry state and timestamps for one single. | Yes |
| list_registrations | Registration rows across the catalog, filterable by single or status. | Yes |
list_works, response
{
"works": [
{
"id": "4608d4e2-94ce-49eb-8bdc-e6133d112eac",
"title": "Night Drive",
"status": "active",
"isrc": "QZTAA2500001",
"iswc": "T-123.456.789-0",
"duration_seconds": 201,
"publishing_path": "self_published",
"updated_at": "2026-09-09T05:47:42.779Z"
}
]
}get_work, arguments and response
{ "name": "get_work", "arguments": { "work_id": "4608d4e2-94ce-49eb-8bdc-e6133d112eac" } }{
"work": { "id": "4608d4e2-...", "title": "Night Drive", "iswc": "T-123.456.789-0" },
"writers": [
{ "legal_name": "Ava Reyes", "pro": "BMI", "writer_share": 60, "publisher_name": "Reyes Songs" },
{ "legal_name": "Marcus Hale", "pro": "ASCAP", "writer_share": 40, "publisher_name": "Hale Publishing" }
],
"recording": { "isrc": "QZTAA2500001", "upc": "196922000011", "distributor": "DistroKid" },
"registrations": [ { "org": "mlc", "status": "locked_in", "submitted_at": "2026-09-08T01:47:42Z" } ]
}create_work, arguments
{
"name": "create_work",
"arguments": {
"title": "New Single",
"publishing_path": "self_published",
"writers": [
{ "legal_name": "Ava Reyes", "pro": "BMI", "writer_share": 60 },
{ "legal_name": "Marcus Hale", "pro": "ASCAP", "writer_share": 40 }
]
}
}If the writer shares do not add up to 100, the call returns an error result saying what they add up to. Nothing is written.
get_registration_status, response
{
"work_id": "4608d4e2-94ce-49eb-8bdc-e6133d112eac",
"title": "Night Drive",
"registries": [
{ "org": "mlc", "registry": "The MLC", "state": "confirmed",
"stored_registration_status": "locked_in", "stored_fulfillment_status": "filed",
"confirmation_ref": "MLC-DEMO-4471", "last_activity_at": "2026-09-08T01:47:42Z" },
{ "org": "pro", "registry": "PRO (BMI or ASCAP)", "state": "uploaded",
"stored_registration_status": "self_reported", "stored_fulfillment_status": null,
"confirmation_ref": null, "last_activity_at": "2026-09-08T09:47:42Z" },
{ "org": "copyright", "registry": "US Copyright Office (eCO)", "state": "not_started",
"stored_registration_status": null, "stored_fulfillment_status": null,
"confirmation_ref": null, "last_activity_at": null }
]
}State is one of not_started, generated, uploaded, confirmed, failed. Every state is derived from a stored value, shown alongside it, so nothing is inferred or invented.
5. For connector reviewers
This account holds a demo catalog of three singles with writers, splits, ISRCs, and a mix of registration states, including one failed rail. It can only ever see its own data. Every request is scoped to the signed-in account at the database level.
email: reviewer@royaltylock.app
password: RLReviewer-2026-Demo!x7Step 1, get a bearer token
curl -s -X POST "https://cotwilckospymcxvpyuf.supabase.co/auth/v1/token?grant_type=password" \
-H "apikey: sb_publishable__IPogICxnw3qTvAHvDCaiQ_eT_hg82H" \
-H "content-type: application/json" \
-d '{"email":"reviewer@royaltylock.app","password":"RLReviewer-2026-Demo!x7"}'
# copy the access_token from the response into TOKEN below
export TOKEN="<access_token>"Step 2, list the tools
curl -s -X POST https://royaltylock.io/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Step 3, call a tool
curl -s -X POST https://royaltylock.io/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"list_works","arguments":{"limit":10}}}'Responses come back as a text/event-stream frame containing the JSON-RPC result. The reviewer catalog returns Night Drive, Paper Crowns, and Slow Static.
6. Compliance note
Royalty Lock enforces a per destination policy. Where a registry's terms reserve filing to the rights holder, we prepare the data and the artist submits it themselves. We never script logins into third party accounts. The full rail by rail breakdown is on our auto-submit roadmap.
7. Support
Questions or additional reviewer access: chad@royaltylock.io