Skip to main content
Glama

playfile

Play one file by path (e.g. a searchmedia result's file): Player.Open auto-selects the audio/video player. Works for any reachable path, in-library or not. A file missing from disk (stale library entry) is reported as an error.

Instructions

Play one file by path (e.g. a searchmedia result's file): Player.Open auto-selects the audio/video player. Works for any reachable path, in-library or not. A file missing from disk (stale library entry) is reported as an error. Returns the player-state snapshot { "state", "type", "time", "totaltime", "progress", "nowplaying": { "media", "id", "title", "artist", … } }.

Input Schema

NameRequiredDescriptionDefault
fileYesPath of the file to play — the `file` field of a `searchmedia` result row. Any path Kodi can reach works, in-library or not.
instanceNoTarget Kodi instance. Omitted uses the default ("(null)").
fullscreenaudioNoAudio only: once playback starts, bring Kodi's fullscreen now-playing screen (the `visualisation` window) to the front. Audio playback does not auto-fullscreen the way video does, so without this the player stays behind whatever window is up, showing only the small now-playing strip. Ignored when the open starts video (Kodi already fullscreens that) and a no-op when nothing starts. Note: with no visualisation add-on installed the window renders blank behind the now-playing info.

Output Schema

NameRequiredDescriptionDefault
timeNoPlayback position { hours, minutes, seconds, milliseconds }.
typeNoThe active player kind.
audioNoAudio tracks of the playing video (video only): { count, current: { index, language, codec, channels } }. `index` is the set_audio_and_subtitle audio selector.
stateYesPlayback state; "stopped" means nothing is loaded.
progressNoLegible position derived from time/totaltime, "elapsed / total (NN%)" e.g. "15:38 / 46:40 (33%)"; absent for live streams with no fixed length.
subtitleNoSubtitles of the playing video (video only, present only when any exist): { count, enabled, current: { index, language } }. `current` is present only while a subtitle is shown; `index` is the set_audio_and_subtitle subtitle selector.
totaltimeNoThe item's duration, same shape as time.
nowplayingNoThe loaded media (present whenever something is loaded): { media (song/episode/movie/…; "unknown" off-library), id (library id, -1 off-library), file, label, title; and where they apply showtitle/season/episode (TV), album/artist/track (song) }.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changed
    • addedInput schema / properties / fullscreenaudio
      Added value: +{
      +  "description": "Audio only: once playback starts, bring Kodi's fullscreen now-playing screen (the `visualisation` window) to the front. Audio playback does not auto-fullscreen the way video does, so without this the player stays behind whatever window is up, showing only the small now-playing strip. Ignored when the open starts video (Kodi already fullscreens that) and a no-op when nothing starts. Note: with no visualisation add-on installed the window renders blank behind the now-playing info.",
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / album
      Removed value: -{
      -  "description": "Song: the album name.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / artist
      Removed value: -{
      -  "description": "Song: the performers, an array of strings.",
      -  "type": "array"
      -}
    • addedOutput schema / properties / audio
      Added value: +{
      +  "description": "Audio tracks of the playing video (video only): { count, current: { index, language, codec, channels } }. `index` is the set_audio_and_subtitle audio selector.",
      +  "type": "object"
      +}
    • removedOutput schema / properties / episode
      Removed value: -{
      -  "description": "TV episode: episode number.",
      -  "type": "integer"
      -}
    • removedOutput schema / properties / file
      Removed value: -{
      -  "description": "Path of the playing item.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / id
      Removed value: -{
      -  "description": "Library id of the playing item; -1 when off-library.",
      -  "type": "integer"
      -}
    • removedOutput schema / properties / label
      Removed value: -{
      -  "description": "Kodi's display label for the item.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / media
      Removed value: -{
      -  "description": "Real media type (song/episode/movie/musicvideo/…); \"unknown\" for an off-library file.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / nowplaying
      Added value: +{
      +  "description": "The loaded media (present whenever something is loaded): { media (song/episode/movie/…; \"unknown\" off-library), id (library id, -1 off-library), file, label, title; and where they apply showtitle/season/episode (TV), album/artist/track (song) }.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / progress
      Added value: +{
      +  "description": "Legible position derived from time/totaltime, \"elapsed / total (NN%)\" e.g. \"15:38 / 46:40 (33%)\"; absent for live streams with no fixed length.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / season
      Removed value: -{
      -  "description": "TV episode: season number.",
      -  "type": "integer"
      -}
    • removedOutput schema / properties / showtitle
      Removed value: -{
      -  "description": "TV episode: the show's name.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / subtitle
      Added value: +{
      +  "description": "Subtitles of the playing video (video only, present only when any exist): { count, enabled, current: { index, language } }. `current` is present only while a subtitle is shown; `index` is the set_audio_and_subtitle subtitle selector.",
      +  "type": "object"
      +}
    • removedOutput schema / properties / title
      Removed value: -{
      -  "description": "The item's title (may be empty).",
      -  "type": "string"
      -}
    • removedOutput schema / properties / track
      Removed value: -{
      -  "description": "Song: track number on the album.",
      -  "type": "integer"
      -}
  2. First observedv0.1.0

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does reasonably well: it discloses auto player selection (Player.Open), broad path reach, and that a missing-on-disk file surfaces as an error. It omits auth/instance-scoping behavior and any side effects on current playback, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and stays in one dense paragraph with little waste. The returned-state enumeration is arguably redundant given an output schema exists, making it slightly longer than needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, path scope, error behavior, and playback side effect, which is sufficient for a no-annotation mutation-style tool. Since an output schema exists, the embedded state-snapshot description is extra rather than necessary, and instance/auth behavior is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for `file` by tying it to `searchmedia` output paths and the in-library-or-not scope. It says nothing extra about `instance` or `fullscreenaudio`, which remain schema-only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (play) and resource (one file by path), and explicitly frames the input as a `searchmedia` result's `file`, which differentiates it from siblings like `play` and `playfile_with_audio_and_subtitle`. An agent can identify what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete context (use a path from `searchmedia`, any reachable path in-library or not) and notes the stale-entry error case, but never names the alternative sibling `playfile_with_audio_and_subtitle` or states when NOT to use this tool. Clear condition, no explicit exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.