HasData YouTube

Search YouTube and read video, channel and transcript data as JSON. No Google Cloud project.

Should I use this

Quality & Safety

B
Description quality
100%
Schema completeness
100%
Naming quality
30%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (8)

  • LOWTool 'hasdata_youtube_channel_getYoutubeChannel' doesn't follow camelCase/snake_casein hasdata_youtube_channel_getYoutubeChannel
  • LOWTool 'hasdata_youtube_channel_getYoutubeChannel' name length outside 3-30 rangein hasdata_youtube_channel_getYoutubeChannel
  • LOWTool 'hasdata_youtube_search_getYoutubeSearchResults' doesn't follow camelCase/snake_casein hasdata_youtube_search_getYoutubeSearchResults
  • LOWTool 'hasdata_youtube_search_getYoutubeSearchResults' name length outside 3-30 rangein hasdata_youtube_search_getYoutubeSearchResults
  • LOWTool 'hasdata_youtube_transcript_getYoutubeTranscript' doesn't follow camelCase/snake_casein hasdata_youtube_transcript_getYoutubeTranscript
  • LOWTool 'hasdata_youtube_transcript_getYoutubeTranscript' name length outside 3-30 rangein hasdata_youtube_transcript_getYoutubeTranscript
  • LOWTool 'hasdata_youtube_video_getYoutubeVideo' doesn't follow camelCase/snake_casein hasdata_youtube_video_getYoutubeVideo
  • LOWTool 'hasdata_youtube_video_getYoutubeVideo' name length outside 3-30 rangein hasdata_youtube_video_getYoutubeVideo

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,384Tokens (tool definitions)
~4.3 KBTypical response size
Moderate attention impact (1.86% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

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

Runnable packages

npm@hasdata/youtube-mcp1.0.9stdio
pypihasdata-youtube-mcp1.0.9stdio

Remote endpoints

https://mcp.hasdata.com/api/mcp?apis=youtubestreamable-http
https://mcp.hasdata.com/mcp?apis=youtubestreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢hasdata_youtube_channel_getYoutubeChannel(channelId, tab, gl, hl, deviceType, ...)

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` (desktop only), `about`. Returns channel identity (title, description, avatar, banner), subscriber count, country, join date, total-view count and social links (on the `about` tab), 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.

Input Schema

{
  "type": "object",
  "properties": {
    "channelId": {
      "type": "string",
      "description": "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."
    },
    "tab": {
      "type": "string",
      "enum": [
        "featured",
        "videos",
        "shorts",
        "streams",
        "playlists",
        "posts",
        "community",
        "podcasts",
        "releases",
        "about",
        "store"
      ],
      "description": "Channel tab to scrape. Each tab returns a different content shape:\n- `featured` (default) — channel Home page (channel trailer + curated rows)\n- `videos` — uploaded long-form videos\n- `shorts` — Shorts feed\n- `streams` — past and upcoming live streams\n- `playlists` — created and saved playlists\n- `posts` / `community` — community posts\n- `podcasts` — podcast episodes\n- `releases` — music releases\n- `about` — channel description, links, stats\n- `store` — channel merch\n"
    },
    "gl": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "enum": [
        "desktop",
        "mobile"
      ],
      "description": "Device type for the request."
    },
    "paginationToken": {
      "type": "string",
      "description": "Token returned in the previous response to fetch the next page of results."
    }
  },
  "required": [
    "channelId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢hasdata_youtube_search_getYoutubeSearchResults(q, gl, hl, deviceType, sp, ...)

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 <creator>'), `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.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search query, exactly as a user would type it into the YouTube search box."
    },
    "gl": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "enum": [
        "desktop",
        "mobile"
      ],
      "description": "Device type for the request."
    },
    "sp": {
      "type": "string",
      "description": "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."
    },
    "sortBy": {
      "type": "string",
      "enum": [
        "relevance",
        "popularity",
        "rating",
        "date",
        "views"
      ],
      "description": "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."
    },
    "date": {
      "type": "string",
      "enum": [
        "hour",
        "today",
        "week",
        "month",
        "year"
      ],
      "description": "Limit results to videos uploaded within this time window relative to now."
    },
    "videoType": {
      "type": "string",
      "enum": [
        "video",
        "shorts",
        "channel",
        "playlist",
        "movie"
      ],
      "description": "Restrict results to a single YouTube content type — regular videos, Shorts, channels, playlists, or movies."
    },
    "length": {
      "type": "string",
      "enum": [
        "under4",
        "between420",
        "plus20"
      ],
      "description": "Filter by video duration bucket:\n- `under4` — under 4 minutes\n- `between420` — 4 to 20 minutes\n- `plus20` — over 20 minutes\n"
    },
    "filters__": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "hd",
          "subtitles",
          "cc",
          "d3",
          "live",
          "bought",
          "k4",
          "d360",
          "location",
          "hdr",
          "vr180"
        ]
      },
      "description": "Feature flags to require on results. Multiple values are combined with AND (every flag must apply).\n\n- `hd` — HD quality\n- `k4` — 4K quality\n- `hdr` — HDR\n- `subtitles` — has subtitles/closed captions\n- `cc` — Creative Commons license\n- `d3` — 3D video\n- `d360` — 360° video\n- `vr180` — VR180 video\n- `live` — currently live\n- `bought` — purchased/paid content\n- `location` — has a geographic location tag\n"
    },
    "paginationToken": {
      "type": "string",
      "description": "Token returned in the previous response to fetch the next page."
    }
  },
  "required": [
    "q"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢hasdata_youtube_transcript_getYoutubeTranscript(v, languageCode, type)

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

Input Schema

{
  "type": "object",
  "properties": {
    "v": {
      "type": "string",
      "description": "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`)."
    },
    "languageCode": {
      "type": "string",
      "description": "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."
    },
    "type": {
      "type": "string",
      "enum": [
        "asr"
      ],
      "description": "Set to `asr` to fetch the YouTube auto-generated (speech-recognition) track. Omit to fetch the human-authored track for `languageCode` when one exists."
    }
  },
  "required": [
    "v"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢hasdata_youtube_video_getYoutubeVideo(v, gl, hl, deviceType)

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, link, 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.

Input Schema

{
  "type": "object",
  "properties": {
    "v": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "enum": [
        "desktop",
        "mobile"
      ],
      "description": "Device type for the request."
    }
  },
  "required": [
    "v"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
auth requiredversion not recorded—
auth requiredversion not recorded—
auth requiredversion not recorded—
auth requiredversion not recorded—