internet-radio-mcpCAUTION
MCP server for internet radio: search 50,000+ stations, get stream URLs, top/trending stations, countries and genres (Radio Browser public-domain data). By 72FM.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
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."
Install
Requires Node.js 20 or newer. The server runs straight from GitHub with npx, so there is nothing to install globally.
Claude Code
claude mcp add internet-radio -- npx -y github:AlonDrilich/internet-radio-mcp
Then 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:
`
61c8fa4d4668OBSERVED · 2026-10-10Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add internet-radio-mcp:1.0.3 -- docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:1.0.3:None
Exposed tools (5)
5 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
get_station | read | |
list_countries | read | |
list_genres | read | |
search_stations | read | |
top_stations | read |
Trust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (5 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (9)
env: { ...getDefaultEnvironment(), RADIO_BROWSER_MIRRORS: `http://127.0.0.1:${port}` }, stderr: 'pipe'RADIO_BROWSER_MIRRORS: 'http://127.0.0.1:59998,http://127.0.0.1:59999',
assert.equal(cleanUrl(' http://195.150.20.242:8000/rmf_fm '), 'http://195.150.20.242:8000/rmf_fm');assert.deepEqual(mirrorsFromEnv('http://127.0.0.1:8080'), ['http://127.0.0.1:8080']);return { base: `http://127.0.0.1:${port}`, close: () => new Promise(resolve => { server.closeAllConnections(); server.close(() => resolve(undefined)); }) };{ stationuuid: '../../vote/' + UUID, name: 'Bad id', url_resolved: 'https://ok.example/b', votes: 1, lastcheckok: 1 }assert.equal(normalizeStation(station({ stationuuid: '../../vote/' + UUID })), null);@modelcontextprotocol/server, zod, @modelcontextprotocol/client, @types/node, typescript
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 n
Gates applied: no_behavioural_pass.
61c8fa4d4668full audit observations/trust-audit/mcp-server/alondrilich__internet-radio-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-10 | 61c8fa4d4668 | CAUTION | B | 89 | first audit |
Questions
What is the internet-radio-mcp MCP server?
MCP server for internet radio: search 50,000+ stations, get stream URLs, top/trending stations, countries and genres (Radio Browser public-domain data). By 72FM.
What tools does internet-radio-mcp expose?
5 in total: 5 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is internet-radio-mcp safe to connect to an agent?
With care. The audit graded it B (89/100) and found 9 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does internet-radio-mcp need?
No credential environment variables were found in its source, so it appears to need none.
How does internet-radio-mcp run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as internet-radio-mcp at 1.0.3.
How current is this page?
The grade is for one exact copy of the source (61c8fa4d4668), read on 2026-10-10. The repository is watched and re-audited when it changes.