# youtube-kit (pypi · youtube-kit)

YouTube CLI and MCP server: search and read public YouTube, and manage your own channels.

- Trust score: 68/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-24

## Components

- pypi · `youtube-kit`: 68/100 (this document), [markdown](https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit.md), [page](https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit)

## Channel facts

- Registry: `pypi`
- Package: `youtube-kit`
- Version: `0.7.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-24.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs uv_build at install time, a recognised build step with no custom scripting around it.
  - 2 of 44 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to eukosh/youtube-kit).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 66/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 7179 tokens (~140/item across 51 items; 51 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 52 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the youtube-kit MCP server?

youtube-kit runs locally as a PyPI package, launched with uvx youtube-kit. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add eukosh-youtube-kit -- uvx youtube-kit
```

### Cursor

```json
{
  "mcpServers": {
    "eukosh-youtube-kit": {
      "command": "uvx",
      "args": [
        "youtube-kit"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "eukosh-youtube-kit": {
      "command": "uvx",
      "args": [
        "youtube-kit"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add eukosh-youtube-kit -- uvx youtube-kit
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "eukosh-youtube-kit": {
      "type": "local",
      "command": [
        "uvx",
        "youtube-kit"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add eukosh-youtube-kit --command uvx --arg youtube-kit
```

### Hermes

```yaml
mcp_servers:
  eukosh-youtube-kit:
    command: "uvx"
    args: ["youtube-kit"]
```

### Netclaw

```json
{
  "McpServers": {
    "eukosh-youtube-kit": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "youtube-kit"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add eukosh-youtube-kit -t stdio -c uvx -a youtube-kit
```

### Other

```json
{
  "mcpServers": {
    "eukosh-youtube-kit": {
      "command": "uvx",
      "args": [
        "youtube-kit"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-24 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 66, 0)

- [functional] Package version: 0.7.0 → 0.7.1

### 2026-10-20 (score 66, 0)

- [functional regression] Schema quality: 5917 → 7165
- [functional] Package version: 0.6.0 → 0.7.0

### 2026-10-19 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-18 (score 65)

First indexed and scored.

## MCP tools (51)

### `get_analytics` (~636 tokens)

Get Analytics

YouTube Analytics for your channel: totals, or rows broken down by one dimension.

Data for the last two or three days is incomplete, so recent rows keep growing. Uses the separate
YouTube Analytics API and its quota; enable it in the same Google Cloud project.

Quota: no YouTube Data API units.

Input parameters:

- `by`: Break the numbers down by this dimension; its column is named as given here. Omit for totals. By month, the range widens to whole months. By elapsed: the audience retention of exactly one video, a ro…
- `content_type`: Only long-form videos (videoOnDemand), shorts, or live streams (liveStream), as the content-type breakdown names them. Not by elapsed.
- `country`: Only viewers in this country, e.g. US. Not by elapsed.
- `limit`: Maximum number of rows. Breaking down by video returns at most 200, 25 by default; by traffic-source-detail, at most 25. Other breakdowns return every row by default.
- `metrics`: Metric names from https://developers.google.com/youtube/analytics/metrics, e.g. views, estimatedMinutesWatched, subscribersGained. Defaults to views, watch time, average view duration, likes, comment…
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `since`: First day, inclusive: 2026-01-01, or 90d / 4w before until. Defaults to 28 days before until.
- `sort`: Metric or dimension to sort by; prefix with - for descending, e.g. -views. Defaults to chronological by day, month or elapsed, and to the first metric, descending, by anything else.
- `traffic_source`: The source to break down by traffic-source-detail, as the traffic-source breakdown names it, e.g. YT_SEARCH. Only with that breakdown.
- `until`: Last day, inclusive: 2026-01-31, or 7d / 1w ago. Defaults to today.
- `videos`: Only these videos (IDs or URLs).

Output parameters:

- `columns` (array): Dimension first (if any), then the metrics, in request order.
- `rows` (array)
- `since` (string)
- `until` (string)

### `setup_guide` (~94 tokens)

Setup Guide

What is left before the user's channel can be used: a one-time Google Cloud setup, then a Google sign-in.

The steps happen in the user's browser, so walk them through one step at a time. Once ready, running
the sign-in again connects another channel.

Quota: no YouTube Data API units.

Input parameters:

- `project`: Google Cloud project ID, once known. The links then open with that project selected.

Output parameters:

- `channels` (array)
- `ready` (boolean): At least one channel is logged in.
- `steps` (array): What is left to do, in order. Empty when ready.

### `get_channel` (~79 tokens)

Get Channel

Channel metadata, statistics, and uploads playlist ID.

Quota: 1 unit.

Input parameters:

- `channel`: UC… channel ID, @handle, or channel URL. Omit for your own channel.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `country`
- `description` (string)
- `handle`
- `id` (string)
- `published_at` (string)
- `stats`
- `title` (string)
- `uploads_playlist_id`
- `url` (string)

### `list_my_channels` (~60 tokens)

List My Channels

Channels the user is logged in to, and which one is the default.

Operations on the user's own channel work on the default unless told to use another.
Reads stored logins only; makes no API calls.

Quota: no YouTube Data API units.

Output parameters:

- `result` (array)

### `list_activities` (~153 tokens)

List Activities

A channel's recent activity feed (uploads, playlist additions, and the like).

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `channel`: UC… channel ID, @handle, or channel URL. Omit for your own channel.
- `limit` (integer): Maximum number of activities.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `page_token`: Continue from a previous result's next_page_token.
- `since`: Only activity at or after this date or datetime (2026-01-01), or this long ago (90d, 4w).

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `list_sections` (~78 tokens)

List Sections

The sections on a channel's home page.

Quota: 1 unit.

Input parameters:

- `channel`: UC… channel ID, @handle, or channel URL. Omit for your own channel.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `result` (array)

### `list_captions` (~93 tokens)

List Captions

A video's caption tracks: language, name, and whether YouTube generated them from the audio.

Works on any public video, though only the owner can download a transcript.

Quota: 50 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `video` (string, required): Video ID or URL.

Output parameters:

- `result` (array)

### `get_transcript` (~204 tokens)

Get Transcript

What is said in one of your videos, from its captions, including the ones YouTube generates.

YouTube lets only a video's owner download its captions. Of several tracks in a language, one YouTube is
serving is preferred over one it failed to process, then a published one you wrote over YouTube's.

Quota: 252 units.

Input parameters:

- `format` (string): text: paragraphs of about 30 seconds, each starting with its [m:ss] time. srt or vtt: the caption file itself.
- `language`: Caption language, e.g. en or en-US. Omit for the language spoken in the video.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `translate_to`: Machine-translate the captions into this language, e.g. de.
- `video` (string, required): Video ID or URL.

Output parameters:

- `caption_id` (string)
- `format` (string)
- `kind` (string)
- `language` (string)
- `text` (string)
- `translated_to`: Language YouTube machine-translated the track into.
- `video_id` (string)

### `list_comments` (~180 tokens)

List Comments

Top-level comments on a video, or on all of your channel's videos.

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `limit` (integer): Maximum number of comments.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `order` (string): Newest first, or most relevant first.
- `page_token`: Continue from a previous result's next_page_token.
- `search`: Only comments containing these words.
- `status` (string): Moderation status to list; spam is what YouTube flagged as likely spam. Anything but published is only visible on your own videos. YouTube can't list rejected comments.
- `video`: Video ID or URL. Omit for every video on your channel.

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `list_replies` (~110 tokens)

List Replies

Replies to a top-level comment.

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `comment` (string, required): Comment ID or link. A reply's ID or link lists its whole thread.
- `limit` (integer): Maximum number of replies.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `page_token`: Continue from a previous result's next_page_token.

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `list_playlists` (~113 tokens)

List Playlists

A channel's playlists.

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `channel`: UC… channel ID, @handle, or channel URL. Omit for your own channel, including private playlists.
- `limit` (integer): Maximum number of playlists.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `page_token`: Continue from a previous result's next_page_token.

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `get_playlists` (~95 tokens)

Get Playlists

Metadata of one or more playlists: title, description, privacy, and item count.

Quota: 1 unit.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlists` (array, required): Playlist IDs or URLs with a list= parameter. Fetched in batches of 50, 1 quota unit per batch.

Output parameters:

- `result` (array)

### `list_playlist_items` (~123 tokens)

List Playlist Items

Videos in a playlist, in playlist order.

To list everything a channel has uploaded, pass the channel's uploads_playlist_id.

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `limit` (integer): Maximum number of entries.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `page_token`: Continue from a previous result's next_page_token.
- `playlist` (string, required): Playlist ID or a URL with a list= parameter.

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `search` (~181 tokens)

Search

Search YouTube for videos, channels, or playlists.

Quota: 1 of the project's 100 daily search calls per page of up to 50 results.

Input parameters:

- `channel`: Only results from this channel: UC… ID, @handle, or channel URL.
- `kind` (string): What to search for.
- `limit` (integer): Maximum number of results.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `order` (string): Sort order.
- `page_token`: Continue from a previous result's next_page_token.
- `query` (string, required): Search terms.
- `since`: Only results published at or after this date or datetime (2026-01-01), or this long ago (90d, 4w).

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `list_subscriptions` (~109 tokens)

List Subscriptions

Channels the authorized user is subscribed to.

Quota: 1 unit per page of up to 50 results.

Input parameters:

- `limit` (integer): Maximum number of subscriptions.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `order` (string): Alphabetical, by relevance, or by activity (unread first).
- `page_token`: Continue from a previous result's next_page_token.

Output parameters:

- `items` (array)
- `next_page_token`: Pass as page_token to continue; null at the end.
- `total_results`: Total reported by YouTube; only an estimate for search.

### `get_videos` (~113 tokens)

Get Videos

Full metadata, statistics, and status for one or more videos.

Videos that don't exist or aren't visible to you are left out of the result;
if none are found, that's a not-found error.

Quota: 1 unit.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `videos` (array, required): Video IDs or URLs. Fetched in batches of 50, 1 quota unit per batch.

Output parameters:

- `result` (array)

### `get_my_ratings` (~84 tokens)

Get My Ratings

Whether the authorized user liked or disliked each video.

Quota: 1 unit.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `videos` (array, required): Video IDs or URLs. Fetched in batches of 50, 1 quota unit per batch.

Output parameters:

- `result` (array)

### `list_video_categories` (~86 tokens)

List Video Categories

Video categories that can be assigned to uploads in a region, with the IDs to pass as category_id.

Quota: 1 unit.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `region` (string): ISO 3166-1 alpha-2 country code.

Output parameters:

- `result` (array)

### `get_processing_status` (~149 tokens)

Get Processing Status

Whether YouTube has finished processing one of your uploads.

Quota: 1 unit.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `timeout` (integer): Seconds to wait at most. Callers that can't block for long should wait briefly and check again.
- `video` (string, required): Video ID or URL.
- `wait` (boolean): Keep checking every 10 seconds (1 quota unit each) until processing ends, reporting progress when YouTube gives it. If it hasn't ended within timeout, that's a timeout error, so a script can chain th…

Output parameters:

- `failure_reason`
- `parts_processed`
- `parts_total`
- `status` (string)
- `time_left_ms`
- `video_id` (string)

### `get_impressions` (~273 tokens)

Get Impressions

Thumbnail impressions and click-through rate for your channel, which YouTube Analytics doesn't offer.

They come from YouTube's daily bulk reports. The first call asks YouTube to start making them: the first
ones arrive within two days and cover the 30 days before. YouTube keeps daily reports for 60 days, those
first 30 days for 30. ctr is clicks per impression: 0.05 is 5%. Uses the YouTube Reporting API; enable it
in the same Google Cloud project.

Quota: no YouTube Data API units.

Input parameters:

- `by`: Break the numbers down by day or by video. Omit for totals.
- `limit`: Maximum number of rows by video, most impressions first. 25 by default.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `since`: First day, inclusive: 2026-01-01, or 90d / 4w before until. Defaults to 28 days before until.
- `until`: Last day, inclusive: 2026-01-31, or 7d / 1w ago. Defaults to today.
- `videos`: Only these videos (IDs or URLs).

Output parameters:

- `columns` (array): Dimension first (if any), then the metrics, in request order.
- `missing_days` (array): Days YouTube has no report for: the last two, and any outside what it keeps.
- `note`
- `rows` (array)
- `since` (string)
- `until` (string)

### `update_channel` (~168 tokens)

Update Channel

Change your channel's about info. Only the fields you pass change. The name can only be changed in Studio.

Quota: 51 units.

Input parameters:

- `country`: ISO 3166-1 alpha-2 country code.
- `description`: Channel description.
- `keywords`: Channel keywords, replacing the current ones. An empty list removes them all.
- `language`: Language of the channel's title and description, e.g. en or de. If the channel has none, YouTube may pick one on any change; pass it to choose.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `trailer`: Video (ID or URL) shown to visitors who aren't subscribed.

Output parameters:

- `banner_url`
- `channel_id` (string)
- `country`
- `description`
- `keywords` (array)
- `language`
- `title`
- `trailer_video_id`: Shown to visitors who aren't subscribed.

### `set_channel_banner` (~91 tokens)

Set Channel Banner

Upload and set your channel's banner. Use a 16:9 image of at least 2048x1152, at most 6 MB.

Quota: 101 units.

Input parameters:

- `image` (string, required): Path to a JPEG or PNG.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `banner_url`
- `channel_id` (string)
- `country`
- `description`
- `keywords` (array)
- `language`
- `title`
- `trailer_video_id`: Shown to visitors who aren't subscribed.

### `set_watermark` (~167 tokens)

Set Watermark

Set the watermark shown over all your videos, replacing any current one. Viewers click it to subscribe.

Quota: 51 units.

Input parameters:

- `corner` (string): Where it appears.
- `duration`: Seconds to show it. Until the end of the video when omitted.
- `from_end` (boolean): Count start back from the end of the video.
- `image` (string, required): Path to a square JPEG or PNG, at least 150x150, at most 1 MB.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `start` (integer): Seconds from the start of the video when it appears, or from its end when counting from the end.

Output parameters:

- `active` (boolean)
- `channel_id` (string)
- `corner`
- `duration_seconds`
- `from_end`
- `start_seconds`

### `remove_watermark` (~62 tokens)

Remove Watermark

Remove the watermark from your videos. Succeeds when there is none.

Quota: 51 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `active` (boolean)
- `channel_id` (string)
- `corner`
- `duration_seconds`
- `from_end`
- `start_seconds`

### `add_section` (~169 tokens)

Add Section

Add a section to your channel's home page. A channel has at most 10.

Quota: 52 units.

Input parameters:

- `channels`: Channels to show: UC… IDs, @handles, or channel URLs.
- `kind` (string, required): What the section shows. single-playlist needs one playlist, multiple-playlists several playlists and a title, multiple-channels channels and a title.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlists`: Playlist IDs or URLs to show.
- `position`: 0-based position on the home page. Added at the end when omitted.
- `title`: Section title, for the multiple-playlists and multiple-channels kinds.

Output parameters:

- `channel_ids` (array)
- `id` (string)
- `playlist_ids` (array)
- `position`
- `title`
- `type` (string)

### `update_section` (~140 tokens)

Update Section

Change a section on your channel's home page. Only the fields you pass change.

Quota: 51 units.

Input parameters:

- `channels`: Channels to show instead of the current ones (UC… IDs, @handles, or URLs).
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlists`: Playlists to show instead of the current ones (IDs or URLs).
- `position`: New 0-based position on the home page.
- `section` (string, required): Section ID, as listed for your channel.
- `title`: New title.

Output parameters:

- `channel_ids` (array)
- `id` (string)
- `playlist_ids` (array)
- `position`
- `title`
- `type` (string)

### `delete_section` (~79 tokens)

Delete Section

Delete a section from your channel's home page. Its playlists and videos are not affected.

Quota: 50 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `section` (string, required): Section ID, as listed for your channel.

Output parameters:

- `already_gone` (boolean): Nothing to delete: it didn't exist or was already deleted.
- `id` (string)
- `kind` (string)

### `upload_caption` (~152 tokens)

Upload Caption

Add a caption track to one of your videos from a caption file, such as SRT or VTT.

Quota: 400 units.

Input parameters:

- `draft` (boolean): Upload it hidden from viewers.
- `file` (string, required): Path to the caption file, at most 100 MB.
- `language` (string, required): Language of the captions, e.g. en or en-US.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `name` (string): Track name viewers see next to the language. Two tracks in one language need different names.
- `video` (string, required): Video ID or URL.

Output parameters:

- `draft` (boolean): Not shown to viewers yet.
- `id` (string)
- `kind` (string): asr: made by YouTube's speech recognition. forced: shown when no track is chosen.
- `language` (string)
- `name`
- `status`: serving, syncing, or failed.
- `updated_at`
- `video_id` (string)

### `update_caption` (~143 tokens)

Update Caption

Replace the file of a caption track on one of your videos, or show or hide the track.

Quota: 502 units.

Input parameters:

- `draft`: Whether the track is hidden from viewers.
- `file`: Path to the new caption file, at most 100 MB.
- `language` (string, required): Language of the track, e.g. en or en-US.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `name`: Name of the track, when the video has several in that language.
- `video` (string, required): Video ID or URL.

Output parameters:

- `draft` (boolean): Not shown to viewers yet.
- `id` (string)
- `kind` (string): asr: made by YouTube's speech recognition. forced: shown when no track is chosen.
- `language` (string)
- `name`
- `status`: serving, syncing, or failed.
- `updated_at`
- `video_id` (string)

### `delete_caption` (~139 tokens)

Delete Caption

Permanently delete a caption track from one of your videos.

Without confirm, nothing is deleted and the error describes the track.

Quota: 102 units.

Input parameters:

- `confirm`: The track's ID, passed only after the user has approved deleting this track.
- `language` (string, required): Language of the track, e.g. en or en-US.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `name`: Name of the track, when the video has several in that language.
- `video` (string, required): Video ID or URL.

Output parameters:

- `already_gone` (boolean): Nothing to delete: it didn't exist or was already deleted.
- `id` (string)
- `kind` (string)

### `post_comment` (~79 tokens)

Post Comment

Post a top-level comment on a video as the authorized user.

Quota: 50 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `text` (string, required): The comment.
- `video` (string, required): Video ID or URL.

Output parameters:

- `author` (string)
- `author_channel_id`
- `id` (string)
- `likes`
- `parent_id`: Replies only: the comment replied to.
- `published_at` (string)
- `reply_count`: Top-level comments only.
- `status`: Moderation status, where YouTube reports it.
- `text` (string)
- `updated_at`
- `video_id`

### `reply_to_comment` (~89 tokens)

Reply To Comment

Reply to a top-level comment as the authorized user.

Quota: 50 units.

Input parameters:

- `comment` (string, required): Comment ID or link. Replying to a reply adds to the same thread.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `text` (string, required): The reply.

Output parameters:

- `author` (string)
- `author_channel_id`
- `id` (string)
- `likes`
- `parent_id`: Replies only: the comment replied to.
- `published_at` (string)
- `reply_count`: Top-level comments only.
- `status`: Moderation status, where YouTube reports it.
- `text` (string)
- `updated_at`
- `video_id`

### `edit_comment` (~79 tokens)

Edit Comment

Replace the text of one of your own comments or replies.

Quota: 50 units.

Input parameters:

- `comment` (string, required): Comment ID or link.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `text` (string, required): The new text.

Output parameters:

- `author` (string)
- `author_channel_id`
- `id` (string)
- `likes`
- `parent_id`: Replies only: the comment replied to.
- `published_at` (string)
- `reply_count`: Top-level comments only.
- `status`: Moderation status, where YouTube reports it.
- `text` (string)
- `updated_at`
- `video_id`

### `delete_comment` (~128 tokens)

Delete Comment

Permanently delete one of your own comments or replies. Deleting a top-level comment deletes its replies.

Others' comments on your videos can't be deleted, only rejected, which hides them.
Without confirm, nothing is deleted and the error describes the comment.

Quota: 52 units.

Input parameters:

- `comment` (string, required): Comment ID or link.
- `confirm`: The comment ID again, passed only after the user has approved deleting this comment.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `already_gone` (boolean): Nothing to delete: it didn't exist or was already deleted.
- `id` (string)
- `kind` (string)

### `approve_comments` (~82 tokens)

Approve Comments

Publish comments on your videos that are held for review or marked as likely spam.

Quota: 50 units.

Input parameters:

- `comments` (array, required): Comment IDs or links. 50 quota units per 50 comments.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `authors_banned` (boolean)
- `comment_ids` (array)
- `status` (string)

### `hold_comments` (~76 tokens)

Hold Comments

Hide comments on your videos until you review them.

Quota: 50 units.

Input parameters:

- `comments` (array, required): Comment IDs or links. 50 quota units per 50 comments.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `authors_banned` (boolean)
- `comment_ids` (array)
- `status` (string)

### `reject_comments` (~105 tokens)

Reject Comments

Reject comments on your videos, hiding them from viewers. They can still be approved later.

Quota: 50 units.

Input parameters:

- `ban_author` (boolean): Also reject all future comments on your channel by each comment's author.
- `comments` (array, required): Comment IDs or links. 50 quota units per 50 comments.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `authors_banned` (boolean)
- `comment_ids` (array)
- `status` (string)

### `create_playlist` (~118 tokens)

Create Playlist

Create a playlist on the authorized user's channel.

Left out, the language is copied from your most recent public upload, as video uploads do.

Quota: 57 units.

Input parameters:

- `description` (string): Playlist description.
- `language`: Language of the title and description, e.g. en-US.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `privacy` (string): Privacy status.
- `title` (string, required): Playlist title.

Output parameters:

- `channel_id`
- `description`
- `id` (string)
- `item_count`
- `language`: Language of the title and description, e.g. en-US.
- `privacy`
- `published_at`
- `title` (string)
- `url` (string)

### `update_playlist` (~109 tokens)

Update Playlist

Change one of your playlists. Only the fields you pass change.

Quota: 51 units.

Input parameters:

- `description`: New description.
- `language`: Language of the title and description, e.g. en-US.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.
- `privacy`: New privacy status.
- `title`: New title.

Output parameters:

- `channel_id`
- `description`
- `id` (string)
- `item_count`
- `language`: Language of the title and description, e.g. en-US.
- `privacy`
- `published_at`
- `title` (string)
- `url` (string)

### `delete_playlist` (~106 tokens)

Delete Playlist

Permanently delete one of your playlists. The videos in it are not affected.

Without confirm, nothing is deleted and the error describes the playlist.

Quota: 52 units.

Input parameters:

- `confirm`: The playlist ID again, passed only after the user has approved deleting this playlist.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.

Output parameters:

- `already_gone` (boolean): Nothing to delete: it didn't exist or was already deleted.
- `id` (string)
- `kind` (string)

### `add_video_to_playlist` (~102 tokens)

Add Video To Playlist

Add a video to a playlist on the authorized user's channel.

Quota: 50 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.
- `position`: 0-based position in the playlist. Appends to the end when omitted.
- `video` (string, required): Video ID or URL.

Output parameters:

- `playlist_id` (string)
- `playlist_item_id` (string)
- `position` (integer)
- `video_id` (string)

### `remove_from_playlist` (~90 tokens)

Remove From Playlist

Remove a video from one of your playlists, every time it appears. The video itself is not affected.

Quota: 51 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.
- `video` (string, required): Video ID or URL.

Output parameters:

- `playlist_id` (string)
- `removed` (integer): How many occurrences were removed; 0 if the video wasn't in the playlist.
- `video_id` (string)

### `move_in_playlist` (~106 tokens)

Move In Playlist

Move a video to another position in one of your playlists.

Quota: 51 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.
- `position` (integer, required): New 0-based position.
- `video` (string, required): Video ID or URL. Refused if the video appears in the playlist more than once.

Output parameters:

- `playlist_id` (string)
- `playlist_item_id` (string)
- `position` (integer)
- `video_id` (string)

### `set_playlist_thumbnail` (~93 tokens)

Set Playlist Thumbnail

Set the custom thumbnail of one of your playlists, replacing any current one.

Quota: 101 units.

Input parameters:

- `image` (string, required): Path to a square JPEG or PNG, at most 50 MB.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `playlist` (string, required): Playlist ID or URL.

Output parameters:

- `height`
- `image_id` (string)
- `playlist_id` (string)
- `width`

### `subscribe` (~77 tokens)

Subscribe

Subscribe the authorized user to a channel. Already being subscribed is fine.

Quota: 51 units.

Input parameters:

- `channel` (string, required): UC… channel ID, @handle, or channel URL.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `channel_id` (string)
- `description`
- `id` (string)
- `subscribed_at`
- `title`
- `url` (string)

### `unsubscribe` (~78 tokens)

Unsubscribe

Unsubscribe the authorized user from a channel. Not being subscribed is fine.

Quota: 51 units.

Input parameters:

- `channel` (string, required): UC… channel ID, @handle, or channel URL.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.

Output parameters:

- `channel_id` (string)
- `was_subscribed` (boolean)

### `rate_video` (~87 tokens)

Rate Video

Like or dislike a video as the authorized user, or clear the rating with none.

Quota: 50 units.

Input parameters:

- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `rating` (string, required): like, dislike, or none.
- `video` (string, required): Video ID or URL.

Output parameters:

- `rating` (string)
- `video_id` (string)

### `upload_video` (~391 tokens)

Upload Video

Upload a video file from disk (resumable, reports progress).

Category and languages left out are copied from your most recent public upload (among your last 150),
so the video matches the rest of your channel; with none, the category is 22 (People & Blogs).
YouTube keeps processing the video after this returns, and its duration and statistics appear only once
that ends. Checking whether processing has finished tells you when, or why it failed.

Quota: 1 of the project's 100 daily upload calls, plus up to 7 units.

Input parameters:

- `ai_content` (boolean): Whether AI made realistic content: a real person saying or doing something they didn't, altered footage of a real event or place, a realistic scene that didn't happen, or music that's the video's foc…
- `audio_language`: Language spoken in the video, e.g. en-US.
- `category_id`: Category ID (see the video categories listing).
- `description` (string): Video description.
- `file` (string, required): Path to the local video file.
- `language`: Language of the title and description, e.g. en-US.
- `made_for_kids` (boolean): Whether the video is made for kids (COPPA).
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `paid_promotion` (boolean): Whether the video includes paid promotion: a sponsorship, product placement, or endorsement.
- `privacy` (string): Privacy status. Must be private when publish_at is set.
- `publish_at`: Schedule publication at this date or datetime; YouTube makes the video public then.
- `tags`: Keyword tags. YouTube may store them in a different order.
- `title` (string, required): Video title.

Output parameters:

- `ai_content`: Declared to contain realistic AI-made content, as set by this upload or update. YouTube doesn't report it when reading a video.
- `audio_language`: Language spoken in the video, e.g. en-US.
- `category_id`
- `channel_id`
- `channel_title`
- `description`
- `duration`
- `duration_seconds`
- `id` (string)
- `language`: Language of the title and description, e.g. en-US.
- `paid_promotion`: Declared to include paid promotion.
- `privacy`
- `publish_at`
- `published_at`
- `rejection_reason`: Why YouTube rejected the video, e.g. copyright, duplicate, length, termsOfService. YouTube reports no reason for a video kept private because its API project isn't verified.
- `stats`
- `studio_url`: Edit page in YouTube Studio; only for videos on channels you're logged in to.
- `tags`: In the order YouTube stores them, which may differ from yours.
- `title`
- `upload_failure_reason`: Why a failed upload failed, e.g. codec, conversion, emptyFile, invalidFile, tooSmall.
- `upload_status`: uploaded, processed, failed, rejected, or deleted.
- `url` (string)

### `update_video` (~315 tokens)

Update Video

Change a video's metadata. Only the fields you pass change; the rest keep their values.

Quota: 51 units.

Input parameters:

- `ai_content`: Whether AI made realistic content: a real person saying or doing something they didn't, altered footage of a real event or place, a realistic scene that didn't happen, or music that's the video's foc…
- `audio_language`: Language spoken in the video, e.g. en-US.
- `category_id`: New category ID (see the video categories listing).
- `description`: New description.
- `language`: Language of the title and description, e.g. en-US.
- `made_for_kids`: Whether the video is made for kids (COPPA).
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `paid_promotion`: Whether the video includes paid promotion: a sponsorship, product placement, or endorsement.
- `privacy`: New privacy status. Making a scheduled video public or unlisted cancels the schedule.
- `publish_at`: Schedule publication at this date or datetime. The video must end up private.
- `tags`: New tags, replacing the current ones. An empty list removes all tags. YouTube may store them in a different order.
- `title`: New title.
- `video` (string, required): Video ID or URL.

Output parameters:

- `ai_content`: Declared to contain realistic AI-made content, as set by this upload or update. YouTube doesn't report it when reading a video.
- `audio_language`: Language spoken in the video, e.g. en-US.
- `category_id`
- `channel_id`
- `channel_title`
- `description`
- `duration`
- `duration_seconds`
- `id` (string)
- `language`: Language of the title and description, e.g. en-US.
- `paid_promotion`: Declared to include paid promotion.
- `privacy`
- `publish_at`
- `published_at`
- `rejection_reason`: Why YouTube rejected the video, e.g. copyright, duplicate, length, termsOfService. YouTube reports no reason for a video kept private because its API project isn't verified.
- `stats`
- `studio_url`: Edit page in YouTube Studio; only for videos on channels you're logged in to.
- `tags`: In the order YouTube stores them, which may differ from yours.
- `title`
- `upload_failure_reason`: Why a failed upload failed, e.g. codec, conversion, emptyFile, invalidFile, tooSmall.
- `upload_status`: uploaded, processed, failed, rejected, or deleted.
- `url` (string)

### `set_thumbnail` (~88 tokens)

Set Thumbnail

Set a video's custom thumbnail. The channel must be verified.

Quota: 50 units.

Input parameters:

- `image` (string, required): Path to a JPEG or PNG, at most 50 MB.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `video` (string, required): Video ID or URL.

Output parameters:

- `thumbnail_url`
- `video_id` (string)

### `delete_video` (~152 tokens)

Delete Video

Permanently delete one of your videos.

Only recent, little-watched videos can be deleted here: by default at most 100 views and, if public,
uploaded within the last 7 days (the limits are set in the toolkit's config file). Anything else must be
deleted in YouTube Studio. Without confirm, nothing is deleted and the error describes the video.

Quota: 52 units.

Input parameters:

- `confirm`: The video ID again, passed only after the user has approved deleting this video.
- `my_channel`: Which of your logged-in channels to work on: UC… ID, @handle or exact title. Omit for the default channel.
- `video` (string, required): Video ID or URL.

Output parameters:

- `already_gone` (boolean): Nothing to delete: it didn't exist or was already deleted.
- `id` (string)
- `kind` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit#diagnostics

## Score history

- 2026-10-24: 68
- 2026-10-23: 67
- 2026-10-22: 67
- 2026-10-21: 66
- 2026-10-20: 66
- 2026-10-19: 66
- 2026-10-18: 65

## Common questions

### What is the youtube-kit MCP server?

youtube-kit is an MCP server listed in the public MCP registry as io.github.eukosh/youtube-kit. YouTube CLI and MCP server: search and read public YouTube, and manage your own channels. This page covers its PyPI package (youtube-kit).

### Is the youtube-kit MCP server safe to use?

youtube-kit scores 68 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the youtube-kit MCP server expose?

youtube-kit exposes 51 tools: get_analytics, setup_guide, get_channel, list_my_channels, list_activities, and 46 more. Their descriptions and schemas cost roughly 6,873 tokens of context every time the server is loaded.

### Is the youtube-kit MCP server still maintained?

youtube-kit is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the youtube-kit MCP server under?

youtube-kit declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/youtube-kit/
- Socket report: https://socket.dev/pypi/package/youtube-kit
- Repository: https://github.com/eukosh/youtube-kit
- Changelog RSS feed: https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit.xml
- Changelog JSON feed: https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit.json
- HTML version of this page: https://verifymcp.io/servers/eukosh-youtube-kit/youtube-kit
