sonora-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sonora-mcpSet the living room volume to 40"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sonora-mcp
MCP server for the Sonora Multiroom audio system. It exposes the Multiroom Audio Hub API as 24 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.
Related MCP server: Talky Talky
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:8080Options go after --hub-url:
Option | Default | Description |
| — (required) | Base URL of the Multiroom Audio Hub |
|
| Port sonora-mcp listens on |
| all addresses | Address to listen on, e.g. |
| the release the script is pinned to (its | Release to install, e.g. |
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/healthOther platforms: download the archive for your OS from Releases and run the binary.
Run
sonora-mcp --multiroom-url http://multiroom.lan:8080Flag | Required | Default | Description |
| yes | — | Base URL of the Multiroom Audio Hub ( |
| no |
| Port to listen on (1–65535) |
| no | all addresses | Address to listen on: an IP such as |
| 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/inspectorConnect to http://localhost:3001/mcp with the Streamable HTTP transport.
Tools (24)
Every tool returns structured content (and the same JSON as text). Lists are wrapped in an object,
such as {"outputs": [...]}.
Inputs
Tool | Description |
| List audio inputs ( |
| Get one input by ID |
| Register a new ephemeral input from a stream or file URI |
| Delete an ephemeral input (static inputs can't be deleted) |
| Enable or disable an input |
Outputs
Tool | Description |
| List outputs (speakers or zones; |
| Get one output by ID |
| Set an output's volume (0–100) |
| Mute or unmute an output |
| Enable or disable an output |
Groups
Tool | Description |
| List output groups ( |
| Get one group by ID |
| Set the volume of every output in a group (0–100) |
| Mute or unmute a group |
| Enable or disable a group |
Routes
Tool | Description |
| List routes, optionally filtered by |
| Get one route by ID |
| Play an input to an output or group |
| Stop and delete a route |
| Move a route to another output or group |
| Pause or resume a route (pauseable inputs only) |
Playback and master mute
Tool | Description |
| Play a URI on an output or group in one step (creates the input and route) |
| Get the system-wide master mute state |
| Turn the system-wide master mute on or off |
Errors
A failed call returns an error result whose text starts with a category:
Category | Meaning |
| The input, output, group, route or target doesn't exist |
| The hub rejected the request (the hub's explanation is included) |
| The hub could not create the route |
| The hub could not reach the audio source |
| The hub is temporarily unavailable |
| The hub did not answer in time (5 s) |
| The hub could not be reached |
| The hub's response didn't match the API |
| Any other hub error |
| 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-mcpWithout -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-mcpBefore sending a change:
gofmt -l . # must print nothing
go vet ./...
go test ./... # offline; the hub is fakedThe 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 requestsGoReleaser for releases
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Sonos MCP server: control your Sonos speakers from any MCP client. Play songs, artists and playlists, set volume, group rooms, move music to another room, switch to TV, spoken announcements and reminders. 27 tools, English and Chinese. Works through the official Sonos cloud, so there is no home bridge to install; sign in with OAuth. Requires the free ZoneFoundry iOS app.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for Producer/Riffusion AI music generation
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server to control the Roon music player, enabling AI agents to search music, manage playback, and adjust volume across zones.939 npm2MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive audio MCP server that enables AI agents to generate speech, transcribe audio, clone voices, analyze speech quality, design soundscapes, and manage audio assets through a standardized interface.2MIT
- AlicenseBqualityDmaintenanceMCP server that provides LLM tools to interact with Lyrion Music Server (LMS), enabling player control, playback management, playlist operations, and music library search.556 npmMIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server that enables AI assistants to control music playback, manage users and access, configure providers, and administer a Music Assistant setup through natural language commands.MIT