MIDI composition server with FluidSynth audio synthesis, soundfont management, and real-time collaboration support
synth-mcp has 16 tools with basic schemas and descriptions, but significant quality gaps. Most tool descriptions are terse (10-50 chars) and lack actionable context for LLM selection. Parameter descriptions exist but are minimal. No output schemas documented. Error handling is absent, tools return Dict with 'success' and 'error' fields but provide no recovery guidance. Tool names are clear (verb_noun pattern), but composition issues exist: create_project, create_track, mute_track, solo_track, set_track_volume, set_track_pan are all WRITE operations on the same resource with no idempotency guarantees or confirmation patterns. No tool annotations (readOnlyHint, destructiveHint). Schemas present but incomplete, many parameters lack constraints (e.g., channel 0-15 not enforced, volume/pan ranges undefined). Per-tool average: 42/100.
Add a new soundfont to FluidSynth. Args: soundfont_path: Path to the .sf2 soundfont file Returns: Dict containing success status and soundfont ID if successful
Create a new MIDI composition project. For a complete example of how to use the MIDI composition server, including: - Creating tracks with different instruments - Adding notes with proper timing and velocity - Exporting to MIDI and audio - Using MIDI settings for timing calculations Try running demonstrate_workflow() to see a working example.
Create a new track in the specified project. Args: project_name: Name of the project track_name: Name of the track instrument: Name of the instrument (must match a soundfont name from list_available_soundfonts()) channel: MIDI channel number (0-15) Returns: Dict containing success status and error message if failed
Get debug information about a project.
Search for and download a soundfont by name. Args: search_term: The name or partial name of the soundfont to search for Returns: Dict containing success status and either the downloaded file path or error message
Descriptions too terse (10-50 chars), mute_track, solo_track, set_track_volume, set_track_pan, debug_project lack context for LLM selection. Baseline is 194 chars; these are 25-40 chars.
No output schemas documented. Tools return Dict with 'success' and 'error' fields, but LLM cannot infer structure of nested objects (e.g., what fields are in track info, project info). Baseline: 100% of A+ tools document return types.
No error recovery guidance. Tools return {'success': false, 'error': '...'} but do not tell LLM what to do next (retry? call discovery tool? ask user?). Baseline: error responses must guide recovery.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | <=2025-11-25 | v2 |
Export the current project to an audio file. Args: project_name: Name of the project to export output_path: Path where the audio file should be saved (will be saved in the audio directory) format: Audio format (wav, mp3, etc.) Returns: Dict containing success status and error message if failed
Export a project as a MIDI file.
Search for a soundfont by name in the soundfontSources.json file. Args: search_term: The name or partial name of the soundfont to search for Returns: Dict containing success status and matching soundfont info if found
Get information about a project.
List all available projects.
List all loaded soundfonts. Returns: Dict containing success status and list of loaded soundfonts
Mute a track in the specified project.
Remove a soundfont from FluidSynth. Args: soundfont_id: ID of the soundfont to remove Returns: Dict containing success status and error message if failed
Set the pan of a track in the specified project.
Set the volume of a track in the specified project.
Solo a track in the specified project.
Parameter constraints missing. channel (0-15), volume/pan ranges, tempo bounds, time_signature format not enforced in schema. LLM can pass invalid values (channel=99, volume=1000).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLM cannot distinguish safe reads from destructive writes. remove_soundfont is destructive but unmarked; mute_track is idempotent but unmarked.