Install
$ agentstack add skill-grigorytal-youtube-transcript-skill-youtube-transcript-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
YouTube transcript & search
Two capabilities, both backed by yt-dlp, no API key and no quota:
- Search YouTube by topic → ranked candidate list (find videos yourself).
- Transcribe a known URL → clean plain text (read a video).
The natural pipeline: search.sh "topic" → pick the relevant hits → get_transcript.sh on each → summarize / give verdicts.
The point: an agent that can only see a video's title is guessing. With this it reads what was actually said, so "watch these 20 videos and tell me which are worth my time" becomes a real instruction.
Requirements
yt-dlp must be on PATH:
brew install yt-dlp # macOS
pipx install yt-dlp # anything with Python
Keep it fresh — YouTube changes things and a stale yt-dlp starts failing (brew upgrade yt-dlp / pipx upgrade yt-dlp).
Search
/search.sh "" [count] [today|week|month|year]
query– free-text topic, quote it. Works in any language (Cyrillic fine).count– how many results (default 10).when– optional freshness window. Omit for relevance, all-time.
Output: a numbered list, each entry = title, then channel · duration · views (and the upload date when a window is set), then the full youtube.com/watch?v=… URL on its own line (ready to pipe into get_transcript.sh).
Two modes:
- No window → relevance order, flat & fast, no dates shown.
- With window (
today/week/month/year) → uses YouTube's ownsp=upload-date filter and full extraction, so real upload dates appear. Slightly slower (worth it — that's the point of asking for fresh). Use this for "what's new in this niche" sweeps.
Note: ytsearchdate is unsupported in many packaged yt-dlp builds, so freshness goes through the sp= filter instead — which is richer anyway (time windows, not just sort).
Transcribe
/get_transcript.sh [--save] "" [sub-langs]
Prefer --save when you (the agent) will read the transcript. Without it the full transcript streams to stdout, and a long one (tens of KB) gets spilled by the harness into a random-hash file that's awkward to track. With --save the script writes to /.cache/ [].txt and prints only a short summary plus that path, so you then Read a file named after the actual video. It doubles as a cache: re-running the same URL rewrites the same well-named file.
url– full video or Short URL (youtu.be/…,youtube.com/watch?v=…,youtube.com/shorts/…).sub-langs– optionalyt-dlp --sub-langsoverride. By default no language is needed: the script reads the video's original audio language from YouTube metadata (%(language)s) and fetches that track, preferring the original-origcaptions over auto-translations. If metadata has no language, it falls back to a Cyrillic-in-title heuristic (→ru), then English. Pass a spec (e.g.ru.*,ruor.*) only to force something.
Output: a header line (title · channel), the URL, a blank line, then the transcript as one flowing text block. Exit code 2 + NO_SUBTITLES on stderr means the video has no captions at all — retry with an explicit --sub-langs ".*".
Notes
- Auto-generated captions have no punctuation-perfect formatting; the cleaner strips timestamps, inline tags, and rolling duplicate lines, but the text stays spoken-language rough. Good enough to read and summarize, not a polished quote source.
- Works on any video that has captions — including auto-generated ones, which is most of YouTube. Videos with captions disabled entirely are the exception, and the script tells you so instead of failing silently.
- This is for reading YouTube content. Transcribing arbitrary audio files is a different job — use a speech-to-text tool for that.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: grigorytal
- Source: grigorytal/youtube-transcript-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.