mcp-youtube
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| YOUTUBE_CONFIG | No | Config file path. | |
| YOUTUBE_CLIENT_ID | Yes | Desktop-app OAuth client id (`….apps.googleusercontent.com`). | |
| YOUTUBE_CHANNEL_ID | No | Expected channel (`UC…`). Every tool refuses if the token acts as another channel. | |
| YOUTUBE_TOKEN_FILE | No | Where the login is stored. | ~/.config/youtube/tokens.json |
| YOUTUBE_ALLOW_WRITES | No | Set to `1` to register the upload and other write tools, and ask for the `youtube` scope. | |
| YOUTUBE_CHUNK_SIZE_MB | No | Upload chunk size in MB. | 16 |
| YOUTUBE_CLIENT_SECRET | Yes | The OAuth client secret. Google requires it even with PKCE. | |
| YOUTUBE_REFRESH_TOKEN | No | Use this refresh token in memory instead of the token file. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| youtube_auth_statusA | Whether the server is configured and signed in, which channel the token acts as (the token picks the channel, so this is where uploads land), the granted scopes, whether write tools are registered, and the daily quota model. When unconfigured, returns the exact setup steps. Call this first when a tool you expected is missing. Costs 1 quota unit the first time it resolves the channel, then nothing. |
| youtube_auth_loginA | Sign in with Google: opens the consent screen in the browser and waits for it to finish, then stores a refresh token (mode 600) and reports which channel it acts as. On the account chooser, pick the channel uploads should go to — a Brand Account channel is listed separately from the personal one. The app is unverified, so Google shows a warning first: Advanced → Go to (app). If no browser can be opened, or the wait runs out, returns the authorize URL instead and keeps listening for 5 minutes; call youtube_auth_status afterwards. Logging in again replaces the stored login. |
| youtube_auth_logoutA | Revoke the stored refresh token at Google and delete it locally. Recoverable by calling youtube_auth_login again. Uploads already in progress fail at their next chunk. |
| youtube_get_channelA | The channel the signed-in token acts as: id, handle, uploads playlist, subscriber/video/view counts, and |
| youtube_list_categoriesA | The video categories that can be assigned to an upload in a region, as {id, title}. Pass the id as |
| youtube_list_videosA | This channel's uploads, newest first, including private, unlisted and scheduled ones: id, title, privacy, upload status, duration, views/likes/comments and URL. A video still processing shows upload_status |
| youtube_get_videoA | One video in full: snippet, status (privacy, uploadStatus, failure/rejection reason, publishAt, madeForKids), contentDetails, statistics, and — for your own videos — processingDetails (processing progress after an upload) and fileDetails. Use it to follow processing after youtube_upload_video finishes: processingStatus goes |
| youtube_list_playlistsA | This channel's playlists, including private ones: id, title, privacy and item count. The id is what youtube_add_to_playlist and youtube_upload_video's playlistId take. Costs 1 quota unit per page. |
| youtube_requestA | Escape hatch: call any YouTube Data API v3 endpoint (https://developers.google.com/youtube/v3/docs) that has no dedicated tool, e.g. GET /captions, GET /commentThreads, GET /search. The path is relative to /youtube/v3; parameters go in |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 9 tools
The existing tools are cleanly separated: three auth tools, three read tools targeting distinct resources (channel, videos, playlists), a category lookup, and an explicit escape hatch. The only overlap is youtube_request, which can duplicate every other read tool, but it is clearly framed as a fallback that should be preferred less. The bigger confusion source is that several descriptions point at tools that do not exist (youtube_upload_video, youtube_update_video, youtube_add_to_playlist), sending an agent hunting for phantom tools.
All names are snake_case with a consistent youtube_ prefix, and get_/list_ verb patterns are used predictably for reads. Minor deviations: the auth tools use a noun-namespace form (auth_login/status/logout) rather than verb_noun, and youtube_request is a bare noun. These are readable and conventional enough not to cause misselection.
Nine tools is a well-scoped count for a YouTube server and nothing feels padded. The composition is slightly lopsided — three of nine tools are auth lifecycle — but each earns its place given the OAuth flow described. The number itself is appropriate; the issue is which tools are present rather than how many.
The surface is read-only in practice: no upload, update, delete, playlist mutation, or comment tools exist, yet descriptions extensively document upload behavior (long_uploads checks, categoryId passing, processing follow-up) for tools that are absent. Writes are even disabled in youtube_request unless an env var is set, so there is no workaround path. This will cause agent failures on the server's apparent primary use case.