MewCP LogoAStheTech
MCPsBlogsPricingDocsLogin
MewCP Logo

Infrastructure You Can Trust for Agentic Products

X

Categories

  • Productivity & Docs
  • Developer Tools
  • CRM & Sales
  • Finance & Commerce
  • Data & Analytics
  • Marketing & SEO
  • Search & Web
  • Communication
  • View All Servers →

Resources

  • Blog
  • Docs
  • Privacy Policy
  • Terms of Service

Blogs

  • View All Blogs →
Browse Servers|Pricing|Contact

Browse by Category

Productivity & Docs

  • Gmail
  • Google Drive
  • YouTube
  • Google Calendar
  • Google People
  • Google Classroom
  • Notion
  • ClickUp
  • Figma

Developer Tools

  • Gemini
  • Veo
  • ClickUp
  • Firecrawl
  • Vercel
  • Apify
  • Github
  • Chef
  • Scientific Calculator
  • Figma
  • HTTP
  • Perplexity

CRM & Sales

  • Google People

Finance & Commerce

  • Kite
  • Razorpay
  • Polymarket
  • Stripe
  • Binance

Marketing & SEO

  • YouTube
  • Google Business
  • Mailchimp

Search & Web

  • Web Scrapper
  • Firecrawl
  • Apify
  • Perplexity

Communication

  • Gmail
  • Google Meet
  • Google Calendar
  • Mailchimp
  • WhatsApp
  • Slack

© 2026 MewCP. All rights reserved.

YouTube

YouTube

v1.0.0263 callsOAuthGitHub
Open in ChatGPTChatGPT
Open in ClaudeClaude

Documentation

Guide

Connect

Gateway URL

https://gateway.mewcp.com/youtube/mcp

Integrations

Click a client to view its config snippet and setup steps. Use for a guided setup with your MewCP key pre-filled.

Help Improve This Server

Missing a tool?

Found a bug?

Have an idea for an improvement?

Share your feedback directly with the maintainers - every feedback helps make this server better for everyone.

Open GitHub Issues →

Your YouTube, fully accessible through AI.

A Model Context Protocol (MCP) server that exposes YouTube's API for searching videos, managing playlists, reading channel data, posting comments, and more.

Overview

The MewCP YouTube MCP Server provides authenticated access to the YouTube Data API v3:

  • Search and retrieve videos, channel data, and comments
  • Manage playlists: create, browse, and add videos
  • Interact with content: rate videos, post comments, subscribe to channels

Perfect for:

  • Building AI assistants that can search and analyze YouTube content
  • Automating YouTube channel management tasks
  • Integrating YouTube data into workflows and dashboards

Tools

Get information about the authenticated user's YouTube channel. Returns snippet, contentDetails, and statistics for the channel.

Inputs:

(no parameters)

output data schema:

{
  kind: string | null;
  etag: string | null;
  nextPageToken: string | null;
  prevPageToken: string | null;
  items: object[] | null;
  pageInfo: object | null;
}

Get playlists from the authenticated user's channel. Returns snippet and contentDetails for each playlist.

Inputs:

- `max_results` (int, optional, default: 25) — Maximum playlists to return (capped at 50). Defaults to 25.

output data schema:

{
  kind: string | null;
  etag: string | null




Get the authenticated user's channel subscriptions. Returns snippet and contentDetails for each subscription.

Inputs:

- `max_results` (int, optional, default: 25) — Maximum subscriptions to return (capped at 50). Defaults to 25.

output data schema:

{
  kind: string | null;
  etag: string | null




Get recent activities on the authenticated user's channel. Returns snippet and contentDetails for each activity.

Inputs:

- `max_results` (int, optional, default: 25) — Maximum activities to return (capped at 50). Defaults to 25.

output data schema:

{
  kind: string | null;
  etag: string |




Subscribe to a YouTube channel. Returns the created subscription resource including snippet details.

Inputs:

- `channel_id` (str, required) — Channel ID to subscribe to. Required.

output data schema:

{
  kind: string | null;
  etag: string | null;
  id: string | null;




Search for videos on YouTube.

Inputs:

- `query` (str, required) — Search query text. Required.
- `max_results` (int, optional, default: 10) — Maximum videos to return (capped at 50). Defaults to 10.
- `order` (str, optional, default: "relevance") — Sort order. Common values: `relevance`, `date`, `rating`, `title`, `videoCount`, `viewCount`. Defaults to `relevance`.

output data schema:

{






Get detailed information about a specific video by ID.

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.

output data schema:

{
  kind: string | null;
  etag: string | null;
  nextPageToken: string | null;
  prevPageToken


Get videos from a specific channel.

Inputs:

- `channel_id` (str, required) — YouTube channel ID. Required.
- `max_results` (int, optional, default: 25) — Maximum videos to return (capped at 50). Defaults to 25.

output data schema:

{
  kind: string | null;
  etag: string 




Get comments for a specific video.

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.
- `max_results` (int, optional, default: 20) — Maximum comments to return (capped at 100). Defaults to 20.
- `order` (str, optional, default: "relevance") — Comment order. Supported values: `relevance`, `time`. Defaults to `relevance`.

output data schema:

{
  kind





Post a comment on a video.

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.
- `text` (str, required) — Comment text content. Required.

output data schema:

{
  kind: string | null;
  etag: string | null;
  id: string | null




Rate a video (like or dislike).

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.
- `rating` ("like" | "dislike" | "none", required) — Rating value: `like`, `dislike`, or `none` (removes rating). Required.

output data schema:

{
  message: string;
}

Fetch the transcript (captions) for a YouTube video as plain text and individual timed segments. Uses auto-generated or manually created captions. Specify preferred languages in priority order; falls back to the first available if none match.

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.
- `languages` (list[str], optional, default: null) — Preferred language codes in priority order (e.g. ['en', 'fr']). Omit to use the video's default language.

output data schema:











List all available transcript tracks for a YouTube video, including language, language code, whether the track is auto-generated, and whether it can be translated. Use this before get_video_transcript to discover available languages.

Inputs:

- `video_id` (str, required) — YouTube video ID. Required.

output data schema:

{
  video_id: string;
  tracks: {
    language: string;
    language_code: string;
    is_generated: boolean;
    is_translatable

Get videos from a specific playlist.

Inputs:

- `playlist_id` (str, required) — YouTube playlist ID. Required.
- `max_results` (int, optional, default: 50) — Maximum items to return (capped at 50). Defaults to 50.

output data schema:

{
  kind: string | null;
  etag: string 




Create a new playlist on the authenticated user's channel.

Inputs:

- `title` (str, required) — Playlist title. Required.
- `description` (str, optional, default: "") — Optional playlist description. Defaults to empty string.
- `privacy_status` (str, optional, default: "private") — Privacy setting. Common values: `private`, `public`, `unlisted`. Defaults to `private`.

output data schema:

{
  kind: string |






Add a video to a playlist.

Inputs:

- `playlist_id` (str, required) — Target playlist ID. Required.
- `video_id` (str, required) — Video ID to insert. Required.

output data schema:

{
  kind: string | null;
  etag: string | null;
  id: string | null




API Parameters Reference

Every tool returns the same top-level envelope. Only data varies per tool.

// Success
{
  "success": true,
  "statusCode": 200,
  "retriable": false,
  "retry_after_seconds": null,
  "error": null,
  "data": { ... }
}
 
// Error







  • max_results — Controls the number of items returned. Always capped at the YouTube API maximum for the given endpoint (50 for most resources, 100 for comments).
  • order — Controls result ordering. Supported values vary by tool; see each tool's parameter description for the accepted values.

Video ID:

11-character alphanumeric string
Example: dQw4w9WgXcQ

channel ID:

starts with "UC" followed by 22 characters
Example: UCq-Fj5jknLsUf-MWSy4_brA

playlist ID:

Troubleshooting

  • Cause: OAuth token not provided in request headers or incorrect format
  • Solution:
    1. Verify Authorization: Bearer YOUR_OAUTH_TOKEN and X-Mewcp-Credential-Id: CREDENTIAL-ID headers are present
    2. Check that your OAuth credential is active in your MewCP account
  • Cause: API calls have exceeded your request limits
  • Solution:
    1. Check credit usage in your Curious Layer dashboard
    2. Upgrade to a paid plan or add credits for higher limits
    3. Contact support for credit adjustments
  • Cause: No YouTube credential linked to your account
  • Solution:
    1. Go to Credentials in your MewCP dashboard
    2. Connect your Google/YouTube account via OAuth
    3. Retry the request with the correct X-Mewcp-Credential-Id header
  • Cause: JSON payload is invalid or missing required fields
  • Solution:
    1. Validate JSON syntax before sending
    2. Ensure all required tool parameters are included
    3. Check parameter types match expected values
  • Cause: Incorrect server name in the API endpoint
  • Solution:
    1. Verify endpoint format: {server-name}/mcp/{tool-name}
    2. Use correct server name from documentation
    3. Check available servers in your Curious Layer account
  • Cause: Upstream YouTube Data API returned an error
  • Solution:
    1. Check YouTube service status at Google Workspace Status
    2. Verify your OAuth credential has the required YouTube scopes
    3. Review the error message for specific details

  • YouTube Data API Documentation — Official API reference
  • YouTube Data API Reference — Complete endpoint reference
  • FastMCP Docs — FastMCP specification
  • FastMCP Credentials — FastMCP Credentials package for credential handling
;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
null
;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
snippet
: object
|
null
;
contentDetails: object | null;
statistics: object | null;
status: object | null;
}
kind: string | null;
etag: string | null;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
: string
|
null
;
items: object[] | null;
pageInfo: object | null;
}
|
null
;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
: string
|
null
;
etag: string | null;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
;
snippet: object | null;
contentDetails: object | null;
statistics: object | null;
status: object | null;
}
{
video_id: string;
language: string;
is_generated: boolean;
segments: {
text: string;
start: number;
duration: number;
}[];
full_text: string;
}
: boolean;
}[];
}
|
null
;
nextPageToken: string | null;
prevPageToken: string | null;
items: object[] | null;
pageInfo: object | null;
}
null
;
etag: string | null;
id: string | null;
snippet: object | null;
contentDetails: object | null;
statistics: object | null;
status: object | null;
}
;
snippet: object | null;
contentDetails: object | null;
statistics: object | null;
status: object | null;
}
{
"success": false,
"statusCode": 400,
"retriable": false,
"retry_after_seconds": null,
"error": { "code": "ERROR_CODE", "message": "description", "details": {} },
"data": null
}
  • retriable — true when it is safe to retry (rate limit, network error, 503). false for validation and auth errors.
  • retry_after_seconds — seconds to wait before retrying; present only when retriable is true and the upstream specifies a delay.
  • error.code — machine-readable string: VALIDATION_ERROR, AUTH_ERROR, UPSTREAM_ERROR, SERVER_ERROR.
starts with "PL" followed by alphanumeric characters Example: PLbpi6ZahtOH6Ar_3GPy3workbp73xONIf