bama
BAMA: Build Any Mac App. Agent skills to research, clone, design, build, optimize, and test native macOS apps with Swift and SwiftUI.
Keyless MCP server + skill: search in every language, read only the seconds that matter, see real frames, cite every claim with a timestamp.
SkillsTypeScriptGitHub @jindratilkOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Keyless YouTube MCP server + research skill for AI agents: multi-language search with transcript highlights, transcript ranges, real video frames, comments and channel outliers. Claude Code & Codex plugin.
Taken from the repository README
Loading the full README.
Read the full README ↗A keyless YouTube MCP server and research skill for AI agents. Multi-language YouTube search with transcript highlights, transcripts by time range, chapter or query, real video frames, comments and channel outlier scores, in Claude Code, Codex and any MCP client.
Website · Install · Tools · The skill · FAQ
Ask your agent things like:
"List 20 hooks from this year's top AI productivity videos, with hook type, what's on screen, and a link to the second."
"Which of @channel's videos broke out this year, and what do they have in common?"
"What do creators say is the biggest mistake with AI note-taking? Quote them."
…and get back a table with verbatim quotes, ?t= timestamp links and a coverage line (what was searched, reviewed and skipped). No YouTube Data API key, no OAuth, no cookies.
Most YouTube MCP servers expose one call per video and dump whole transcripts into context. That falls apart when an agent has to look at 50 videos. This one follows the pattern that works for web-search agents: few tools, results that are already useful, and the research method in a skill.
hl/gl), merged and de-duplicated. Videos found by several queries rank higher.start: 0, end: 30 for hooks), by chapter, or only the passages matching a query. Up to 25 videos per call.YT_PROXY for big sweeps.Paste this into Claude Code, Codex, Cursor or any agent that can run commands:
Install YouTube Research MCP for me from https://github.com/jindratilk/youtube-research-mcp. Follow the "Install instructions for AI agents" in its README for the client you are running in: the plugin (MCP server + research skill) in Claude Code or Codex, otherwise the MCP server config. Then run youtube_doctor and tell me whether everything works, and if I need to restart anything.
claude plugin marketplace add jindratilk/youtube-research-mcp
claude plugin install youtube-research@youtube-research
codex plugin marketplace add jindratilk/youtube-research-mcp
codex plugin add youtube-research@youtube-research
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": ["-y", "github:jindratilk/youtube-research-mcp"]
}
}
}
The skill is optional outside the plugins: copy skills/youtube-research into your agent's skills folder.
git clone https://github.com/jindratilk/youtube-research-mcp && cd youtube-research-mcp && npm install && npm run build
claude mcp add youtube -- node "$PWD/dist/index.js"
Requirements: Node.js 20+. dist/index.js is one bundled file with no runtime dependencies. For video frames also install yt-dlp and ffmpeg (brew install yt-dlp ffmpeg); yt-dlp also serves as a transcript fallback.
If a user asked you to install YouTube Research MCP, follow these steps exactly.
node --version must be 20 or newer. If it is older or missing, stop and tell the user.claude CLI exists): run claude plugin marketplace add jindratilk/youtube-research-mcp, then claude plugin install youtube-research@youtube-research. This installs the youtube MCP server and the youtube-research skill.codex CLI exists): run codex plugin marketplace add jindratilk/youtube-research-mcp, then codex plugin add youtube-research@youtube-research."youtube": { "command": "npx", "args": ["-y", "github:jindratilk/youtube-research-mcp"] }. Common config files: Claude Desktop ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows); Cursor ~/.cursor/mcp.json; Windsurf ~/.codeium/windsurf/mcp_config.json; VS Code .vscode/mcp.json (uses a servers key instead of mcpServers). If the client supports skills, copy skills/youtube-research into its skills folder.npx -y github:jindratilk/youtube-research-mcp --doctor. Every line should start with ✓. yt-dlp and ffmpeg are optional (needed only for video frames); if they are missing, offer to install them (brew install yt-dlp ffmpeg on macOS) but do not install without asking. A [rate_limited] transcript line means YouTube is throttling this IP for a while; everything else still works.| Tool | What it does |
|---|---|
youtube_search | Multi-query search with filters and transcript highlights |
youtube_fetch | Batch read: transcript slices, real frames, details, chapters, comments, thumbnail |
youtube_channel | A channel's videos with ×median outlier scores |
youtube_doctor | Checks every YouTube path from your machine, with timings |
youtube_search{
"queries": [
"AI productivity workflow",
"how I use AI to save 10 hours a week",
{ "query": "productividad con IA", "hl": "es", "gl": "ES" }
],
"uploaded": "year",
"minViews": 10000,
"highlights": 5
}
| Parameter | Meaning |
|---|---|
queries | 1–12 strings or {query, hl, gl} objects, run in parallel and merged |
limit | Results per query before merging (default 10, max 50) |
uploaded | hour · today · week · month · year (server-side) |
publishedAfter / publishedBefore | YYYY-MM[-DD], applied after search, approximate |
duration | short (<4 min) · medium (4–20) · long (>20) |
minDurationSec / maxDurationSec / minViews | Post-filters |
shorts | exclude (default) · include · only |
captionsOnly | Only videos with subtitles/CC |
sort | relevance · views · date |
highlights / highlightsPerVideo | How many top results get transcript passages (default 5) and how many each (default 3) |
highlightQuery | Highlight something other than the search topic, e.g. ["biggest mistake"] |
transcriptLangs | Preferred caption languages; default is the video's original language |
youtube_fetch{
"videos": ["https://youtu.be/TL8V41Ea6oM", "htZRCE2GgIs"],
"parts": ["details", "transcript", "frames"],
"start": 0,
"end": 30,
"frames": 4
}
| Parameter | Meaning |
|---|---|
videos | 1–25 URLs or IDs (a ?t= in a URL is used as the start) |
parts | details · transcript · chapters · comments · thumbnail · frames |
start / end | Range for transcript and frames, in seconds or m:ss |
chapter | Limit to the chapter whose title contains this text |
query / matches | Return only matching transcript passages instead of the full text |
timestamps | paragraph (~30 s blocks, default) · segment · none |
maxCharacters | Transcript budget per video (default 12000); truncation says where to resume |
frames / frameAt / frameWidth | N evenly spaced frames, or exact seconds; width up to 1280 px |
commentsLimit | Comments to show per video (default 20, max 200) |
commentsQuery / commentsMatch | Search inside the top comments (accent-insensitive, matches word forms); any (default) or all terms |
commentsMinLikes / commentsAuthor | Keep only comments with enough likes, or from an author |
commentsScan | How many top comments to read before filtering (default 300 when filtering, max 1000) |
commentsSort | top (YouTube order) or likes (most liked first among the scanned) |
commentsReplies | Also load up to N replies under each shown comment (max 20) |
youtube_channel{ "channel": "@aliabdaal", "limit": 60, "minOutlier": 2 }
Videos, Shorts or streams; latest · popular · oldest; up to 300 videos; subscriber and video counts; publishedAfter; minOutlier to keep only breakouts.
youtube_doctorNo parameters. Checks search, video details, transcripts, watch page, channels, yt-dlp and ffmpeg, and shows an active rate-limit pause.
skills/youtube-research turns a request into a supervised sweep:
videos_reviewed: N / skipped: ….References: searching · hooks (10-type taxonomy) · quotes & claims · creators & outliers · synthesis.
productivity matches productive), weights rare terms higher and rewards passages that hit several concepts.| Env var | Default | Meaning |
|---|---|---|
YT_MCP_TOOLS | all | Comma-separated tools to expose |
YT_MAX_CONCURRENCY / YT_MIN_GAP_MS | 4 / 120 | API request queue |
YT_CAPTION_CONCURRENCY / YT_CAPTION_GAP_MS | 2 / 350 | Caption download queue |
YT_CAPTION_COOLDOWN_MS | 60000 | First pause after a caption 429 (doubles per repeat, max 15 min) |
YT_PROXY | none | HTTP(S) proxy for all YouTube requests, yt-dlp and ffmpeg |
YT_TIMEOUT_MS | 15000 | Per-request timeout |
YT_CACHE_TTL_MS | 900000 | In-memory cache lifetime |
YT_FRAME_MAX_HEIGHT / YT_FRAME_CONCURRENCY | 720 / 3 | Stream quality for frames; parallel ffmpeg processes |
YT_DLP / YT_DLP_PATH / FFMPEG_PATH | on / yt-dlp / ffmpeg | Disable or locate the helpers |
YT_DEBUG | off | Log every YouTube request (status, queue wait, latency) to stderr |
YT_WEB_CLIENT_VERSION, YT_ANDROID_CLIENT_VERSION, YT_IOS_CLIENT_VERSION | built in | Override Innertube client versions if YouTube starts rejecting them |
get_transcript endpoint is closed to anonymous clients, so there is no second keyless source. The server pauses and tells the agent when to retry; for sweeps of hundreds of videos use YT_PROXY.youtube_fetch returns the exact publish date.sort: "date" re-sorts fetched results, so pair it with uploaded.Does it need a YouTube API key? No. No API key, OAuth or cookies.
Which clients does it work with? Any MCP client over stdio: Claude Code, Codex, Claude Desktop, Cursor, Windsurf, VS Code, Zed and more. Claude Code and Codex get the plugin with the skill.
Does it download videos? No. Transcripts come from caption files; frames are decoded from small byte ranges of the stream.
Does it work for non-English content? Yes: per-query language and region, original-language transcripts by default, and accent-aware highlights.
Researching Instagram Reels too? See the sibling project Reels Research MCP.
Is it affiliated with YouTube or Google? No. It is an independent open-source project. Use it in line with YouTube's terms and respect creators' rights.
npm test # offline unit tests: parsing, highlights, filters, frame spacing
npm run smoke # end-to-end against live YouTube through a real MCP client
npm run dev # run from source
npm run build # typecheck + bundle to dist/index.js
Layout: src/innertube.ts (HTTP, queues, errors) · src/youtube.ts (search, player, transcripts, watch page, comments, channels) · src/highlights.ts · src/frames.ts · src/tools/* (MCP tools) · skills/ · docs/ (website).
MIT. Not affiliated with YouTube or Google. YouTube is a trademark of Google LLC.
Keywords: YouTube MCP server, YouTube transcript MCP, YouTube search for AI agents, Model Context Protocol, Claude Code plugin, Codex plugin, YouTube without API key, YouTube hooks research, video frames for LLMs, agent skill.