# 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](https://apify.com/heyitsgautham) (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](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`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

```json
{
  "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

```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](https://console.apify.com/settings/integrations) 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`:

```json
{
  "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`:

```json
{
  "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`:

```json
{
  "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`:

```json
{
  "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](https://apify.com/heyitsgautham/youtube-transcript-scraper), [YouTube Channel Transcripts](https://apify.com/heyitsgautham/youtube-channel-transcripts) and [TikTok Transcript Scraper](https://apify.com/heyitsgautham/tiktok-transcript-scraper) fit better.

### More from heyitsgautham

Other actors from the same account.

- [YouTube Transcript & Subtitles Scraper](https://apify.com/heyitsgautham/youtube-transcript-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](https://apify.com/heyitsgautham/youtube-channel-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](https://apify.com/heyitsgautham/youtube-comments-scraper) for the comments and replies on a video or Short, for sentiment analysis and audience research.
- [YouTube Search Results & Rank Tracker Scraper](https://apify.com/heyitsgautham/youtube-search-scraper) for YouTube search results with rank, and channel discovery within a subscriber range.
- [TikTok Video Transcript & Subtitles Scraper](https://apify.com/heyitsgautham/tiktok-transcript-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

```json
{
  "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

```javascript
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

```python
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

```bash
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

```json
{
    "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
