Professional multi-interface music analysis server built on music21, providing MCP Server, HTTP API, CLI tools, and Python library interfaces for comprehensive music analysis and composition.
Server has 5 music-domain tools with clear names and reasonable descriptions, but significant gaps in parameter documentation, output schema clarity, and error handling. Naming follows verb_noun conventions (chord_analysis, counterpoint_generator, delete_score, export_score, harmonization). Descriptions are present and substantive (120-260 chars, within baseline range), but parameter descriptions are sparse or missing. Input schemas visible for all tools with proper type definitions, but output schemas are not documented anywhere in the source provided. No error handling guidance, no per-tool permission scoping, no recovery hints. Tool composition is reasonable, each tool does one thing, but lacks idempotent/destructive operation guidance needed for agent planning.
Analyze chord progressions in a score. Extracts chord progressions with Roman numeral analysis, includes harmonic rhythm analysis, and generates summary statistics about chord usage.
Generate counterpoint for a given cantus firmus. Supports all five species of counterpoint (1:1, 2:1, 3:1, 4:1, and florid) with strict Fux rules or relaxed modern rules. Can generate counterpoint above or below the cantus firmus.
Delete a score or all scores from memory. Can delete individual scores by ID or all scores with wildcard '*'.
Export a score to various formats including MIDI, MusicXML, ABC, LilyPond, PDF, PNG, Braille, and text.
Harmonize a melody in the specified style (classical, jazz, pop, modal). Analyzes melodic contour and generates appropriate harmony with explanations for harmonic choices.
Output schemas not documented. LLMs cannot plan downstream calls or extract specific fields from results. Rubric requires: 'Document the output schema. LLMs need to know what fields to expect so they can plan downstream tool calls and extract the right data.' [pattern:tool]
Parameter descriptions are minimal or absent. 'segment_length' in chord_analysis has description 'Segment length for chordify (in quarter notes)' but no guidance on valid range, typical values, or why it matters. Most parameters lack actionable format guidance. Rubric requires: 'Every parameter needs a description explaining what it controls.' and 'Describe the expected format, range, and allowed values directly in the parameter description.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 34 | - | v1 |
Destructive tool (delete_score) lacks confirmation/dry-run capability. No error guidance on what happens when deleting all scores ('*') or a nonexistent score_id. Rubric requires: 'Irreversible operations (delete, send, publish) should support a dry-run or confirmation step.' and 'Error responses must tell the LLM what to do next.' [pattern:confirmation-request] and [pattern:recovery-guide]
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) in schemas. MCP spec (2026-07-28) rewards structured tool output and tool annotations for agent planning. delete_score and counterpoint_generator should be annotated @destructiveHint to signal irreversible operations.
No error handling guidance. Rubric requires: 'Categorize errors as retryable, user-fixable, or fatal.' and 'Include the invalid value and the constraint it violated.' No example error responses shown. Tools should return 'rule_set must be one of: strict, relaxed, custom' when invalid, not a generic 500 error.
score_id parameter in all tools requires more guidance. Are IDs opaque UUIDs? Short strings? What if score_id doesn't exist? Rubric requires: 'When a parameter could be an ID, name, email, or position, suffix it with the type' and 'When a resource is not found, return available alternatives.'
No permission/scope declarations. Rubric requires: 'Each tool should declare what permissions it requires (e.g. "read:email", "write:calendar").' Music21 tools should declare scopes like read:music, write:music, delete:music to enable least-privilege agent configuration.
Batch operations missing. Rubric suggests: 'Offer batch variants for tools agents call in loops.' If agents analyze multiple scores' chords, they should call chord_analysis_batch() once rather than 5 sequential calls.