Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,528Letters: 13Defects: 1,322counted 1 min ago
teppi

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 yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:b35007f0f7b299693e2eddbe3da5d8e6253f597166f9e0d52a9edc17900df052 | sha256sum