YouTube MCP Server
Servidor MCP de YouTube
Un servidor de Model Context Protocol (MCP) alojado que ofrece a Claude, Cursor, Windsurf y cualquier otro cliente MCP cuatro herramientas de solo lectura para YouTube. Busca en YouTube, lee datos de vídeos y canales, y extrae transcripciones, sin proyecto de Google Cloud ni clave de YouTube Data API.
https://mcp.hasdata.com/api/mcp?apis=youtube
Contenido
Related MCP server: YouTube MCP Server
Lo que necesitas
Un cliente MCP que hable HTTP transmisible con cabeceras personalizadas. Una clave de API de HasData desde el panel de control, gratuita de crear. Nada más. Este es un servidor remoto. No hay paquete que instalar, ni contenedor que ejecutar, ni cuenta de Google en ningún punto del flujo.
Inicio rápido
La URL del servidor es la misma para todos los clientes. Lo ejecutamos de forma práctica en Claude Code y Claude Desktop. Los demás bloques siguen el formato documentado de cada cliente para un servidor remoto.
Campo | Valor |
URL |
|
Transporte | HTTP, transmisible |
Cabecera de autenticación |
|
Los clientes con soporte OAuth pueden añadir la misma URL como conector e iniciar sesión sin poner una clave en un archivo de configuración.
claude mcp add --transport http youtube "https://mcp.hasdata.com/api/mcp?apis=youtube" \
--header "x-api-key: HASDATA_API_KEY"Configuración, luego Conectores, luego Añadir conector personalizado, y pega https://mcp.hasdata.com/api/mcp?apis=youtube e inicia sesión.
Para la ruta de archivo de configuración, Claude Desktop solo carga servidores locales (stdio), por lo que un servidor remoto se alcanza a través del puente mcp-remote, que necesita Node. Añade esto a claude_desktop_config.json:
{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.hasdata.com/api/mcp?apis=youtube",
"--header",
"x-api-key:HASDATA_API_KEY"
]
}
}
}El valor x-api-key: no lleva espacio después de los dos puntos. Claude Desktop pasa el argumento sin shell, y un espacio divide la cabecera.
~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno solo:
{
"mcpServers": {
"youtube": {
"url": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:
{
"mcpServers": {
"youtube": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}{
"mcpServers": {
"youtube": {
"url": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"type": "streamableHttp",
"headers": { "x-api-key": "HASDATA_API_KEY" },
"disabled": false
}
}
}.vscode/mcp.json en el espacio de trabajo:
{
"servers": {
"youtube": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codex/config.toml:
[mcp_servers.youtube]
url = "https://mcp.hasdata.com/api/mcp?apis=youtube"
[mcp_servers.youtube.headers]
"x-api-key" = "HASDATA_API_KEY"~/.gemini/settings.json:
{
"mcpServers": {
"youtube": {
"httpUrl": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}Ejemplos de prompts
Prompts, no código. Pega uno y el agente elige la herramienta por sí mismo. Cada uno está anotado con las llamadas que requiere, porque en MCP el modelo decide cuántas llamadas hacer y cada llamada exitosa cuesta 10 créditos.
Encuentra los diez vídeos más vistos sobre el Model Context Protocol del último mes, luego extrae la transcripción del primero y dame las tres afirmaciones que hace sobre la llamada a herramientas.
Dos llamadas, 20 créditos.
Toma el canal @GoogleDevelopers. Lista las pestañas que publica, luego resume las últimas cinco subidas y dime qué temas se repiten.
Dos llamadas, 20 créditos. Leer una pestaña que no has visto requiere una segunda llamada, porque la lista de pestañas llega dentro de la primera respuesta.
Toma este id de vídeo, dQw4w9WgXcQ. Obtén sus estadísticas, luego comprueba cuáles de sus vídeos relacionados provienen del mismo canal.
Una llamada, 10 créditos. Los vídeos relacionados viajan en la misma respuesta.
Busca en YouTube "tutorial de web scraping", ordenado por fecha de subida, solo vídeos de menos de cuatro minutos, y dame los títulos de los capítulos de cada resultado que los tenga.
Una llamada, 10 créditos.
Extrae la transcripción en alemán de este vídeo si existe, y dime en qué idiomas está disponible.
Una llamada, 10 créditos.
La búsqueda acepta los tokens de filtro propios de YouTube, y un agente reduce por duración, fecha de subida y tipo de contenido sin post-procesamiento. Las transcripciones llegan con la lista de pistas de idioma disponibles, lo que permite al agente elegir una sin adivinar.
Paginación cuesta una llamada cada vez. Un prompt de investigación que busca, pagina dos veces y luego extrae tres transcripciones son seis llamadas y 60 créditos. La prueba gratuita llega más lejos con preguntas concretas que con rastreos abiertos.
Herramientas
Cuatro herramientas, todas de solo lectura. Los ejemplos a continuación están recortados de llamadas reales, y los números en ellos cambian a medida que YouTube se actualiza. Léelos como formas. Cada nombre de herramienta enlaza a su referencia de endpoint, que incluye la lista completa de campos.
Los ejemplos son el payload, no la respuesta completa. Un resultado de tools/call lleva un bloque de texto, y ese texto es en sí mismo JSON que contiene url, status, text y json, con los datos extraídos bajo json. Desde una respuesta JSON-RPC cruda, la ruta es result.content[0].text, parseado, luego .json. Un cliente de chat lo desenvuelve por ti, y el código que habla directamente con el endpoint no lo hace.
Obtener resultados de búsqueda de YouTube
hasdata_youtube_search_getYoutubeSearchResults
Busca en YouTube y devuelve la página completa de resultados, dividida por tipo de resultado.
Parámetro | Tipo | Obligatorio | Notas |
| string | sí | Consulta de texto libre, exactamente como la escribiría un usuario |
| string |
| |
| string | Ventana de subida relativa a ahora | |
| string | Rango de duración, por ejemplo | |
| string | Restringe a un tipo de contenido | |
| array | Marcas de características, combinables | |
| string | Token | |
| string | El | |
| string | Códigos de país e idioma de dos letras, y dispositivo |
Una página de resultados se divide en videoResults, shortsResults, inlineShortsResults, playlistResults, channelResults y shelves, con colocaciones de pago en adsResults y sponsoredResults. Qué bloques aparecen depende de la consulta, y un bloque sin nada que informar está ausente, no vacío. Comprueba la clave antes de iterar. searchInformation lleva el total y pagination.nextPageToken es lo que devuelves como paginationToken. Los anuncios nunca se mezclan en los arrays orgánicos, aunque hay dos que saltarse.
{
"positionOnPage": 1,
"videoId": "GuTcle5edjk",
"title": "you need to learn MCP RIGHT NOW!! (Model Context Protocol)",
"viewsOriginal": "1.6M views",
"views": 1653824,
"length": "38:40",
"publishedDate": "11 months ago",
"extensions": ["4K"],
"chapters": [
{ "title": "Intro", "time": "0:00" },
{ "title": "Problem: LLMs Suck at Accessing Code", "time": "0:40" }
],
"channel": { "name": "NetworkChuck", "verified": true }
}Dos cosas ahí merecen mención. views es un entero parseado junto a la cadena de visualización 1.6M views y no necesita un analizador de sufijos. Y chapters vienen dentro de los resultados de búsqueda, no solo en el vídeo en sí, aunque solo algunos vídeos los llevan.
La referencia del endpoint de búsqueda lista todos los tokens sp y filters__ que acepta el endpoint.
Obtener datos de vídeo de YouTube
hasdata_youtube_video_getYoutubeVideo
Un vídeo por id.
Parámetro | Tipo | Obligatorio | Notas |
| string | sí | El id de vídeo de 11 caracteres de |
| string | Códigos de país e idioma de dos letras, y dispositivo |
Devuelve title, thumbnail, channel, publishedDate, lengthSeconds, category, isFamilySafe y isUnlisted, más los arrays relatedVideos, endScreenVideos, keywords, captions, music y socialLinks. description es un objeto que contiene el texto completo en content y un array links donde cada enlace y hashtag lleva startIndex, length, text y url. El campo text contiene el enlace tal como lo escribió el autor y url contiene el envoltorio de redirección de YouTube, lo que importa si estás extrayendo destinos de patrocinadores o afiliados de las descripciones.
Lee el campo parseado por nombre según la herramienta antes de copiar el ejemplo a continuación. Los resultados de búsqueda y canal ponen el número parseado en
viewsy la cadena de visualización enviewsOriginal. Esta respuesta lo invierte, manteniendo la cadena enviewsy el número enextractedViews, y la misma inversión se aplica alikesysubscribers. Si lo haces mal,item.views > 100000compara una cadena aquí sin lanzar nunca una excepción.
{
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"views": "1,806,075,152 views",
"extractedViews": 1806075152,
"likes": "19M",
"extractedLikes": 19344370,
"publishedDate": "Oct 24, 2009",
"lengthSeconds": 214,
"category": "Music",
"channel": { "name": "Rick Astley", "subscribers": "4.53M subscribers", "extractedSubscribers": 4530000 }
}Obtener datos de canal de YouTube
hasdata_youtube_channel_getYoutubeChannel
Un canal por id o handle, una pestaña a la vez.
Parámetro | Tipo | Obligatorio | Notas |
| string | sí | Identificador canónico |
| string |
| |
| string | Token de la respuesta anterior | |
| string | Códigos de país e idioma de dos letras, y dispositivo |
Devuelve channelInfo, featuredVideo y sections en la pestaña predeterminada. Otras pestañas devuelven su propia forma. channelInfo incluye el handle, el avatar, el banner, la descripción, las palabras clave del canal y el rssUrl del canal, suficiente para seguir un canal sin necesidad de consultarlo periódicamente.
La matriz
availableTabsdel ejemplo siguiente contiene etiquetas de visualización, que no son los valores que aceptatab.Home,Live,CoursesySearchno se corresponden con ningún valor de parámetro, y el resto deben pasarse a minúsculas. Un agente que lea la lista y recorra cada entrada falla en la primera.
{
"channelInfo": {
"channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
"name": "Google for Developers",
"handle": "@GoogleDevelopers",
"rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UC_x5XG1OV2P6uZZ5FSM9Ttw",
"isFamilySafe": true,
"availableTabs": ["Home", "Videos", "Shorts", "Live", "Courses", "Playlists", "Posts", "Search"]
}
}Obtener la transcripción de un vídeo de YouTube
hasdata_youtube_transcript_getYoutubeTranscript
La transcripción sincronizada de un vídeo.
Parámetro | Tipo | Obligatorio | Notas |
| string | sí | El identificador de vídeo de 11 caracteres |
| string | Código BCP-47 de la pista que quieres | |
| string | Establécelo en |
Comprueba
selecteden la respuesta antes de confiar en el idioma. Pedir unlanguageCodeque el vídeo no tiene no falla ni devuelve vacío, sino que recurre silenciosamente a la pista predeterminada. Cada entrada de la lista incluyelanguageNameylanguageCode, y un idioma puede aparecer dos veces: una con autoría humana y otra contypeestablecido enasr.
{
"transcript": [
{ "startMs": 320, "endMs": 18800, "snippet": "[Music]", "startTimeText": "0:00" },
{ "startMs": 18800, "endMs": 21800, "snippet": "We're no strangers to", "startTimeText": "0:18" }
],
"availableTranscripts": [
{ "languageName": "English", "languageCode": "en" },
{ "languageName": "English", "languageCode": "en", "type": "asr", "selected": true },
{ "languageName": "German (Germany)", "languageCode": "de-DE" },
{ "languageName": "Japanese", "languageCode": "ja" }
]
}Errores y rutas de fallo
Tu cliente casi nunca ve un código de error HTTP en una llamada a una herramienta. La capa MCP responde con 200 y coloca el fallo dentro del resultado, con isError establecido en true y el motivo como texto. El agente lee un mensaje donde cabría esperar una línea de estado.
Una clave incorrecta aparece como salida de la herramienta, no como una conexión fallida. tools/list acepta cualquier clave no vacía y devuelve las cuatro herramientas, por lo que el cliente completa el protocolo de enlace y muestra verde. La primera llamada a una herramienta devuelve entonces isError: true y el texto HasData API error: 401 Unauthorized. Presta atención a esa cadena, porque nada anterior en el flujo informa del problema.
Una clave ausente es el único error HTTP real. La autorización se ejecuta antes que cualquier herramienta, y la propia conexión falla con 401. Las cabeceras CORS están presentes, y un cliente de navegador lee el estado y no un fallo de red opaco.
Un argumento que rompe el esquema de una herramienta se rechaza antes de convertirse en un raspado. El servidor responde con isError: true y el texto MCP error -32602: Input validation error, nombrando el campo infractor. No se obtiene nada y no se cobra nada. El mensaje nombra el campo pero no los valores aceptados, por lo que las tablas de parámetros anteriores son la referencia.
Una llamada que tiene éxito y no encuentra nada es el caso que confunde a la gente. Llega como un resultado ordinario con requestMetadata.status establecido en ok y la clave de datos simplemente ausente. Nada en el cuerpo indica que el resultado estaba vacío. Comprueba el campo que necesitas, no un error.
Un identificador que la plataforma rechaza devuelve 400 con requestMetadata.status establecido en error. Un handle de canal que no existe es la forma habitual de verlo.
Los resultados que contienen datos también incluyen un requestMetadata.id que merece la pena citar en el soporte.
Precios, plan gratuito y límites
Cada herramienta de YouTube cuesta 10 créditos por llamada correcta. El tamaño de la respuesta no cambia el precio. Una página completa de resultados de búsqueda cuesta lo mismo que una página con un solo vídeo.
La prueba gratuita es de 1.000 créditos durante 30 días sin tarjeta, lo que equivale a 100 llamadas de YouTube. Después, una cuenta activa sigue recibiendo 100 créditos cada día cuando su saldo baja de 100, por lo que un agente de bajo volumen funciona con el plan gratuito indefinidamente.
Los planes de pago empiezan en 49 $ al mes por 200.000 créditos, lo que equivale a 20.000 llamadas. El precio unitario baja con el volumen, desde 2,45 $ por 1.000 llamadas en el plan de entrada hasta 0,99 $ en Business, 0,83 $ en Growth y 0,75 $ en los planes de alto volumen más grandes.
Tu plan también establece la concurrencia. La prueba gratuita permite 1 solicitud a la vez, Startup 15, Business 30, Growth 50, y los planes de alto volumen van de 200 a 1.500. Gestiona el caso de desbordamiento de forma defensiva en cualquier proceso desatendido, porque un agente que se ramifique alcanzará el techo antes que tú.
Una solicitud que devuelve un código distinto de 200 no se factura. Una llamada correcta que no encuentra nada sigue siendo una llamada.
Selección de herramientas
El parámetro de consulta apis decide qué herramientas ve tu agente. Menos herramientas significa menos contexto dedicado a las definiciones de herramientas y menos posibilidades de que el modelo elija la equivocada.
?apis=youtube the four tools in this repo
?apis=youtube,google_serp add Google search
?apis=youtube,tiktok,instagram a social research bundleEl parámetro acepta nombres de proveedores como youtube y nombres de API individuales como google_maps_search. Los nombres mal escritos se ignoran. Si todos los nombres son incorrectos, la solicitud falla con 400, y el cuerpo enumera tanto lo que no reconoció como todos los valores válidos. Elimina el parámetro y el mismo endpoint expone las 57 herramientas de HasData.
Cómo se compara
Frente a la YouTube Data API v3 oficial:
YouTube Data API v3 | Este servidor | |
Configuración | Proyecto de Google Cloud y una clave de API | Una clave y una URL |
Cuota de búsqueda | "asignación de cuota predeterminada de 100 llamadas | Los créditos de tu plan, 10 por llamada |
Transcripciones de vídeos que no son tuyos |
| Sí, con la lista de idiomas |
Capítulos en los resultados de búsqueda | No | Sí |
Visualizaciones y me gusta en los resultados de búsqueda | Ausentes, y una segunda llamada a | Cadena de visualización y entero en la misma respuesta |
Coste | Gratis dentro de la cuota diaria | De pago tras la prueba, 10 créditos por llamada |
Escrituras y datos privados | Subidas, listas de reproducción, comentarios y tus propios análisis a través de OAuth | Solo lectura, únicamente datos públicos |
Las dos últimas filas importan. Si la cuota diaria cubre tu volumen y eres dueño del canal que consultas, la API oficial es la respuesta más barata y deberías usarla.
La mayoría de los demás servidores MCP de YouTube solo hacen transcripciones. Este también busca, lee vídeos con sus cifras de interacción y recorre las pestañas del canal, por lo que un agente realiza toda una pasada de investigación sin un segundo servidor.
Lo que este servidor no hace. Sin comentarios, sin gestión de canales, sin subidas, sin análisis, sin datos privados. Lee lo que puede ver un visitante sin sesión iniciada.
Preguntas frecuentes
¿Existe un servidor MCP oficial de YouTube?
Google no publica ninguno. YouTube no tiene un servidor MCP de primera parte. Todas las opciones las construye otra persona, ya sea en torno a la YouTube Data API v3 o en torno a las páginas públicas. Este está mantenido por HasData y lee páginas públicas, por eso no necesita credenciales de Google.
¿Qué es un servidor MCP de YouTube?
Un servidor que expone datos de YouTube como herramientas que un cliente de IA puede llamar. El cliente envía una llamada a una herramienta a través del Model Context Protocol, el servidor obtiene los datos y devuelve JSON estructurado, y el modelo trabaja con el resultado sin ver nunca una página de HTML. Este expone cuatro herramientas y se ejecuta de forma remota. El cliente se conecta a una URL y no inicia ningún proceso local.
¿Necesito una clave de API de YouTube o un proyecto de Google Cloud?
No. La única credencial es tu clave de HasData. No hay ningún proyecto de Google Cloud que crear, ningún formulario de cuota que rellenar ni ninguna pantalla de consentimiento de OAuth, porque las herramientas leen páginas públicas de YouTube y no la YouTube Data API.
¿Necesito alojar o ejecutar algo?
No. Es un servidor MCP remoto sobre streamable HTTP. Nada que instalar, ningún contenedor que mantener activo, ningún proceso que reiniciar.
¿Los datos son en vivo o en caché?
En vivo. Cada llamada obtiene la página en el momento de la solicitud y lleva su propio requestMetadata.id. Dos llamadas idénticas son dos obtenciones separadas y no una reproducción de una copia almacenada. Contadores como las visualizaciones y los me gusta siguen a la página, por lo que se mueven cuando la página se mueve.
¿Qué ocurre cuando YouTube cambia su diseño?
Nada por tu parte. Seguimos los cambios y mantenemos estable el esquema de respuesta, por lo que los nombres y tipos de campo permanecen igual. Un campo sin valor está ausente del elemento, no presente y nulo. Lee los campos opcionales con un valor predeterminado.
¿Puedo usar esto junto con otras API de HasData?
Sí. El parámetro apis acepta una lista, y ?apis=youtube,google_serp da a tu agente las cuatro herramientas de YouTube más la búsqueda de Google. Elimina el parámetro y lo obtienes todo.
¿Puedo obtener una transcripción de cualquier vídeo?
Solo donde el vídeo tenga una, y availableTranscripts te indica lo que existe antes de que preguntes.
¿Puedo iniciar sesión con OAuth en lugar de pegar una clave?
Sí, en clientes que lo admitan. Claude Desktop y Cursor pueden añadir el endpoint como conector e iniciar sesión. Los agentes y scripts desatendidos usan la cabecera x-api-key.
Cumplimiento y datos personales
HasData solo accede a datos disponibles públicamente. Los términos de una plataforma pueden restringir el acceso automatizado, y tú eres responsable de tu propio cumplimiento. Cuando los datos que recopiles incluyan información personal, asegúrate de tener una base legal para ello según el GDPR, la CCPA o las normas equivalentes en tu jurisdicción.
Enlaces de HasData
Página del producto y generador de solicitudes | |
Documentación del servidor | |
Las 57 herramientas en un solo servidor | |
Tutoriales para clientes | |
Todo lo demás que extraemos | |
Planes y costes de créditos | |
Claves y uso |
Desarrollo
Este repositorio es configuración y documentación para un servidor remoto. No hay paso de compilación ni nada que contenerizar.
Las pruebas en test/ verifican el contrato de las herramientas, la parte que puede romperse sin un commit aquí. Comprueban que ?apis=youtube devuelve exactamente cuatro herramientas, que cada herramienta sigue declarando su parámetro requerido, que ningún nombre ha cambiado y que la clave en uso es realmente aceptada. Esa última comprobación llama a una herramienta de verdad y cuesta 10 créditos, que es el precio de un canario que puede fallar por la razón correcta.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm testLa misma suite se ejecuta en CI en cada push y una vez por semana de forma programada, porque la lista de herramientas upstream puede cambiar sin que nadie toque este repositorio. Un fallo significa que la lista de herramientas se ha movido, que la clave ha dejado de funcionar o que el endpoint no era accesible, y el mensaje de aserción indica cuál de ellos.
Contribuciones
Las correcciones a las tablas de herramientas y a los ejemplos de respuesta son la contribución más útil, porque son las partes que se desvían. Incluye la llamada que hiciste y la respuesta que obtuviste. Las pull requests de forks ejecutan la suite sin una clave, y las comprobaciones en vivo se omiten en lugar de ponerse en rojo.
Licencia
MIT. Consulta LICENSE.
Available Tools
4 toolshasdata_youtube_channel_getYoutubeChannelyoutube_channel: GET /AInspect
Get YouTube Channel Data
Fetches a YouTube channel by its ID (UC…) or handle (@name) and returns structured data for any channel tab — featured/Home, videos, shorts, streams, playlists, posts, podcasts, releases, store, about. Returns channel identity (title, description, avatar, banner, country, join date), subscriber and total-view counts, social links, and the items on the requested tab (videos with views and publish date, playlists, posts, podcasts, etc.). Use to monitor competitor channels, build creator/brand directories, track posting cadence and growth signals, or feed videoId into the YouTube Video / Transcript endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| gl | No | The two-letter country code for the country you want to limit the search to. Provide one exact documented value (245 allowed), e.g. `ac`, `af`. | |
| hl | No | The two-letter language code for the language you want to use for the search. Provide one exact documented value (159 allowed), e.g. `af`, `ak`. | |
| tab | No | Channel tab to scrape. Each tab returns a different content shape: - `featured` (default) — channel Home page (channel trailer + curated rows) - `videos` — uploaded long-form videos - `shorts` — Shorts feed - `streams` — past and upcoming live streams - `playlists` — created and saved playlists - `posts` / `community` — community posts - `podcasts` — podcast episodes - `releases` — music releases - `about` — channel description, links, stats - `store` — channel merch | |
| channelId | Yes | YouTube channel identifier — either the canonical channel ID (`UC…`, 24 chars) or the public handle starting with `@` (e.g. `@PewDiePie`). Legacy `/c/<custom>` and `/user/<name>` URL slugs are also accepted. | |
| deviceType | No | Device type for the request. | |
| paginationToken | No | Token returned in the previous response to fetch the next page of results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well: it states what is fetched, which tabs are supported, what channel-level fields are returned, and how results can be reused. It does not mention rate limits, authentication, or explicit read-only status, but the verb 'Fetches' and the GET-style title make the operation's nature clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it starts with the core fetch behavior, then explains output fields, then lists concrete use cases. Every sentence adds value; only minor redundancy exists between the description's tab list and the schema's tab enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description provides a solid mental model of inputs, outputs, tabs, and downstream use. It could go deeper on pagination/response structure, but the schema already covers paginationToken, and the description sufficiently explains what an agent can expect from the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description reinforces channelId's accepted formats and explains the meaning of tab-level output, but it does not add significant meaning beyond the schema for gl, hl, deviceType, or paginationToken. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Fetches a YouTube channel by its ID or handle') and clearly distinguishes the tool from YouTube search, video, and transcript siblings by focusing on channel-level data and per-tab content. It names concrete output types, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear application contexts ('monitor competitor channels, build creator/brand directories, track posting cadence and growth signals') and even routes downstream usage to the YouTube Video/Transcript endpoints. It does not explicitly list when not to use this tool versus search or video endpoints, but the use cases are concrete enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hasdata_youtube_search_getYoutubeSearchResultsyoutube_search: GET /AInspect
Get YouTube Search Results
Searches YouTube for a query and returns the full results page split into videoResults (videoId, title, views, length, publish date, chapters, channel info, extensions like 4K/CC), channelResults (channelId, handle, subscribers, verified flag), shortsResults / inlineShortsResults, themed shelves (e.g. 'People also watched', 'Latest from '), adsResults and sponsoredResults (advertiser, landing URL, position), plus searchInformation.totalResults. Each block preserves its positionOnPage so the original layout is reconstructable. Use for competitor and topic monitoring, brand-mention tracking, ad-placement intelligence, creator discovery, trend research, or to feed videoId / channelId into the YouTube Video, Channel, or Transcript endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Free-text search query, exactly as a user would type it into the YouTube search box. | |
| gl | No | The two-letter country code for the country you want to limit the search to. Provide one exact documented value (245 allowed), e.g. `ac`, `af`. | |
| hl | No | The two-letter language code for the language you want to use for the search. Provide one exact documented value (159 allowed), e.g. `af`, `ak`. | |
| sp | No | Raw YouTube `sp` filter token, copied verbatim from a YouTube search URL (e.g. `EgIQAQ%253D%253D`). When provided, it overrides `sortBy`, `date`, `videoType`, `length`, and `filters[]`. Use only if you need a YouTube-side filter that this API does not expose as a structured parameter. | |
| date | No | Limit results to videos uploaded within this time window relative to now. | |
| length | No | Filter by video duration bucket: - `under4` — under 4 minutes - `between420` — 4 to 20 minutes - `plus20` — over 20 minutes | |
| sortBy | No | Sort order applied to the results page. `relevance` (default) — best match for the query; `date` — newest first; `views` — most viewed first; `rating` — highest rated first; `popularity` — trending/most popular. | |
| filters__ | No | Feature flags to require on results. Multiple values are combined with AND (every flag must apply). - `hd` — HD quality - `k4` — 4K quality - `hdr` — HDR - `subtitles` — has subtitles/closed captions - `cc` — Creative Commons license - `d3` — 3D video - `d360` — 360° video - `vr180` — VR180 video - `live` — currently live - `bought` — purchased/paid content - `location` — has a geographic location tag | |
| videoType | No | Restrict results to a single YouTube content type — regular videos, Shorts, channels, playlists, or movies. | |
| deviceType | No | Device type for the request. | |
| paginationToken | No | Token returned in the previous response to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description makes clear this is a read-oriented search operation that returns a results page, but no annotations are present and it does not explicitly mention authentication, rate limits, error behavior, or confirm there are no side effects. The read-only nature is implied rather than fully disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: the first sentence front-loads the purpose and output structure, and the second sentence explains real-world use cases and relationships to sibling tools. There is no redundant filler or repeated schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description thoroughly covers the response shape (videoResults, channelResults, shortsResults, shelves, adsResults, sponsoredResults, positionOnPage) and gives downstream usage context. Pagination is also covered indirectly through the paginationToken parameter, making the tool self-contained enough for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% descriptive coverage of all 11 parameters, including enums and the sp override behavior. The description itself adds no parameter-level meaning beyond that, so it sits at the baseline for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Searches YouTube for a query' and precisely identifies the resource and action, and it enumerates the distinct result sections returned. This makes the tool's purpose unmistakable and distinguishes it from the channel, video, and transcript sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly lists concrete use cases (competitor monitoring, brand tracking, ad-placement intelligence, creator discovery, trend research) and tells agents to feed returned videoId/channelId into the Video, Channel, or Transcript endpoints. This provides clear guidance on when to use the search tool versus its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hasdata_youtube_transcript_getYoutubeTranscriptyoutube_transcript: GET /AInspect
Get YouTube Video Transcript
Returns the timed transcript (subtitles) of a YouTube video by its 11-character videoId. languageCode selects the track (e.g. en, de-DE, pt-BR); type=asr requests the auto-generated speech-recognition track. Each segment in transcript[] carries startMs, endMs, snippet, and a formatted startTimeText. The response also includes availableTranscripts[] listing every track on the video (language name + code, type: asr for auto-generated, selected: true for the one returned) so callers can discover what else is available. Use to feed a video's spoken content into RAG/LLM pipelines, generate summaries or chapter outlines, build searchable archives, run translation or accessibility workflows, or analyze talking points across a creator's catalog (pair with the YouTube Channel endpoint to enumerate videos, then fetch transcripts).
| Name | Required | Description | Default |
|---|---|---|---|
| v | Yes | 11-character YouTube video ID — the value of the `v=` query parameter in a watch URL (e.g. `dQw4w9WgXcQ` for `https://www.youtube.com/watch?v=dQw4w9WgXcQ`). | |
| type | No | Set to `asr` to fetch the YouTube auto-generated (speech-recognition) track. Omit to fetch the human-authored track for `languageCode` when one exists. | |
| languageCode | No | BCP-47 / YouTube language code of the transcript track to return (e.g. `en`, `de`, `en-US`, `pt-BR`). Must match a track that the video actually has. When omitted, the video's default language track is returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by explaining the response shape: transcript segments with startMs/endMs/snippet/startTimeText, plus availableTranscripts[] with language/type/selected info. It does not cover error cases such as missing tracks or invalid video IDs, but the behavioral context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded, leading with the core purpose before expanding into response details and use cases. Every sentence adds meaningful context, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description thoroughly explains the return value structure and available track discovery. Combined with the complete parameter schema, an agent has enough information to select and invoke this tool correctly for transcript-related tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all three parameters with 100% coverage, so the baseline is 3. The description reinforces languageCode and type=asr semantics but adds little beyond what the schema already states; the v parameter is already fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the timed transcript (subtitles) of a YouTube video by 11-character videoId. This is a specific verb+resource that is naturally distinct from the sibling channel/search/video endpoints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete use cases such as RAG/LLM pipelines, summaries, archives, translation, and accessibility workflows. It also suggests pairing with the YouTube Channel endpoint to enumerate videos, but it does not explicitly contrast with the search or video siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hasdata_youtube_video_getYoutubeVideoyoutube_video: GET /AInspect
Get YouTube Video Data
Fetches a single YouTube video by its 11-character videoId. Returns title, thumbnail, raw + normalized views and likes, lengthSeconds, publish date, category, keywords/tags, isFamilySafe / isUnlisted flags, the uploading channel (id, handle, subscribers, avatar), the full description with parsed links and hashtags, available captions tracks (with kind: asr for auto-generated), Content-ID music matches (song/artist/album), creator socialLinks, and the relatedVideos, endScreenVideos, and relatedShorts rails. Use to enrich a video URL with metadata, monitor view/like growth, extract music or sponsor/affiliate links, gather features for recommender or RAG pipelines, or detect caption tracks before calling the YouTube Transcript endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| v | Yes | 11-character YouTube video ID — the value of the `v=` query parameter in a watch URL (e.g. `dQw4w9WgXcQ` for `https://www.youtube.com/watch?v=dQw4w9WgXcQ`). | |
| gl | No | The two-letter country code for the country you want to limit the search to. Provide one exact documented value (245 allowed), e.g. `ac`, `af`. | |
| hl | No | The two-letter language code for the language you want to use for the search. Provide one exact documented value (159 allowed), e.g. `af`, `ak`. | |
| deviceType | No | Device type for the request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly indicates a read-only fetch and provides rich output semantics: raw + normalized views/likes, safety/unlisted flags, captions with kind:asr, Content-ID music matches, social links, and related rails. It omits error handling, auth, and rate limits, but for a GET-style data tool the described behavior is substantially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense: it front-loads the core purpose, then systematically lists return fields and use cases without filler. It could be structured into shorter sentences, but every clause adds relevant information for a tool with a rich payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description compensates well by enumerating the full return surface and tying usage to the transcript sibling. Minor gaps remain around error cases and access requirements, but an agent has enough to invoke the tool correctly for typical metadata enrichment tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and all four parameters (v, gl, hl, deviceType) are already documented with types, examples, and allowed values. The description only repeats the videoId concept and does not add meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetches') and resource ('a single YouTube video by its 11-character videoId') and enumerates the returned fields in detail. It is clearly distinct from the sibling channel/search/transcript tools because it is scoped to video metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists concrete use cases: enriching video URLs, monitoring view/like growth, extracting music or affiliate links, building recommender/RAG features, and detecting caption tracks before calling the YouTube Transcript endpoint. It does not explicitly state when not to use the tool, but the context is clear enough for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
hasdata_youtube_channel_getYoutubeChannel - First observed
hasdata_youtube_search_getYoutubeSearchResults - First observed
hasdata_youtube_transcript_getYoutubeTranscript - First observed
hasdata_youtube_video_getYoutubeVideo
TDQS
Scored across 4 tools
Each tool targets a clearly distinct resource: channel data, search results, transcripts, and video metadata. There is no overlap in purpose—the channel tool returns channel/playlist info, search returns result blocks, transcript returns timed subtitles, and video returns single-video metadata. An agent would have no trouble selecting the right tool for a given task.
All four tools follow the identical `hasdata_youtube_<domain>_getYoutube<Domain>` pattern (e.g., `hasdata_youtube_channel_getYoutubeChannel`). The naming is fully consistent in structure, verb, and case, making it predictable and easy to remember.
The server exposes exactly four tools, which is well-scoped for a YouTube data retrieval purpose. It covers the core read operations—channel lookup, search, transcript, and video details—without unnecessary bloat. Each tool earns its place, and the count is neither too thin nor excessive.
The tool set covers the primary read-only workflows for YouTube: fetching channel data (including playlists and posts), searching, retrieving video metadata, and getting transcripts. Minor gaps exist, such as a dedicated method for channel video lists (though the channel tool can fetch the videos tab) or comments, but the core lifecycle for data retrieval is well covered. Agents can achieve most tasks without dead ends.
Maintenance
Related MCP Connectors
YouTube transcripts, search, channel browsing, and playlists for AI agents via MCP.
YouTube transcripts, search, and channel and playlist listings for any AI app. Hosted.
YouTube transcripts, search, channel/playlist listings and upload tracking for AI agents.
An MCP server that gives any LLM or agent clean YouTube transcripts on demand: a single video, a whole channel, or a playlist, plus AI cleanup of auto-generated captions. API-key auth, credit-based, same backend as the public v1 API. Get a free API key with 25 free credits at youtubetranscriptdownload.com/account.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol server that enables searching YouTube videos, retrieving and storing transcripts, and performing semantic search over video content without using the official YouTube API.40MIT
- AlicenseBqualityAmaintenanceA server that enables interaction with YouTube data through the Model Context Protocol, allowing users to search videos, retrieve detailed information about videos/channels, and fetch comments.12420 npm26MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI assistants to access YouTube data in real-time, with capabilities for searching videos, analyzing channels, retrieving video details, and extracting transcripts.13MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol server providing comprehensive read-only access to YouTube data, including video search, transcripts, and channel forensics. It features 16 specialized tools designed for content analysis and metadata retrieval in LLM applications.2-