MCP server that turns YouTube into a research engine — keyless search, video intel, and resilient transcripts for Claude Code, Codex, and any MCP client.
Solid tool definitions with clear naming (verb_noun pattern), comprehensive parameter schemas using Zod, and detailed descriptions. All 6 tools have input schemas and descriptions. However, output schemas are not formally documented in the code, responses are JSON-stringified but lack explicit schema declarations. Error handling is present but generic (fail() wraps errors without recovery guidance). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Parameter descriptions are good (72 chars avg baseline met), but some lack format/constraint details (e.g., 'language' accepts any string, no ISO 639-1 hint).
Channel metadata (name, subscribers, description) plus its recent uploads with views — enough to read a channel's strategy, cadence, and what performs.
YouTube's autocomplete for a seed term — a direct read on real search demand. Use for keyword research: seed a niche term, get what people actually type. Chain suggestions of suggestions to map a topic space.
Fetch a video's transcript as clean plain text. Resilient: tries InnerTube, then the timedtext caption track, then local yt-dlp if installed. Long transcripts are chunked — check totalChars and call again with offsetChars to continue.
Batch transcript fetch (max 10 videos, 3 at a time). Per-video failures don't kill the batch — failed entries carry an error field. Each transcript is truncated to fit; use get_transcript with offsetChars for full text of long ones.
Full metadata + engagement for one video: title, channel, publish date, views, likes, likesPer1kViews (resonance signal, typical range 10-50), category, keywords, description, hasCaptions.
Output schemas not formally documented. Responses are JSON-stringified but lack explicit schema declarations in tool registration. LLMs cannot reliably parse response structure without documented schemas.
No tool annotations despite all tools being read-only. Missing readOnlyHint declarations prevent clients from optimizing caching and retry logic.
Error handling is generic. fail() function returns raw error messages without recovery guidance. LLMs receive no actionable next steps (e.g., 'Try search_videos() first' for not-found errors).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Search YouTube for videos (no API key). Returns id, title, channel, published, views, duration, snippet per hit. Use filters to narrow: uploadDate for recency, sortBy view_count to find what performs.
Language parameter accepts any string without format hint. Should document ISO 639-1 code requirement (e.g., 'en', 'es', 'fr') to prevent invalid language codes.
get_transcripts batch operation lacks per-item error details. Response includes error field but does not distinguish retryable vs fatal failures, limiting LLM recovery strategies.