Server definition
- Hash
- sha256:b35007f0f7b299693e2eddbe3da5d8e6253f597166f9e0d52a9edc17900df052
- What it is
- What a remote MCP server returned when asked what it offers: 7 tools
The blob, as servednamed by its sha256
{
"instructions": "Read an existing session with get_session before editing it. After every edit_session attempt, call get_session next for the same session before another edit or a final answer; the compact edit_session result is not verification. Step indexes are zero-based; preserve every track and step the user did not ask to change. For add_track, generate a stable collision-resistant track_id ending in at least eight hexadecimal characters and reuse it on retry. For set_steps, set_track_instrument, and set_track_pan, use a track_id returned by get_session. Only publish when the user explicitly asks. A session UUID grants the same access as its share URL, so do not expose it unnecessarily.",
"tools": [
{
"description": "Describe what is happening musically in a session — rhythm, pitch content, inferred key, and chords — without changing anything. Use this to explain music rather than to edit it. Results come from the same music-theory module the browser's Key Assistant and Chromatic Grid use, and report where the analysis is uncertain instead of guessing.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "analyze_session",
"outputSchema": null
},
{
"description": "Create a new editable Keyboardia session with the normal defaults and return its shareable URL. The session starts with no tracks; use edit_session to add them. Pass the same idempotency_key when retrying so an uncertain attempt cannot leave duplicate sessions behind.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"idempotency_key": {
"description": "A UUID you generate for this creation attempt. Reusing it returns the session the first attempt created instead of making another one.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
},
"name": {
"description": "Optional display name for the new session.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"tempo": {
"description": "Starting tempo in BPM. Defaults to Keyboardia's own default.",
"maximum": 180,
"minimum": 60,
"type": "number"
}
},
"required": [
"idempotency_key"
],
"type": "object"
},
"name": "create_session",
"outputSchema": null
},
{
"description": "Make one narrow, retry-safe edit to an existing collaborative session. After every attempt, the next Keyboardia call must be get_session for the same session. A successful call includes a backwards-compatible compact snapshot plus an acknowledgement. That snapshot is not authoritative verification; do not make another edit or finish from it. Read with get_session next. Supported operations: add_track, set_track_instrument, set_track_pan, set_steps, and set_tempo. set_steps changes only the named steps; it never replaces a track or session. set_track_instrument replaces only a track's sound source, keeping its pattern, mix, timing, and custom name.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"description": "The target session and one retry-safe edit to apply.",
"properties": {
"edit": {
"description": "Exactly one narrow session edit.",
"oneOf": [
{
"additionalProperties": false,
"description": "Add one track. Retrying the same track_id and definition is a no-op; a conflicting reuse is rejected.",
"properties": {
"name": {
"description": "Optional display name. The instrument name is used when omitted.",
"maxLength": 32,
"minLength": 1,
"type": "string"
},
"operation": {
"const": "add_track",
"type": "string"
},
"sample_id": {
"description": "The canonical Keyboardia instrument ID. Use one of the enumerated values exactly.",
"enum": [
"advanced:acid-bass",
"advanced:sub-bass",
"advanced:supersaw",
"advanced:thick-lead",
"advanced:tremolo-strings",
"advanced:vibrato-lead",
"advanced:warm-pad",
"advanced:wobble-bass",
"bass",
"cabasa",
"chord",
"clap",
"clave",
"conga",
"cowbell",
"hihat",
"kick",
"lead",
"noise",
"openhat",
"pad",
"pluck",
"rim",
"sampled:808-clap",
"sampled:808-hihat-closed",
"sampled:808-hihat-open",
"sampled:808-kick",
"sampled:808-snare",
"sampled:acoustic-crash",
"sampled:acoustic-guitar",
"sampled:acoustic-hihat-closed",
"sampled:acoustic-hihat-open",
"sampled:acoustic-kick",
"sampled:acoustic-ride",
"sampled:acoustic-snare",
"sampled:alto-sax",
"sampled:brushes-snare",
"sampled:clean-guitar",
"sampled:finger-bass",
"sampled:french-horn",
"sampled:hammond-organ",
"sampled:kalimba",
"sampled:marimba",
"sampled:piano",
"sampled:slap-bass",
"sampled:steel-drums",
"sampled:string-section",
"sampled:vibraphone",
"sampled:vinyl-crackle",
"shaker",
"snare",
"subbass",
"synth:acid",
"synth:bass",
"synth:bell",
"synth:brass",
"synth:clavinet",
"synth:discobass",
"synth:dreampop",
"synth:epiano",
"synth:evolving",
"synth:funkbass",
"synth:glass",
"synth:growl",
"synth:hoover",
"synth:hypersaw",
"synth:jangle",
"synth:lead",
"synth:organ",
"synth:organphase",
"synth:pad",
"synth:pluck",
"synth:reese",
"synth:rhodes",
"synth:shimmer",
"synth:stab",
"synth:strings",
"synth:sub",
"synth:supersaw",
"synth:sweep",
"synth:vibes",
"synth:warmpad",
"synth:wobble",
"synth:wurlitzer",
"tambourine",
"tom",
"tone:am-bell",
"tone:am-tremolo",
"tone:duo-lead",
"tone:fm-bass",
"tone:fm-bell",
"tone:fm-epiano",
"tone:membrane-kick",
"tone:membrane-tom",
"tone:metal-cymbal",
"tone:metal-hihat",
"tone:pluck-string",
"woodblock",
"zap"
],
"type": "string"
},
"track_id": {
"description": "Generate a fresh collision-resistant ID that ends with at least eight hexadecimal characters, such as agent-kick-a7f3c29d. Generate it once and reuse it on retries.",
"pattern": "^(?=.{10,64}$)[A-Za-z0-9][A-Za-z0-9._-]*-[0-9a-fA-F]{8,32}$",
"type": "string"
}
},
"required": [
"operation",
"track_id",
"sample_id"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Replace only an existing track's sound source while preserving its name, pattern, mix, and timing.",
"properties": {
"operation": {
"const": "set_track_instrument",
"type": "string"
},
"sample_id": {
"description": "The canonical Keyboardia instrument ID. Use one of the enumerated values exactly.",
"enum": [
"advanced:acid-bass",
"advanced:sub-bass",
"advanced:supersaw",
"advanced:thick-lead",
"advanced:tremolo-strings",
"advanced:vibrato-lead",
"advanced:warm-pad",
"advanced:wobble-bass",
"bass",
"cabasa",
"chord",
"clap",
"clave",
"conga",
"cowbell",
"hihat",
"kick",
"lead",
"noise",
"openhat",
"pad",
"pluck",
"rim",
"sampled:808-clap",
"sampled:808-hihat-closed",
"sampled:808-hihat-open",
"sampled:808-kick",
"sampled:808-snare",
"sampled:acoustic-crash",
"sampled:acoustic-guitar",
"sampled:acoustic-hihat-closed",
"sampled:acoustic-hihat-open",
"sampled:acoustic-kick",
"sampled:acoustic-ride",
"sampled:acoustic-snare",
"sampled:alto-sax",
"sampled:brushes-snare",
"sampled:clean-guitar",
"sampled:finger-bass",
"sampled:french-horn",
"sampled:hammond-organ",
"sampled:kalimba",
"sampled:marimba",
"sampled:piano",
"sampled:slap-bass",
"sampled:steel-drums",
"sampled:string-section",
"sampled:vibraphone",
"sampled:vinyl-crackle",
"shaker",
"snare",
"subbass",
"synth:acid",
"synth:bass",
"synth:bell",
"synth:brass",
"synth:clavinet",
"synth:discobass",
"synth:dreampop",
"synth:epiano",
"synth:evolving",
"synth:funkbass",
"synth:glass",
"synth:growl",
"synth:hoover",
"synth:hypersaw",
"synth:jangle",
"synth:lead",
"synth:organ",
"synth:organphase",
"synth:pad",
"synth:pluck",
"synth:reese",
"synth:rhodes",
"synth:shimmer",
"synth:stab",
"synth:strings",
"synth:sub",
"synth:supersaw",
"synth:sweep",
"synth:vibes",
"synth:warmpad",
"synth:wobble",
"synth:wurlitzer",
"tambourine",
"tom",
"tone:am-bell",
"tone:am-tremolo",
"tone:duo-lead",
"tone:fm-bass",
"tone:fm-bell",
"tone:fm-epiano",
"tone:membrane-kick",
"tone:membrane-tom",
"tone:metal-cymbal",
"tone:metal-hihat",
"tone:pluck-string",
"woodblock",
"zap"
],
"type": "string"
},
"track_id": {
"description": "For add_track, choose a stable unique ID and reuse it on retries. For set_steps, set_track_instrument, or set_track_pan, copy an existing track_id from get_session.",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$",
"type": "string"
}
},
"required": [
"operation",
"track_id",
"sample_id"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Set one existing track's normalized stereo position without changing its notes or level.",
"properties": {
"operation": {
"const": "set_track_pan",
"type": "string"
},
"pan": {
"description": "Normalized equal-power stereo position: -1 left, 0 center, 1 right.",
"maximum": 1,
"minimum": -1,
"type": "number"
},
"track_id": {
"description": "For add_track, choose a stable unique ID and reuse it on retries. For set_steps, set_track_instrument, or set_track_pan, copy an existing track_id from get_session.",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$",
"type": "string"
}
},
"required": [
"operation",
"track_id",
"pan"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Change only the listed steps on an existing track. Read get_session first to obtain its track_id and step_count.",
"properties": {
"changes": {
"description": "Assignments for named steps only. Every unmentioned step is preserved.",
"items": {
"additionalProperties": false,
"properties": {
"step": {
"description": "Zero-based step index. It must be within this track's current step_count.",
"maximum": 127,
"minimum": 0,
"type": "integer"
},
"value": {
"description": "true activates the step; false clears it.",
"type": "boolean"
}
},
"required": [
"step",
"value"
],
"type": "object"
},
"maxItems": 128,
"minItems": 1,
"type": "array"
},
"operation": {
"const": "set_steps",
"type": "string"
},
"track_id": {
"description": "For add_track, choose a stable unique ID and reuse it on retries. For set_steps, set_track_instrument, or set_track_pan, copy an existing track_id from get_session.",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$",
"type": "string"
}
},
"required": [
"operation",
"track_id",
"changes"
],
"type": "object"
},
{
"additionalProperties": false,
"description": "Set the session-wide tempo without changing any track.",
"properties": {
"operation": {
"const": "set_tempo",
"type": "string"
},
"tempo": {
"description": "Session tempo in beats per minute (60-180).",
"maximum": 180,
"minimum": 60,
"type": "number"
}
},
"required": [
"operation",
"tempo"
],
"type": "object"
}
]
},
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id",
"edit"
],
"type": "object"
},
"name": "edit_session",
"outputSchema": null
},
{
"description": "Export the session as a base64-encoded Standard MIDI File, matching what Keyboardia's own Export MIDI produces for the same music. The session is not modified. The result lists any session features a MIDI file cannot carry rather than approximating them silently.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "export_midi",
"outputSchema": null
},
{
"description": "Read the current tempo and compact track patterns from an existing Keyboardia session.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "get_session",
"outputSchema": null
},
{
"description": "Freeze the current music into a new immutable session and return its URL. The source session stays editable at its own URL. Only call this when someone explicitly asks to publish; it is never a side effect of editing or exporting.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "publish_session",
"outputSchema": null
},
{
"description": "Copy an existing session — published or editable — into a new editable session that records the original as its source. The source is never modified, so this is how to continue from published work.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"session_id": {
"description": "The UUID after /s/ in a Keyboardia share URL. Pass only the UUID, not the full URL.",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "remix_session",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:b35007f0f7b299693e2eddbe3da5d8e6253f597166f9e0d52a9edc17900df052 | sha256sum