mcp-kodi
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KODI_AUTH | No | HTTP Basic credentials as user:pass | |
| KODI_HOST | No | Host[:port] of the Kodi box or proxy | |
| KODI_SCHEME | No | http or https (default https) | |
| KODI_CURL_OPTS | No | Curl options; include '-k' for insecure |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| playA | Press Play on the Kodi remote: resumes paused playback only — it cannot start new content (with nothing loaded it is a no-op); use playfile to start something. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "nowplaying": { "media", "id", "title", "artist", … } }. |
| pauseB | Press Pause on the Kodi remote: pause the active player on the target instance. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "nowplaying": { "media", "id", "title", "artist", … } }. |
| stopA | Press Stop on the Kodi remote: stop the active player on the target instance and clear the playlist it was playing, so no queued items linger. Returns the player-state snapshot — { "state": "stopped" } after a successful stop. |
| skipnextA | Press Skip Next (Next track / chapter) on the Kodi remote: advance the active player to the next item in its playlist (or next chapter). A remote keypress, not a player command; with nothing loaded it is a no-op. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "nowplaying": { "media", "id", "title", "artist", … } }. |
| skippreviousA | Press Skip Previous (Previous track / chapter) on the Kodi remote: go to the previous item in the playlist (or restart the current item, matching Kodi's own button). A remote keypress, not a player command; with nothing loaded it is a no-op. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "nowplaying": { "media", "id", "title", "artist", … } }. |
| muteA | Mute the target instance's audio output. Returns { "muted", "volume" }. |
| unmuteA | Unmute the target instance's audio output. Returns { "muted", "volume" }. |
| volumeA | Adjust the target instance's volume by a relative step (in percentage points); step 0 or omitted just reports the current volume. Returns { "muted", "volume", "min", "max" }. |
| nowplayingA | Report what is playing on the target instance without changing anything — also a reachability and state probe. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "audio", "subtitle" (audio/subtitle for video: count + current track), "nowplaying": { "media", "id", "title", "artist", … } }; { "state": "stopped" } when idle. |
| instancesA | Read or modify the configured Kodi instances (action: get/set/remove). Manages the MCP server's own config, not a Kodi device. Returns { "default", "instances": [ { "key", "host", "scheme", "insecure", "has_auth", "allow_rpc", … } ] }. |
| searchmediaA | Find playable files by name: music/tv-show/movie, drilled to leaf files with paging (limit/offset) and a total count. For music, title means the ALBUM name; match a song by its own title with the |
| contributorsA | Find or list contributors (bands, solo artists, composers, actors, directors): optional name substring, optional type (band/composer/actor/director) — e.g. {type: "band"} lists all bands. Rows {name, in: [albums|songs|movies|tvshows]} say where each name yields hits — feed the exact name back into |
| playfileA | Play one file by path (e.g. a |
| queueA | Queue an item behind the one now playing, for continuous playback: a |
| getplaylistA | Read the queue without changing it: the items of the active player's playlist — or of a named one (audio/video/picture), which always wins — plus the position of the now-playing item. An empty queue is an empty list. Returns { "type"?, "total", "position"?, "items": [ { "id", "file", "label", "type" } ] }. |
| dropplaylistsA | Empty all queues: clear the audio, video and picture playlists in one call. The current item keeps playing — only the queued items behind it are removed — so playback is never interrupted. Not undoable; inspect with getplaylist first if the content matters. Returns the player-state snapshot — whatever was playing still is, with nothing queued behind it. |
| notifyA | Show a notification toast on the Kodi box's screen: a title and message, with an optional icon ("info"/"warning"/"error" or any image path/URL) and display time in milliseconds. Doesn't touch playback. Returns { "shown", "title", "message", "displaytime", "image"? }. |
| historyA | List recently played items from the local playback log. Filter with an ISO-8601 window (since/until), media/kind/artist, a free-text match or an exact id; page with limit/offset/order, or ask for a count only. An omitted instance returns all boxes. Reads only the local log — no Kodi call, so it works even when no box is reachable. Returns { "total", "returned", "offset", "truncated", "entries": [ { "at", "instance", "kind", "media", "title", "artist", … } ] }. |
| audio_and_subtitle_infoA | Inspect a movie or episode's audio tracks and subtitles BEFORE playback, from Kodi's cached streamdetails (no playback). Name the item by type+id (a searchmedia movie/episode row) or by file. Returns { "file", "audio":[{ "index", "codec", "channels", "language" }], "subtitle":[{ "index", "language" }], "video":[…] }. Embedded streams only: external .srt sidecars and files Kodi hasn't scanned come back as empty arrays; "index" maps to the audio/subtitle setters for embedded streams. |
| set_audio_and_subtitleA | Switch the audio track and/or subtitle of the video now playing on the target instance. "audio" is a stream index; "subtitle" is a stream index or "off" to hide subtitles — use the "index" values from audio_and_subtitle_info. Omit an argument to leave that stream unchanged; give at least one. Returns the player-state snapshot. |
| playfile_with_audio_and_subtitleA | Play a video file by path AND select its audio track and/or subtitle once it starts — the "when starting playback" partner of set_audio_and_subtitle. "file" is required; "audio" is a stream index and "subtitle" is a stream index or "off", using the "index" values from audio_and_subtitle_info. Give at least one of audio/subtitle (else use playfile). Video only. Returns the player-state snapshot. |
| rpcA | Escape hatch: send a raw JSON-RPC method to Kodi and return its reply unchanged. Disabled unless the target instance has opted in (allow_rpc in the server config, set by hand only). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 22 tools
Most tools target a distinct resource+action (play/pause/stop, skipnext/skipprevious, mute/unmute/volume) and are clearly separable. The only real overlap is the audio/subtitle cluster: playfile vs playfile_with_audio_and_subtitle, and set_audio_and_subtitle vs the others, but the descriptions explicitly state when to use each, so ambiguity is low.
Conventions are mixed: bare verbs (play, pause, stop, queue, notify), concatenated lowercase (nowplaying, skipnext, searchmedia, getplaylist, dropplaylists), and snake_case (audio_and_subtitle_info, set_audio_and_subtitle, playfile_with_audio_and_subtitle). All lowercase keeps it readable, but there is no single predictable pattern.
22 tools is on the heavier side for a media-center controller, but the domain (playback, search, queueing, audio/subtitle, volume, history, config, raw RPC) is broad and each tool is distinct. Mute/unmute could be a single toggle, but overall the set is justifiable.
Coverage is strong across playback control, media/people search, queue read/drop, audio-subtitle selection, volume/mute, notifications, history, instance config, and a raw JSON-RPC escape hatch. Minor gaps exist (no seek/position control, no individual queue-item removal, no library scan/update), but core workflows are complete.