internet-radio-mcp
This read-only MCP server lets you discover internet radio stations and get their stream URLs.
Search stations by name, genre/tag, country code, and language, sorted by votes, recent plays, or bitrate.
Fetch one station's details by Radio Browser ID, including its direct stream URL and 72FM listen URL.
List top or trending stations by votes, clicks, or trend, optionally filtered by country and genre.
List countries with working-station counts and 72FM country-page links.
List popular genre tags to use in searches.
Use the
find_radioprompt to find stations for a mood, place, activity, or genre.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@internet-radio-mcp Find jazz stations in Brazil"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
internet-radio-mcp
An open-source Model Context Protocol (MCP) server for internet radio. It lets Claude, Cursor, VS Code Copilot and other MCP clients search radio stations worldwide and get their direct stream URLs. It also lists top and trending stations, countries and genres.
The station data comes from Radio Browser, a community-maintained, public-domain directory with over 50,000 stations that have working streams. The server is built by 72FM, a free web radio player built on the same directory. Every result includes a listen_url that plays the station in the browser on 72FM, as well as the station's own stream_url.
Stations belong to their broadcasters. Neither 72FM nor this server owns, operates or curates them. Anyone can add or edit entries in the directory, so a stream can occasionally be offline.
No API key, no account, read-only.
5 tools, 1 prompt, stdio transport.
Runtime dependencies:
@modelcontextprotocol/server(the official MCP TypeScript SDK, v2) andzod.
Example questions
"Find jazz stations in Brazil"
"What are the most popular stations in Japan?"
"Give me the stream URL for BBC World Service"
"What's trending on internet radio right now?"
"Which countries have the most radio stations?"
"What genres can I search for? Then find me some lofi stations."
Related MCP server: radiomcp
Install
Requires Node.js 20 or newer. The server is published on npm as internet-radio-mcp and runs with npx, so there is nothing to install globally.
Claude Code
claude mcp add internet-radio -- npx -y internet-radio-mcpThen run /mcp in a session to confirm that internet-radio is connected.
Claude Desktop
Open Settings → Developer → Edit Config. This opens claude_desktop_config.json: on macOS it is at ~/Library/Application Support/Claude/claude_desktop_config.json, and on Windows at %APPDATA%\Claude\claude_desktop_config.json. Add:
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "internet-radio-mcp"]
}
}
}Restart Claude Desktop.
Cursor
Add to Cursor with one click, or add the server to ~/.cursor/mcp.json to use it everywhere, or to .cursor/mcp.json to use it in one project:
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "internet-radio-mcp"]
}
}
}VS Code (GitHub Copilot, Agent mode)
Install in VS Code with one click, or add the server to .vscode/mcp.json, or run MCP: Add Server from the Command Palette:
{
"servers": {
"internet-radio": {
"type": "stdio",
"command": "npx",
"args": ["-y", "internet-radio-mcp"]
}
}
}Gemini CLI
gemini extensions install https://github.com/AlonDrilich/internet-radio-mcpThe repository carries a gemini-extension.json, so the server is added as the internet-radio extension.
Other clients
Any MCP client that can launch a stdio server can use the same command: npx -y internet-radio-mcp.
The first launch downloads the package from npm, which takes a few seconds. Later launches use the npx cache.
Docker
The same server is published as a container image, and is listed in the official MCP Registry as io.github.AlonDrilich/internet-radio-mcp:
docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:latestIn a client config, use "command": "docker" with "args": ["run", "-i", "--rm", "ghcr.io/alondrilich/internet-radio-mcp:latest"].
Tools
All tools are read-only and annotated with readOnlyHint: true and openWorldHint: true. Each result contains:
a one-line summary,
the same data as JSON text,
structuredContentthat matches the tool'soutputSchema.
Broken streams (streams that failed the directory's last automated check) are excluded from searches.
Tool | Arguments | Returns |
|
| Matching stations |
|
| One station |
|
| Most voted, most played, or trending stations |
|
| Country name, ISO code, station count and 72FM country page ( |
|
| Top genre tags by station count. Placeholder and non-genre tags are filtered out (e.g. |
Station fields
{
"id": "963fa65f-0601-11e8-ae97-52543be04c81",
"name": "Antena 1 São Paulo, SP (ZYD823 94,7 MHz FM) [aac]",
"country": "Brazil",
"countrycode": "BR",
"language": "portuguese",
"tags": ["adult contemporary", "jazz", "pop", "smooth jazz"],
"codec": "AAC+",
"bitrate": 96,
"homepage": "http://antena1.com.br/",
"stream_url": "http://antena1.newradio.it/stream?ext=.mp3",
"favicon": null,
"votes": 33238,
"lastcheckok": true,
"listen_url": "https://72fm.com/station/963fa65f-0601-11e8-ae97-52543be04c81?source=mcp"
}stream_urlis the directory's resolved stream URL, or the original URL when no resolved one exists.listen_urlplays the station in the browser on 72FM. The?source=mcpat the end only tells 72FM that the visit came from this server (apps send no referrer); it carries no id and nothing about you or your question.tagsholds up to 8 tags.
Prompt
find_radio(request) finds stations for a mood, place, activity or genre, for example "calm jazz for a rainy evening" or "radio from Lisbon".
Untrusted data
Station names, tags, languages, countries and URLs come from a public directory that anyone can edit, and the server hands them to an AI assistant. The server therefore treats every field as untrusted input:
Text is reduced to a single line: line breaks and control characters become spaces; zero-width characters, bidirectional controls, private-use code points, the invisible Unicode "tag" characters and every other invisible "default-ignorable" code point (variation selectors, fillers, joiners) are removed, except the emoji selector and the zero-width joiners that real text needs, which survive only in runs of at most two; names are cut at 120 characters, tags at 40, other fields at 60.
URLs (
stream_url,homepage,favicon) must be plainhttporhttpswritten out in full, without credentials or backslashes, and are returned in their parsed canonical form; anything else (javascript:,data:,file:,https:host, a bare word) is dropped, and a station with no valid id or no playable stream is left out of the results.bitrateis converted when a station reports bits per second, and dropped when it is implausible; the directory's own bitrate sort is not offered because it ranks those entries first.Every result and the server instructions say that these fields are data, not instructions.
Replies are capped at 5 MB, must be a JSON list, and a mirror that redirects or answers with something else counts as failed.
This reduces the risk of indirect prompt injection; it cannot remove it. A station can still be called "Ignore previous instructions", and that text will be shown, as one capped line, like any other name. Treat results as untrusted when you build on them.
Reliability
The server queries the Radio Browser mirrors in this order, with an 8-second timeout for each:
de1.api.radio-browser.infode2.api.radio-browser.infoall.api.radio-browser.info
If all three fail, the tool returns a clear error (isError: true) and the server keeps running. Requests identify themselves with User-Agent: internet-radio-mcp/1.0 (+https://72fm.com).
You can change this behavior with two optional environment variables:
RADIO_BROWSER_MIRRORS: comma-separated base URLs to use instead of the defaults. OnlyhttpsURLs without credentials are accepted (plainhttponly forlocalhost,127.0.0.1or[::1], for testing); anything else is ignored with a warning on stderr. Redirects are never followed.RADIO_BROWSER_TIMEOUT_MS: the timeout for each mirror, in milliseconds: a whole number from 100 to 60000 (default8000).
Development
git clone https://github.com/AlonDrilich/internet-radio-mcp
cd internet-radio-mcp
npm install
npm run typecheck # tsc checkJs over the JSDoc-typed sources
npm run smoke # spawns the server over stdio and calls every tool against the live API
npx @modelcontextprotocol/inspector node src/index.js # interactive testingThe source is plain ES modules with JSDoc types (src/), so there is no build step. That is why npx github:… works without an npm publish.
Related
radio-playlists: weekly M3U playlists by country and genre from the same directory (browse online).
radio-player-72fm: WordPress plugin for putting a station's player on a site.
Radio stream URL finder: the same lookup in a browser. Type a station's name and copy the address of its stream.
All 72FM tools: 72fm.com/developers.
Data and credits
The station directory data comes from Radio Browser and is in the public domain. Thanks to its maintainers and contributors. If you use this server heavily, please consider supporting Radio Browser.
Streams, names and logos belong to their respective broadcasters.
72FM is a free web radio player built on the Radio Browser directory.
License
MIT © Alon Drilich (72FM)
Available Tools
5 toolsget_stationGet station detailsARead-onlyIdempotent
Get one radio station by its Radio Browser id (stationuuid, as returned by search_stations or top_stations), including its direct stream_url and a listen_url to play it in the browser on 72FM. Station data from the Radio Browser community directory (radio-browser.info, public domain). Stations belong to their broadcasters; 72FM does not own, operate or curate them.
Inputs: id (required). Returns: source, station
list_countriesList countriesARead-onlyIdempotent
List countries that have internet radio stations in the Radio Browser directory, with ISO 3166-1 alpha-2 codes, working-station counts, and the 72FM country page for each. Sorted by station count, highest first.
Inputs: limit, min_stations. Returns: count, source, countries
list_genresList popular genresARead-onlyIdempotent
List the most common genre/format tags in the Radio Browser directory by number of working stations. Placeholder and non-genre tags (country, region and language names, "radio", "fm", etc.) are filtered out. Use a returned name as the tag argument of search_stations or top_stations.
Inputs: limit. Returns: count, genres, source
search_stationsSearch radio stationsARead-onlyIdempotent
Search internet radio stations in the Radio Browser community directory by name, genre tag, country and/or language. Broken streams are excluded. Returns stream URLs plus a listen_url to play each station in the browser on 72FM. Station data from the Radio Browser community directory (radio-browser.info, public domain). Stations belong to their broadcasters; 72FM does not own, operate or curate them.
Inputs: tag, name, limit, order, +2 more. Returns: count, source, stations
top_stationsTop radio stationsARead-onlyIdempotent
List the most popular internet radio stations: by community votes, by recent clicks (plays), or trending (rising click trend). Optionally limit to one country and/or genre tag. Broken streams are excluded. Station data from the Radio Browser community directory (radio-browser.info, public domain). Stations belong to their broadcasters; 72FM does not own, operate or curate them.
Inputs: by, tag, limit, countrycode. Returns: count, source, stations
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct discovery intent: search_stations (filtered search), get_station (single lookup by id), top_stations (popularity ranking), list_countries and list_genres (metadata enumerations). search_stations and top_stations both return stations but are cleanly differentiated by filtering vs. popularity ranking, and the descriptions reinforce this.
Four of five names follow a verb_noun pattern (search_stations, get_station, list_countries, list_genres), which is highly predictable. top_stations deviates by dropping the verb, but it remains readable and idiomatic, so the deviation is minor.
Five tools is well-scoped for a read-only radio directory: search, retrieve, rank, and two metadata enumerations. Every tool earns its place and there is no redundancy or bloat.
The surface covers the core discovery lifecycle: find stations by multiple facets, fetch one by id, rank by popularity, and enumerate the country/genre facets that drive search. Minor gaps exist (e.g., no bitrate/codec filtering, no pagination or advanced query options), but these are workable around.
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Remote MCP server that gives Claude, ChatGPT, Cursor or any MCP client Google search volume, CPC, competition and similar keywords for 50+ countries. Works with no signup at 20 lookups a day; sign in with OAuth or an API key for higher limits, or $4.99 a month for unlimited.
Spotify MCP server for ChatGPT, Claude and any AI agent: search songs and artists, list playlists, read playlist songs, create playlist, add songs to playlist, remove songs from playlist, set playlist public or private and save to Liked Songs in your own Spotify account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Spotify yourself; Cotlet does not store your password and you need no Spotify API key. About the official Spotify API: Spotify has a full Web API and, since 23 Apr 2026, an official connector for Claude (checked 5 Nov 2026). The API needs an app you register, and in development mode the app owner must have Premium and the app allows 5 users; unlimited users need a registered business with at least 250,000 monthly users. Setup and FAQ: https://cotlet.dev/integrations/spotify-api-mcp-server
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceInternet radio for Claude and your terminal with ~25,000 verified live stations from 197 countries. Control playback, search, and get recommendations through natural language.MIT
- AlicenseNot gradedqualityBmaintenanceInternet radio + AI DJ for Claude. 55,000+ stations across 197 countries. Search, play, and get recommendations through natural language.1MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that wraps the Radio Browser API to search radio stations, list countries, and discover genres. Enables AI agents to find and browse radio stations without authentication.229 npmMIT
- FlicenseBqualityBmaintenanceEnables searching and browsing internet radio stations from the Radio Browser directory, retrieving live now-playing track information from station streams via ICY/Shoutcast metadata, and interacting with directory data through MCP tools without requiring API keys.29-