Security
- Section-header spoofing fixed (#10): transcript text and video metadata (title, channel, description) are author-controlled input, but were interpolated verbatim into the labeled sections of
get_transcript/summarize_transcriptoutput — a caption line reading[INSTRUCTIONS]was indistinguishable from the genuine header. Such lines are now escaped (\[INSTRUCTIONS]); timestamp prefixes like[00:12:34]are unaffected.
Fixes
list_playlist_videosnow honorsorder="desc"with the defaultsort_by="index"(previously silently ignored), and fetches the full playlist in that case solimitreturns the true tail (#10)youtube.com/live/andyoutube-nocookie.com/embed/URLs are now recognized (#10)- The transcript client is constructed per call instead of sharing one
requests.Sessionacross the thread pool's concurrent tool calls (#12) - yt-dlp failures (metadata, playlist, search) now report their cause instead of a bare "Failed to fetch", so clients can distinguish rate-limits from bad IDs and decide whether to retry (#13)
get_video_metadatatruncates the description at 2000 chars instead of returning it unbounded (#13)
Infrastructure
- New CI workflow runs the new 52-test suite (pure helpers, protobuf
spencoding, playlist sorting, error paths) on every push and PR (#10) server.jsonis only bumped onmainafter the PyPI publish succeeds (#11)youtube-transcript-apicapped at<2to protect the error handler's exception imports (#13)
No MCP tool names or parameters changed — fully compatible with existing clients.