YouTube Transcript & Search MCP Server

MCP serverSearch

This integration connects your AI to YouTube, so it can pull transcripts from videos and search YouTube for content. Once added, your AI can read what a video says, find videos on a topic, and work through channels and playlists. It also supports bulk transcript jobs, so many videos can be processed in one go.

Use YouTube Transcript & Search MCP Server in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add YouTube Transcript & Search MCP Server and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use YouTube Transcript & Search MCP Server to get transcript

Details

Available today. Use it from your connected AI after setup.

After adding it, ask your AI to pull the transcript of a YouTube video link or search YouTube for a topic you are researching. It includes 14 tools covering transcripts, search, channels, playlists, and bulk jobs.

YouTube Transcript & Search MCP ServerStart free

What your AI can do with it

  • Fetch the transcript of a YouTube video
  • Search YouTube for videos on any topic
  • Look up channels and playlists
  • Run bulk transcript jobs for many videos at once
  • Read what a video covers without watching it

Install YouTube Transcript & Search MCP Server

The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.

  • Claude Code

    claude mcp add --transport http --scope user youtube-transcript-amp-search-mc 'https://api.transcriptout.com/mcp'

    Run it once in your project, then open /mcp to approve any sign-in the server asks for.

  • Claude Desktop

    https://api.transcriptout.com/mcp

    Add a custom connector in Settings, paste this address, and approve the sign-in.

  • Cursor

    cursor://anysphere.cursor-deeplink/mcp/install?name=youtube-transcript-amp-search-mc&config=eyJ1cmwiOiJodHRwczovL2FwaS50cmFuc2NyaXB0b3V0LmNvbS9tY3AifQ==

    Open the link and Cursor adds the server at that address.

  • ChatGPT

    https://api.transcriptout.com/mcp

    In Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.

  • Codex

    codex mcp add youtube-transcript-amp-search-mc --url 'https://api.transcriptout.com/mcp'

    Run it once, then sign in with codex mcp login youtube-transcript-amp-search-mc if the server asks for an account.

From the project's README

As published by artemchuikin/youtube-mcp in README.md.


🎬 Why

Everyone who works with an agent has run this exchange at least once.

You:   Summarize this. https://www.youtube.com/watch?v=kCc8FmEb1nY
Agent: I'm not able to watch videos. If you paste the transcript here, I'll gladly help!

The transcript is precisely the thing the agent cannot get on its own. With this server connected, the same message simply resolves.

You:   Summarize this. https://www.youtube.com/watch?v=kCc8FmEb1nY
Agent: → get_transcript(video="kCc8FmEb1nY", video_metadata=true)      1 credit

       That's "Let's build GPT: from scratch, in code, spelled out" by Andrej
       Karpathy, 1:56:20. He starts from an empty file and a bigram model,
       derives self-attention step by step, and ends with a working GPT that...

Reading one video is rarely where the job ends. Here is how the three ways of getting YouTube data into an agent actually compare.

This serverLocal yt-dlp / scraper MCPGoogle YouTube Data API
Transcripts✅ any public video, 5 formats⚠️ blocked on datacenter IPs, breaks when YouTube changes markup❌ not served at all
Setup✅ a URL and an API key❌ local install, binaries to keep alive❌ Cloud project, OAuth consent screens
YouTube search✅ native, 1 credit per page❌⚠️ 100 quota units per search
Channels & playlists✅ 100 videos/page, or 500 bare IDs❌ one video at a time⚠️ quota-metered per item
Bulk transcripts✅ 4,000 per background job❌❌
RAG-ready chunking✅ 20-5,000 chars, word-level timestamps❌❌
When YouTube changes✅ fixed server-side, nothing to update❌ you patch and redeploy✅
Failed calls✅ credits refund themselves❌ your retry logic⚠️ quota spent anyway

⚡ Quick start

1. Get an API key. Sign up at transcriptout.com and create a key in the dashboard. New accounts receive 100 free credits and no card is asked. Keys start with sk_ and are shown once.

2. Point your client at the server. It speaks streamable HTTP and authenticates with one Bearer header.

{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

One-click buttons for Cursor and VS Code sit at the top of this page. Exact snippets for the rest live under Install in your client.

3. Paste a link.

Summarize this talk and pull the three strongest quotes.
https://www.youtube.com/watch?v=dQw4w9WgXcQ

The agent picks get_transcript on its own, reads the timed text and answers from it. Every response carries an X-Credits-Remaining header, so the budget stays in view the whole session.


🧰 The 14 tools

All 14 tools are exposed automatically once you connect. Most calls cost 1 credit. Credits are refunded automatically when a call fails before reaching YouTube (validation errors, rate limits, our own capacity), so you pay for answers, not for failures. A definitive "this video has no captions" is an answer and is billed like one.

1. get_transcript · 1 credit

Fetch the transcript of any YouTube video. format=text (default) returns plain readable text, cheapest for a model to reason over, and format=json returns timed segments.

ParameterTypeDefaultDescription
videostringrequiredYouTube URL (full or short) or 11-char video ID
langstring"en"Language code of the track (en, de, ...)
formatstring"text""text" (plain text), "json" (segments with start/duration in seconds), "srt"/"vtt" (subtitle file body), "srv3" (raw YouTube XML)
kindstringauto-detect"manual" or "auto". Left out, a manual track wins and auto is the fallback
segmentintegersee belowMax characters per segment. 500-1500 makes RAG-ready chunks
video_metadatabooleanfalseAdd title, channel, duration and views in the SAME call, same 1 credit

Left out, segment cuts auto-generated tracks into ~180-character segments and returns manual tracks exactly as their author broke them. Pass it whenever you need one size regardless of which track answers.

Example output (format=json):

{
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "kind": "manual",
  "transcript": [
    { "text": "Never gonna give you up", "start": 18.0, "duration": 4.12 },
    { "text": "Never gonna let you down", "start": 22.12, "duration": 3.85 }
  ]
}

srt and vtt come back as complete subtitle file bodies, ready to be written to disk by the agent. srv3 is the raw source XML and does not combine with segment.

2. get_video_info · 1 credit

Metadata for one video (title, channel, duration, views, thumbnails) plus the list of available transcript languages, WITHOUT downloading the subtitles.

ParameterTypeDefaultDescription
idstringrequiredYouTube video ID or URL

Credit hygiene: if you are going to fetch the transcript anyway, call get_transcript with video_metadata=true instead. It returns both for one credit where these are two calls and two.

3. search_youtube · 1 credit/page

Search YouTube for videos or channels. Paginate with next_page_token. has_more tells you whether another page exists.

ParameterTypeDefaultDescription
qstringrequired*Search query (*unless paginating)
typestring"video""video" or "channel"
limitinteger20Results per page, 1-50
next_page_tokenstringToken from a previous result

4. list_channel_videos · 1 credit/page

List videos from a channel's Videos tab, newest first. Accepts an @handle, a channel name, a UC... channel ID or a channel URL.

ParameterTypeDefaultDescription
namestringrequired*@handle, channel name, UC... ID or URL
limitinteger100Page size, up to 500 with ids_only
ids_onlybooleanfalseReturn just video_ids[], up to 500 per page
next_page_tokenstringToken from a previous result

ids_only=true is the cheap way to feed submit_transcripts_job.

5. search_channel_videos · 1 credit/page

Search inside one channel using YouTube's native relevance search. A result whose title lacks the query word is normal. Results are ranked by relevance, not by substring.

ParameterTypeDefaultDescription
namestringrequired@handle, channel name, UC... ID or URL
qstringrequiredQuery to search within the channel
limitinteger30Results per page, 1-100
next_page_tokenstringPagination token

6. latest_channel_videos · 1 credit

The ~15 most recent videos of a channel from its RSS feed. The fastest and cheapest way to check what a channel published recently.

ParameterTypeDefaultDescription
namestringrequired@handle, channel name, UC... ID or URL

7. list_playlist_videos · 1 credit/page

Every video of a playlist in playlist order. Accepts a PL... playlist ID or a URL with list=.

ParameterTypeDefaultDescription
idstringrequired*Playlist ID or URL
limitinteger100Page size, up to 500 with ids_only
ids_onlybooleanfalseReturn just video_ids[], up to 500 per page
next_page_tokenstringPagination token

8. search_playlist_videos · 1 credit

Find videos inside a playlist by a substring of the title (case-insensitive). YouTube has no native playlist search, so this scans up to 500 playlist items. truncated=true means there may be more matches beyond the scanned window.

ParameterTypeDefaultDescription
idstringrequiredPlaylist ID or URL
qstringrequiredSubstring to match in video titles
limitinteger30Max matches, 1-100

9. submit_transcripts_job · 1 credit per video

Queue transcripts for MANY videos at once (up to 4,000) and get a job_id back immediately. The work continues in the background at your rate limit's pace. Use this instead of calling get_transcript in a loop for more than a handful of videos.

ParameterTypeDefaultDescription
videosstring[]requiredVideo IDs or URLs, up to 4,000. Duplicates collapse BEFORE billing
langstring"en"One language for the whole job
formatstring"text""text", "json", "srt", "vtt" or "srv3", one for the whole job
kindstringauto-detect"manual" or "auto"
segmentintegerOne segment size for the whole job
video_metadatabooleanfalseMetadata per video, no extra cost
idempotency_keystringResubmitting the same list with the same key returns the SAME job, no double charge

Requires a user key (sk_...). Credits are charged on submit and refunded per video when a video could not be delivered through our fault.

10. get_transcripts_job · free

Progress of a batch job: status (queued/running/done/cancelled), how many videos are ready, failed and pending. Polling a job you already paid for costs nothing.

11. get_transcripts_results · free

Finished transcripts from a batch job, in the order submitted, paged with next_page_token (limit 1-500, default 100). Results appear as they are fetched, so you can read before the job is done. Each entry is exactly what get_transcript returns for that video, plus its status.

12. get_transcripts_result · free

One video's result out of a batch job, by its video id, without paging through the whole result set. A 404 means the job does not exist or this video has not finished yet, so check get_transcripts_job before concluding anything.

ParameterTypeDefaultDescription
job_idstringrequiredJob id from submit_transcripts_job
video_idstringrequiredOne of the video ids the job was submitted with

13. cancel_transcripts_job · free

Cancel a batch job. Credits are refunded ONLY for videos not started yet. Anything already fetched stays in the results and stays paid for.

14. get_credits · free

The remaining credit balance of the key, with no parameters. The balance also rides in the X-Credits-Remaining header of every response, but headers are invisible to the model, so the number a user actually asks about needs a tool. Handy right before a large batch too, since the batch charges 1 credit per video on submit.


🔌 Install in your client

The server is remote, so every install below is a config entry and nothing more. All of them want the same two values, the URL and the Bearer header from Quick start.

Worth doing once, a standing rule for your client

With this in your client's rules/instructions, pasting a YouTube link is enough and the word "transcript" never has to be typed:

Whenever a YouTube link or video ID appears in my message, call the
transcriptout get_transcript tool first and answer from the transcript,
whether I asked for a summary, a quote, a translation or a question.

One-Click Install:

After installing, open the server settings and add the Authorization header with your key.

Manual configuration (~/.cursor/mcp.json):

{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
claude mcp add --transport http transcriptout https://api.transcriptout.com/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

Claude's custom connectors authenticate remote servers via OAuth, which TranscriptOut does not offer yet (API keys only). On desktop, use Claude Code (see above), which supports API-key headers. OAuth support is on the roadmap. Watch the changelog.

Or add this to VS Code user settings (settings.json):

"mcp.servers": {
  "transcriptout": {
    "type": "http",
    "url": "https://api.transcriptout.com/mcp",
    "headers": {
      "Authorization": "Bearer YOUR_API_KEY"
    }
  }
}
  1. Create a new Agent
  2. Under "Actions" or "Tools", add a new MCP Server
  3. URL: https://api.transcriptout.com/mcp
  4. Auth Type: API Key
  5. Paste your API key from the dashboard

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "transcriptout": {
      "serverUrl": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "type": "streamableHttp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In Zed settings.json:

{
  "context_servers": {
    "transcriptout": {
      "source": "remote",
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
{
  "mcpServers": {
    "transcriptout": {
      "type": "streamable-http",
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
amp mcp add transcriptout https://api.transcriptout.com/mcp --header "Authorization: Bearer YOUR_API_KEY"

In settings.json under augment.advanced:

"augment.advanced": {
  "mcpServers": [
    {
      "name": "transcriptout",
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  ]
}

In .kilocode/mcp.json:

{
  "mcpServers": {
    "transcriptout": {
      "type": "streamable-http",
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In Settings → Tools → AI Assistant → MCP:

{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In ~/.gemini/settings.json:

{
  "mcpServers": {
    "transcriptout": {
      "httpUrl": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In ~/.qwen/settings.json:

{
  "mcpServers": {
    "transcriptout": {
      "httpUrl": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
{
  "mcpServers": {
    "transcriptout": {
      "serverUrl": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}
{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In mcp.json:

{
  "mcpServers": {
    "transcriptout": {
      "url": "https://api.transcriptout.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

In Settings → AI → MCP:

{
  "transcriptout": {
    "url": "https://api.transcriptout.com/mcp",
    "headers": {
      "Authorization": "Bearer YOUR_API_KEY"
    }
  }
}

In Settings → Connectors → Advanced:

{
  "url": "https://api.transcriptout.com/mcp",
  "headers": {
    "Authorization": "Bearer YOUR_API_KEY"
  }
}

🧩 Install as an Agent Plugin

This repository root is a conformant Agent Plugins 1.0.0 package, the portable format supported by ChatGPT, Codex, Cursor, GitHub Copilot, Kiro and VS Code. One install gets you the MCP server and a bundled youtube skill that teaches your agent when to use each tool and how not to waste credits.

plugin.json                # manifest
mcp.json                   # hosted MCP server, streamable-http
skills/youtube/SKILL.md    # when + how to use the 14 tools

VS Code. Command Palette → Chat: Install Plugin From Source, then paste:

https://github.com/artemchuikin/youtube-mcp

Or register a local clone in settings.json:

"chat.pluginLocations": { "/absolute/path/to/youtube-mcp": true }

Cursor. Customize in the sidebar → find the plugin → Install. For a local clone:

git clone https://github.com/artemchuikin/youtube-mcp ~/.cursor/plugins/local/transcriptout

Then Developer: Reload Window.

ChatGPT, Codex, GitHub Copilot, Kiro, any other client. Point your client's plugin mechanism at this repository, or at a local clone. Agent Plugins 1.0.0 standardizes the package format, not installation, so each client owns its own install flow.

There are no credentials in this package, Agent Plugins 1.0.0 forbids embedded secrets. The server authenticates with an API key you add in your client's MCP settings (see Keys and security). Verify the package yourself:

curl -sO https://agent-plugins.org/schemas/1.0.0/plugin.schema.json
curl -sO https://agent-plugins.org/schemas/1.0.0/mcp.schema.json
npx ajv-cli@5 validate --spec=draft2020 -s plugin.schema.json -d plugin.json
npx ajv-cli@5 validate --spec=draft2020 -s mcp.schema.json    -d mcp.json

🔑 Keys and security

Shortened here. Read the whole README on GitHub.

Tools it offers (14)

What this server listed when Ahel dialed its public endpoint in Oct 2026, with no key and no account of yours. The names are the server’s own.

  • get_transcript
  • get_video_info
  • search_youtube
  • list_channel_videos
  • search_channel_videos
  • latest_channel_videos
  • list_playlist_videos
  • search_playlist_videos
  • submit_transcripts_job
  • get_transcripts_job
  • get_transcripts_results
  • get_transcripts_result
  • cancel_transcripts_job
  • get_credits

Signals

Last commit
Aug 2026
Advanced
Delivery
youtube-transcript-and-youtube-search MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
Item type
mcp-server
Key
com-transcriptout-youtube-transcript-and-youtube-search
Source
github.com/artemchuikin/youtube-mcp
Hosted endpoint
https://api.transcriptout.com/mcp