youtube-personal-feed
This server connects to your personal YouTube account and provides AI assistants with access to your subscriptions and channel data via MCP.
List Subscriptions: Retrieve your subscribed channels, with optional case-insensitive title filtering and limits up to 500.
List Feed: Get recent uploads from your subscribed channels, with limits up to 200, recency filtering (past 365 days), and optional restriction to a single channel.
List Channel Uploads: Fetch recent uploads from any YouTube channel by ID (even if not subscribed), up to 50 videos.
Get Video Details: Obtain detailed metadata for a specific video, including duration, statistics, live status, and URLs.
Integration Ready: All video results include direct
https://www.youtube.com/watch?v=<id>links for seamless handoff to transcript-extraction and other MCPs.
Provides tools to list YouTube channel subscriptions, fetch recent uploads from the user's subscription feed, retrieve uploads for a specific channel, and get video details, returning watch URLs for use with other tools.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@youtube-personal-feedWhat are the latest uploads from my subscriptions?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
youtube-personal-feed
An MCP server that connects to your personal YouTube account and exposes your subscription feed to AI assistants: list your subscribed channels, list the most recent uploads across your feed, and get https://www.youtube.com/watch?v= links that can be handed off to other MCPs (for example transcript-extraction tools).
Requirements
Node.js 18+
A Google account and a Google Cloud project with the YouTube Data API v3 enabled
An MCP client (opencode, Claude Desktop, etc.)
Related MCP server: YouTube MCP Server
Google Cloud Console setup (one-time)
Go to https://console.cloud.google.com and create a project (or reuse one).
Enable the API: APIs & Services -> Library -> search "YouTube Data API v3" -> Enable.
OAuth consent screen: APIs & Services -> OAuth consent screen.
User type: External, then add your own Gmail address as a test user.
Add the scope
https://www.googleapis.com/auth/youtube.readonly.
Create a Desktop client: APIs & Services -> Credentials -> Create credentials -> OAuth client ID -> Application type Desktop app.
No redirect URI needs to be registered; loopback redirect is allowed for Desktop clients.
Copy the Client ID and Client secret into a
.envfile at the repo root:CLIENT_ID=xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxx(
cp .env.example .envfirst.)
Install and authenticate
Global installation
Install the published package on npm globally to run the CLI and MCP server from any directory:
npm install -g youtube-personal-feedCreate ~/.config/youtube-personal-mcp/.env with your Google Desktop OAuth credentials:
mkdir -p ~/.config/youtube-personal-mcp
cat > ~/.config/youtube-personal-mcp/.env <<'EOF'
CLIENT_ID=xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxx
EOF
chmod 600 ~/.config/youtube-personal-mcp/.envAuthenticate once, then run either executable from any directory:
youtube-personal-feed-auth
youtube-personal-feed subscriptions --limit 20
youtube-personal-feed-mcpThe OAuth token is stored at ~/.config/youtube-personal-mcp/token.json. You can instead provide CLIENT_ID and CLIENT_SECRET as environment variables.
Local development
npm install
npm run authnpm run auth prints a URL, opens your browser, and asks you to consent. Tokens are stored in ~/.config/youtube-personal-mcp/token.json (read-only to you) and are refreshed automatically at runtime.
Note: because this uses an unverified "Desktop app" client, Google shows a "Google hasn't verified this app" warning the first time. Click Advanced -> Go to (unsafe) to proceed.
Register with an MCP client
OpenCode: register
youtube-personal-feed-mcpas an stdio MCP command in your OpenCode configuration. For local development, usenpx tsx src/index.tswithcwdset to the repository.Claude Desktop: add to
claude_desktop_config.json:{ "mcpServers": { "youtube-personal-feed": { "command": "youtube-personal-feed-mcp" } } }Local development: use
npx tsx src/index.tswithcwdset to the repository.
Tools
Tool | Inputs | Output |
|
|
|
|
|
|
|
|
|
|
| video metadata, duration, available statistics, live status, video URL, and channel URL |
Feed items always include videoUrl in the form https://www.youtube.com/watch?v=<id> — the format accepted by most transcript-extraction MCP servers.
list_feed vs. list_channel_uploads
Use case | Tool | Behavior |
See recent videos from all subscriptions |
| Fetches recent uploads across your subscriptions and sorts the combined results by publication date. |
See recent videos from one channel in your feed |
| Limits the subscription feed to that channel. A channel ID outside your subscriptions also works. |
See recent videos from any known channel |
| Fetches that channel directly; it does not need to be one of your subscriptions. |
For example, first call list_subscriptions to obtain a subscribed channel's channelId, then pass it to list_feed:
{
"channelId": "UCJaGVXG4KgOUXUtcmAHAOdA",
"limit": 10
}Use list_channel_uploads with that same ID if the channel is not in your subscriptions, or if you specifically want a direct per-channel lookup.
CLI
The CLI uses the same OAuth credentials and token as the MCP server. Run youtube-personal-feed after global installation, or use npm run cli -- while developing:
youtube-personal-feed subscriptions --query running --limit 20
youtube-personal-feed feed --limit 10 --since-days 7 # all subscriptions
youtube-personal-feed feed --channel-id UCJaGVXG4KgOUXUtcmAHAOdA # one subscription
youtube-personal-feed uploads UCJaGVXG4KgOUXUtcmAHAOdA --limit 15 # any channel
youtube-personal-feed video 64wtzsSQx84For local development:
npm run cli -- subscriptions --query running --limit 20
npm run cli -- feed --limit 10 --since-days 7
npm run cli -- feed --channel-id UCJaGVXG4KgOUXUtcmAHAOdA --limit 10
npm run cli -- uploads UCJaGVXG4KgOUXUtcmAHAOdA --limit 15
npm run cli -- video 64wtzsSQx84Each command writes JSON to standard output. Run youtube-personal-feed --help (or npm run cli -- --help) for the command reference.
Quota
The YouTube Data API default quota is 10,000 units/day. Subscription and playlist list calls cost ~1 unit each. A full feed refresh over ~100 subscriptions therefore costs about 100 upload-playlist requests plus the subscription request.
The process caches list_subscriptions results for 30 minutes. Feed builds cache per-channel uploads for 10 minutes, while direct list_channel_uploads requests deliberately refresh that channel. Caches are in memory, so they reset whenever the CLI process or MCP server restarts. If you hit the quota, the tools return a clear error; wait until the next day or request more quota.
Development
npm run typecheck # type-check
npm run lint # lint and check formatting
npm run format # apply source formatting
npm run build # compile to dist/
npm run smoke # sanity check auth + subscriptions (prints real data)
npm pack --dry-run # inspect the files that would be publishednpm install installs a pre-commit hook. Commits run staged TypeScript files through Biome and then run npm run typecheck. Bypass this only when necessary with git commit --no-verify.
Publishing is automated by .github/workflows/publish.yml: publishing a GitHub release runs linting, type checking, and a build before publishing to npm. The release tag, without its optional v prefix, must match the version in package.json.
Project layout
src/config.ts # env loading, credential + token path helpers
src/auth.ts # one-time OAuth loopback flow (npm run auth)
src/youtube.ts # YouTube Data API v3 wrapper + caching
src/index.ts # MCP server (McpServer, stdio, 4 tools)
src/types.ts # shared types
scripts/smoke.ts
.github/workflows/publish.yml # release-triggered npm publish workflowMaintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with the YouTube Data API, allowing users to search videos, get video and channel details, analyze trends, and fetch video transcripts.
- AlicenseNot gradedqualityCmaintenanceStreamable HTTP MCP server for YouTube that enables video search, channel exploration, playlist browsing, and video detail retrieval via the YouTube Data API.206MIT
- AlicenseNot gradedqualityDmaintenanceMCP server connector for YouTube — search videos, manage playlists, subscriptions, and watch history via Playwright browser automation.6MIT
- AlicenseNot gradedqualityCmaintenanceSelf-hosted MCP server that lets AI assistants read your own YouTube channel's stats, recent uploads, and upload schedule via the YouTube Data API v3, using read-only OAuth.MIT
Related MCP Connectors
YouTube MCP — wraps the YouTube Data API v3 (BYO API key)
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/toniher/youtube-personal-feed'
If you have feedback or need assistance with the MCP directory API, please join our Discord server