### Example logs

Player here is `ha-panel-voice` (`player_id: upsendspinclihapanel`), a `universal_player`
whose active output protocol is `sendspin-cli`.

**1. Player snapshot during playback — reports available, volume via `group_volume`:**

```json
{
  "player_id": "upsendspinclihapanel",
  "name": "ha-panel-voice",
  "state": "playing",
  "available": true,
  "powered": true,
  "volume_level": null,
  "group_volume": 25,
  "synced_to": null,
  "active_group": null,
  "active_output_protocol": "sendspin-cli-ha-panel"
}
```

`config_get_player` for it: `volume_control: follow_protocol`, `mute_control:
follow_protocol`, `min_volume: 0`, `max_volume: 100`. `supported_features: []`.

**2. MCP `volume_set` call — returns success, but the volume does not change:**

```json
// request
{"method":"tools/call","params":{"name":"volume_set",
 "arguments":{"player_id":"upsendspinclihapanel","level":70}}}

// response (no error surfaced to the caller)
{"result":{"content":[],"structuredContent":{"result":null},"isError":false}}
```

**3. MA server log around that call — the command is silently dropped:**

```log
2026-06-12T17:09:10-04:00  INFO     music_assistant.streams   Start Queue Flow stream for Queue ha-panel-voice - crossfade: disabled
2026-06-12T17:09:16-04:00  INFO     mcp.server.streamable_ht  Processing request of type CallToolRequest
2026-06-12T17:09:18-04:00  WARNING  music_assistant.players   Ignoring command cmd_volume_set for unavailable player ha-panel-voice
2026-06-12T17:09:24-04:00  INFO     music_assistant.streams   Finished Queue Flow stream for Queue ha-panel-voice
2026-06-12T17:09:25-04:00  INFO     music_assistant.streams   Start Queue Flow stream for Queue ha-panel-voice - crossfade: disabled
```

**4. Fast `players_get_player` poll across the same window — `available` never flips,
and the commanded level (70) never lands:**

```text
21:16:57.126Z  available=True  powered=True  state=playing  group_volume=25
   …no change logged… (volume_set(70) issued ~21:17:09Z; group_volume stays 25)
21:17:38.720Z  poll done
```

**5. Contrast — the identical command at idle works and persists.** A held, re-asserted
sweep (`volume_set` once per second) tracks exactly, both in `group_volume` and audibly:

```text
volume_set(90):  group_volume=90  group_volume=90  group_volume=90   (~5 s, audibly loud)
volume_set(20):  group_volume=20  group_volume=20  group_volume=20   (~5 s, audibly quiet)
```

So the player is fully volume-controllable; the command is only dropped during active
playback when MA momentarily treats it as unavailable.