Sonora
БесплатноНе проверенMCP server that wraps the Multiroom Audio Hub v2 REST API, providing 24 tools to control multiroom audio systems. Enables AI assistants to manage inputs, output
Описание
MCP server that wraps the Multiroom Audio Hub v2 REST API, providing 24 tools to control multiroom audio systems. Enables AI assistants to manage inputs, outputs, groups, routes, playback, and master mute.
README
MCP server for the Sonora Multiroom audio system. It exposes the Multiroom Audio Hub API as 32 MCP tools, so any AI assistant that supports MCP can list and control your speakers, groups, inputs and routes over a URL.
Architecture
AI Assistant (Copilot, Claude, etc.)
│
▼ MCP (Streamable HTTP, stateless) at /mcp
┌──────────────────────────┐
│ sonora-mcp │ port 3001
│ (Go, one static binary) │
└────────────┬─────────────┘
│ HTTP, via the sonora-cli hub package
▼
┌──────────────────────────┐
│ Multiroom Audio Hub API │ e.g. port 8080
└──────────────────────────┘
sonora-mcp keeps no state of its own: every tool call is one request to the hub.
Install on a Raspberry Pi
One command on the Pi (64-bit Raspberry Pi OS) installs sonora-mcp as a systemd service:
curl -fsSL https://raw.githubusercontent.com/Sonora-Multiroom/sonora-mcp/main/deploy/pi/install.sh | sudo bash -s -- --hub-url http://localhost:8080
Options go after --hub-url:
| Option | Default | Description |
|---|---|---|
--hub-url <url> |
— (required) | Base URL of the Multiroom Audio Hub |
--port <port> |
3001 |
Port sonora-mcp listens on |
--host <address> |
all addresses | Address to listen on, e.g. 127.0.0.1 |
--version <tag> |
the release the script is pinned to (its RELEASE_TAG) |
Release to install, e.g. v1.1.0 |
The script downloads the release archive, checks it against the release's checksums.txt,
installs /usr/local/bin/sonora-mcp, and writes /etc/default/sonora-mcp and the
sonora-mcp.service unit. The service starts at boot and restarts on failure. Re-run the same
command with different options to reconfigure or upgrade. You can also copy
deploy/pi/install.sh to the Pi and run sudo ./install.sh --hub-url <url>.
systemctl status sonora-mcp
curl localhost:3001/health
Other platforms: download the archive for your OS from Releases and run the binary.
Run
sonora-mcp --multiroom-url http://multiroom.lan:8080
| Flag | Required | Default | Description |
|---|---|---|---|
--multiroom-url <url> |
yes | — | Base URL of the Multiroom Audio Hub (http or https) |
--port <port> |
no | 3001 |
Port to listen on (1–65535) |
--host <address> |
no | all addresses | Address to listen on: an IP such as 127.0.0.1 or ::1, or localhost |
-h, --help |
no | — | Show usage |
The server does not start without --multiroom-url. A missing or invalid flag prints the error and
usage and exits with status 2; a port that can't be opened exits with status 1. Ctrl+C or SIGTERM
stops accepting connections, lets in-flight calls finish (up to 6 s) and exits 0. Each tool call
is logged to stderr.
Health check
curl http://localhost:3001/health
# {"status":"ok","server":"sonora-mcp","version":"1.1.0","hub":"reachable"}
/health always answers 200 while the server runs. hub is reachable or unreachable,
from one read-only hub request bounded by 2 seconds.
Connect an AI assistant
The MCP endpoint is http://<host>:3001/mcp.
VS Code (GitHub Copilot)
.vscode/mcp.json:
{
"servers": {
"sonora-mcp": {
"type": "http",
"url": "http://localhost:3001/mcp"
}
}
}
Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"sonora-mcp": {
"type": "streamableHttp",
"url": "http://localhost:3001/mcp"
}
}
}
MCP Inspector (testing)
npx @modelcontextprotocol/inspector
Connect to http://localhost:3001/mcp with the Streamable HTTP transport.
Tools (32)
Every tool returns structured content (and the same JSON as text). Lists are wrapped in an object,
such as {"outputs": [...]}.
Inputs
| Tool | Description |
|---|---|
listInputs |
List audio inputs (includeDisabled to include disabled ones) |
getInput |
Get one input by ID |
createInput |
Register a new ephemeral input from a stream or file URI (defaultRouteVolume for its routes) |
deleteInput |
Delete an ephemeral input (static inputs can't be deleted) |
setInputEnabled |
Enable or disable an input |
Outputs
| Tool | Description |
|---|---|
listOutputs |
List outputs (speakers or zones; includeDisabled to include disabled ones) |
getOutput |
Get one output by ID |
setOutputVolume |
Set an output's volume (0–100) |
setOutputMute |
Mute or unmute an output |
setOutputEnabled |
Enable or disable an output |
stopRoutesForOutput |
Stop everything playing on an output, including group routes that include it |
Groups
| Tool | Description |
|---|---|
listGroups |
List output groups (includeDisabled to include disabled ones) |
getGroup |
Get one group by ID |
setGroupVolume |
Set the volume of every output in a group (0–100) |
setGroupMute |
Mute or unmute a group |
setGroupEnabled |
Enable or disable a group |
stopRoutesForGroup |
Stop everything playing in a group and on its members |
Routes
| Tool | Description |
|---|---|
listRoutes |
List routes, optionally filtered by status, inputId and targetId |
getRoute |
Get one route by ID |
createRoute |
Play an input to an output or group (routeVolume for this route only) |
deleteRoute |
Stop and delete a route |
transferRoute |
Move a route to another output or group |
setRoutePause |
Pause or resume a route (pauseable inputs only) |
setRouteVolume |
Change a route's own volume (0–100) without touching any output's volume |
stopAllRoutes |
Stop every route on every speaker; only for "stop everything" |
Playback and master mute
| Tool | Description |
|---|---|
playback |
Play a URI on an output or group in one step (creates the input and route; routeVolume for this playback only) |
getMasterMute |
Get the system-wide master mute state |
setMasterMute |
Turn the system-wide master mute on or off |
Text-to-speech
Announcements are spoken by the hub's TTS extension. Omitting providerName uses the hub's configured
provider, which may be a billed cloud service; piper-local runs on the hub at no cost.
| Tool | Description |
|---|---|
speak |
Speak a text on an output or group (playbackMode, routeVolume and duckingLevelDb for ducking and a volume of its own); returns once the announcement is queued |
listTtsVoices |
List a provider's voices, optionally by language or engine |
getTtsCacheStats |
Read the size and entries of the TTS audio cache |
clearTtsCache |
Clear the TTS audio cache, for all providers or one |
Errors
A failed call returns an error result whose text starts with a category:
| Category | Meaning |
|---|---|
NotFound |
The input, output, group, route or target doesn't exist |
Validation |
The hub rejected the request (the hub's explanation is included) |
Conflict |
The hub refused the request in its current state, for example a disabled speaker; the hub's reason follows in parentheses. Change that state and retry |
RouteFailed |
The hub could not create the route |
SourceUnreachable |
The hub could not reach the audio source |
ServiceUnavailable |
The hub is temporarily unavailable |
TtsUnavailable |
The hub has no working text-to-speech; the message says why (not installed, disabled, failed to load, inactive or a version mismatch) |
Timeout |
The hub did not answer in time (5 s; 15 s for speak) |
Network |
The hub could not be reached |
MalformedResponse |
The hub's response didn't match the API |
HubError |
Any other hub error |
Internal |
Unexpected fault in sonora-mcp |
Arguments that don't match a tool's schema (for example a volume of 150) are rejected with
validating "arguments": … before anything is sent to the hub.
Build from source
Requires Go 1.27.
go build -ldflags "-X github.com/Sonora-Multiroom/sonora-mcp/internal/version.Version=1.1.0" ./cmd/sonora-mcp
Without -ldflags the version is dev. Cross-build for a Raspberry Pi:
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags "-X github.com/Sonora-Multiroom/sonora-mcp/internal/version.Version=1.1.0" -o sonora-mcp ./cmd/sonora-mcp
Before sending a change:
gofmt -l . # must print nothing
go vet ./...
go test ./... # offline; the hub is faked
The tests also check every tool's inputs and outputs against the hub's OpenAPI spec, published by
sonora-cli as api.Spec.
Releases
Push a vX.Y.Z tag on main (./release.sh does this). The release workflow runs
GoReleaser, which builds linux, macOS and Windows for amd64 and arm64 and
publishes the archives and checksums.txt to a GitHub Release. Tags such as v1.2.0-rc.1 are
published as prereleases. Pull requests run gofmt, vet and go test -race.
Tech stack
- Go 1.27, standard library HTTP server
- MCP Go SDK v1.8.0, Streamable HTTP (stateless)
- sonora-cli
hubpackage for all hub requests - GoReleaser for releases
License
Установка Sonora
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/Sonora-Multiroom/sonora-mcpFAQ
Sonora MCP бесплатный?
Да, Sonora MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Sonora?
Нет, Sonora работает без API-ключей и переменных окружения.
Sonora — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Sonora в Claude Desktop, Claude Code или Cursor?
Открой Sonora на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
ARA
Generate images, video and audio from any AI agent — one connector.
автор: ARAOmni Video
An MCP server that transforms LLM-enabled IDEs into professional video editors by pre-processing footage into text proxies, generating motion graphics via HTML/
автор: buildwithtazaYouTube
Transcripts, channel stats, search
автор: YouTubeEverArt
AI image generation using various models.
автор: modelcontextprotocolgpu-bridge/mcp-server
GPU inference API for LLMs, image and video generation, TTS, Whisper, embeddings, reranking and OCR, paid per use via x402 or an API key.
автор: gpu-bridgemerterbak/Grok-MCP
Access xAI's Grok API with agentic tool calling, image generation, vision and file support.
автор: merterbakSureScaleAI/openai-gpt-image-mcp
Image generation and editing with OpenAI's GPT image models.
автор: SureScaleAIYangLiangwei/PersonalizationMCP
Aggregate personal data from Steam, YouTube, Bilibili, Spotify, Reddit and other gaming, music, video and social platforms, with OAuth2 and token management.
автор: YangLiangweiAceDataCloud/MCPFlux
Flux image generation and editing from Black Forest Labs via the Ace Data Cloud API.
автор: AceDataCloudAceDataCloud/MCPNanoBanana
Nano Banana image generation and editing, including virtual try-on and product placement in realistic scenes.
автор: AceDataCloudCompare Sonora with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории media
