Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

YouTube MCP

A safe, local-first Model Context Protocol server for inspecting and managing a creator-owned YouTube channel.

@fullstackcraftllc/youtube-mcp uses Google's official YouTube Data API v3 and YouTube Analytics API. It does not scrape YouTube, download videos, send telemetry, or provide a hosted intermediary.

Features

  • Inspect your channel and page through its uploads.
  • Read owned-video metadata and public statistics.
  • Analyze channel/video performance, traffic sources, YouTube search terms, and audience retention.
  • Preview exact title, description, tag, and category changes.
  • Apply only an unexpired reviewed preview after rechecking ownership and remote state.
  • Maintain separate readonly and manage OAuth authorizations in named local profiles.

Version 0.1 intentionally excludes uploads, deletes, thumbnails, visibility, comments, playlists, monetization, public-channel research, transcripts, and HTTP hosting.

Requirements

  • Node.js 22 or newer.
  • A creator-owned YouTube channel.
  • Your own Google Cloud project and Desktop OAuth client.

Follow Google Cloud setup before logging in. Never commit the downloaded OAuth client JSON.

Authorize a profile

Readonly analytics:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode readonly \
--client-secrets /absolute/path/to/client_secret.json

Metadata management uses a separate token and explicit extra permission:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth login \
--profile vannacharm \
--mode manage \
--client-secrets /absolute/path/to/client_secret.json

If Google exposes multiple channels, repeat the command with --channel-id <id> after the CLI prints the valid choices.

Check configuration without exposing credentials:

npx -y @fullstackcraftllc/youtube-mcp@0.1.0 auth status --profile vannacharm --mode readonly
npx -y @fullstackcraftllc/youtube-mcp@0.1.0 doctor --profile vannacharm --mode readonly

MCP client configuration

Codex, readonly:

codex mcp add youtube \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode readonly

Codex, manage mode as a separately named server:

codex mcp add youtube-manage \
-- npx -y @fullstackcraftllc/youtube-mcp@0.1.0 serve --profile vannacharm --mode manage

Claude Desktop:

{
"mcpServers": {
"youtube": {
"command": "npx",
"args": [
"-y",
"@fullstackcraftllc/youtube-mcp@0.1.0",
"serve",
"--profile",
"vannacharm",
"--mode",
"readonly"
]
}
}
}

The server starts even if authorization is missing so the client can call youtube_get_auth_status. Other tools return AUTH_REQUIRED until the selected profile and mode are authorized.

Safe metadata updates

There is no direct update tool. The workflow is:

  1. Call youtube_preview_video_update with one or more proposed fields.
  2. Review the complete before/after diff, video ID, channel ID, expiry, and hash.
  3. Call youtube_apply_video_update with the preview ID, hash, and exact video ID.

Apply re-fetches current metadata and fails if anything changed since preview. YouTube receives a complete writable snippet so omitted fields are preserved. A preview expires after ten minutes and is consumed after one apply attempt.

See the complete tool reference, privacy and deletion behavior, and threat model.

Other CLI commands

youtube-mcp profiles list
youtube-mcp auth revoke --profile vannacharm --mode readonly
youtube-mcp auth revoke --profile vannacharm --mode manage
youtube-mcp --help
youtube-mcp --version

Local development

git clone https://github.com/FullStackCraft/youtube-mcp.git
cd youtube-mcp
npm install
npm run release:check

Run locally from an MCP client with:

node /absolute/path/to/youtube-mcp/dist/index.js serve --profile vannacharm --mode readonly

Compliance and affiliation

Use of this software is subject to the YouTube Terms of Service, YouTube API Services Terms of Service, and Google Privacy Policy.

YouTube and Google are trademarks of Google LLC. This independent project is not affiliated with, sponsored by, or endorsed by YouTube or Google.

License

MIT © Full Stack Craft LLC.

About

Safe, local-first MCP server for creator-owned YouTube analytics and reviewed metadata updates.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages