Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
YOUTUBE_API_KEYNoUsed for public Data API reads when you have not signed in. Unset by default.
YOUTUBE_MCP_CONFIG_DIRNoWhere the token, client secret, and quota ledger live.~/.youtube-mcp
YOUTUBE_MCP_UPLOAD_DIRNoIf set, uploads and thumbnails may only read files inside this folder. Unset by default.
YOUTUBE_MCP_CLIENT_SECRETNoPath to the OAuth client JSON.<config dir>/client_secret.json

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

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
docsA

Guides for the yt client used by execute(): the API surface, quota rules, analytics recipes, publishing gotchas, and error reasons. Read docs("overview") before the first execute() call. Topics: analytics, auth, comments, discovery, overview, playlists, publishing, quota, reporting, transcripts.

searchA

Explore the YouTube API specs by running a JavaScript async function body. No network, no auth, no quota.

A global spec holds:

  • spec.youtube: Data API v3 Discovery doc. Methods live at spec.youtube.resources..methods., with httpMethod, parameters (description, required, repeated, enum), and request/response $ref schemas in spec.youtube.schemas.

  • spec.analytics: YouTube Analytics v2 Discovery doc (reports.query, groups, groupItems).

  • spec.analyticsFields: { metrics, dimensions } with descriptions, since the Analytics Discovery doc does not list them.

  • spec.reporting: YouTube Reporting v1 Discovery doc.

  • spec.quotaCosts: { "youtube.videos.list": { bucket, cost }, ... }.

Return only what you need. Examples: return Object.entries(spec.youtube.resources.videos.methods).map(([k, m]) => ({ k, params: Object.keys(m.parameters ?? {}) })) return spec.youtube.schemas.VideoSnippet.properties return Object.keys(spec.analyticsFields.metrics).filter((m) => /revenue/i.test(m))

Method ids found here map 1:1 to execute(): spec.youtube.resources.videos.methods.list is yt.data.videos.list(params).

executeA

Run a JavaScript async function body against the user's YouTube channel. Call docs() first for recipes, quota rules, and gotchas. Use search() to look up method parameters.

The yt client: yt.data..(params, body?, { confirm? }) YouTube Data API v3, e.g. yt.data.videos.list({ part: "snippet,statistics", id: ["a", "b"] }) yt.analytics.query(params) YouTube Analytics v2 reports.query; ids defaults to channel==MINE, dates to the last 28 days; returns { columns, rows: object[] } yt.reporting..(params, body?) YouTube Reporting v1 yt.reporting.download(downloadUrl, { maxChars? }) CSV text of a report, default cap 50,000 chars yt.paginate(fn, params, { max }) follows nextPageToken, returns items yt.transcript(videoId, { lang? }) captions of any public video, no quota: { language, isGenerated, fullText, segments, available } yt.suggest(query, { lang? }) YouTube search autocomplete, no quota yt.upload(absPath, { snippet, status }, { confirm }) resumable upload from local disk yt.setThumbnail(videoId, absPath, { confirm }) JPEG or PNG, 2 MB max yt.quota() yt.auth.status()

Confirm gate: deletes, uploads, comments, thumbnails, captions, reporting jobs, live transitions, and anything that sets privacyStatus to public return a dry run ({ dryRun, effect, wouldCall, cost }) and send nothing unless the call passes { confirm: true } as its last argument. Show the user the dry run and get approval before confirming. Helpers in scope: formatDuration(iso), durationSeconds(iso), isLikelyShort(iso), toRows(analyticsResponse).

Chain many calls in one program and return a compact, aggregated result. Errors thrown by yt carry status, reason (e.g. quotaExceeded, authRequired, invalidParams), and message, and can be caught. The sandbox has no network, env, or filesystem; credentials stay on the host. Limits: 60s wall clock, 500 yt calls, 100 KB of returned JSON.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.4/5.0

Scored across 3 tools

Disambiguation4/5

The three tools have distinguishable roles: docs provides static guides, search explores discovery specs offline, and execute runs authenticated calls against the channel. The only mild overlap is that both search and execute take a JavaScript function body, but the descriptions clearly separate them via 'no network, no auth, no quota' versus the live authenticated client.

Naming Consistency5/5

All three names are single lowercase tokens (docs, search, execute) following one uniform convention, so there is no mixing of camelCase/snake_case or verb styles. Readable and predictable as a set.

Tool Count4/5

Three tools is a deliberate code-mode design that collapses the entire YouTube Data/Analytics/Reporting surface into one dispatch tool, so the low count is justified rather than thin. It is slightly lean on the documentation/meta side, but each tool clearly earns its place.

Completeness4/5

Coverage is broad: Data v3, Analytics, Reporting, uploads, thumbnails, transcripts, autocomplete, pagination, and quota are all reachable, so no major domain gaps. The main omission is that auth is host-managed and only surfaced via yt.auth.status(), leaving no in-server login/setup operation.