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

48 lines
2.3 KiB
Markdown

# Roadmap
Planned and candidate features for emby-mcp. Items here are scoped ideas, not
committed designs — each still needs its own implementation plan.
## Done
- [x] Go port of the 20 Python Emby.MCP tools (parity)
- [x] Streamable-HTTP transport (`MCP_TRANSPORT=http`, endpoint `/mcp`,
per-request Emby auth: Basic / Bearer token passthrough / `X-Emby-User-Id`
disambiguation)
- [x] Docker image publishing (multi-arch, Gitea registry)
- [x] 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
- [x] `retrieve_next_episode` (`next_unplayed`/`latest` modes; resume counts
as next)
- [x] 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)