Files
gronod 42570915ed
Build and publish / Test and build (darwin) (push) Successful in 1m43s
Build and publish / Test and build (linux) (push) Successful in 2m30s
Build and publish / Test and build (windows) (push) Successful in 3m5s
Build and publish / Build and publish Docker image (push) Successful in 1m46s
Add browse, next-episode, and track-control tools
Implements the three roadmap feature sections:

- Browse: retrieve_item_children, retrieve_season_list, retrieve_episode_list;
  search_for_item gains item_types (e.g. "Series") so shows are findable
  without a selected library. Items now expose item_type, series_name, and
  per-user played state/resume position.
- retrieve_next_episode: next_unplayed (Emby NextUp, resume counts) or latest
  (most recent present episode; virtual placeholders skipped).
- retrieve_now_playing + set_subtitle/set_audio_track: stream listing and
  track switching via SetSubtitleStreamIndex/SetAudioStreamIndex GeneralCommands,
  with a PlayNow restart-at-position fallback for sessions that cannot switch
  mid-play (DLNA/Chromecast bridges).

Conformance manifest grows to 34 call sites with three new documented spec
gaps (StartPositionTicks on PlayRequest, missing /Shows/{Id}/Episodes response
schema, undeclared Fields/EnableUserData on /Users/{UserId}/Items/{Id}).
2026-09-21 00:09:49 +01:00

2.3 KiB

Roadmap

Planned and candidate features for emby-mcp. Items here are scoped ideas, not committed designs — each still needs its own implementation plan.

Done

  • Go port of the 20 Python Emby.MCP tools (parity)
  • Streamable-HTTP transport (MCP_TRANSPORT=http, endpoint /mcp, per-request Emby auth: Basic / Bearer token passthrough / X-Emby-User-Id disambiguation)
  • Docker image publishing (multi-arch, Gitea registry)
  • Library browse tools (retrieve_item_children, retrieve_season_list, retrieve_episode_list), series discovery via search_for_item's item_types, and item_type/series_name/played-state fields on items
  • retrieve_next_episode (next_unplayed/latest modes; resume counts as next)
  • Subtitle/audio control: retrieve_now_playing + set_subtitle / set_audio_track with GeneralCommand mid-play switching and restart-at-position fallback

Proposed: HTTP-mode hardening / extras

  • Per-token user allowlist: an API key can currently act as any user via X-Emby-User-Id. Optional env allowlist (e.g. MCP_ALLOWED_USERS) if tighter control is wanted.
  • Session-scoped token revocation: Basic-auth Emby tokens aren't revoked when an MCP session closes (no SDK close hook); only the 15-min credential cache TTL does a best-effort Logout. Could add explicit tracking if this matters.
  • TLS: HTTP mode is plain HTTP; README recommends a reverse proxy. In-binary TLS (MCP_TLS_CERT/MCP_TLS_KEY) is possible if proxy-less deploys matter.
  • Legacy SSE transport: mcp.SSEHandler (2024-11-05 spec) is available in the SDK if an SSE-only client ever needs it; deliberately omitted as deprecated.

Ideas / backlog (unscoped)

  • Movie/music-specific list tools (retrieve_movie_list, artist/album browse)
  • /Items/{Id}/Similar, /Shows/{Id}/Similar, /Items/{Id}/InstantMix — "more like this" tools
  • retrieve_next_up (/Shows/NextUp) — continue-watching list for the authed user (series-level; retrieve_next_episode is the single-series variant)
  • retrieve_missing_episodes (/Shows/Missing, /Shows/Upcoming) — gaps in a series collection
  • Watch-state tools (played/unplayed) if a write path is wanted
  • Image/artwork endpoints (probably out of scope — MCP clients can't render)