{"apiVersion":"v1","directorySlug":"codexmusica-mcp-7184d72f87","title":"Codex Musica","description":"Codex Musica — recording recipes for 6725 music traditions and 1653 instruments. Human app at codex.html; machine-readable recipes at api/all.json (one fetch, all recipes). No server, no key.","pageUrl":"https://www.mcpbundles.com/skills/codexmusica-mcp-7184d72f87","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.codexmusica.com/mcp","hostedMcpUrl":null,"toolCount":21,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.codexmusica/codexmusica-mcp-7184d72f87","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"get_operation","description":"Read an operation (or any session) by its id; this never dispatches work. pending: poll again after retry_after_seconds. completed: the content leads with the tool's own result blocks, private state withheld — present the deliverable from them exactly — and ends with the receipt. A finished lyric_grade or lyric_revise publishes the song and a SHORT verdict: its status fields, `blocking` (one line per flag or banned pair standing, and per line a requested obligation could not be judged on), and a","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["operation_id"],"properties":{"lines":{"type":"array","items":{"type":"integer","maximum":9007199254740991,"minimum":1}},"detail":{"enum":["full","findings","report","coverage","pronunciations","pairs"],"type":"string"},"operation_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Read a saved operation","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_operation","displayName":"Read a saved operation"},{"name":"resume_operation","description":"Continue an interrupted operation when get_operation reports resumable: true. A recipe call reruns from its saved input and answers at once; a lyric revision continues from its accepted checkpoint (no answer is replayed) as a new operation to poll. Repeating this returns the same successor. When the operation cannot resume, the refusal says what to do instead.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["operation_id"],"properties":{"operation_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Resume interrupted work","logicalName":"resume_operation","displayName":"Resume interrupted work","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"begin_lyrics","description":"Open a private lyrics session and return its session_id. Phase 'create' (the default) is for a new song: the session enforces sweep → screen → plan → exact-draft grade → revise from receipts the server records. Phase 'edit' is only for lyrics the user supplied: it skips those receipts, so choose it only then — this argument is the only thing that selects it. The phase is fixed for the session. You write every line; the service plans and grades, and lyric_revise asks you each question it needs an","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"phase":{"enum":["create","edit"],"type":"string","default":"create"}}},"title":"Begin a lyric task","logicalName":"begin_lyrics","displayName":"Begin a lyric task","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"start_recipe","description":"SESSION: opens a recipe session. The first content block is this tool's own output — the recipe, its cards and the caller-managed `workspace` — with the new session_id added; the last block is the session receipt. Pass its session_id to edit_recipe or render_recipe and the server keeps the workspace. Seed a recording recipe from any number of traditions — deterministic default cards, identical to what a human sees in the app (\"Current Recipe\"). This is the SCAFFOLD, not the finished answer: when","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["traditions"],"properties":{"format":{"enum":["rich","tags","prose","compact"],"type":"string"},"max_chars":{"type":"integer","maximum":1000,"exclusiveMinimum":0},"traditions":{"type":"array","items":{"type":"string"},"maxItems":16,"minItems":1}}},"title":"Start a recipe from tradition(s)","logicalName":"start_recipe","displayName":"Start a recipe from tradition(s)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"edit_recipe","description":"SESSION: pass the latest session_id; the server applies this call to the workspace it keeps. Every content block before the last is this tool's own output with private state withheld; the last is the receipt holding the next session_id. Without session_id, pass `workspace` instead (caller-managed): the raw engine runs and returns its own result, edited workspace included. Never send both. The main tool — push the scaffold toward the user's words with an ordered batch of edits in ONE call. Edits:","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["edits"],"properties":{"edits":{"type":"array","items":{"type":"object","required":["action"],"properties":{"card":{"type":"string"},"part":{"type":"string"},"room":{"type":"string"},"chain":{"type":"object","properties":{"eq":{"type":"string"},"fx":{"type":"string"},"amp":{"type":"string"},"mic":{"type":"string"},"pre":{"type":"string"},"comp":{"type":"string"},"medium":{"type":"string"},"console":{"type":"string"}},"additionalProperties":false},"clear":{"type":"array","items":{"enum":["room","tuning","fx","amp","mic","pre","comp","eq","medium","console"],"type":"string"},"maxItems":10},"action":{"enum":["add_tradition","remove_tradition","add_instrument","remove_instrument","set_variant","set_environment","set_preface","move_instrument"],"type":"string"},"before":{"type":"string"},"tuning":{"type":"string"},"preface":{"type":"string"},"variant":{"type":"string"},"tradition":{"type":"string"},"instrument":{"type":"string"}}},"maxItems":64,"minItems":1},"format":{"enum":["rich","tags","prose","compact"],"type":"string"},"max_chars":{"type":"integer","maximum":1000,"exclusiveMinimum":0},"workspace":{"type":"object","required":["cards"],"properties":{"cards":{"type":"array","items":{},"maxItems":512}}},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Edit the recipe (the main tool)","logicalName":"edit_recipe","displayName":"Edit the recipe (the main tool)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"render_recipe","description":"SESSION: pass the latest session_id; the server applies this call to the workspace it keeps. Every content block before the last is this tool's own output with private state withheld; the last is the receipt holding the next session_id. Without session_id, pass `workspace` instead (caller-managed): the raw engine runs and returns its own result, edited workspace included. Never send both. Render the current recipe again — a different format or max_chars — without editing it.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"format":{"enum":["rich","tags","prose","compact"],"type":"string"},"max_chars":{"type":"integer","maximum":1000,"exclusiveMinimum":0},"workspace":{"type":"object","required":["cards"],"properties":{"cards":{"type":"array","items":{},"maxItems":512}}},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Re-render the recipe","logicalName":"render_recipe","displayName":"Re-render the recipe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search_catalog","description":"Free-text search across traditions, instruments, part-variants, rooms, tunings, arrangements, aesthetics, prefaces, and chain items. Use it to turn the CONCRETE words in a request into real ids — a genre, an instrument, a piece of gear, a material, a space, an era — and never guess an id. For MOOD and FEEL adjectives reach for search_prefaces instead: it searches the same prefaces, ranked the same way, but returns each one's note and token profile, which is what you need to choose between near-s","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":50,"exclusiveMinimum":0},"query":{"type":"string"},"types":{"type":"array","items":{"enum":["tradition","instrument","variant","room","tuning","arrangement","aesthetic","preface","chain"],"type":"string"}}}},"title":"Search the catalog","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_catalog","displayName":"Search the catalog"},{"name":"search_prefaces","description":"Search the named prefaces (aesthetic/technique/delivery signatures: satirical, keening, brooding, …) by mood/feel words. Ranked like search_catalog: an exact id first, then words in an id, then the preface's note, then its tokens. Reach for this whenever the user says ANY stylistic adjective — then realize the winning id on each relevant instrument via edit_recipe set_preface. Any preface can target any instrument. A word with no preface hit may name gear or a space instead: try search_catalog.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":50,"exclusiveMinimum":0},"query":{"type":"string"}}},"title":"Search prefaces (intent → preface id)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_prefaces","displayName":"Search prefaces (intent → preface id)"},{"name":"get_instrument","description":"The parts of one instrument and the variant ids valid for set_variant, with labels and which is the default. Wide parts are SAMPLED, not dumped — shared materials tables give some parts hundreds of variants (the widest has 1443), so each part reports its full `variant_count` and sets `truncated` when you are seeing a slice. Narrow it rather than raising `limit`: `query` filters variants by name and descriptor (\"mahogany\", \"phosphor bronze\"), `part` focuses one part. The default variant is always","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"},"part":{"type":"string"},"limit":{"type":"integer","maximum":200,"exclusiveMinimum":0},"query":{"type":"string"}}},"title":"Get one instrument (the knob catalog)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_instrument","displayName":"Get one instrument (the knob catalog)"},{"name":"get_tradition","description":"Full record for one tradition: name, family, lineage, axis profile, default instruments, raw row.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string"}}},"title":"Get one tradition","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_tradition","displayName":"Get one tradition"},{"name":"list_traditions","description":"List traditions, optionally filtered: `query` keeps traditions whose id or name contains the text; `family` keeps one exact family (list_options kind=\"tradition_families\"). Paginated, at most 100 per page; next_offset continues. For free-text search use search_catalog.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":100,"exclusiveMinimum":0},"query":{"type":"string"},"family":{"type":"string"},"offset":{"type":"integer","maximum":9007199254740991,"minimum":0}}},"title":"List / browse traditions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_traditions","displayName":"List / browse traditions"},{"name":"list_options","description":"Enumerate one catalog list. rooms and tunings are ids set_environment takes. chain_sections are the stage names of set_environment's chain, not chain ids — search_catalog types=[\"chain\"] returns those, each with its stage. tradition_families filter list_traditions. archetypes, aesthetics, arrangements, instrument_families and axes are reference only: no edit takes them. Each response says what accepts its ids (accepted_by).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["kind"],"properties":{"kind":{"enum":["rooms","tunings","chain_sections","archetypes","aesthetics","arrangements","instrument_families","tradition_families","axes"],"type":"string"}}},"title":"Enumerate a catalog list","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_options","displayName":"Enumerate a catalog list"},{"name":"lyric_screen","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. Without session_id (caller-managed) this call runs the raw en","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["words"],"properties":{"words":{"type":"array","items":{"type":"string","maxLength":40},"maxItems":12,"minItems":2},"fallback":{"enum":["high","low"],"type":"string"},"relation":{"type":"string","maxLength":64},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Screen rhyme pairs before writing","logicalName":"lyric_screen","displayName":"Screen rhyme pairs before writing","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_plan","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. Without session_id (caller-managed) this call runs the raw en","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["seed"],"properties":{"form":{"enum":["verse-chorus"],"type":"string"},"seed":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"lines":{"type":"integer","maximum":463,"minimum":12},"wants":{"type":"array","items":{"type":"string","maxLength":80},"maxItems":13},"melody":{"type":"string","maxLength":65536},"relation":{"type":"string","maxLength":64},"functions":{"type":"string","maxLength":200},"narrative":{"type":"string","maxLength":200},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Plan a song shape (seeded, reproducible)","logicalName":"lyric_plan","displayName":"Plan a song shape (seeded, reproducible)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_grade","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. Without session_id (caller-managed) this call runs the raw en","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["seed"],"properties":{"form":{"enum":["verse-chorus"],"type":"string"},"seed":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"draft":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"lines":{"type":"integer","maximum":463,"minimum":12},"wants":{"type":"array","items":{"type":"string","maxLength":80},"maxItems":13},"melody":{"type":"string","maxLength":65536},"voices":{"type":"boolean"},"fallback":{"enum":["high","low"],"type":"string"},"relation":{"type":"string","maxLength":64},"functions":{"type":"string","maxLength":200},"narrative":{"type":"string","maxLength":200},"draft_text":{"type":"string","maxLength":93063},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"pronunciations":{"type":"array","items":{"type":"object","required":["line","token","word","phones","basis","source"],"properties":{"line":{"type":"string","maxLength":4000,"minLength":1},"word":{"type":"string","maxLength":4000,"minLength":1},"basis":{"enum":["dictionary","declared"],"type":"string"},"token":{"type":"integer","maximum":4000,"minimum":1},"phones":{"type":"array","items":{"type":"string","maxLength":4,"minLength":1},"maxItems":128,"minItems":1},"source":{"type":"string","maxLength":1000,"minLength":1}},"additionalProperties":false},"maxItems":128}}},"title":"Grade a draft against its plan","logicalName":"lyric_grade","displayName":"Grade a draft against its plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_revise","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once (recover_only: true answers at once instead). Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. The session carr","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"form":{"enum":["verse-chorus"],"type":"string"},"seed":{"type":"integer","maximum":2147483647,"minimum":-2147483648},"draft":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"lines":{"type":"integer","maximum":463,"minimum":12},"state":{"type":"string","maxLength":1048574},"wants":{"type":"array","items":{"type":"string","maxLength":80},"maxItems":13},"answer":{"type":"string","maxLength":4000},"groups":{"type":"string","maxLength":65536},"melody":{"type":"string","maxLength":65536},"run_id":{"type":"string","maxLength":80},"scheme":{"type":"string","maxLength":463},"voices":{"type":"boolean"},"answers":{"type":"array","items":{"type":"object","required":["line","text"],"properties":{"line":{"type":"integer","maximum":463,"minimum":1},"text":{"type":"string","maxLength":200}}},"maxItems":463,"minItems":1},"new_run":{"type":"boolean"},"returns":{"type":"string","maxLength":65536},"attempts":{"type":"integer","maximum":6,"minimum":0},"fallback":{"enum":["high","low"],"type":"string"},"relation":{"type":"string","maxLength":64},"backtrack":{"type":"integer","maximum":8,"minimum":0},"blueprint":{"type":"string","maxLength":1048574},"functions":{"type":"string","maxLength":200},"narrative":{"type":"string","maxLength":200},"checkpoint":{"type":"string","maxLength":1048574},"draft_text":{"type":"string","maxLength":93063},"max_rounds":{"type":"integer","maximum":9007199254740991,"minimum":1},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"structures":{"type":"string","maxLength":65536},"subdivision":{"type":"integer","maximum":8,"minimum":1},"recover_only":{"type":"boolean"},"run_revision":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},"recovery_part":{"enum":["all","journal"],"type":"string"},"pronunciations":{"type":"array","items":{"type":"object","required":["line","token","word","phones","basis","source"],"properties":{"line":{"type":"string","maxLength":4000,"minLength":1},"word":{"type":"string","maxLength":4000,"minLength":1},"basis":{"enum":["dictionary","declared"],"type":"string"},"token":{"type":"integer","maximum":4000,"minimum":1},"phones":{"type":"array","items":{"type":"string","maxLength":4,"minLength":1},"maxItems":128,"minItems":1},"source":{"type":"string","maxLength":1000,"minLength":1}},"additionalProperties":false},"maxItems":128}}},"title":"Drive the revise loop to a stop condition (the finishing step)","logicalName":"lyric_revise","displayName":"Drive the revise loop to a stop condition (the finishing step)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_sweep","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. Without session_id (caller-managed) this call runs the raw en","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["seed_from","count"],"properties":{"form":{"enum":["verse-chorus"],"type":"string"},"want":{"type":"array","items":{"type":"string","maxLength":80},"maxItems":13},"count":{"type":"integer","maximum":28,"minimum":1},"lines":{"type":"integer","maximum":463,"minimum":12},"melody":{"type":"string","maxLength":65536},"functions":{"type":"string","maxLength":200},"seed_from":{"type":"integer","maximum":2147483000,"minimum":0},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"title":"Find seeds whose shape matches what you want","logicalName":"lyric_sweep","displayName":"Find seeds whose shape matches what you want","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_verify","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. Without session_id (caller-managed) this call runs the raw en","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"after":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"before":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"groups":{"type":"string","maxLength":65536},"scheme":{"type":"string","maxLength":463},"voices":{"type":"boolean"},"returns":{"type":"string","maxLength":65536},"fallback":{"enum":["high","low"],"type":"string"},"relation":{"type":"string","maxLength":64},"targeted":{"type":"array","items":{"type":"integer","maximum":463,"minimum":1},"maxItems":463},"blueprint":{"type":"string","maxLength":1048574},"after_text":{"type":"string","maxLength":93063},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"structures":{"type":"string","maxLength":65536},"before_text":{"type":"string","maxLength":93063},"subdivision":{"type":"integer","maximum":8,"minimum":1},"pronunciations":{"type":"array","items":{"type":"object","required":["line","token","word","phones","basis","source"],"properties":{"line":{"type":"string","maxLength":4000,"minLength":1},"word":{"type":"string","maxLength":4000,"minLength":1},"basis":{"enum":["dictionary","declared"],"type":"string"},"token":{"type":"integer","maximum":4000,"minimum":1},"phones":{"type":"array","items":{"type":"string","maxLength":4,"minLength":1},"maxItems":128,"minItems":1},"source":{"type":"string","maxLength":1000,"minLength":1}},"additionalProperties":false},"maxItems":128}}},"title":"Did this revision earn it?","logicalName":"lyric_verify","displayName":"Did this revision earn it?","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_recover","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. For lyrics the user supplied (a begin_lyrics phase 'edit' ses","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"lines":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"voices":{"type":"boolean"},"fallback":{"enum":["high","low"],"type":"string"},"lines_text":{"type":"string","maxLength":93063},"placements":{"type":"string","maxLength":200},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"pronunciations":{"type":"array","items":{"type":"object","required":["line","token","word","phones","basis","source"],"properties":{"line":{"type":"string","maxLength":4000,"minLength":1},"word":{"type":"string","maxLength":4000,"minLength":1},"basis":{"enum":["dictionary","declared"],"type":"string"},"token":{"type":"integer","maximum":4000,"minimum":1},"phones":{"type":"array","items":{"type":"string","maxLength":4,"minLength":1},"maxItems":128,"minItems":1},"source":{"type":"string","maxLength":1000,"minLength":1}},"additionalProperties":false},"maxItems":128}}},"title":"Structure a pasted song (the second door into the pipeline)","logicalName":"lyric_recover","displayName":"Structure a pasted song (the second door into the pipeline)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_check","description":"SESSION: pass the latest session_id. This call queues a background operation and returns its operation_id at once. Poll get_operation until it is no longer pending: a completed operation's content leads with this tool's own result blocks, private state withheld and the song or plan text exact — wherever this description speaks of the first content block, it is the first of those — and ends with the receipt holding the next session_id. For lyrics the user supplied (a begin_lyrics phase 'edit' ses","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"lines":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":463,"minItems":1},"groups":{"type":"string","maxLength":65536},"scheme":{"type":"string","maxLength":463},"voices":{"type":"boolean"},"returns":{"type":"string","maxLength":65536},"fallback":{"enum":["high","low"],"type":"string"},"relation":{"type":"string","maxLength":64},"blueprint":{"type":"string","maxLength":1048574},"lines_text":{"type":"string","maxLength":93063},"session_id":{"type":"string","pattern":"^[a-f0-9]{64}$"},"structures":{"type":"string","maxLength":65536},"subdivision":{"type":"integer","maximum":8,"minimum":1},"pronunciations":{"type":"array","items":{"type":"object","required":["line","token","word","phones","basis","source"],"properties":{"line":{"type":"string","maxLength":4000,"minLength":1},"word":{"type":"string","maxLength":4000,"minLength":1},"basis":{"enum":["dictionary","declared"],"type":"string"},"token":{"type":"integer","maximum":4000,"minimum":1},"phones":{"type":"array","items":{"type":"string","maxLength":4,"minLength":1},"maxItems":128,"minItems":1},"source":{"type":"string","maxLength":1000,"minLength":1}},"additionalProperties":false},"maxItems":128}}},"title":"Check pasted lyrics against a declared rhyme plan","logicalName":"lyric_check","displayName":"Check pasted lyrics against a declared rhyme plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lyric_types","description":"The full rhyme-type coordinate for one word pair: per-syllable agreement, anchor, identity, stress, boundary, EVERY traditional name the pair satisfies at the declared `position` (default end: two line-final words; names are judged at their own coordinate there, and a pair has many), every relation it answers side by side, and — in English — every coarse relation and registry schema the two words stand in as line ends. Taxonomy, not judgement — for bans use lyric_screen. Computation has a shared","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["word_a","word_b"],"properties":{"word_a":{"type":"string","maxLength":40},"word_b":{"type":"string","maxLength":40},"position":{"enum":["end","internal","leonine","cross","head","holorhyme"],"type":"string"}}},"title":"Classify one rhyme pair (the 9-axis coordinate)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"lyric_types","displayName":"Classify one rhyme pair (the 9-axis coordinate)"}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Codex-Musica&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AuY29kZXhtdXNpY2EuY29tL21jcCJ9"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Codex-Musica%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.codexmusica.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Codex-Musica%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.codexmusica.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Codex+Musica&connectorUrl=https%3A%2F%2Fmcp.codexmusica.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Codex-Musica\" --url \"https://mcp.codexmusica.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/codexmusica-mcp-7184d72f87","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/codexmusica-mcp-7184d72f87/tools/{tool}","mcpServerUrl":"https://mcp.codexmusica.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/codexmusica-mcp-7184d72f87?live=1"}