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
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}).
48 lines
2.3 KiB
Markdown
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)
|