让 Claude 直接控制家里的 Sonos:一个 MCP server 的实现与 Sonos 三条控制路的实测

0 阅读3分钟

我写 ZoneFoundry for Sonos 的起因是两件每天都碰到的事:我的歌分散在四个服务里(Apple Music / Spotify / QQ 音乐 / 网易云),官方 App 把它们当四个世界;Sonos 自带的语音听不懂粤语和普通话。写了一年,现在上架了(免费,iOS 18+)。而我自己用得最多的,是一个本来只为调试做的东西:一个 MCP server,让 Claude 直接控制音箱。

这篇讲技术部分:Sonos 的 API 到底允许做什么、到哪里为止、MCP 这层怎么接。

一、和 Sonos 音箱说话的三条路

  1. 局域网 UPnP/SOAP。每只音箱在局域网里用 HTTP 暴露一堆服务(AVTransport、RenderingControl、ContentDirectory…)。不用账号、不走云、往返不到 100ms。官方 App 十年来就是这么做的。
    1. 官方云 Control API。OAuth + HTTPS,在哪里都能用:播放、编组、音量、收藏、歌单、音频片段(广播)。按 household 限频。
    1. SMAPI 音乐服务接口。Sonos 自己浏览、解析 Apple Music / Spotify / QQ 音乐 / 网易云曲目的那套。

我最后定下的规则:在家走局域网,出门走云;除非 API 真的没留路,否则不要求家里常开任何东西。然后把功能清单逐项过一遍——清单本身是一个 Swift 文件,每项标 free / partial / required,改功能的人顺手改标记,数字不会漂:50 项里 46 项不需要在家里装任何东西。

二、云端做不到的四样

EQ、闹钟、电量、line-in / 电视输入。云 Control API 就是没开放,只能局域网做。想在公司改 EQ,家里就得有东西醒着——我提供一个很轻的可选 Docker 桥,并且在 App 里写明,而不是装作能用。

三、我错了几个月的一件事

「往 Sonos 收藏夹写东西局域网做不到」——我自己代码里三处注释都这么写,还围着这个判断加了付费墙。它是错的。ContentDirectory 的 CreateObject 在音箱的 SCPD 里真实存在;失败的是自己拼的 DIDL-Lite metadata,音箱一律拒绝(UPnP 803)。把音箱自己从 GetPositionInfo 返回的 TrackMetaData 原样包回去,就通了,我试过的每个音乐服务都通。教训:关于硬件的注释别信,去打那个 SOAP。

四、三种语言的语音,和一个撤销键

识别是容易的部分(iOS 端侧语音对粤语和普通话都很好)。难的是一句话多个意图——「主卧调到 30,浴室调到 20」——以及判断错了怎么收场。每个动作都有回执,每个回执都能撤销。对我家人来说,这比识别率重要。

五、MCP server

ZoneFoundry 有一个 relay(单个 Python / aiohttp 进程),前面同时接局域网桥和 Sonos 云。把它暴露成 MCP server 只用了几百行:23 个 tool——play_music、search_music、group_rooms、set_volume、announce、set_reminder、now_playing、undo_last 等。鉴权是在 App 设置里生成的 Bearer key;没有 OAuth,暂时也没有开源仓库。

Claude Code 一行接入:

claude mcp add --transport http zonefoundry https://relay.zonefoundry.dev/mcp --header "Authorization: Bearer <你的 key>"

它也在 MCP 官方 registry 里(dev.zonefoundry/sonos),ChatGPT 或任何支持 streamable HTTP 的客户端都能用。

用起来是这样:「楼下放点轻松的,7 点提醒我收衣服」——音箱编组、歌单开播、提醒设好,三个 tool,一句话。这是我第一次觉得「AI 进家」不是口号——而它之所以可能,是因为 relay 本来就是那个懂得和音箱说话的东西。

六、老实说限制

  • EQ / 闹钟 / 电量 / line-in 只能局域网。
    • 云 API 按 household 有配额;App 自己很克制,但一个过于勤快的 MCP 客户端可以把它烧光。
    • 没有 Android,暂时没有开源。

App Store(iOS 18 起,免费,同一个 Wi-Fi 下不用注册):apps.apple.com/app/apple-s… —— 每一条 bug 报告我都会看。