Add a song to my notebook
jj_create_songAdds a song using a standard payload to a private notebook. Files converted songs or edits existing entries without creating duplicates.
Instructions
Adds a song to the calling account's PRIVATE notebook. song is the canonical pivot payload: exactly the object returned by jj_get_song (song) or by a conversion whose output is "songbook", so converting then filing is a copy with no transformation. The id is DERIVED, never random: song.id if given, otherwise an "artist-title" slug. That means posting the same song twice REPLACES it instead of creating a duplicate, and it is also how you rewrite a song wholesale (read it with jj_get_song, edit the payload, post it back with its id). Adding NEVER publishes anything on the public profile. Consumes one unit of the daily WRITE quota (200/day free, 5000 Premium).
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"song": "<song>"
},
"name": "jj_create_song"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| song | Yes | Canonical pivot payload. `title` is required and non-empty; `artist`, `sections[].lines[].lyrics`, `sections[].lines[].chords[] = { offset, chord }`, `detectedKey { tonic, scale }` and `metadata { capo, bpm }` are the usual fields. Validated by the same gate as a .jamsong import in the app; hard cap 512 KB. | |
| publish | No | NOT ACCEPTED HERE, and passing it is an error rather than a no-op. Adding a song and publishing it on a public profile are two different decisions: publish afterwards with jj_update_song, once the person has said which rights declaration applies. | |
| playlistIds | No | COMPLETE target state of playlist membership, not a delta: the song joins the playlists listed and LEAVES every other one. [] removes it from all of them. Omit to leave memberships untouched. |