YouTube MCP Server
YouTube MCP 서버
Claude, Cursor, Windsurf 및 기타 모든 MCP 클라이언트에 4개의 읽기 전용 YouTube 도구를 제공하는 호스팅형 Model Context Protocol(MCP) 서버입니다. Google Cloud 프로젝트나 YouTube Data API 키 없이 YouTube를 검색하고, 동영상 및 채널 데이터를 읽고, 자막을 가져올 수 있습니다.
https://mcp.hasdata.com/api/mcp?apis=youtube
목차
Related MCP server: YouTube MCP Server
필요한 것
사용자 정의 헤더로 streamable HTTP를 지원하는 MCP 클라이언트. 대시보드에서 무료로 만들 수 있는 HasData API 키. 그 외에는 아무것도 필요하지 않습니다. 이는 원격 서버입니다. 설치할 패키지도, 실행할 컨테이너도, 흐름에 포함되는 Google 계정도 없습니다.
빠른 시작
서버 URL은 모든 클라이언트에서 동일합니다. Claude Code와 Claude Desktop에서 직접 실행해 보았습니다. 다른 블록은 각 클라이언트가 문서화한 원격 서버 형식을 따릅니다.
필드 | 값 |
URL |
|
전송 방식 | HTTP, streamable |
인증 헤더 |
|
OAuth를 지원하는 클라이언트는 동일한 URL을 커넥터로 추가하고 구성 파일에 키를 넣지 않고 로그인할 수 있습니다.
claude mcp add --transport http youtube "https://mcp.hasdata.com/api/mcp?apis=youtube" \
--header "x-api-key: HASDATA_API_KEY"설정(Settings) → 커넥터(Connectors) → 사용자 지정 커넥터 추가(Add custom connector) → https://mcp.hasdata.com/api/mcp?apis=youtube 붙여넣기 → 로그인.
구성 파일 방식의 경우 Claude Desktop은 로컬(stdio) 서버만 로드하므로 원격 서버는 Node가 필요한 mcp-remote 브리지를 통해 연결됩니다. 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"
]
}
}
}x-api-key: 값에는 콜론 뒤에 공백이 없습니다. Claude Desktop은 셸 없이 인수를 전달하므로 공백이 있으면 헤더가 분리됩니다.
모든 프로젝트에 적용하려면 ~/.cursor/mcp.json, 단일 프로젝트에만 적용하려면 .cursor/mcp.json:
{
"mcpServers": {
"youtube": {
"url": "https://mcp.hasdata.com/api/mcp?apis=youtube",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json. Windsurf는 필드 이름을 url이 아닌 serverUrl로 사용합니다:
{
"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:
{
"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" }
}
}
}예시 프롬프트
코드가 아닌 프롬프트입니다. 하나를 붙여넣으면 에이전트가 도구를 직접 선택합니다. 각 프롬프트에는 필요한 호출 수가 표시되어 있습니다. MCP에서는 모델이 호출 횟수를 결정하고 성공적인 호출마다 10크레딧이 소요되기 때문입니다.
지난 한 달간 Model Context Protocol에 관한 가장 많이 조회된 동영상 10개를 찾고, 그중 최상위 동영상의 자막을 가져와서 도구 호출에 대해 주장하는 세 가지를 알려줘.
호출 2회, 20크레딧.
@GoogleDevelopers 채널을 가져와. 게시하는 탭을 나열한 다음, 최근 업로드 5개를 요약하고 반복되는 주제를 알려줘.
호출 2회, 20크레딧. 아직 보지 않은 탭을 읽으려면 두 번째 호출이 필요합니다. 탭 목록이 첫 번째 응답 안에 포함되어 도착하기 때문입니다.
이 동영상 ID dQw4w9WgXcQ를 가져와. 통계를 확인한 다음, 관련 동영상 중 같은 채널에서 온 것이 있는지 확인해.
호출 1회, 10크레딧. 관련 동영상은 같은 응답에 함께 포함됩니다.
YouTube에서 "web scraping tutorial"을 업로드 날짜순으로 정렬하여 검색하고, 4분 미만 동영상만, 각 결과에 챕터 제목이 있으면 알려줘.
호출 1회, 10크레딧.
이 동영상의 독일어 자막이 있으면 가져오고, 어떤 언어로 제공되는지 알려줘.
호출 1회, 10크레딧.
검색은 YouTube 자체 필터 토큰을 사용하며, 에이전트는 후처리 없이 길이, 업로드 날짜, 콘텐츠 유형으로 좁힐 수 있습니다. 자막은 사용 가능한 언어 트랙 목록과 함께 도착하므로 에이전트가 추측 없이 언어를 선택할 수 있습니다.
페이지네이션은 호출할 때마다 비용이 발생합니다. 검색 후 페이지를 두 번 넘기고 자막 세 개를 가져오는 연구 프롬프트는 호출 6회, 60크레딧입니다. 무료 체험은 무제한 크롤링보다 좁은 질문에서 더 오래 사용할 수 있습니다.
도구
4개의 도구, 모두 읽기 전용입니다. 아래 샘플은 실제 호출에서 축약된 것이며, 숫자는 YouTube가 업데이트됨에 따라 변합니다. 형태로 읽어 주세요. 각 도구 이름은 전체 필드 목록이 포함된 엔드포인트 참조 문서로 연결됩니다.
샘플은 전체 응답이 아닌 페이로드입니다. tools/call 결과는 하나의 텍스트 블록을 전달하며, 그 텍스트 자체가 url, status, text, json을 담은 JSON이고 스크랩된 데이터는 json 아래에 있습니다. 원시 JSON-RPC 응답에서 경로는 result.content[0].text를 파싱한 다음 .json입니다. 채팅 클라이언트는 이를 자동으로 풀어주지만, 엔드포인트에 직접 연결하는 코드는 직접 처리해야 합니다.
YouTube 검색 결과 가져오기
hasdata_youtube_search_getYoutubeSearchResults
YouTube를 검색하고 결과 유형별로 분류된 전체 결과 페이지를 반환합니다.
매개변수 | 유형 | 필수 | 참고 |
| string | 예 | 사용자가 입력하는 그대로의 자유 텍스트 쿼리 |
| string | 기본값은 | |
| string | 현재 기준 업로드 기간 | |
| string | 길이 버킷, 예: | |
| string | 단일 콘텐츠 유형으로 제한 | |
| array | 기능 플래그, 조합 가능 | |
| string | 검색 URL에서 복사한 원시 YouTube | |
| string | 이전 응답의 | |
| string | 두 글자 국가 및 언어 코드, 기기 |
결과 페이지는 videoResults, shortsResults, inlineShortsResults, playlistResults, channelResults, shelves로 분할되며, 유료 배치는 adsResults와 sponsoredResults에 있습니다. 어떤 블록이 나타나는지는 쿼리에 따라 다르며, 보고할 내용이 없는 블록은 빈 배열이 아니라 아예 없습니다. 반복 전에 키를 확인하세요. searchInformation에는 총계가, pagination.nextPageToken은 paginationToken으로 다시 전달하는 값입니다. 광고는 유기적 배열에 섞이지 않지만, 건너뛸 광고 배열이 두 개 있습니다.
{
"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 }
}여기서 두 가지를 언급할 가치가 있습니다. views는 1.6M views 표시 문자열 옆에 있는 파싱된 정수이므로 접미사 파서가 필요 없습니다. 그리고 chapters는 동영상 자체뿐만 아니라 검색 결과 안에서도 반환되지만, 일부 동영상에만 있습니다.
검색 엔드포인트 참조에는 엔드포인트가 허용하는 모든 sp 및 filters__ 토큰이 나열되어 있습니다.
YouTube 동영상 데이터 가져오기
hasdata_youtube_video_getYoutubeVideo
ID로 동영상 하나를 가져옵니다.
매개변수 | 유형 | 필수 | 참고 |
| string | 예 |
|
| string | 두 글자 국가 및 언어 코드, 기기 |
title, thumbnail, channel, publishedDate, lengthSeconds, category, isFamilySafe, isUnlisted와 함께 relatedVideos, endScreenVideos, keywords, captions, music, socialLinks 배열을 반환합니다. description은 content에 전체 텍스트를 담고, 모든 링크와 해시태그에 startIndex, length, text, url이 포함된 links 배열을 가진 객체입니다. text 필드는 작성자가 쓴 그대로의 링크를, url은 YouTube의 리디렉션 래퍼를 담고 있습니다. 설명에서 스폰서나 제휴사 대상을 추출할 때 중요합니다.
아래 샘플을 복사하기 전에 도구별로 파싱된 필드 이름을 읽으세요. 검색 및 채널 결과는 파싱된 숫자를
views에, 표시 문자열을viewsOriginal에 넣습니다. 이 응답은 반대로views에 문자열을,extractedViews에 숫자를 넣으며,likes와subscribers에도 동일한 반전이 적용됩니다. 잘못 이해하면item.views > 100000이 여기서는 예외 없이 문자열을 비교하게 됩니다.
{
"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 }
}YouTube 채널 데이터 가져오기
hasdata_youtube_channel_getYoutubeChannel
ID 또는 핸들로 채널을 가져오며, 한 번에 하나의 탭을 가져옵니다.
매개변수 | 유형 | 필수 | 설명 |
| string | 예 | 표준 |
| string | 기본값은 | |
| string | 이전 응답의 토큰 | |
| string | 두 글자 국가 코드, 언어 코드 및 기기 |
기본 탭에서는 channelInfo, featuredVideo, sections를 반환합니다. 다른 탭은 각자의 구조를 반환합니다. channelInfo에는 핸들, 아바타, 배너, 설명, 채널 키워드 및 채널의 rssUrl이 포함되어 있어, 채널을 폴링하지 않고도 계속 시청할 수 있을 만큼 충분한 정보를 제공합니다.
아래 샘플의
availableTabs배열에는 표시 라벨이 들어 있으며, 이는tab이 허용하는 값이 아닙니다.Home,Live,Courses,Search는 어떤 매개변수 값에도 매핑되지 않으며, 나머지는 소문자로 변환해야 합니다. 목록을 읽고 각 항목을 순회하는 에이전트는 첫 번째 항목에서 실패합니다.
{
"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"]
}
}YouTube 동영상 트랜스크립트 가져오기
hasdata_youtube_transcript_getYoutubeTranscript
동영상의 타임스탬프 트랜스크립트입니다.
매개변수 | 유형 | 필수 | 설명 |
| string | 예 | 11자리 동영상 ID |
| string | 원하는 트랙의 BCP-47 코드 | |
| string | 자동 생성 트랙의 경우 |
언어를 신뢰하기 전에 응답의
selected를 확인하세요. 동영상에 없는languageCode를 요청해도 실패하거나 빈 값을 반환하지 않고, 조용히 기본 트랙으로 대체됩니다. 목록의 모든 항목에는languageName과languageCode가 포함되며, 한 언어가 두 번 나타날 수 있습니다. 한 번은 사람이 작성한 항목, 한 번은type이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" }
]
}오류 및 실패 경로
클라이언트가 도구 호출에서 HTTP 오류 코드를 보는 경우는 거의 없습니다. MCP 계층은 200으로 응답하고 실패를 결과 내부에 넣으며, isError를 true로 설정하고 이유를 텍스트로 포함합니다. 에이전트는 상태 줄을 기대할 만한 위치에서 메시지를 읽습니다.
잘못된 키는 연결 실패가 아닌 도구 출력으로 표시됩니다. tools/list는 비어 있지 않은 모든 키를 수락하고 네 개의 도구를 모두 반환하므로, 클라이언트는 핸드셰이크를 완료하고 녹색을 표시합니다. 그런 다음 첫 번째 도구 호출이 isError: true와 HasData API error: 401 Unauthorized 텍스트로 돌아옵니다. 이 문자열을 주의하세요. 흐름의 앞부분에서는 문제를 보고하지 않기 때문입니다.
키 누락은 유일한 실제 HTTP 오류입니다. 인증은 모든 도구보다 먼저 실행되며 연결 자체가 401로 실패합니다. CORS 헤더가 존재하므로 브라우저 클라이언트는 불투명한 네트워크 실패가 아닌 상태 코드를 읽습니다.
도구의 스키마를 위반하는 인수는 스크래핑이 되기 전에 거부됩니다. 서버는 isError: true와 MCP error -32602: Input validation error 텍스트로 응답하며 문제가 되는 필드를 명명합니다. 아무것도 가져오지 않으며 비용도 청구되지 않습니다. 메시지는 필드 이름을 명명하지만 허용되는 값은 명명하지 않으므로 위의 매개변수 표가 참조 자료입니다.
성공했지만 아무것도 찾지 못하는 호출이 사람들을 당황하게 만드는 경우입니다. 이는 requestMetadata.status가 ok로 설정된 일반 결과로 도착하며 데이터 키가 단순히 누락되어 있습니다. 본문에는 결과가 비어 있었다는 내용이 없습니다. 오류를 테스트하지 말고 필요한 필드를 테스트하세요.
플랫폼이 거부하는 식별자는 400을 반환하며 requestMetadata.status는 error로 설정됩니다. 존재하지 않는 채널 핸들이 일반적인 예입니다.
데이터를 포함하는 결과에는 지원 문의에 인용할 만한 requestMetadata.id도 포함됩니다.
가격, 무료 티어 및 한도
모든 YouTube 도구는 성공적인 호출당 10크레딧이 소요됩니다. 응답 크기는 가격을 변경하지 않습니다. 검색 결과 전체 페이지도 동영상 하나가 있는 페이지와 동일한 비용입니다.
무료 평가판은 카드 없이 30일 동안 1,000크레딧으로, YouTube 호출 100회에 해당합니다. 이후 활성 계정은 잔액이 100 미만으로 떨어질 때마다 매일 100크레딧을 충전받으므로, 저용량 에이전트는 무료 티어에서 무기한 실행됩니다.
유료 요금제는 월 $49부터 시작하며 200,000크레딧, 즉 20,000회 호출입니다. 단가(1,000회 호출당)는 볼륨에 따라 낮아지며, 입문 요금제 $2.45에서 Business $0.99, Growth $0.83, 가장 큰 고용량 요금제 $0.75까지입니다.
요금제는 동시성도 결정합니다. 무료 평가판은 한 번에 1개 요청, Startup 15, Business 30, Growth 50, 고용량 요금제는 200~1,500입니다. 무인 작업에서는 오버플로우 상황을 방어적으로 처리하세요. 팬아웃하는 에이전트는 사용자보다 먼저 상한에 도달할 것이기 때문입니다.
200이 아닌 상태로 반환된 요청은 청구되지 않습니다. 아무것도 찾지 못한 성공적인 호출도 여전히 호출입니다.
도구 선택
apis 쿼리 매개변수는 에이전트가 볼 도구를 결정합니다. 도구가 적을수록 도구 정의에 소비되는 컨텍스트가 줄어들고, 모델이 잘못된 도구를 선택할 가능성도 줄어듭니다.
?apis=youtube the four tools in this repo
?apis=youtube,google_serp add Google search
?apis=youtube,tiktok,instagram a social research bundle이 매개변수는 youtube와 같은 공급자 이름과 google_maps_search와 같은 개별 API 이름을 사용합니다. 철자가 틀린 이름은 무시됩니다. 모든 이름이 틀리면 요청이 400으로 실패하고 본문에는 인식하지 못한 이름과 모든 유효한 값이 모두 나열됩니다. 매개변수를 생략하면 동일한 엔드포인트가 57개의 HasData 도구를 모두 노출합니다.
비교
공식 YouTube Data API v3와 비교:
YouTube Data API v3 | 이 서버 | |
설정 | Google Cloud 프로젝트 및 API 키 | 키 하나와 URL 하나 |
검색 허용량 | Google 시작 가이드에 따른 일일 "기본 할당량 100회 | 요금제의 크레딧, 호출당 10개 |
소유하지 않은 동영상의 트랜스크립트 | Google 참조 문서에 따르면 | 가능, 언어 목록 포함 |
검색 결과의 챕터 | 없음 | 있음 |
검색 결과의 조회수 및 좋아요 | 없음, 별도의 | 동일한 응답에서 표시 문자열과 정수 |
비용 | 일일 할당량 내 무료 | 평가판 이후 유료, 호출당 10크레딧 |
쓰기 및 비공개 데이터 | OAuth를 통한 업로드, 재생목록, 댓글 및 자체 분석 | 읽기 전용, 공개 데이터만 |
마지막 두 행이 중요합니다. 일일 할당량이 볼륨을 충당하고 쿼리하는 채널을 소유하고 있다면 공식 API가 더 저렴한 답이며 이를 선택해야 합니다.
대부분의 다른 YouTube MCP 서버는 트랜스크립트만 제공합니다. 이 서버는 검색, 참여 수치가 포함된 동영상 읽기, 채널 탭 탐색도 수행하므로 에이전트는 두 번째 서버 없이 전체 리서치 패스를 실행할 수 있습니다.
이 서버가 하지 않는 것. 댓글 없음, 채널 관리 없음, 업로드 없음, 분석 없음, 비공개 데이터 없음. 로그아웃한 방문자가 볼 수 있는 것만 읽습니다.
FAQ
공식 YouTube MCP 서버가 있나요?
Google은 공식 서버를 게시하지 않습니다. YouTube에는 자사 MCP 서버가 없습니다. 모든 옵션은 YouTube Data API v3 또는 공개 페이지를 기반으로 다른 누군가가 구축한 것입니다. 이 서버는 HasData가 유지 관리하며 공개 페이지를 읽으므로 Google 자격 증명이 필요하지 않습니다.
YouTube MCP 서버란 무엇인가요?
YouTube 데이터를 AI 클라이언트가 호출할 수 있는 도구로 노출하는 서버입니다. 클라이언트는 Model Context Protocol을 통해 도구 호출을 보내고, 서버는 데이터를 가져와 구조화된 JSON을 반환하며, 모델은 결과로 작업하고 HTML 페이지를 볼 수 없습니다. 이 서버는 네 개의 도구를 노출하며 원격으로 실행됩니다. 클라이언트는 URL에 연결하고 로컬 프로세스를 시작하지 않습니다.
YouTube API 키나 Google Cloud 프로젝트가 필요한가요?
아니요. 유일한 자격 증명은 HasData 키입니다. 만들 Google Cloud 프로젝트도, 작성할 할당량 양식도, OAuth 동의 화면도 없습니다. 도구가 YouTube Data API가 아닌 공개 YouTube 페이지를 읽기 때문입니다.
호스팅하거나 실행할 것이 필요한가요?
아니요. 이 서버는 streamable HTTP의 원격 MCP 서버입니다. 설치할 것도, 유지할 컨테이너도, 재시작할 프로세스도 없습니다.
데이터는 실시간인가요, 캐시된 것인가요?
실시간입니다. 각 호출은 요청 시점에 페이지를 가져오고 자체 requestMetadata.id를 포함합니다. 동일한 두 호출은 저장된 사본의 재생이 아닌 두 번의 별도 가져오기입니다. 조회수, 좋아요 같은 카운터는 페이지를 추적하므로 페이지가 움직이면 함께 움직입니다.
YouTube가 레이아웃을 변경하면 어떻게 되나요?
사용자 측에서는 아무 일도 없습니다. 변경 사항을 추적하고 응답 스키마를 안정적으로 유지하므로 필드 이름과 유형은 그대로 유지됩니다. 값이 없는 필드는 항목에서 null로 존재하는 것이 아니라 아예 없습니다. 선택적 필드는 기본값으로 읽으세요.
다른 HasData API와 함께 사용할 수 있나요?
네. apis 매개변수는 목록을 받으며 ?apis=youtube,google_serp는 에이전트에게 네 개의 YouTube 도구와 Google 검색을 제공합니다. 매개변수를 생략하면 모든 것을 얻을 수 있습니다.
모든 동영상의 트랜스크립트를 얻을 수 있나요?
동영상에 트랜스크립트가 있는 경우에만 가능하며, availableTranscripts는 요청하기 전에 무엇이 존재하는지 알려줍니다.
키를 붙여넣는 대신 OAuth로 로그인할 수 있나요?
네, 이를 지원하는 클라이언트에서는 가능합니다. Claude Desktop과 Cursor는 엔드포인트를 커넥터로 추가하고 로그인할 수 있습니다. 무인 에이전트와 스크립트는 x-api-key 헤더를 사용합니다.
규정 준수 및 개인 데이터
HasData는 공개적으로 이용 가능한 데이터에만 접근합니다. 플랫폼의 이용 약관이 자동 접근을 제한할 수 있으며, 규정 준수에 대한 책임은 사용자에게 있습니다. 수집하는 데이터에 개인 정보가 포함된 경우, GDPR, CCPA 또는 해당 관할권의 동등한 규정에 따라 합법적인 근거가 있는지 확인하십시오.
HasData 링크
제품 페이지 및 요청 빌더 | |
서버 문서 | |
하나의 서버에 있는 57개 도구 모두 | |
클라이언트 연습 가이드 | |
우리가 스크래핑하는 기타 모든 것 | |
요금제 및 크레딧 비용 | |
키 및 사용량 |
개발
이 저장소는 원격 서버에 대한 구성 및 문서입니다. 빌드 단계나 컨테이너화할 항목이 없습니다.
test/의 테스트는 도구 계약을 검증합니다. 이는 여기서 커밋 없이도 깨질 수 있는 부분입니다. 테스트는 ?apis=youtube가 정확히 네 개의 도구를 반환하는지, 모든 도구가 여전히 필수 매개변수를 선언하는지, 이름이 변경되지 않았는지, 사용 중인 키가 실제로 승인되는지 확인합니다. 마지막 검사는 실제로 도구를 호출하며 10크레딧이 소요됩니다. 이는 올바른 이유로 실패할 수 있는 카나리아의 가격입니다.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test동일한 테스트 스위트는 모든 푸시 시 CI에서 실행되고, 일정에 따라 주 1회 실행됩니다. 상위 도구 목록은 누군가 이 저장소를 건드리지 않아도 변경될 수 있기 때문입니다. 실패는 도구 목록이 이동했거나, 키가 작동을 멈췄거나, 엔드포인트에 연결할 수 없음을 의미하며, 어설션 메시지가 어떤 경우인지 알려줍니다.
기여
도구 테이블과 응답 샘플에 대한 수정이 가장 유용한 기여입니다. 이 부분들이 표류하기 때문입니다. 수행한 호출과 받은 응답을 포함하십시오. 포크에서 온 풀 리퀘스트는 키 없이 테스트 스위트를 실행하며, 실시간 검사는 빨간색으로 표시되는 대신 건너뜁니다.
라이선스
MIT. 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.43MIT
- 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.12186 npm27MIT
- 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-