Exposes a set of tools over streamable-HTTP MCP so Poke (cloud) can control a KEF LSX II on your LAN and drive Spotify playback through it.
KEF+Spotify MCP has 21 well-named tools with clear verb-noun patterns (kef_power_on, spotify_pause, cast_url). Descriptions are present and substantive (avg ~150 chars), explaining WHAT each tool does and WHEN to use it. Input schemas are visible and typed (string, integer). However, critical gaps reduce the score: (1) No enum constraints on source parameter in kef_set_source despite listing valid values in description only; (2) No output schemas documented for any tool, LLMs cannot plan downstream calls; (3) No error handling guidance, tools return bare strings without recovery hints; (4) Parameter descriptions lack format/range details (e.g., volume 0-100 stated in description but not in schema); (5) No tool annotations (readOnlyHint, destructiveHint) despite clear read/write semantics. Composition is strong, tools are single-purpose and chainable (e.g., play_on_kef orchestrates multiple steps internally). Security: credentials injected via env vars, not exposed as params. Overall: solid foundation, but missing LLM-optimization patterns that would push this to 75+.
Pause the current Cast playback on the KEF.
Resume paused Cast playback on the KEF.
What's currently playing on the KEF via Google Cast.
Stop Cast playback on the KEF and close the Cast receiver.
Play a direct audio stream URL on the KEF via Google Cast. Use this for internet radio, podcast audio, or any direct .mp3/.aac/.flac/ stream URL. NOT for Spotify (use play_on_kef) or YouTube (use play_from_youtube). `volume` optionally sets the KEF hardware volume (0-100).
Get the current KEF hardware volume (0-100).
No output schemas documented. Tools return dicts or strings without field definitions. LLMs cannot infer what fields to extract or plan downstream calls.
kef_set_source accepts 'source' as free-form string but valid values (wifi, bluetooth, tv, optic, coaxial, analog) are only in description. No enum constraint in schema. LLMs may hallucinate invalid values.
No error handling guidance. Tools return bare success strings ('KEF powered on.') without recovery hints for failure cases. If a tool fails, LLM has no guidance on retry strategy or alternatives.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Skip to the next track on the KEF.
Toggle play/pause on the KEF.
Wake the KEF speakers from standby.
Go to the previous track on the KEF.
Switch the KEF input source. Valid sources: wifi, bluetooth, tv, optic, coaxial, analog. Use 'wifi' for Spotify Connect / streaming.
Set the KEF hardware volume (0-100).
Put the KEF speakers into standby (off).
Report KEF power state, current source, and what's playing.
Play audio from YouTube (or SoundCloud / other sites) on the KEF via Cast. `query` can be a search phrase ("daft punk discovery") or a direct YouTube/SoundCloud URL. The audio stream is resolved and cast to the KEF. Use this when the user wants something from YouTube specifically; for music by name, prefer play_on_kef (Spotify). `volume` optionally sets the KEF hardware volume (0-100). Note: 24/7 YouTube *livestreams* (e.g. "lofi hip hop radio") only offer HLS, which this speaker's Cast receiver can't play -- use a normal video/track, or use play_radio with a direct radio stream URL for continuous audio.
Play music on the KEF speakers from a natural request. Does the whole flow: wakes the KEF, switches it to wifi, finds the requested artist/track/playlist/album on Spotify, transfers playback to the KEF's Spotify Connect device, and starts it. `query` is a free-text request like "Bonobo", "lofi beats playlist", or "Bohemian Rhapsody by Queen". `volume` optionally sets the KEF volume (0-100) before playing.
Play internet radio / a direct stream URL on the KEF via Google Cast. Pass a direct stream URL (e.g. an Icecast/Shoutcast .mp3 endpoint). `volume` optionally sets the KEF hardware volume (0-100).
What's currently playing on Spotify and on which device.
Pause Spotify playback.
Set Spotify playback volume (0-100) on the active device.
Skip to the next Spotify track.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools have clear semantics (kef_power_on is destructive, kef_get_volume is read-only) but LLMs cannot see this in the schema.
Parameter constraints (volume 0-100, level 0-100) stated in descriptions but not in JSON Schema. LLMs cannot validate bounds programmatically and may pass out-of-range values.