Internet Radio Stations MCP Server
Pricing
from $3.00 / 1,000 read operations
Internet Radio Stations MCP Server
Internet radio MCP server for Claude, ChatGPT and Cursor. Search tens of thousands of stations from the Radio Browser directory by genre, country, language, codec or bitrate, see what is trending, find stations nearby or similar to one you like, and check whether a stream works.
Pricing
from $3.00 / 1,000 read operations
Rating
0.0
(0)
Developer
MrBridge
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Share
📻 Internet Radio Stations MCP Server
Give Claude, ChatGPT, Cursor, VS Code or any MCP client a searchable directory of internet radio. This MCP server reads the Radio Browser community directory (tens of thousands of stations) through 14 read-only tools. They search and rank stations, open a full record with its stream URL, show recent stream checks, find stations close to a point or similar to another one, identify the station behind a stream URL and count what exists per genre or country. ChatGPT also gets its search and fetch pair.
Ask "find jazz stations in France that stream in AAC above 128 kbps and passed their last check" and your assistant calls music_search_stations. Back come matching stations, each with a stream URL and a homepage, its codec and bitrate, plus the outcome of its latest check, ready to open in your player.
Quick start
- Copy your Apify API token from Apify Console > Settings > API & Integrations.
- Point your MCP client at
https://mrbridge--internet-radio-mcp.apify.actor/mcpwith that token, as a Bearer header or as?token=in claude.ai and ChatGPT (Connect has every recipe). - Ask in plain language.
What this server exposes
This server gives an AI assistant read-only access to the Radio Browser community directory of internet radio stations through 14 tools. It searches stations by name, genre tag, country, region, language, codec and bitrate, ranks them (most listened in the last 24 hours, most voted, trending, recently added or changed), opens the full record of a station with its stream URL and homepage, shows the recent checks of a stream, finds stations near a point or similar to a given station, identifies the station behind a stream URL, and counts stations per genre, country, region and language. The ChatGPT search and fetch pair finds stations by name or genre and returns one station record as text. Radio Browser is public and keyless, so you need no credential beyond your Apify token, and every answer names its source. The server does not cover recorded music catalogues (artists, albums, tracks) and plays no audio.
Tools
| Tool | What it answers | Billed event |
|---|---|---|
music_search_stations | Search radio stations | tool-read |
music_browse_stations | Browse top, trending and new radio stations | tool-read |
music_get_station | Get one radio station | tool-read |
music_get_station_checks | Check whether a station stream works | tool-action |
music_find_stations_near | Find radio stations near a place | tool-read |
music_find_similar_stations | Find similar radio stations | tool-action |
music_find_station_by_stream_url | Find the station of a stream URL | tool-read |
music_list_genres | List radio genres and tags | tool-read |
music_list_countries | List countries with radio stations | tool-read |
music_list_regions | List regions of a country with radio stations | tool-read |
music_list_languages | List languages of radio stations | tool-read |
music_get_directory_stats | Get radio directory statistics | tool-read |
search | Search | tool-read |
fetch | Fetch | tool-read |
music_search_stations: Search radio stations
Use this when you need internet radio stations matching a name, a genre tag, a country, a region, a language, a codec or a minimum bitrate, for example jazz stations in France or AAC stations above 128 kbps. Do not use for rankings without a filter (music_browse_stations), places on a map (music_find_stations_near) or recorded music, albums or artists (not covered). Parameters, at least one filter: name (part of the name, e.g. "FIP"), exact_name, tag (e.g. "jazz"), exact_tag, all_tags (every tag must match, e.g. ["jazz","lounge"]), country_code (e.g. "FR"), region (e.g. "Bavaria"), language (e.g. "french" or "fr"), codec (e.g. "AAC", "MP3", "OGG", "FLAC"), min_bitrate_kbps (e.g. 128), https_only, include_broken (default false: stations whose last check failed are hidden), sort ("popularity" by listeners in the last 24 hours, default, "votes", "trending", "name", "bitrate", "recently_changed"), limit (1 to 50, default 10, at most 30 in detailed mode), offset, response_format ("detailed" adds coordinates, check times, favicon and all tags). Each station comes with its station_id, stream URL, homepage and radio-browser.info page.
| Parameter | Type | Required | Example |
|---|---|---|---|
name | string | no | "FIP" |
exact_name | boolean | no | false |
tag | string | no | "jazz" |
exact_tag | boolean | no | true |
all_tags | array of string | no | ["jazz","lounge"] |
country_code | string | no | "FR" |
region | string | no | "Bavaria" |
language | string | no | "french" |
codec | string | no | "AAC" |
min_bitrate_kbps | integer | no | 128 |
https_only | boolean | no | true |
include_broken | boolean | no | false |
sort | "popularity" or "votes" or "trending" or "name" or "bitrate" or "recently_changed" | no | "popularity" |
limit | integer | no | 10 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { stations[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
music_browse_stations: Browse top, trending and new radio stations
Use this when you need a ranking of internet radio stations: the most listened in the last 24 hours, the most voted, the trending ones (by the click trend Radio Browser reports) or the recently added or changed ones, worldwide or for one country, genre or language. Do not use for a name or several combined filters (music_search_stations) or stations near a place (music_find_stations_near). Parameters: by ("most_listened" default, "most_voted", "trending", "recently_changed"), country_code (e.g. "BR"), tag (e.g. "techno"), language (e.g. "spanish" or "es"), limit (1 to 50, default 10, at most 30 in detailed mode), offset, response_format. Stations whose last check failed are left out.
| Parameter | Type | Required | Example |
|---|---|---|---|
by | "most_listened" or "most_voted" or "trending" or "recently_changed" | no | "trending" |
country_code | string | no | "FR" |
tag | string | no | "techno" |
language | string | no | "french" |
limit | integer | no | 10 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { stations[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
music_get_station: Get one radio station
Use this when you need everything about one internet radio station: stream URL (resolved and as submitted), homepage, favicon, country, region, languages, all tags, codec, bitrate, HLS, online status, last check and change times, votes, listeners in the last 24 hours, coordinates. Do not use for finding stations (music_search_stations) or the history of its stream checks (music_get_station_checks). Parameter: station_id (the UUID from another tool, e.g. "960e57c5-0601-11e8-ae97-52543be04c81", or a radio-browser.info station page URL).
| Parameter | Type | Required | Example |
|---|---|---|---|
station_id | string | yes | "960e57c5-0601-11e8-ae97-52543be04c81" |
Returns { station, next_steps[], attribution }. Upstream: Radio Browser. Cache: hourly (1 hour). Read-only.
music_get_station_checks: Check whether a station stream works
Use this when you need to know whether an internet radio stream has been working: the recent online checks of one station, newest first, with a summary (checks that passed and failed, last success, last failure, check servers). Radio Browser checks stations from several check servers and keeps up to 30 days of results, sometimes only a few checks. Do not use for the station record itself (music_get_station). Parameters: station_id (UUID, e.g. "960e57c5-0601-11e8-ae97-52543be04c81"), limit (1 to 30, default 10), offset, response_format ("detailed" adds the resolved stream URL, server software, sampling rate and check duration).
| Parameter | Type | Required | Example |
|---|---|---|---|
station_id | string | yes | "960e57c5-0601-11e8-ae97-52543be04c81" |
limit | integer | no | 10 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { station, summary, checks[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: hourly (1 hour). Read-only.
music_find_stations_near: Find radio stations near a place
Use this when you need internet radio stations located near a point, nearest first, for example local stations around a city. Only stations that publish coordinates are found. Do not use for a whole country or region (music_search_stations with country_code or region). Parameters: latitude (-90 to 90, e.g. 48.8566), longitude (-180 to 180, e.g. 2.3522), radius_km (1 to 1000, default 50), tag (optional genre, e.g. "jazz"), limit (1 to 50, default 10, at most 30 in detailed mode), offset, response_format. The 200 most listened stations within the radius are ranked by distance, each with distance_km.
| Parameter | Type | Required | Example |
|---|---|---|---|
latitude | number | yes | 48.8566 |
longitude | number | yes | 2.3522 |
radius_km | number | no | 50 |
tag | string | no | "jazz" |
limit | integer | no | 10 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { stations[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
music_find_similar_stations: Find similar radio stations
Use this when you need internet radio stations like a given one: stations sharing its most widely used genre tag, ranked by the number of shared tags, then by listeners, by default in the same country. Do not use for stations by name or by free filters (music_search_stations). Parameters: station_id (UUID, e.g. "960e57c5-0601-11e8-ae97-52543be04c81"), same_country (default true), same_language (default false), limit (1 to 30, default 10), offset, response_format. Each result lists its shared_tags. Generic tags such as "music" or "radio" are ignored.
| Parameter | Type | Required | Example |
|---|---|---|---|
station_id | string | yes | "960e57c5-0601-11e8-ae97-52543be04c81" |
same_country | boolean | no | true |
same_language | boolean | no | false |
limit | integer | no | 10 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { source, stations[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
music_find_station_by_stream_url: Find the station of a stream URL
Use this when you have an internet radio stream URL (from a playlist file, a player or a log) and need the station it belongs to. Only an exact URL match counts. Do not use for station names or web pages (music_search_stations). Parameters: stream_url (http or https, e.g. "http://stream.example.com/mp3_128"), response_format ("detailed" adds coordinates, check times and all tags). Returns up to 20 stations and the number of matches.
| Parameter | Type | Required | Example |
|---|---|---|---|
stream_url | string | yes | "http://stream.example.com/mp3_128" |
response_format | "concise" or "detailed" | no | "concise" |
Returns { stations[], match_count, notice, next_steps[], attribution }. Upstream: Radio Browser. Cache: hourly (1 hour). Read-only.
music_list_genres: List radio genres and tags
Use this when you need the genre and topic tags used by internet radio stations, with the number of working stations for each, for example how many stations play techno or which jazz sub-genres exist. Do not use for the stations themselves (music_search_stations with tag). Parameters: name_contains (e.g. "jazz"), min_stations (default 1, e.g. 10 to skip rare tags), limit (1 to 100, default 25), offset, response_format ("detailed" adds cache information). Without name_contains, the 1,000 most used tags are listed. Tags are free text chosen by the community, so spellings vary.
| Parameter | Type | Required | Example |
|---|---|---|---|
name_contains | string | no | "jazz" |
min_stations | integer | no | 10 |
limit | integer | no | 25 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { genres[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: daily (1 day). Read-only.
music_list_countries: List countries with radio stations
Use this when you need the countries that have internet radio stations, with their ISO code and number of working stations, or the code of a country before filtering by it. Do not use for regions inside a country (music_list_regions) or the stations themselves (music_search_stations). Parameters: name_contains (part of the English name or the code, e.g. "united"), sort ("stations" default or "name"), limit (1 to 250, default 25), offset, response_format ("detailed" adds cache information).
| Parameter | Type | Required | Example |
|---|---|---|---|
name_contains | string | no | "united" |
sort | "stations" or "name" | no | "stations" |
limit | integer | no | 25 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { countries[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: daily (1 day). Read-only.
music_list_regions: List regions of a country with radio stations
Use this when you need the regions or states of one country that have internet radio stations, with the number of working stations for each, for example before searching the stations of Bavaria. Region names are free text from the directory, so one region can appear under several spellings. Do not use for countries (music_list_countries). Parameters: country_code (required, e.g. "DE"), name_contains (e.g. "berlin"), limit (1 to 100, default 25), offset, response_format ("detailed" adds cache information).
| Parameter | Type | Required | Example |
|---|---|---|---|
country_code | string | yes | "FR" |
name_contains | string | no | "berlin" |
limit | integer | no | 25 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { country, regions[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: daily (1 day). Read-only.
music_list_languages: List languages of radio stations
Use this when you need the languages spoken on internet radio stations, with the number of working stations for each and the ISO 639 code when known. Do not use for the stations themselves (music_search_stations with language). Parameters: name_contains (part of the English name, e.g. "german"), sort ("stations" default or "name"), limit (1 to 100, default 25), offset, response_format ("detailed" adds cache information).
| Parameter | Type | Required | Example |
|---|---|---|---|
name_contains | string | no | "german" |
sort | "stations" or "name" | no | "stations" |
limit | integer | no | 25 |
offset | integer | no | 0 |
response_format | "concise" or "detailed" | no | "concise" |
Returns { languages[], pagination, next_steps[], attribution }. Upstream: Radio Browser. Cache: daily (1 day). Read-only.
music_get_directory_stats: Get radio directory statistics
Use this when you need the size of the Radio Browser directory: stations, broken stations, tags, languages, countries, listener clicks in the last hour and day, and optionally the most used audio codecs with their station counts. Do not use for per-country or per-genre counts (music_list_countries, music_list_genres). Parameter: include_codecs (default false, e.g. true).
| Parameter | Type | Required | Example |
|---|---|---|---|
include_codecs | boolean | no | true |
Returns { directory, codecs[], next_steps[], attribution }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
search: Search
Use this when ChatGPT needs to find internet radio stations by name or genre in the Radio Browser directory. Do not use for recorded music, artists or albums (not covered), or for filters by country, language or bitrate (the prefixed music_ tools). Parameter query (string), e.g. "jazz" or "BBC". Returns up to 10 working stations, the most listened first, with their station UUID as id.
| Parameter | Type | Required | Example |
|---|---|---|---|
query | string | yes | "jazz" |
Returns { results[], notices[] }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
fetch: Fetch
Use this when ChatGPT needs the full record of one station returned by search, as text: stream URL, homepage, country, languages, tags, codec, bitrate, online status and popularity. Do not use for ids that did not come from search. Parameter id (a station UUID from search), e.g. "960e57c5-0601-11e8-ae97-52543be04c81".
| Parameter | Type | Required | Example |
|---|---|---|---|
id | string | yes | "960e57c5-0601-11e8-ae97-52543be04c81" |
Returns { id, title, text, url, metadata, notices[] }. Upstream: Radio Browser. Cache: intraday (5 minutes). Read-only.
Connect
Endpoint (Streamable HTTP): https://mrbridge--internet-radio-mcp.apify.actor/mcp
Every client authenticates with your Apify API token, found in Apify Console > Settings > API & Integrations. Clients that support custom headers send it as Authorization: Bearer <token>. The others use the ?token= URL variant, which must be treated as a secret: keep it out of commits, screenshots and shared logs.
Claude Code
$claude mcp add --transport http internet-radio "https://mrbridge--internet-radio-mcp.apify.actor/mcp" --header "Authorization: Bearer ${APIFY_TOKEN}"
Cursor, VS Code and other JSON configurations
{"mcpServers": {"internet-radio": {"type": "http","url": "https://mrbridge--internet-radio-mcp.apify.actor/mcp","headers": {"Authorization": "Bearer ${APIFY_TOKEN}"}}}}
claude.ai and Claude Desktop
Add a custom connector with the URL https://mrbridge--internet-radio-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN and no authentication. Prefilled link (replace the token placeholder before saving): add Internet Radio Stations MCP Server to Claude.
ChatGPT (developer mode)
Settings > Apps > Create, URL https://mrbridge--internet-radio-mcp.apify.actor/mcp?token=YOUR_APIFY_TOKEN, authentication "No authentication". ChatGPT snapshots the tool list: after a server update, an admin has to click Refresh on the app.
OpenAI Responses API
{"type": "mcp","server_label": "internet_radio","server_url": "https://mrbridge--internet-radio-mcp.apify.actor/mcp","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"},"require_approval": "never"}
Add allowed_tools to restrict the tool list. Tool calls must finish within about 60 seconds on this API, and every tool of this server answers in under 50 seconds.
Anthropic Messages API
{"mcp_servers": [{"type": "url","url": "https://mrbridge--internet-radio-mcp.apify.actor/mcp","name": "internet-radio","authorization_token": "YOUR_APIFY_TOKEN"}],"tools": [{"type": "mcp_toolset","mcp_server_name": "internet-radio"}]}
Send the beta header anthropic-beta: mcp-client-2025-11-20.
One-click OAuth alternative
https://mcp.apify.com/?tools=mrbridge/internet-radio-mcp connects through Apify OAuth without a token. It exposes the Actor as a single tool rather than the granular tools listed above.
Cost control
Each Standby run has a spending limit (maxTotalChargeUsd). When a call uses the last of it, the result is still returned, and later calls in that run answer CHARGE_LIMIT_REACHED until the limit is raised.
Why use this server
- Filters that combine. Mix genre tag, country or region, language, codec, minimum bitrate and HTTPS in one search, sorted by listeners, votes or name.
- Know before you press play. Several check servers test each stream: see how often it passed or failed lately, and when it last worked.
- Discovery beyond search. Stations near a point ranked by distance, and stations like one you enjoy, ranked by shared genre tags.
- Reverse lookup. Paste a stream URL from a playlist or a log and get the station behind it.
- Directory-wide numbers. How many stations exist per genre or country, down to regions and languages, and which codecs dominate.
- Links only. Nothing is played, recorded or hosted here. Audio stays with its broadcasters.
Pricing (Pay-per-Event)
| Event | Charged when | Price |
|---|---|---|
apify-actor-start | run start (platform default) | see the Store page |
tool-read (primary event) | each successful read tool call | see the Store page |
tool-action | each successful call of a detailed or computed tool | see the Store page |
Never charged: initialize, tools/list, pings, readiness probes, and any call that ends in an error (invalid input, not found, upstream failure, timeout, spending limit).
Platform usage comes on top of these events. This server runs in Apify Standby mode, and you also pay the platform usage of your own Standby run, billed to your Apify account like any other run: the memory set for the Standby run, for as long as the server is up, idle time included, until the run stops at its idle timeout. The Apify pay-per-event documentation says so: "For runs in Standby mode, users always pay the platform usage costs in addition to the event charges."
Limits, caveats and attribution
- Attribution. Each answer carries an
attributionblock. Radio Browser places its data in the public domain and asks for no credit, so the credit line is a courtesy. This server is not affiliated with or endorsed by Radio Browser. - Third-party streams. Stream URLs and homepages point to the broadcasters. This server returns links only: it never plays, records or hosts audio. Whether you may play or rebroadcast a stream depends on the broadcaster and on the rules where you are. The fee for this server pays for the service (hosting, caching, normalisation), not for a licence on any stream.
- Community data. Anyone can add a station, so names, tags, languages, regions and coordinates can be wrong, misspelled or missing. Genre tags and region names are free text, and one genre or region can appear under several spellings.
- Working stations. Radio Browser re-checks each stream regularly: on 2026-10-13, every station read had been checked within the previous 2 days. Stations whose last check failed are hidden unless you ask for them, a stream can stop working between two checks, and stations that have not worked for 6 days are removed from the directory, so a
station_idcan disappear. - Popularity. "Most listened" counts the plays recorded by apps that use Radio Browser in the last 24 hours. It is not an audience measurement.
- Paging. Radio Browser does not report result counts, so
totalis a lower bound for searches and rankings, withhas_moreandnext_offsetto continue. A page is shortened when its rows would make the answer too large, and says so. Rankings can shift between two pages. - Nearby stations. Only stations that publish coordinates are found. The 200 most listened stations within the radius are ranked by distance.
- Freshness and load. Radio Browser documents no rate limit. This server keeps to 2 requests per second per instance and caches answers: 5 minutes for station lists, 1 hour for station records and checks, 1 day for genres, countries, regions and languages. Radio Browser runs several federated servers: when one fails, the next one answers. When all of them fail, an older cached copy can be served, marked
stalein thecacheblock. - Not covered. Artists, albums, tracks, lyrics, charts and audio playback.
Data terms
Station records come from the Radio Browser community directory (https://www.radio-browser.info), whose data is in the public domain. No credit is required, though every answer keeps one as a courtesy.
Every stream URL, homepage or favicon points to a third-party broadcaster, who keeps all rights in its programmes, its name and its logo. This server returns links only. It never plays, records, hosts or rebroadcasts audio, and its fee pays for the service (hosting, caching, normalisation), not for a licence on any stream. Before you play a stream in a public place or inside a product, check the broadcaster's terms and the rules where you operate.
To report a station link that should not be listed, open an issue on the Issues tab.
Use cases
- Listening assistants. Ask for a station that fits a mood, a language you are learning or a city you miss, and get a stream URL to open.
- Radio and player apps. Developers prototype station search, "near me" and "similar stations" features with an AI agent before writing their own client.
- Playlist maintenance. Find out whether the entries of an M3U file or a player config still work, and identify unknown URLs.
- Market overviews. Count stations by genre, language or region, for example how many working stations play techno in Germany.
FAQ
Does it play music, or know artists and albums?
No to both. It hands your own player links to broadcasters' streams and homepages, and it holds stations only, with no recorded-music catalogue.
How fresh is the station data?
Radio Browser tests streams on a rolling basis, so the latest result can be a few days old, and stations failing for 6 days leave the directory. A feed can die between two tests, so glance at the latest result before relying on it.
Is the data reliable?
Anyone can add a station, so a name, a tag or a position on the map can be wrong or misspelled. "Most listened" counts plays from apps that use the directory: it is not an audience measurement.
What does a call cost?
Each successful tool call is one event, at the price shown on the Pricing tab for your Apify plan: tool-action for music_get_station_checks and music_find_similar_stations, tool-read for every other tool. Paid Apify plans get lower prices. On the free plan, a read costs $0.005 and an action $0.01, so 100 reads come to $0.50 in events. On top of that, your Apify account pays the platform usage of your own Standby run while the server is up, idle minutes included. Errors are never charged, and maxTotalChargeUsd caps what one run can spend.
Why is the first call slower?
The first call after a quiet period starts a new Standby run on your Apify account, which takes a few seconds. Then it answers quickly, and it shuts down after about 5 idle minutes.
Is this server affiliated with Radio Browser?
No. It reads their public API, and Radio Browser does not endorse it.
Your feedback
Found a bug or a station link that should not be listed? Tell us on the Issues tab.
More MCP servers, scrapers and data studies from the same team: mr-bridge.com.
Changelog
- 0.1.4: Output, dataset and key-value store schemas, as Apify asks for publication: the Output tab of a run started from the Console shows the connection details and one row per tool.
- 0.1.3: the Input tab shows the endpoint and how to connect an AI client, and a run started from the Console outputs the connection details and the tool list
- 0.1.2: pricing events tool-read and tool-action
- 0.1.1: fixes from the first live capture: regions are read for the requested country only (small countries no longer come back empty), similar stations match the station's most widely used genre tag, web addresses no longer appear as languages or genres, and the trending and stream check descriptions follow what Radio Browser reports
- 0.1.0: initial build (private, unpublished)