关于 Internet Radio
Internet Radio 是一个通过 Radio Browser 查找全球网络电台的开源 MCP 服务,面向 MCP 客户端提供电台信息、播放流地址、热门排行及国家和流派目录。
主要功能
- 01按名称、流派、国家或语言搜索电台
- 02获取电台详情和播放流地址
- 03列出热门及趋势电台
- 04浏览国家和流派目录
- 05排除标记为失效的播放流
适用场景
- 01查找巴西的爵士电台
- 02获取指定电台的播放流地址
- 03按国家浏览趋势电台
- 04先浏览流派,再搜索电台
MCP 相关
通过 stdio 向 MCP 客户端提供 5 个只读工具和 `find_radio` 提示词。结果包含电台播放流地址及浏览器收听链接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:1.0.3本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/alondrilich/internet-radio-mcp:1.0.3stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
internet-radio-mcp
一个用于网络电台的开源 Model Context Protocol(MCP)服务。它可让 Claude、Cursor、VS Code Copilot 和其他 MCP 客户端搜索全球各地的电台,并获取它们的直接流媒体 URL。它还会列出热门和趋势电台、国家/地区及流派。
电台数据来自 Radio Browser,这是一个由社区维护的公有领域目录,收录了超过 50,000 个拥有正常流媒体的电台。该服务由 72FM 构建。72FM 是一款基于同一目录打造的免费网络电台播放器。每条结果都包含一个可在浏览器中通过 72FM 播放电台的 listen_url,以及电台自身的 stream_url。
电台归其广播机构所有。72FM 和本服务均不拥有、运营或策划这些电台。任何人都可以在该目录中添加或编辑条目,因此流媒体偶尔可能无法播放。
- 无需 API 密钥或账户,只读。
- 5 个工具、1 个提示词、stdio 传输。
- 运行时依赖:
@modelcontextprotocol/server(官方 MCP TypeScript SDK v2)和zod。
示例问题
- “查找巴西的爵士电台”
- “日本最受欢迎的电台有哪些?”
- “告诉我 BBC World Service 的流媒体 URL”
- “目前网络电台中有哪些趋势?”
- “哪些国家/地区的电台数量最多?”
- “我可以搜索哪些流派?然后帮我找一些 lo-fi 电台。”
安装
需要 Node.js 20 或更高版本。该服务可通过 npx 直接从 GitHub 运行,因此无需全局安装任何内容。
Claude Code
claude mcp add internet-radio -- npx -y github:AlonDrilich/internet-radio-mcp
然后在会话中运行 /mcp,确认 internet-radio 已连接。
Claude Desktop
打开 Settings → Developer → Edit Config。这会打开 claude_desktop_config.json:在 macOS 上,该文件位于 ~/Library/Application Support/Claude/claude_desktop_config.json;在 Windows 上,位于 %APPDATA%\Claude\claude_desktop_config.json。添加:
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
重启 Claude Desktop。
Cursor
一键添加到 Cursor,或将服务添加到 ~/.cursor/mcp.json 以便在所有位置使用,或添加到 .cursor/mcp.json 以便在单个项目中使用:
{
"mcpServers": {
"internet-radio": {
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
VS Code(GitHub Copilot,Agent 模式)
一键安装到 VS Code,或将服务添加到 .vscode/mcp.json,也可以从命令面板运行 MCP: Add Server:
{
"servers": {
"internet-radio": {
"type": "stdio",
"command": "npx",
"args": ["-y", "github:AlonDrilich/internet-radio-mcp"]
}
}
}
Gemini CLI
gemini extensions install https://github.com/AlonDrilich/internet-radio-mcp
仓库中包含 gemini-extension.json,因此该服务会作为 internet-radio 扩展添加。
其他客户端
任何能够启动 stdio 服务的 MCP 客户端都可以使用相同的命令:npx -y github:AlonDrilich/internet-radio-mcp。
首次启动时会从 GitHub 下载软件包,需要几秒钟。之后的启动会使用 npx 缓存。
Docker
同一服务也以容器映像的形式发布,并收录在官方 MCP Registry 中,名称为 io.github.AlonDrilich/internet-radio-mcp:
docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:latest
在客户端配置中,使用 "command": "docker" 和 "args": ["run", "-i", "--rm", "ghcr.io/alondrilich/internet-radio-mcp:latest"]。
工具
所有工具均为只读,并标注为 readOnlyHint: true 和 openWorldHint: true。每个结果都包含:
- 一行摘要,
- 相同数据的 JSON 文本,
- 与工具
outputSchema相匹配的structuredContent。
目录上次自动检查失败的数据流不会出现在搜索结果中。
| 工具 | 参数 | 返回值 |
|---|---|---|
search_stations | name?、tag?(流派)、countrycode?(ISO 3166-1 alpha-2,例如 BR)、language?(例如 portuguese)、order = votes | clickcount(默认 votes)、limit 1–50(默认 10) | 匹配的电台 |
get_station | id(Radio Browser 的 stationuuid) | 单个电台 |
top_stations | by = votes | clicks | trending(默认 votes)、countrycode?、tag?、limit 1–50(默认 10) | 票数最多、播放次数最多或趋势上升的电台 |
list_countries | min_stations?(默认 1)、limit? | 国家名称、ISO 代码、电台数量和 72FM 国家页面(https://72fm.com/radio/<iso2>?source=mcp) |
list_genres | limit 1–100(默认 30) | 按电台数量排序的热门流派标签。占位符和非流派标签会被过滤掉(例如 undefined、radio、fm 以及国家、地区或语言名称)。 |
电台字段
{
"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_url是目录解析后的流 URL;如果没有解析后的 URL,则为原始 URL。listen_url可在 72FM 浏览器中播放电台。末尾的?source=mcp仅用于告知 72FM 此次访问来自此服务(应用不会发送 referrer);它不包含 ID,也不包含关于你或你的问题的信息。tags最多包含 8 个标签。
提示词
find_radio(request) 可根据心情、地点、活动或流派查找电台,例如“雨夜里适合听的轻柔爵士乐”或“来自里斯本的电台”。
不可信数据
电台名称、标签、语言、国家和 URL 均来自任何人都可以编辑的公共目录,服务会将它们交给 AI 助手。因此,服务会将每个字段都视为不可信输入:
- 文本会压缩为单行:换行符和控制字符会变为空格;零宽字符、双向控制字符、专用区码点、不可见的 Unicode“标签”字符,以及所有其他不可见的“默认可忽略”码点(变体选择符、填充符、连接符)都会被移除,但表情符号选择符和真实文本所需的零宽连接符除外;这些字符仅在长度不超过 2 的连续字符组中保留。名称最多截取 120 个字符,标签最多 40 个字符,其他字段最多 60 个字符。
- URL(
stream_url、homepage、favicon)必须是完整写出的纯http或httpsURL,不能包含凭据或反斜杠,并会以解析后的规范形式返回;其他内容(javascript:、data:、file:、https:host、单独的词语)都会被丢弃;ID 无效或没有可播放流的电台也会从结果中排除。 - 如果电台报告的是每秒比特数,
bitrate会进行转换;如果数值不合理,则会被丢弃。目录自身的比特率排序功能不可用,因为它会将这些条目排在最前面。 - 每条结果和服务指令都会说明,这些字段是数据,而不是指令。
- 回复上限为 5 MB,且必须是 JSON 列表;如果镜像发生重定向或返回其他内容,则视为失败。
这能降低间接提示注入的风险,但无法彻底消除风险。电台仍可能被命名为“忽略之前的指令”,并像其他名称一样以单行形式显示。基于结果进行后续操作时,请将其视为不可信数据。
可靠性
服务器按以下顺序查询 Radio Browser 镜像,每个镜像的超时时间为 8 秒:
de1.api.radio-browser.infode2.api.radio-browser.infoall.api.radio-browser.info
如果三个镜像均不可用,工具会返回明确的错误(isError: true),服务器则继续运行。请求会使用 User-Agent: internet-radio-mcp/1.0 (+https://72fm.com) 标识自身。
你可以通过以下两个可选环境变量更改此行为:
RADIO_BROWSER_MIRRORS:以逗号分隔的基础 URL,用于替代默认值。仅接受不含凭据的httpsURL(测试时,localhost、127.0.0.1或[::1]仅可使用纯http);其他 URL 均会被忽略,并在 stderr 中显示警告。绝不会跟随重定向。RADIO_BROWSER_TIMEOUT_MS:每个镜像的超时时间,单位为毫秒;必须是 100 至 60000 之间的整数(默认值为8000)。
开发
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 testing
源代码是带有 JSDoc 类型的纯 ES 模块(src/),因此无需构建。这就是为什么无需发布到 npm,npx github:… 也能正常使用。
相关项目
- radio-playlists:按国家和流派整理的每周 M3U 播放列表,来自同一目录(在线浏览)。
- radio-player-72fm:用于在网站上放置电台播放器的 WordPress 插件。
- Radio stream URL finder:在浏览器中进行相同的查找。输入电台名称并复制其流的地址。
- 所有 72FM 工具:72fm.com/developers。
数据与致谢
- 电台目录数据来自 Radio Browser,属于公有领域。感谢其维护者和贡献者。如果你大量使用此服务,请考虑支持 Radio Browser。
- 流、名称和徽标归各自的广播公司所有。
- 72FM 是一款基于 Radio Browser 目录构建的免费网络电台播放器。
许可证
MIT © Alon Drilich (72FM)
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。