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}).
2.3 KiB
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-Iddisambiguation) - Docker image publishing (multi-arch, Gitea registry)
- Library browse tools (
retrieve_item_children,retrieve_season_list,retrieve_episode_list), series discovery viasearch_for_item'sitem_types, anditem_type/series_name/played-state fields on items retrieve_next_episode(next_unplayed/latestmodes; resume counts as next)- Subtitle/audio control:
retrieve_now_playing+set_subtitle/set_audio_trackwith 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" toolsretrieve_next_up(/Shows/NextUp) — continue-watching list for the authed user (series-level;retrieve_next_episodeis 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)