Install any skill in seconds. Free to start, no credit card required.
Get Started Free →CLI to discover and control Sonos speakers over local network — playback, grouping, queue, favorites, scenes, Spotify, and volume. Use when an agent needs to control music playback, manage speaker groups, or play Spotify on Sonos.
.claude/skills/composio-community-sonos-cli-sonoscli/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -30% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -38% | 0% |
Modern Go CLI for Sonos speaker control over your local network (UPnP/SOAP).
bashbrew install steipete/tap/sonoscli
Or build from source:
bashgo install github.com/steipete/sonoscli/cmd/sonos@latest
bashsonos discover sonos discover --format json sonos status --name "Kitchen" sonos now --name "Kitchen"
bashsonos play --name "Kitchen" sonos pause --name "Kitchen" sonos stop --name "Kitchen" sonos next --name "Kitchen" sonos prev --name "Kitchen"
bashsonos volume get --name "Kitchen" sonos volume set --name "Kitchen" 25 sonos mute toggle --name "Kitchen"
bashsonos group status sonos group join --name "Bedroom" --to "Living Room" sonos group unjoin --name "Bedroom" sonos group solo --name "Office" sonos group party --to "Bar" # all speakers join target sonos group dissolve --name "Living Room"
bashsonos queue list --name "Kitchen" sonos queue play --name "Kitchen" 1 # play track at position sonos queue remove --name "Kitchen" 3 sonos queue clear --name "Kitchen"
bashsonos favorites list --name "Kitchen" sonos favorites open --name "Kitchen" --index 1 sonos favorites open --name "Kitchen" "BBC Radio 6 Music"
bash# Play a Spotify link sonos open --name "Kitchen" https://open.spotify.com/track/6NmXV4o6bmp704aPGyTVVG # Enqueue a playlist sonos enqueue --name "Kitchen" spotify:playlist:37i9dQZF1DXcBWIGoYBM5M # Search and play via SMAPI (no Spotify API credentials needed) sonos play spotify --name "Office" "gareth emery" # Search via Spotify Web API (needs SPOTIFY_CLIENT_ID/SECRET) sonos search spotify --type track "daft punk harder better" sonos search spotify --open --name "Kitchen" "miles davis so what"
bashsonos scene save "Evening" sonos scene apply "Evening" sonos scene list sonos scene delete "Evening"
bashsonos play-uri --name "Kitchen" "https://example.com/stream.mp3" sonos tv --name "Living Room" # switch to TV input sonos linein --name "Kitchen" --from "Living Room"
bashsonos watch --name "Kitchen" sonos watch --name "Kitchen" --format json
--format plain (default)--format json--format tsv--debug for trace logsbashsonos config set defaultRoom "Office" sonos config set format json sonos config get
Room targeting supports fuzzy substring matching — --name "Kit" matches "Kitchen".
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 10,007 | 2,420 | -76% | 1 | 1 | 0% | 1,613 | 1,248 | -23% | 0 | 0 | — |
case-02 | fail→pass | 8,943 | 2,450 | -73% | 1 | 1 | 0% | 1,519 | 1,221 | -20% | 0 | 0 | — |
case-03 | fail→pass | 12,589 | 3,436 | -73% | 1 | 1 | 0% | 1,991 | 1,490 | -25% | 0 | 0 | — |
case-04 | fail→pass | 9,839 | 2,501 | -75% | 1 | 1 | 0% | 1,878 | 1,311 | -30% | 0 | 0 | — |
case-05 | fail→pass | 18,852 | 1,934 | -90% | 1 | 1 | 0% | 1,909 | 1,191 | -38% | 0 | 0 | — |
case-06 | fail→pass | 10,031 | 2,066 | -79% | 1 | 1 | 0% | 1,395 | 1,152 | -17% | 0 | 0 | — |
case-07 | fail→pass | 6,797 | 2,098 | -69% | 1 | 1 | 0% | 1,123 | 1,245 | +11% | 0 | 0 | — |
case-08 | fail→pass | 7,063 | 1,853 | -74% | 1 | 1 | 0% | 1,221 | 1,117 | -9% | 0 | 0 | — |
case-09 | fail→pass | 10,144 | 1,387 | -86% | 1 | 1 | 0% | 1,487 | 1,105 | -26% | 0 | 0 | — |
case-10 | fail→pass | 7,433 | 1,650 | -78% | 1 | 1 | 0% | 1,275 | 1,146 | -10% | 0 | 0 | — |
case-11 | fail→pass | 8,017 | 1,893 | -76% | 1 | 1 | 0% | 1,176 | 1,128 | -4% | 0 | 0 | — |
case-12 | fail→pass | 6,774 | 1,442 | -79% | 1 | 1 | 0% | 1,111 | 1,116 | +0% | 0 | 0 | — |
case-13 | fail→pass | 10,206 | 2,108 | -79% | 1 | 1 | 0% | 1,500 | 1,153 | -23% | 0 | 0 | — |
case-14 | fail→pass | 5,911 | 1,607 | -73% | 1 | 1 | 0% | 991 | 1,101 | +11% | 0 | 0 | — |
case-15 | fail→pass | 6,379 | 1,533 | -76% | 1 | 1 | 0% | 1,148 | 1,070 | -7% | 0 | 0 | — |
case-16 | fail→pass | 6,402 | 1,701 | -73% | 1 | 1 | 0% | 1,192 | 1,163 | -2% | 0 | 0 | — |
case-17 | fail→pass | 8,708 | 2,577 | -70% | 1 | 1 | 0% | 1,421 | 1,262 | -11% | 0 | 0 | — |
case-18 | fail→pass | 8,683 | 1,997 | -77% | 1 | 1 | 0% | 1,687 | 1,160 | -31% | 0 | 0 | — |
case-19 | fail→pass | 8,406 | 2,093 | -75% | 1 | 1 | 0% | 1,465 | 1,166 | -20% | 0 | 0 | — |
case-20 | pass→pass | 10,147 | 4,317 | -57% | 1 | 1 | 0% | 1,500 | 1,516 | +1% | 0 | 0 | — |
case-21 | pass→pass | 7,996 | 4,757 | -41% | 1 | 1 | 0% | 1,403 | 1,744 | +24% | 0 | 0 | — |
case-22 | pass→fail | 12,188 | 5,843 | -52% | 1 | 1 | 0% | 2,108 | 1,901 | -10% | 0 | 0 | — |
case-23 | pass→pass | 7,767 | 4,695 | -40% | 1 | 1 | 0% | 1,299 | 1,703 | +31% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +67 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.