HasData YouTube MCP Server

Busca en YouTube y lee datos de videos, canales y transcripciones como JSON, sin necesidad de un proyecto de Google Cloud.

Documentación

Servidor MCP de YouTube

Un servidor de Protocolo de Contexto de Modelo (MCP) alojado que brinda a Claude, Cursor, Windsurf y cualquier otro cliente MCP cuatro herramientas de solo lectura para YouTube. Busca en YouTube, lee datos de videos y canales, y obtén transcripciones, sin proyecto de Google Cloud ni clave de API de YouTube Data.

https://mcp.hasdata.com/api/mcp?apis=youtube

Glama score tool contract MCP Tools npm PyPI License

Contenido

Lo que necesitas

Un cliente MCP que hable HTTP transmisible con encabezados personalizados. Una clave de API de HasData desde el panel de control, gratuita de crear. Nada más. Este es un servidor remoto, por lo que la ruta más simple es una URL y un encabezado, sin contenedor que ejecutar y sin cuenta de Google en ningún punto del flujo. Un cliente solo-stdio puede usar el lanzador @hasdata/youtube-mcp (npm) o hasdata-youtube-mcp (PyPI) en su lugar.

Inicio rápido

La URL del servidor es la misma para cada cliente. 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.

CampoValor
URLhttps://mcp.hasdata.com/api/mcp?apis=youtube
TransporteHTTP, transmisible
Encabezado de autenticaciónx-api-key: HASDATA_API_KEY

Los clientes con soporte OAuth pueden agregar la misma URL como conector e iniciar sesión sin poner una clave en un archivo de configuración.

Claude Code
claude mcp add --transport http youtube "https://mcp.hasdata.com/api/mcp?apis=youtube" \
  --header "x-api-key: HASDATA_API_KEY"
Claude Desktop

Configuración, luego Conectores, luego Agregar conector personalizado, luego 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 llega a un servidor remoto a través de un lanzador stdio. El paquete @hasdata/youtube-mcp es ese lanzador, y lee la clave del entorno. Agrega esto a claude_desktop_config.json:

{
  "mcpServers": {
    "youtube": {
      "command": "npx",
      "args": ["-y", "@hasdata/youtube-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

¿Python en lugar de Node? Cambia el lanzador por el paquete PyPI, que uvx ejecuta sin instalación manual:

{
  "mcpServers": {
    "youtube": {
      "command": "uvx",
      "args": ["hasdata-youtube-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}
Cursor

~/.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" }
    }
  }
}
Windsurf

~/.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" }
    }
  }
}
Cline
{
  "mcpServers": {
    "youtube": {
      "url": "https://mcp.hasdata.com/api/mcp?apis=youtube",
      "type": "streamableHttp",
      "headers": { "x-api-key": "HASDATA_API_KEY" },
      "disabled": false
    }
  }
}
VS Code

.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 CLI

~/.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 CLI

~/.gemini/settings.json:

{
  "mcpServers": {
    "youtube": {
      "httpUrl": "https://mcp.hasdata.com/api/mcp?apis=youtube",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Ejemplos de indicaciones

Indicaciones, no código. Pega una y el agente elige la herramienta por sí mismo. Cada una está anotada 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 videos más vistos sobre el Protocolo de Contexto de Modelo del último mes, luego obtén 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. Enumera 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 video, dQw4w9WgXcQ. Obtén sus estadísticas, luego verifica cuáles de sus videos relacionados provienen del mismo canal.

Una llamada, 10 créditos. Los videos relacionados viajan en la misma respuesta.

Busca en YouTube "tutorial de web scraping", ordenado por fecha de subida, videos de menos de cuatro minutos solamente, y dame los títulos de capítulos de cada resultado que los tenga.

Una llamada, 10 créditos.

Obtén la transcripción en alemán de este video si existe, y dime en qué idiomas está disponible.

Una llamada, 10 créditos.

La búsqueda toma los propios tokens de filtro de YouTube, y un agente reduce por duración, fecha de subida y tipo de contenido sin posprocesamiento. Las transcripciones llegan con la lista de pistas de idioma disponibles, lo que permite al agente elegir una sin adivinar.

La paginación cuesta una llamada cada vez. Una indicación de investigación que busca, pagina dos veces y luego obtiene tres transcripciones es seis llamadas y 60 créditos. La prueba llega más lejos con preguntas específicas que con rastreos abiertos.

Herramientas

Cuatro herramientas, todas de solo lectura. Las muestras a continuación están recortadas de llamadas reales, y los números en ellas cambian a medida que YouTube se actualiza. Léelas como formas. El nombre de cada herramienta enlaza a su referencia de endpoint, que contiene la lista completa de campos.

Las muestras son el payload, no la respuesta completa. Un resultado 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, analizado, 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 de resultados completa, dividida por tipo de resultado.

ParámetroTipoRequeridoNotas
qstringConsulta de texto libre, exactamente como un usuario la escribiría
sortBystringrelevance por defecto, más date, views, rating y popularity
datestringVentana de subida relativa a ahora
lengthstringCategoría de duración, por ejemplo under4
videoTypestringRestringir a un tipo de contenido
filters__arrayBanderas de características, combinables
spstringToken sp crudo de YouTube copiado de una URL de búsqueda. Anula sortBy, date, videoType, length y filters__ sin advertencia, así que déjalos vacíos cuando pases un token
paginationTokenstringEl pagination.nextPageToken de la respuesta anterior
gl / hl / deviceTypestringCódigos de país e idioma de dos letras, y dispositivo

Una página de resultados se divide entre videoResults, shortsResults, inlineShortsResults, playlistResults, channelResults y shelves, con ubicaciones pagadas en adsResults y sponsoredResults. Qué bloques aparecen depende de la consulta, y un bloque sin nada que reportar está ausente, no vacío. Prueba 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 de ellos que omitir.

{
  "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 allí merecen mención. views es un entero analizado junto a la cadena de visualización 1.6M views y no necesita analizador de sufijos. Y chapters vienen dentro de los resultados de búsqueda, no solo en el video mismo, aunque solo algunos videos los llevan.

La referencia del endpoint de búsqueda enumera cada token sp y filters__ que el endpoint acepta.

Obtener datos de video de YouTube

hasdata_youtube_video_getYoutubeVideo

Un video por id.

ParámetroTipoRequeridoNotas
vstringEl id de video de 11 caracteres de v=
gl / hl / deviceTypestringCó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 el autor lo escribió 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 analizado por nombre por herramienta antes de copiar la muestra a continuación. Los resultados de búsqueda y canal ponen el número analizado en views y la cadena de visualización en viewsOriginal. Esta respuesta lo invierte, manteniendo la cadena en views y el número en extractedViews, y la misma inversión se aplica a likes y subscribers. Si lo haces mal, item.views > 100000 compara 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ámetroTipoRequeridoNotas
channelIdstringId canónico UC… o un @handle
tabstringfeatured por defecto, más videos, shorts, streams, playlists, posts, community, podcasts, releases, about y store. Toma un valor de esta lista, no de availableTabs en la respuesta
paginationTokenstringToken de la respuesta anterior
gl / hl / deviceTypestringCó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 lleva el handle, avatar, banner, descripción, palabras clave del canal y el rssUrl del canal, suficiente para seguir viendo un canal sin sondearlo.

El array availableTabs en la muestra a continuación contiene etiquetas de visualización, y no son los valores que tab acepta. Home, Live, Courses y Search no se corresponden con ningún valor de parámetro, y el resto necesita 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 transcripción de video de YouTube

hasdata_youtube_transcript_getYoutubeTranscript

La transcripción con tiempos de un video.

ParámetroTipoRequeridoNotas
vstringEl id de video de 11 caracteres
languageCodestringCódigo BCP-47 de la pista que quieres
typestringEstablecer a asr para la pista generada automáticamente

Verifica selected en la respuesta antes de confiar en el idioma. Pedir un languageCode que el video no tiene ni falla ni devuelve vacío, silenciosamente retrocede a la pista predeterminada. Cada entrada en la lista lleva languageName y languageCode, y un idioma puede aparecer dos veces, una vez escrito por humanos y una vez con type establecido a asr.

{
  "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 de 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 podrías 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 su protocolo de enlace y muestra verde. La primera llamada a la herramienta regresa entonces con isError: true y el texto HasData API error: 401 Unauthorized. Presta atención a esa cadena, porque nada antes en el flujo informa del problema.

Una clave faltante es el único error HTTP real. La autorización se ejecuta antes que cualquier herramienta, y la conexión en sí falla con 401. Los encabezados 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 dice que el resultado estaba vacío. Prueba el campo que necesitas, no un error.

Un identificador que la plataforma rechaza devuelve 400 con requestMetadata.status establecido en error. Un identificador de canal que no existe es la forma habitual de ver esto.

Los resultados que contienen datos también llevan un requestMetadata.id que vale la pena citar en el soporte.

Precios, nivel gratuito y límites

Cada herramienta de YouTube cuesta 10 créditos por llamada exitosa. 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 video.

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 recargados cada día siempre que su saldo baje de 100, por lo que un agente de bajo volumen funciona en el nivel gratuito indefinidamente.

Los planes de pago comienzan 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 inicial 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. Maneja el caso de desbordamiento de forma defensiva en cualquier cosa desatendida, porque un agente que se expande alcanzará el límite antes que tú.

Una solicitud que regresa con un estado distinto de 200 no se factura. Una llamada exitosa 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 gastado en definiciones de herramientas y menos oportunidades de que el modelo use la incorrecta.

?apis=youtube                    the four tools in this repo
?apis=youtube,google_serp        add Google search
?apis=youtube,tiktok,instagram   a social research bundle

El 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

Contra la API de datos de YouTube v3 oficial:

YouTube Data API v3Este servidor
ConfiguraciónProyecto de Google Cloud y una clave de APIUna clave y una URL
Asignación de búsqueda"asignación de cuota predeterminada de 100 llamadas search.list" al día, según la guía de inicio de GoogleLos créditos de tu plan, 10 por llamada
Transcripciones de videos que no poseescaptions.download "requiere que el usuario tenga permiso para editar el video", según la referencia de GoogleSí, con la lista de idiomas
Capítulos en resultados de búsquedaNo
Vistas y me gusta en resultados de búsquedaAusentes, y una segunda llamada videos.list los devuelve como cadenasCadena de visualización y entero en la misma respuesta
CostoGratis dentro de la cuota diariaDe pago después de la prueba, 10 créditos por llamada
Escrituras y datos privadosSubidas, listas de reproducción, comentarios y tus propias analíticas mediante OAuthSolo lectura, solo 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 otros servidores MCP de YouTube solo hacen transcripciones. Este también busca, lee videos con sus números de participación y recorre las pestañas de canal, por lo que un agente realiza un pase de investigación completo sin un segundo servidor.

Lo que este servidor no hace. Sin comentarios, sin gestión de canales, sin subidas, sin analíticas, sin datos privados. Lee lo que un visitante sin sesión puede ver.

Preguntas frecuentes

¿Existe un servidor MCP oficial de YouTube?

Google no publica uno. YouTube no tiene un servidor MCP de primera parte. Cada opción está construida por otra persona, ya sea alrededor de la API de datos de YouTube v3 o de las páginas públicas. Este está mantenido por HasData y lee páginas públicas, por lo que 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 de herramienta a través del Protocolo de Contexto de Modelo, el servidor obtiene los datos y devuelve JSON estructurado, y el modelo trabaja con el resultado y nunca ve 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 proyecto de Google Cloud que crear, ni formulario de cuota que completar, ni pantalla de consentimiento OAuth, porque las herramientas leen páginas públicas de YouTube y no la API de datos de YouTube.

¿Necesito alojar o ejecutar algo?

No. Este es un servidor MCP remoto en HTTP transmisible. Nada que instalar, ningún contenedor que mantener caliente, 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 vistas y me gusta siguen la página, por lo que se mueven a medida que la página se mueve.

¿Qué sucede cuando YouTube cambia su diseño?

Nada de tu lado. Rastreamos los cambios y mantenemos el esquema de respuesta estable, por lo que los nombres de campos y tipos permanecen. 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 APIs de HasData?

Sí. El parámetro apis acepta una lista, y ?apis=youtube,google_serp le da a tu agente las cuatro herramientas de YouTube más la búsqueda de Google. Elimina el parámetro y obtienes todo.

¿Puedo obtener una transcripción de cualquier video?

Solo donde el video tenga una, y availableTranscripts te dice qué 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 agregar el endpoint como conector e iniciar sesión. Los agentes y scripts desatendidos usan el encabezado x-api-key.

Cumplimiento y datos personales

HasData accede solo 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 recopilas incluyan información personal, asegúrate de tener una base legal para ello bajo GDPR, CCPA o las reglas equivalentes en tu jurisdicción.

Enlaces de HasData

Página de producto y constructor de solicitudesAPI de raspado de YouTube
Documentación del servidorDocumentación del servidor MCP
Las 57 herramientas en un solo servidorHasData/hasdata-mcp
Tutoriales de clientesClientes MCP e integraciones
Todo lo demás que raspamosAPI de raspado de YouTube y 54 más
Planes y costos de créditosPlanes y costos de créditos
Claves y usoPanel de HasData
Lanzador de Node en npm@hasdata/youtube-mcp
Lanzador de Python en PyPIhasdata-youtube-mcp

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 la herramienta, la parte que puede romperse sin un commit aquí. Comprueban que ?apis=youtube devuelve exactamente cuatro herramientas, que cada herramienta aún declara su parámetro requerido, que ningún nombre cambió y que la clave en uso realmente se acepta. Esa última verificació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 test

La misma suite se ejecuta en CI en cada push y una vez a la semana en un horario, porque la lista de herramientas ascendente puede cambiar sin que nadie toque este repositorio. Un fallo significa que la lista de herramientas se movió, la clave dejó de funcionar o el endpoint era inalcanzable, y el mensaje de aserción dice cuál.

Contribuciones

Las correcciones a las tablas de herramientas y las muestras 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 solicitudes de extracción de bifurcaciones ejecutan la suite sin clave, y las verificaciones en vivo se omiten en lugar de ponerse en rojo.

Licencia

MIT. Ver LICENCIA.