Make a printable setlist for your band's next gig from a pasted song list, with set times and a CSV.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when the user wants a printable setlist for a gig or band (set list, stage setlist, setlist template, "print our set list", "how long is our set") as a PDF and CSV. Pass songs[] in play order with title and, when given, key, bpm, capo, duration ("3:45"), notes, segue and transpose; use sets[] when the sets are decided, or pass the pasted list as text (numbered lists, "Song - Key - BPM - Time", CSV or tab rows, "->" segues, SET 2 / Encore / --- breaks). Options: split_sets or break_after_minutes to split one list, changeover_seconds, transpose_all, band, venue, date, layout (both, stage, band) and paper (letter, a4). Returns set totals and the show total in m:ss; songs without a duration are listed and not estimated. Does not look up keys, tempos or song lengths, and does not make chord charts or lyrics.
Band or act name printed at the top. Example: The Late Shift
Gig date as it should print. Example: Sat 14 Nov 2026
Use instead of songs when the sets are already decided, e.g. [{"name":"Set 1","songs":[...]},{"name":"Encore","songs":[...]}].
Fallback: the setlist as the user pasted it, one song per line, e.g. "1. Brown Eyed Girl (G) 150 bpm 3:05 capo 2\nSET 2\nValerie - Eb - 3:40 ->". Reads numbered lists, CSV or tab rows with a header, "->" segues and SET 2 / Encore / --- breaks.
letter (default) or a4. Example: a4
Songs in play order, one object per song, e.g. [{"title":"Valerie","key":"Eb","bpm":116,"duration":"3:40"}]. A plain string such as "SET 2" or "Encore" starts a new set. Up to 80 songs.
Venue printed at the top. Example: Blue Door Pub
both (default: big-type stage pages plus a band copy table), stage, or band. Example: stage
Split a single list into this many sets of similar length, keeping the order (2 to 6). Example: 2
Shift every song with a known key by these semitones or to a key name. Example: -2
Seconds between songs counted in the set times (none after a segue). Default 0. Example: 20
Start a new set when a set would run past this many minutes. Example: 45
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http setlist-maker https://setlist-maker.zovo.one/mcp
Use this when the user wants a printable setlist for a gig or band (set list, stage setlist, setlist template, "print our set list", "how long is our set") as a PDF and CSV. Pass songs[] in play order with title and, when given, key, bpm, capo, duration ("3:45"), notes, segue and transpose; use sets[] when the sets are decided, or pass the pasted list as text (numbered lists, "Song - Key - BPM - Time", CSV or tab rows, "->" segues, SET 2 / Encore / --- breaks). Options: split_sets or break_after_minutes to split one list, changeover_seconds, transpose_all, band, venue, date, layout (both, stage, band) and paper (letter, a4). Returns set totals and the show total in m:ss; songs without a duration are listed and not estimated. Does not look up keys, tempos or song lengths, and does not make chord charts or lyrics.
| Argument | Type | Description |
|---|---|---|
| band | any | Band or act name printed at the top. Example: The Late Shift |
| date | any | Gig date as it should print. Example: Sat 14 Nov 2026 |
| sets | any | Use instead of songs when the sets are already decided, e.g. [{"name":"Set 1","songs":[...]},{"name":"Encore","songs":[...]}]. |
| text | any | Fallback: the setlist as the user pasted it, one song per line, e.g. "1. Brown Eyed Girl (G) 150 bpm 3:05 capo 2\nSET 2\nValerie - Eb - 3:40 ->". Reads numbered lists, CSV or tab rows with a header, "->" segues and SET 2 / Encore / --- breaks. |
| paper | any | letter (default) or a4. Example: a4 |
| songs | any | Songs in play order, one object per song, e.g. [{"title":"Valerie","key":"Eb","bpm":116,"duration":"3:40"}]. A plain string such as "SET 2" or "Encore" starts a new set. Up to 80 songs. |
| venue | any | Venue printed at the top. Example: Blue Door Pub |
| layout | any | both (default: big-type stage pages plus a band copy table), stage, or band. Example: stage |
| split_sets | number | string | null | Split a single list into this many sets of similar length, keeping the order (2 to 6). Example: 2 |
| transpose_all | number | string | null | Shift every song with a known key by these semitones or to a key name. Example: -2 |
| changeover_seconds | number | string | null | Seconds between songs counted in the set times (none after a segue). Default 0. Example: 20 |
| break_after_minutes | number | string | null | Start a new set when a set would run past this many minutes. Example: 45 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"band": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Band or act name printed at the top. Example: The Late Shift"
},
"date": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Gig date as it should print. Example: Sat 14 Nov 2026"
},
"sets": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"songs"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"description": "Set name. Example: Set 1"
},
"songs": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"bpm": {
"type": [
"number",
"string",
"null"
],
"description": "Tempo in beats per minute. Example: 150"
},
"key": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Key the band plays it in (sounding key). Example: G, Bb, F#m"
},
"set": {
"type": [
"number",
"string",
"null"
],
"description": "Optional set name or number for this song; a change starts a new set. Example: \"Set 2\""
},
"capo": {
"type": [
"number",
"string",
"null"
],
"description": "Capo fret for the guitarist (0 = none). Example: 2"
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Short cue for the band. Example: count in 4, horns on chorus"
},
"segue": {
"type": [
"boolean",
"string",
"number",
"null"
],
"description": "True when this song runs straight into the next one (no changeover). Example: true"
},
"title": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "Song title. Example: Brown Eyed Girl"
},
"duration": {
"type": [
"number",
"string",
"null"
],
"description": "Length as m:ss, seconds or minutes: \"3:45\", 225, \"3m45s\", \"3.5 min\". Example: \"3:05\""
},
"transpose": {
"type": [
"number",
"string",
"null"
],
"description": "Change the key for this song: semitones (+2, -1) or a target key (\"to A\"). Example: \"+2\""
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 120,
"description": "Songs of this set in order."
}
},
"additionalProperties": {}
},
"maxItems": 12
},
{
"type": "null"
}
],
"description": "Use instead of songs when the sets are already decided, e.g. [{\"name\":\"Set 1\",\"songs\":[...]},{\"name\":\"Encore\",\"songs\":[...]}]."
},
"text": {
"anyOf": [
{
"type": "string",
"maxLength": 40000
},
{
"type": "null"
}
],
"description": "Fallback: the setlist as the user pasted it, one song per line, e.g. \"1. Brown Eyed Girl (G) 150 bpm 3:05 capo 2\\nSET 2\\nValerie - Eb - 3:40 ->\". Reads numbered lists, CSV or tab rows with a header, \"->\" segues and SET 2 / Encore / --- breaks."
},
"paper": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "letter (default) or a4. Example: a4"
},
"songs": {
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"bpm": {
"type": [
"number",
"string",
"null"
],
"description": "Tempo in beats per minute. Example: 150"
},
"key": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "Key the band plays it in (sounding key). Example: G, Bb, F#m"
},
"set": {
"type": [
"number",
"string",
"null"
],
"description": "Optional set name or number for this song; a change starts a new set. Example: \"Set 2\""
},
"capo": {
"type": [
"number",
"string",
"null"
],
"description": "Capo fret for the guitarist (0 = none). Example: 2"
},
"notes": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
],
"description": "Short cue for the band. Example: count in 4, horns on chorus"
},
"segue": {
"type": [
"boolean",
"string",
"number",
"null"
],
"description": "True when this song runs straight into the next one (no changeover). Example: true"
},
"title": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"description": "Song title. Example: Brown Eyed Girl"
},
"duration": {
"type": [
"number",
"string",
"null"
],
"description": "Length as m:ss, seconds or minutes: \"3:45\", 225, \"3m45s\", \"3.5 min\". Example: \"3:05\""
},
"transpose": {
"type": [
"number",
"string",
"null"
],
"description": "Change the key for this song: semitones (+2, -1) or a target key (\"to A\"). Example: \"+2\""
}
},
"additionalProperties": {}
},
{
"type": "string",
"maxLength": 300
}
]
},
"maxItems": 120
},
{
"type": "null"
}
],
"description": "Songs in play order, one object per song, e.g. [{\"title\":\"Valerie\",\"key\":\"Eb\",\"bpm\":116,\"duration\":\"3:40\"}]. A plain string such as \"SET 2\" or \"Encore\" starts a new set. Up to 80 songs."
},
"venue": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"description": "Venue printed at the top. Example: Blue Door Pub"
},
"layout": {
"anyOf": [
{
"type": "string",
"maxLength": 30
},
{
"type": "null"
}
],
"description": "both (default: big-type stage pages plus a band copy table), stage, or band. Example: stage"
},
"split_sets": {
"type": [
"number",
"string",
"null"
],
"description": "Split a single list into this many sets of similar length, keeping the order (2 to 6). Example: 2"
},
"transpose_all": {
"type": [
"number",
"string",
"null"
],
"description": "Shift every song with a known key by these semitones or to a key name. Example: -2"
},
"changeover_seconds": {
"type": [
"number",
"string",
"null"
],
"description": "Seconds between songs counted in the set times (none after a segue). Default 0. Example: 20"
},
"break_after_minutes": {
"type": [
"number",
"string",
"null"
],
"description": "Start a new set when a set would run past this many minutes. Example: 45"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.