YouTube & TikTok Transcripts
Hosted MCP server on Apify with 5 tools: YouTube and TikTok transcripts, YouTube channel and playlist transcripts, YouTube search and YouTube comments. Connect over streamable HTTP with an Apify API token. Paid per result: $0.003 per YouTube transcript, $0.0015 per TikTok transcript; videos without captions are free.
Hosted MCP Server
npx add-mcp 'https://heyitsgautham--video-transcripts-mcp-server.apify.actor/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
YouTube & TikTok Transcripts MCP Server for AI Agents (heyitsgautham/video-transcripts-mcp-server) Actor
MCP server for AI agents: YouTube and TikTok transcripts, YouTube search and comments as tools for Claude, ChatGPT, Cursor and any MCP client. Connect by URL, nothing to host. $3 per 1,000 YouTube transcripts, $1.50 per 1,000 TikTok. Videos without captions and failures free.
- URL: https://apify.com/heyitsgautham/video-transcripts-mcp-server.md
- Developed by: Gautham Krishna (community)
- Categories: AI, Videos, MCP servers
- Stats: 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- User rating: No ratings yet
Pricing
from $2.10 / 1,000 youtube transcripts
This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.
Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event
What's an Apify Actor?
An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.
How to integrate an Actor?
If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.
For examples already wired to this Actor's own input schema, see the API section below.
Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).
README
YouTube & TikTok Transcripts MCP Server
An MCP server that gives AI agents YouTube and TikTok transcripts, YouTube search and YouTube comments as tools, for anyone building with Claude, ChatGPT, Cursor or their own agent.
Use cases:
- Ask Claude to summarize a YouTube video from its link
- Have an agent search YouTube, read the top videos' transcripts and compare what they say
- Pull the latest videos of a channel or a whole playlist into an agent's context in one call
- Read a TikTok's spoken words, with its author, date and play counts
- Let an agent read what viewers say in a video's comments
It runs on Apify in Standby mode, so there is nothing to install or host. Each tool call answers in a few seconds and starts no other run.
You pay $3 per 1,000 YouTube transcripts ($0.003 each) and $1.50 per 1,000 TikTok transcripts, less on Apify Store discount tiers. Videos without captions, private or deleted videos, duplicates and failures are never charged.
At a glance
| Topic | Details |
|---|---|
| Server URL | https://heyitsgautham--video-transcripts-mcp-server.apify.actor/mcp, streamable HTTP |
| Auth | Your Apify API token, as Authorization: Bearer <token> |
| Tools | youtube_transcript, youtube_channel_transcripts, youtube_search, youtube_comments, tiktok_transcript |
| Price | YouTube transcript $0.003, TikTok transcript $0.0015, search result $0.00024, comment $0.00025. Lower on Bronze, Silver and Gold. No start fee. You also pay the platform usage of the server's run, as with every Standby actor on Apify |
| Tested | Final test on 21 Oct 2026, 17 tool calls through an MCP client: 77 of 77 inputs that had data worked (55 YouTube transcripts, 15 TikTok transcripts, 3 searches, 4 comment threads, 4 channels and playlists). 10 inputs had no data, such as TikToks without captions |
| Speed | 1.5 to 32 seconds per call in that test, 17 to 27 seconds for 10 YouTube transcripts |
| Limits | Up to 25 videos per transcript call, 50 search results and 500 comments. Reads the captions the site publishes and runs no speech-to-text |
Connect
Claude Desktop, Cursor, Windsurf and other clients that take a JSON config
{
"mcpServers": {
"video-transcripts": {
"url": "https://heyitsgautham--video-transcripts-mcp-server.apify.actor/mcp",
"headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }
}
}
}
Claude Code
claude mcp add --transport http video-transcripts https://heyitsgautham--video-transcripts-mcp-server.apify.actor/mcp --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"
Through Apify's own MCP server
If you already use https://mcp.apify.com, add ?tools=heyitsgautham/video-transcripts-mcp-server to its URL and the five tools show up next to Apify's.
Apify's call-actor tool can also call them as heyitsgautham/video-transcripts-mcp-server:youtube_transcript.
From Python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport
URL = "https://heyitsgautham--video-transcripts-mcp-server.apify.actor/mcp"
async def main():
transport = StreamableHttpTransport(URL, headers={"Authorization": "Bearer <YOUR_APIFY_TOKEN>"})
async with Client(transport) as client:
result = await client.call_tool("youtube_transcript", {"videos": ["https://youtu.be/jNQXAC9IVRw"]})
print(result.structured_content["results"][0]["transcript"])
asyncio.run(main())
Your Apify token is on the Integrations page of the Apify Console.
Tools
| Tool | Arguments | Returns |
|---|---|---|
youtube_transcript | videos (URLs or IDs, up to 25), language, timestamps, max_characters | One result per video with transcript, title, channel, publishedAt, duration, language and whether the captions are auto-generated |
youtube_channel_transcripts | source (@handle, channel URL, UC... ID or playlist URL), max_videos (up to 25), language, include_shorts, timestamps, max_characters | The channel or playlist name and one transcript per video, newest first for a channel |
youtube_search | query, max_results (up to 50) | Video IDs, URLs, titles, upload age and view counts in YouTube's order |
youtube_comments | video, max_comments (up to 500), sort (top or newest), include_replies | The video's title, views and comment count, and each comment's text, author display name, likes, reply count and age |
tiktok_transcript | videos (URLs, short links or IDs, up to 25), language, timestamps, max_characters | One result per video with transcript, author, description, date, duration and play, like, comment and share counts |
Every result carries a status.
ok is charged, and everything else is free: no_transcript, unavailable, duplicate, invalid_input, error and budget_reached.
Transcript calls also return a summary with the count per status and how many results were charged.
With timestamps: true the transcript comes as paragraphs, each led by its start time, such as [1:05] text.
max_characters cuts each transcript for agents with a small context, and marks it truncated: true.
language picks the caption language by its 2-letter code.
When a video has no captions in it, you get the original language and requestedLanguageFound: false.
Output examples
From the final test run, with the transcripts shortened here.
youtube_transcript with max_characters: 4000:
{
"input": "https://www.youtube.com/watch?v=qgLaCZyKv_8",
"videoId": "qgLaCZyKv_8",
"url": "https://www.youtube.com/watch?v=qgLaCZyKv_8",
"status": "ok",
"title": "I Tried All The Best (and Worst) Doorbells",
"channel": "Linus Tech Tips",
"channelId": "UCXuqSBlHAE6Xw-yeJA0Tunw",
"publishedAt": "2026-09-17T17:29:14Z",
"durationSeconds": 1042,
"language": "en",
"requestedLanguageFound": true,
"isAutoGenerated": true,
"wordCount": 2866,
"transcript": "We've all got our own reasons for wanting a doorbell camera. [music] >> Great. Now, none of us can watch TV. >> That's my TV. >> But which one should you get? ...",
"truncated": true
}
youtube_search:
{
"query": "how transformers work",
"status": "ok",
"results": [
{
"position": 1,
"videoId": "jcY4QN7awEc",
"url": "https://www.youtube.com/watch?v=jcY4QN7awEc",
"title": "Transformers Explained - How transformers work",
"published": "4 years ago",
"views": "3,773,822 views"
}
]
}
youtube_comments:
{
"input": "https://www.youtube.com/watch?v=wjZofJX0v4M",
"videoId": "wjZofJX0v4M",
"url": "https://www.youtube.com/watch?v=wjZofJX0v4M",
"videoTitle": "Transformers, the tech behind LLMs | Deep Learning Chapter 5",
"videoViews": 11471688,
"videoCommentCount": 4143,
"status": "ok",
"comments": [
{
"commentId": "UgyhCd5s7WIU57r39cl4AaABAg",
"text": "Edit: The finalized version of the next chapter is out https://youtu.be/eMlx5fFNoYc ...",
"author": "@3blue1brown",
"isByCreator": true,
"likes": 1300,
"replies": 47,
"published": "2 years ago",
"isReply": false,
"parentId": null,
"isPinned": true,
"isHeartedByCreator": false
}
]
}
tiktok_transcript with timestamps: true:
{
"input": "https://www.tiktok.com/t/ZTUucaS24",
"videoId": "7683326706576395538",
"url": "https://www.tiktok.com/@chefpolooficial/video/7683326706576395538",
"status": "ok",
"author": "chefpolooficial",
"authorName": "Chef Polo",
"createTime": "2026-09-09T00:31:51Z",
"durationSeconds": 483,
"playCount": 7200000,
"likeCount": 275800,
"commentCount": 4210,
"shareCount": 114900,
"language": "es",
"requestedLanguageFound": false,
"isAutoGenerated": true,
"isMachineTranslated": false,
"availableLanguages": ["spa-ES"],
"wordCount": 1362,
"transcript": "[0:00] te encantan los tacos de suadero y no sabes cΓ³mo prepararlos en casa ..."
}
Pricing
| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| YouTube transcript | $0.003 | $0.0027 | $0.0024 | $0.0021 |
| TikTok transcript | $0.0015 | $0.0014 | $0.0013 | $0.0012 |
| YouTube search result | $0.00024 | $0.00022 | $0.00020 | $0.00018 |
| YouTube comment | $0.00025 | $0.000225 | $0.00020 | $0.000175 |
A tool charges once per call, after the work is done, only for the results it returns.
If your Apify spending limit runs out mid-call, the results it does not cover come back as free budget_reached rows.
Apify runs Standby actors in your account, so your account also pays the server run's platform usage: compute while it serves your calls and for 2 minutes after the last one, and the proxy traffic. In testing, a server run that stayed up 6 minutes and returned 75 transcripts, 49 search results and 120 comments used $0.038 of platform usage. Proxy traffic was $0.028 of that.
Run it without an MCP client
A normal run of this actor, from the Console or the API, runs one tool once and saves the results in the dataset.
Set tool to a tool name and arguments to its arguments, for example {"videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}.
For batch jobs of thousands of videos, our YouTube Transcript Scraper, YouTube Channel Transcripts and TikTok Transcript Scraper fit better.
More from heyitsgautham
Other actors from the same account.
- YouTube Transcript & Subtitles Scraper for specific videos, or when you want every video on a channel or playlist with channel stats and up to 20,000 videos per source.
- YouTube Channel & Playlist Transcripts for every video on a channel or playlist, with channel stats and up to 20,000 videos per source.
- YouTube Video & Shorts Comments Scraper with Replies for the comments and replies on a video or Short, for sentiment analysis and audience research.
- YouTube Search Results & Rank Tracker Scraper for YouTube search results with rank, and channel discovery within a subscriber range.
- TikTok Video Transcript & Subtitles Scraper for the spoken words of public TikTok videos, with an optional speech-to-text fallback for videos without captions.
FAQ
Which videos have no transcript?
Videos with no captions at all, such as many music videos, and TikToks without captions, such as music-only clips and photo posts.
They come back as free no_transcript rows.
Does it work for Shorts, live streams and old videos?
Yes. Shorts, youtu.be, embed and live links all work, and the oldest test video is from 2005.
What data does it collect? Only what YouTube and TikTok show to logged-out visitors. Comment authors appear by their public display name only. It uses no login and no account on either site.
Actor input Schema
tool (type: string):
Which tool to run.
arguments (type: object):
The tool's arguments, as in the README. youtube_transcript and tiktok_transcript take {"videos": [...]}, youtube_channel_transcripts takes {"source": "@handle"}, youtube_search takes {"query": "..."} and youtube_comments takes {"video": "..."}.
Actor input object example
{
"tool": "youtube_transcript",
"arguments": {
"videos": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
]
}
}
Actor output Schema
results (type: string):
Results of a normal run: one item per video, search result or comment, each with a status. Only ok results are charged. Standby (MCP) calls return results to the MCP client instead.
API
You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.
JavaScript example
import { ApifyClient } from 'apify-client';
// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
token: '<YOUR_API_TOKEN>',
});
// Prepare Actor input
const input = {
"tool": "youtube_transcript",
"arguments": {
"videos": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
]
}
};
// Run the Actor and wait for it to finish
const run = await client.actor("heyitsgautham/video-transcripts-mcp-server").call(input);
// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`πΎ Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.dir(item);
});
// π Want to learn more π? Go to β https://docs.apify.com/api/client/js/docs
Python example
from apify_client import ApifyClient
# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")
# Prepare the Actor input
run_input = {
"tool": "youtube_transcript",
"arguments": { "videos": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] },
}
# Run the Actor and wait for it to finish
run = client.actor("heyitsgautham/video-transcripts-mcp-server").call(run_input=run_input)
# Fetch and print Actor results from the run's dataset (if there are any)
print(f"πΎ Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)
# π Want to learn more π? Go to β https://docs.apify.com/api/client/python/docs/quick-start
CLI example
echo '{
"tool": "youtube_transcript",
"arguments": {
"videos": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
]
}
}' |
apify call heyitsgautham/video-transcripts-mcp-server --silent --output-dataset
MCP server setup
{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=fetch-actor-details,heyitsgautham/video-transcripts-mcp-server"
}
}
}
The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an Authorization: Bearer <APIFY_API_TOKEN> header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).
OpenAPI specification
Download the OpenAPI definition: https://api.apify.com/v2/actors/uc892g5X8abcCHFW1/builds/gP417XKb0sFWOkK7D/openapi.json