FastMCP server wrapping FreeSound API for CC0-licensed sound effects search and download
sfx_search is a multi-operation mega-tool combining 6 distinct responsibilities (search, download, tag, list, describe, play) into one tool with an 'operation' enum. This violates the single-responsibility principle and forces LLMs to reason about which operation to invoke. Descriptions are present but verbose (500+ chars) and lack clarity on when to use each operation. Parameters are well-typed with enums and defaults, but the tool's complexity makes it error-prone. show_sfx_browser_card has minimal description (50 chars) and empty input schema, making it difficult for LLMs to understand its purpose and when to invoke it. No output schemas are documented for either tool.
[RATIONALE] Consolidated portmanteau for all FreeSound operations — search, download, tag, list local cache, and describe metadata — to avoid tool explosion while keeping related sound-effect operations grouped. Operations: - search: Query FreeSound's CC0 sound database. Supports duration filter, tags, pagination. - download: Download a sound's original file to local disk. Requires sound_id. - tag: Assign a user-defined tag to a locally cached sound. - list_local: List all locally cached sounds, optionally filtered by tag. - describe: Get full metadata for a specific sound from FreeSound. - play: Play a locally cached sound file using the system default player. ## Return Format {"success": bool, "message": str, "data": {...}} ## Examples sfx_search(operation="search", query="thunder", duration_max=30) sfx_search(operation="download", sound_id=12345) sfx_search(operation="list_local", tag_filter="sfx") sfx_search(operation="play", sound_path="data/sounds/thunder.wav")
Show locally cached sound effects as a rich in-chat Prefab card. Displays sound names, duration, tags, and local file paths for every sound that has been downloaded. Useful for browsing your SFX library without leaving the chat. ## Return Format {"success": bool, "content": str, "structured_content": {...}}
sfx_search combines 6 operations (search, download, tag, list_local, describe, play) into a single tool. This violates single-responsibility principle and forces LLMs to reason about which operation to invoke. Should be split into separate tools: search_sounds, download_sound, tag_sound, list_cached_sounds, describe_sound, play_sound.
show_sfx_browser_card has empty input schema ({}) and minimal description (50 chars). LLMs cannot determine what this tool does or when to call it. Description should explain: displays cached sounds as rich cards, useful for browsing library without leaving chat, returns structured content with sound names/duration/tags/paths.
No output schemas documented for either tool. sfx_search returns {success, message, data} but 'data' structure is undefined. show_sfx_browser_card returns {success, content, structured_content} but field types/structure are not specified. LLMs cannot plan downstream operations without knowing response structure.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2025-06-18+ | v2 |
sfx_search description is 500+ characters and mixes operation-specific details inline. Should be split: tool description explains the mega-tool pattern, then each operation documented separately in parameter descriptions or as distinct tools. Current format wastes tokens and buries key details.
No error handling guidance. What happens if sound_id is invalid? If download fails? If local cache is full? Responses should guide LLM recovery: 'Sound not found. Try search_sounds() first.' Current pattern returns {success, message} but message content/format is not specified.