Skip to main content
Glama

Sonos MCP Server

This project is a Sonos MCP (Model Context Protocol) server that allows you to control and interact with Sonos devices on your network. It provides various functionalities such as discovering devices, controlling playback, retrieving device states, and managing queues.

Features

  • Discover Sonos devices on the network

  • Retrieve and control playback state for devices

  • Manage playback queues

  • Expose functionalities as MCP tools

Related MCP server: YARR Media Stack MCP Server

Requirements

  • Python 3.12+

  • uv for managing Python projects

Installation

From Git (Direct Install)

pip install git+https://github.com/WinstonFassett/sonos-mcp-server.git

For Development

  1. Clone the repository:

    git clone https://github.com/WinstonFassett/sonos-mcp-server.git
    cd sonos-mcp-server
  2. Install the required dependencies using uv:

    uv sync

Usage

Running the Server

Stdio

Run the server using stdio:

uv run mcp run server.py

HTTP (streamable-http)

The server supports the MCP streamable-http transport natively (mcp SDK >= 1.12). No proxy needed:

SONOS_MCP_TRANSPORT=streamable-http \
SONOS_MCP_HOST=127.0.0.1 \
SONOS_MCP_PORT=8090 \
uv run sonos-mcp-server

Endpoint: http://127.0.0.1:8090/mcp

Environment variables:

Var

Default

Notes

SONOS_MCP_TRANSPORT

stdio

stdio, sse, or streamable-http

SONOS_MCP_HOST

127.0.0.1

HTTP bind address

SONOS_MCP_PORT

8000

HTTP port (path is /mcp)

SONOS_MCP_ALLOWED_HOSTS

(localhost only)

Extra Host headers to accept, comma-separated. Needed when serving behind a proxy with a different hostname (e.g. mac-mini.tailc3138.ts.net:*).

SONOS_DEVICE_IPS

(SSDP discovery)

Comma-separated speaker IPs. Skips SSDP multicast and resolves names over unicast SOAP — required when the process can't multicast (e.g. launchd without Local Network permission).

Legacy: SSE with supergateway

Older alternative (deprecated — prefer streamable-http above):

npx -y supergateway --port 8000 --stdio "uv run mcp run server.py"

Development

To run the server in "development" mode with the MCP Inspector:

uv run mcp dev server.py

This command hosts an MCP Inspector for testing and debugging purposes.

To run the server with SSE in development mode, use the SSE command for supergateway, and in a second terminal window run:

npx @modelcontextprotocol/inspector

Install in Claude Desktop

After publishing to git, users can install directly:

mcp install git+https://github.com/WinstonFassett/sonos-mcp-server.git

Or add to Claude Desktop config:

{
  "mcpServers": {
    "sonos": {
      "command": "sonos-mcp-server"
    }
  }
}

Available MCP Tools

Use the exposed MCP tools to interact with Sonos devices. The available tools include:

  • get_all_device_states: Retrieve the state information for all discovered Sonos devices.

  • now_playing: Retrieve information about currently playing tracks on all Sonos devices.

  • get_device_state: Retrieve the state information for a specific Sonos device.

  • pause, stop, play: Control playback on a Sonos device.

  • next, previous: Skip tracks on a Sonos device.

  • get_queue, get_queue_length: Manage the playback queue for a Sonos device.

  • mode: Get or set the play mode of a Sonos device.

  • partymode: Enable party mode on the current Sonos device.

  • speaker_info: Retrieve speaker information for a Sonos device.

  • get_current_track_info: Retrieve current track information for a Sonos device.

  • volume: Get or set the volume of a Sonos device.

  • skip, play_index, remove_index_from_queue: Manage tracks in the queue for a Sonos device.

  • add_service_tracks_to_queue: Add tracks from music services like Spotify, Apple Music, Tidal, or Deezer to the Sonos queue.

Publishing Updates

After making changes:

git add .
git commit -m "Description of changes"
git push

Users can update with:

pip install --upgrade git+https://github.com/WinstonFassett/sonos-mcp-server.git

License

This project is licensed under the MIT License. See the LICENSE file for details.

Available Tools

18 tools
get_all_device_statesB

Retrieve the state information for all discovered Sonos devices.

Returns: List[Dict[str, Any]]: A list of dictionaries containing state information for each device.

Inputs: no named parameters.

get_current_track_infoA

Retrieve current track information for a Sonos device.

Args: name: The name of the device to retrieve track information from. If None, uses the current device.

Returns: Dict[str, str]: A dictionary containing the current track's artist, title, album, playlist position, and duration.

Inputs: name.

get_device_stateA

Retrieve the state information for a specific Sonos device.

Args: name: The name of the device to retrieve state information for. If None, uses the current device.

Returns: Dict[str, Any]: A dictionary containing the device's name, volume, state, and current track information.

Inputs: name.

get_queueA

Retrieve the queue of tracks for a Sonos device.

Args: name: The name of the device to retrieve the queue from. If None, uses the current device.

Returns: List[Dict[str, Any]]: A list of dictionaries containing track information in the queue.

Inputs: name.

get_queue_lengthB

Retrieve the queue length for a Sonos device.

Args: name: The name of the device to retrieve the queue length from. If None, uses the current device.

Returns: int: The length of the queue.

Inputs: name.

modeA

Get or set the play mode of a Sonos device.

Args: mode: The play mode to set (e.g., "NORMAL", "SHUFFLE_NOREPEAT", "SHUFFLE", "REPEAT_ALL"). If None, returns the current mode. name: The name of the device to set the mode for. If None, uses the current device.

Returns: str: The current play mode after the operation.

Inputs: mode, name.

nextA

Skip to the next track on a Sonos device.

Args: name: The name of the device to skip the track on. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after skipping to the next track, including name, volume, state, and track info.

Inputs: name.

now_playingB

Retrieve information about currently playing tracks on all Sonos devices.

Returns: List[Dict[str, str]]: A list of dictionaries containing the name, title, artist, and album of currently playing tracks.

Inputs: no named parameters.

partymodeA

Enable party mode on the current Sonos device.

Returns: Dict[str, Any]: The device's state after enabling party mode, including name, volume, state, and track info.

Inputs: no named parameters.

pauseB

Pause playback on a Sonos device.

Args: name: The name of the device to pause. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after pausing, including name, volume, state, and track info.

Inputs: name.

playA

Start playback on a Sonos device.

Args: name: The name of the device to start playback on. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after starting playback, including name, volume, state, and track info.

Inputs: name.

play_indexA

Play a specific track from the queue on a Sonos device.

Args: index: The index of the track to play. name: The name of the device to play the track on. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after playing the specified track, including name, volume, state, and track info.

Raises: ValueError: If the index is out of the queue's range.

Inputs: index (required), name.

previousA

Skip to the previous track on a Sonos device.

Args: name: The name of the device to skip the track on. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after skipping to the previous track, including name, volume, state, and track info.

Inputs: name.

remove_index_from_queueA

Remove a specific track from the queue on a Sonos device.

Args: index: The index of the track to remove. name: The name of the device to remove the track from. If None, uses the current device.

Returns: List[Dict[str, Any]]: The updated queue after removing the track.

Raises: ValueError: If the index is out of the queue's range.

Inputs: index (required), name.

skipA

Skip tracks in the queue for a Sonos device.

Args: increment: The number of tracks to skip forward. Defaults to 1. name: The name of the device to skip tracks on. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after skipping tracks, including name, volume, state, and track info.

Raises: ValueError: If the new track position is out of the queue's range.

Inputs: increment, name.

speaker_infoB

Retrieve speaker information for a Sonos device.

Args: name: The name of the device to retrieve speaker information from. If None, uses the current device.

Returns: Dict[str, str]: A dictionary containing speaker information.

Inputs: name.

stopA

Stop playback on a Sonos device.

Args: name: The name of the device to stop. If None, uses the current device.

Returns: Dict[str, Any]: The device's state after stopping, including name, volume, state, and track info.

Inputs: name.

volumeA

Get or set the volume of a Sonos device.

Args: volume: The volume level to set (0-99). If None, returns current volume. name: The name of the device to control. If None, uses the current device.

Returns: int: The current volume level after the operation.

Raises: ValueError: If volume is not between 0 and 99. ValueError: If the specified device is not found.

Inputs: name, volume.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 18 tools

    Disambiguation4/5

    Most tools have distinct purposes, but some overlap exists. For example, 'skip' and 'next' both advance tracks, though 'skip' offers more flexibility with an increment parameter. 'get_current_track_info' and 'now_playing' both retrieve track info, but 'now_playing' covers all devices while 'get_current_track_info' is per-device. Descriptions help clarify these differences, but minor confusion could occur.

    Naming Consistency4/5

    Tool names follow a consistent snake_case pattern throughout, with clear verb_noun structures like 'get_device_state', 'play_index', and 'remove_index_from_queue'. However, there are minor deviations: 'mode' and 'volume' are single-word nouns without verbs, and 'partymode' is a compound word instead of snake_case, slightly breaking the pattern.

    Tool Count4/5

    With 18 tools, the count is slightly high but reasonable for a Sonos control server, covering device states, playback control, queue management, and settings. It might feel a bit heavy, but each tool serves a specific function without obvious redundancy, making it well-scoped for the domain.

    Completeness5/5

    The tool set provides comprehensive coverage for Sonos device management. It includes CRUD-like operations for queue management (get, remove), full playback control (play, pause, stop, next, previous, skip), device state retrieval, volume and mode settings, and specialized functions like party mode. No significant gaps are apparent for core audio control workflows.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      A server that enables interaction with Home Assistant devices and automations through the Model Context Protocol, allowing users to monitor device states, control devices, trigger automations, and list entities.
      4
      48
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol (MCP) server for seamless integration with peripheral devices connected to your computer. Control, monitor, and manage hardware devices through a unified API.
      5
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that enables interaction with HomeyPro home automation systems, providing paginated access to devices, zones, and flows with comprehensive management capabilities.
      9
      -