Radio Browser and Playback MCP Server - provides tools for searching radio stations, playback control, and station management via the Radio Browser API
This MCP server exposes 24 radio playback and discovery tools with moderate quality. All tools have descriptions (meeting baseline), and schemas are present with type definitions for most parameters. However, descriptions are frequently generic or under-explained, parameter descriptions are often minimal, and output schemas are entirely undocumented. Error handling is absent, tools return raw API responses without recovery guidance. The server mixes READ_ONLY operations (search, discovery) with WRITE operations (add/remove favorites, playback control) without clear risk delineation in descriptions. Many parameters lack constraints (enums, ranges, formats), forcing LLMs to guess valid inputs. The composition is reasonable, tool names follow verb_noun pattern, but the lack of structured, LLM-optimized descriptions and missing output documentation significantly limits production readiness.
NO DOCUMENTED OUTPUT SCHEMAS. None of the 24 tools document what they return. LLMs cannot predict the response structure, forcing them to guess which fields contain IDs for downstream tool calls (e.g., does play_radio_station return a station_id? does add_favorite return anything?). This is a critical gap for tool chaining.
Document output schema for ALL 24 tools. For search tools, specify: 'Returns array of station objects, each containing {url (string), name (string), country (string), tags (array), votes (int), clicks (int), bitrate (int)}.' For playback tools, specify: 'Returns {status (string: playing|paused|stopped), current_url (string), volume (int), elapsed_ms (int)}.'
Add enum constraints for parameter validation. For search_stations_by_country_code, use enum with ISO 3166-1 alpha-2 codes. For get_available_tags 'order', use enum ['stationcount', 'name']. For set_radio_volume and host_player_set_volume, add minValue: 0, maxValue: 100.
Expand descriptions from 10-50 chars to 50-150 chars using the WHAT/WHEN/RETURN pattern. E.g., 'Search radio stations by genre tag. Call this when the user specifies a music type (e.g., rock, pop, classical). Returns array of matching stations with names, countries, and stream URLs.'
Document error handling for each tool. E.g., 'search_stations_by_tag: If no results found, suggest using get_available_tags to see valid genres. If API is down, retry with exponential backoff or suggest using get_top_voted_stations as fallback.'
Add explicit side-effect declarations to WRITE tools. Prefix descriptions with 'MODIFIES STATE:' for play_radio_station, add_favorite, remove_favorite, set_radio_volume. Note which tools are reversible (pause/resume are symmetric; remove_favorite cannot be undone without re-adding).
Specify pagination behavior for all list/search tools. Add to description: 'Results are capped at [limit] entries. If more exist, call again with offset or cursor. To fetch all stations, iterate until results.length < limit.'
MISSING PARAMETER CONSTRAINTS (enums, min/max). Tools like search_stations_by_tag accept 'tag' as a free-form string with no enum. search_stations_by_country_code accepts 'country_code' with example values but no enum constraint. LLMs will hallucinate invalid tags or country codes. Parameter descriptions mention format hints ('Two-letter country code', 'Volume level 0-100') but do not enforce them as JSON Schema constraints.
GENERIC OR MINIMAL DESCRIPTIONS. Many tools have descriptions under 50 characters or without context on when to use them. Examples: 'Get Radio Browser statistics' (no detail on what statistics), 'Search radio stations by name' (no mention of partial match behavior), 'Get the current radio playback status' (no indication of possible values). LLMs cannot disambiguate between similar tools without richer descriptions.
NO ERROR HANDLING GUIDANCE. Tools have no documented error conditions, recovery paths, or actionable error messages. If a search returns zero results, should the LLM try a broader tag? If play_radio_station fails due to invalid URL, should it retry or ask the user? Missing error documentation prevents the LLM from self-correcting.
WRITE TOOLS LACK SIDE-EFFECT DECLARATIONS. Tools like play_radio_station, add_favorite, remove_favorite, and set_radio_volume modify state but descriptions do not explicitly say so. LLMs need to know which calls are safe to retry and which have irreversible consequences.
MISSING PAGINATION DOCUMENTATION. Tools like get_favorite_stations, get_recent_stations, get_top_stations accept a 'limit' parameter, but no description of whether there are more results, what the total count is, or how to fetch the next page. If a user has 100 favorites but limit defaults to 10, the LLM has no way to know it only fetched 10% of the data.
COMPOSITION GAP: NO CROSS-TOOL GUIDANCE. Tools like search_stations_by_tag do not reference get_available_tags as a discovery step. Tools like add_favorite do not explain how to get a 'stationuuid' from search results. Missing cross-tool documentation forces LLMs to infer dependencies, risking inefficient multi-step plans.
search_stations_by_tagadd_favorite
Add tool-chaining notes to discovery/search tools. E.g., search_stations_by_tag: 'To see valid tags, call get_available_tags first. Returns station URLs suitable for play_radio_station and stationuuids suitable for add_favorite.'
Validate all parameter constraints in the implementation (not just description). Use pydantic or similar to enforce minValue/maxValue, enum, pattern. Return actionable errors: 'Invalid volume: 150. Must be 0-100.' not '500 Internal Server Error.'
Deprecate or clarify Windows SMTC Host tools. If they are optional/Windows-only, add a conditional note: 'Only available on Windows. Check host_health_check before calling.' If they are experimental, mark them as such.
Add a discovery tool or documentation that maps user intents to tool sequences. E.g., 'To play a station by genre: 1) call get_available_tags to see genres, 2) call search_stations_by_tag with chosen genre, 3) call play_radio_station with returned URL.'