mcpField
I
Internet Radio

Internet Radio

本地服务
github.com游戏娱乐12 周前更新

关于 Internet Radio

Internet Radio 是一个通过 Radio Browser 查找全球网络电台的开源 MCP 服务,面向 MCP 客户端提供电台信息、播放流地址、热门排行及国家和流派目录。

主要功能

  1. 01按名称、流派、国家或语言搜索电台
  2. 02获取电台详情和播放流地址
  3. 03列出热门及趋势电台
  4. 04浏览国家和流派目录
  5. 05排除标记为失效的播放流

适用场景

  1. 01查找巴西的爵士电台
  2. 02获取指定电台的播放流地址
  3. 03按国家浏览趋势电台
  4. 04先浏览流派,再搜索电台

MCP 相关

通过 stdio 向 MCP 客户端提供 5 个只读工具和 `find_radio` 提示词。结果包含电台播放流地址及浏览器收听链接。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"alondrilich-internet-radio": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/alondrilich/internet-radio-mcp:1.0.3"
]
}
}
}
启动命令docker run -i --rm ghcr.io/alondrilich/internet-radio-mcp:1.0.3

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/alondrilich/internet-radio-mcp:1.0.3

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

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_stationsname?、tag?(流派)、countrycode?(ISO 3166-1 alpha-2,例如 BR)、language?(例如 portuguese)、order = votes | clickcount(默认 votes)、limit 1–50(默认 10)匹配的电台
get_stationid(Radio Browser 的 stationuuid)单个电台
top_stationsby = votes | clicks | trending(默认 votes)、countrycode?、tag?、limit 1–50(默认 10)票数最多、播放次数最多或趋势上升的电台
list_countriesmin_stations?(默认 1)、limit?国家名称、ISO 代码、电台数量和 72FM 国家页面(https://72fm.com/radio/<iso2>?source=mcp)
list_genreslimit 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 或 https URL,不能包含凭据或反斜杠,并会以解析后的规范形式返回;其他内容(javascript:、data:、file:、https:host、单独的词语)都会被丢弃;ID 无效或没有可播放流的电台也会从结果中排除。
  • 如果电台报告的是每秒比特数,bitrate 会进行转换;如果数值不合理,则会被丢弃。目录自身的比特率排序功能不可用,因为它会将这些条目排在最前面。
  • 每条结果和服务指令都会说明,这些字段是数据,而不是指令。
  • 回复上限为 5 MB,且必须是 JSON 列表;如果镜像发生重定向或返回其他内容,则视为失败。

这能降低间接提示注入的风险,但无法彻底消除风险。电台仍可能被命名为“忽略之前的指令”,并像其他名称一样以单行形式显示。基于结果进行后续操作时,请将其视为不可信数据。

可靠性

服务器按以下顺序查询 Radio Browser 镜像,每个镜像的超时时间为 8 秒:

  1. de1.api.radio-browser.info
  2. de2.api.radio-browser.info
  3. all.api.radio-browser.info

如果三个镜像均不可用,工具会返回明确的错误(isError: true),服务器则继续运行。请求会使用 User-Agent: internet-radio-mcp/1.0 (+https://72fm.com) 标识自身。

你可以通过以下两个可选环境变量更改此行为:

  • RADIO_BROWSER_MIRRORS:以逗号分隔的基础 URL,用于替代默认值。仅接受不含凭据的 https URL(测试时,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 Browser,属于公有领域。感谢其维护者和贡献者。如果你大量使用此服务,请考虑支持 Radio Browser。
  • 流、名称和徽标归各自的广播公司所有。
  • 72FM 是一款基于 Radio Browser 目录构建的免费网络电台播放器。

许可证

MIT © Alon Drilich (72FM)

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。