{"_id":"@aitofy/youtube","_rev":"4-86374fe5745f42eaeed82c5c642d4d96","name":"@aitofy/youtube","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@aitofy/youtube","version":"0.1.0","keywords":["youtube","transcript","subtitles","captions","channel","videos","scraper","api","no-api-key","youtube-transcript","youtube-captions","youtube-subtitles","video-transcript","typescript","nodejs","mcp","claude","chatgpt","ai"],"author":{"name":"Aitofy"},"license":"MIT","_id":"@aitofy/youtube@0.1.0","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"homepage":"https://aitofy.dev","bugs":{"url":"https://github.com/aitofy-dev/youtube/issues"},"bin":{"youtube-mcp":"dist/mcp.js"},"dist":{"shasum":"d1d9d042dea1d18d7d63bf2c2a029523704fc8b5","tarball":"https://registry.npmjs.org/@aitofy/youtube/-/youtube-0.1.0.tgz","fileCount":12,"integrity":"sha512-iGRhGDaANt2ljaEeCJB6hQrfAlgSXBiJuAl61SA+INjoDAgaM+G8M7AgLBtIDWjoR6dbdi/hJk1hi1WSvRyaAA==","signatures":[{"sig":"MEUCIQC2gu14LwO3+ktxVLvf57JiwbF8LdyWp58XUXFCFNpdGQIgGW2QvVbXkpQ82LWssdklLr/+/efCOs/0/4Z91zDSiSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121874},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"9a51ae1b032284aa7c133431c8eefb4d78dceb64","scripts":{"dev":"tsup src/index.ts src/mcp.ts --watch","lint":"eslint src/","test":"npx tsx tests/test-typescript.ts","build":"tsup src/index.ts src/mcp.ts --format cjs,esm --dts --clean","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"repository":{"url":"git+https://github.com/aitofy-dev/youtube.git","type":"git"},"_npmVersion":"10.8.2","description":"Free YouTube utilities - get transcripts, channel videos, and more without API key","directories":{},"_nodeVersion":"20.19.0","dependencies":{"fast-xml-parser":"^4.3.0","@modelcontextprotocol/sdk":"^1.25.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.5.1","typescript":"^5.3.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/youtube_0.1.0_1767774799648_0.2479609428992562","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aitofy/youtube","version":"0.1.1","keywords":["youtube","transcript","subtitles","captions","channel","videos","scraper","api","no-api-key","youtube-transcript","youtube-captions","youtube-subtitles","video-transcript","typescript","nodejs","mcp","claude","chatgpt","ai"],"author":{"name":"Aitofy"},"license":"MIT","_id":"@aitofy/youtube@0.1.1","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"homepage":"https://aitofy.dev","bugs":{"url":"https://github.com/aitofy-dev/youtube/issues"},"bin":{"youtube-mcp":"dist/mcp.js"},"dist":{"shasum":"4ea128e0865f74cfce85906b485c37ed68dfe701","tarball":"https://registry.npmjs.org/@aitofy/youtube/-/youtube-0.1.1.tgz","fileCount":12,"integrity":"sha512-HidurcTi80BYR9AZ7n6YMGXYdJxIjYRQi447LJX2T2T9a6EU7W2cgyiSPRXUMT+ZbJSTiXLh7NNgMNFDxpkaEw==","signatures":[{"sig":"MEYCIQDUqBCwYwkNwEgse5G5Q7sJ1skWfmLDvEhbQMGP0Kh5SwIhAI/cLeldvddETMoRAXEQAl/lssqzz0FDnHlD6aCO8FBT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133218},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"6947ab9d73d04b555ab32876a1afd0c3da73db2e","scripts":{"dev":"tsup src/index.ts src/mcp.ts --watch","lint":"eslint src/","test":"npx tsx tests/test-typescript.ts","build":"tsup src/index.ts src/mcp.ts --format cjs,esm --dts --clean","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"repository":{"url":"git+https://github.com/aitofy-dev/youtube.git","type":"git"},"_npmVersion":"10.8.2","description":"Free YouTube utilities - get transcripts, channel videos, and more without API key","directories":{},"_nodeVersion":"20.19.0","dependencies":{"fast-xml-parser":"^4.3.0","@modelcontextprotocol/sdk":"^1.25.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.5.1","typescript":"^5.3.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/youtube_0.1.1_1767795783803_0.8868376540879652","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aitofy/youtube","version":"0.1.2","keywords":["youtube","transcript","subtitles","captions","channel","videos","api","no-api-key","free-youtube-api","youtube-api-alternative","youtube-without-api-key","youtube-transcript","youtube-captions","youtube-subtitles","video-transcript","channel-videos","video-search","youtube-scraper","ytdl-alternative","innertube","typescript","nodejs","esm","mcp","claude","chatgpt","ai-tools","model-context-protocol"],"author":{"name":"Aitofy"},"license":"MIT","_id":"@aitofy/youtube@0.1.2","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"homepage":"https://aitofy.dev","bugs":{"url":"https://github.com/aitofy-dev/youtube/issues"},"bin":{"youtube-mcp":"dist/mcp.js"},"dist":{"shasum":"0cb0210c3a00c69f4ea25657cbeaa2fcff850a30","tarball":"https://registry.npmjs.org/@aitofy/youtube/-/youtube-0.1.2.tgz","fileCount":13,"integrity":"sha512-2vcl7Ppe6PpgChUZFK8143wjN+7syksrDdPR2WaCkFGPInYjv++F0O4A/dxWUTaZbZgrxOk+4Qc7ySwNuxDdGg==","signatures":[{"sig":"MEUCIQCWmSSEuAbZQwxnKmbB/bBi0idh8GLb2N2Uw2sEPRhqXwIgOReT1+RWykGKXOC3EskhCY7So9VuY3MatHi87C4J2s8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135887},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"bdd97dd8eedeb2215fe4c19a5d854e971badaca0","scripts":{"dev":"tsup src/index.ts src/mcp.ts --watch","lint":"eslint src/","test":"npx tsx tests/test-typescript.ts","build":"tsup src/index.ts src/mcp.ts --format cjs,esm --dts --clean","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"repository":{"url":"git+https://github.com/aitofy-dev/youtube.git","type":"git"},"_npmVersion":"10.8.2","description":"Free YouTube utilities - get transcripts, channel videos, and more without API key","directories":{},"_nodeVersion":"20.19.0","dependencies":{"fast-xml-parser":"^4.3.0","@modelcontextprotocol/sdk":"^1.25.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","tsup":"^8.5.1","typescript":"^5.3.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/youtube_0.1.2_1767801997274_0.5044165860243246","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aitofy/youtube","version":"0.2.0","description":"Free YouTube utilities - get transcripts, channel videos, and more without API key","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"}},"bin":{"youtube-mcp":"dist/mcp.js"},"scripts":{"dev":"tsup src/index.ts src/mcp.ts --watch","build":"tsup src/index.ts src/mcp.ts --format cjs,esm --dts --clean","test":"npx tsx tests/test-typescript.ts","prepublishOnly":"npm run build","lint":"eslint src/","typecheck":"tsc --noEmit"},"keywords":["youtube","transcript","subtitles","captions","channel","videos","api","no-api-key","free-youtube-api","youtube-api-alternative","youtube-without-api-key","youtube-transcript","youtube-captions","youtube-subtitles","video-transcript","channel-videos","video-search","youtube-scraper","ytdl-alternative","innertube","typescript","nodejs","esm","mcp","claude","chatgpt","ai-tools","model-context-protocol"],"author":{"name":"Aitofy"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/aitofy-dev/youtube.git"},"homepage":"https://aitofy.dev","bugs":{"url":"https://github.com/aitofy-dev/youtube/issues"},"engines":{"node":">=18.0.0"},"dependencies":{"@modelcontextprotocol/sdk":"^1.25.1","fast-xml-parser":"^4.3.0"},"devDependencies":{"@types/node":"^20.0.0","tsup":"^8.5.1","tsx":"^4.0.0","typescript":"^5.3.0"},"_id":"@aitofy/youtube@0.2.0","gitHead":"fbe2b0a48425de41d3312f7b817866d1808933a1","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-VJ9qUhDlUTXFdF5UKsP5EDX75NU486HVE/n/NFkW9uXfQ7UfHvt2uQnShsCBQ/yw/AOyrEJaQuPLRQHKQFAKYQ==","shasum":"1b71767472ee363a48a43b459d57f30aa07ca29a","tarball":"https://registry.npmjs.org/@aitofy/youtube/-/youtube-0.2.0.tgz","fileCount":13,"unpackedSize":140954,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDNJfVtPuc3cPrepznMqRooAZO8SXds/IL78CtKyFa54QIgUTnANjpIoYayKZQLdS6qb6aG+5QGslcNgYcRz+ghijw="}]},"_npmUser":{"name":"masterpk","email":"huanthuyon671@gmail.com"},"directories":{},"maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/youtube_0.2.0_1768143563388_0.876785616584463"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-07T08:33:19.552Z","modified":"2026-01-11T14:59:23.778Z","0.1.0":"2026-01-07T08:33:19.803Z","0.1.1":"2026-01-07T14:23:03.952Z","0.1.2":"2026-01-07T16:06:37.419Z","0.2.0":"2026-01-11T14:59:23.523Z"},"bugs":{"url":"https://github.com/aitofy-dev/youtube/issues"},"author":{"name":"Aitofy"},"license":"MIT","homepage":"https://aitofy.dev","keywords":["youtube","transcript","subtitles","captions","channel","videos","api","no-api-key","free-youtube-api","youtube-api-alternative","youtube-without-api-key","youtube-transcript","youtube-captions","youtube-subtitles","video-transcript","channel-videos","video-search","youtube-scraper","ytdl-alternative","innertube","typescript","nodejs","esm","mcp","claude","chatgpt","ai-tools","model-context-protocol"],"repository":{"type":"git","url":"git+https://github.com/aitofy-dev/youtube.git"},"description":"Free YouTube utilities - get transcripts, channel videos, and more without API key","maintainers":[{"name":"masterpk","email":"huanthuyon671@gmail.com"}],"readme":"# @aitofy/youtube\n\n> 🎬 Free YouTube utilities for Node.js - Get transcripts, channel videos, video info without API key\n\n[![npm version](https://badge.fury.io/js/@aitofy%2Fyoutube.svg)](https://www.npmjs.com/package/@aitofy/youtube)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n---\n\n## ⚠️ Disclaimer\n\nThis package accesses YouTube's internal APIs for educational and personal use. It may violate YouTube's Terms of Service. **Use at your own risk.** The authors are not responsible for any misuse or consequences.\n\n---\n\n## ✨ Features\n\n- 📝 **Get Transcripts** - Fetch video captions/subtitles in multiple formats\n- 📺 **List Channel Videos** - Get all videos from any YouTube channel\n- 🔍 **Search Videos** - Search YouTube programmatically\n- ℹ️ **Video Info** - Get metadata, views, duration, thumbnails\n- 🤖 **MCP Integration** - Use with Claude, ChatGPT, and other AI assistants\n- 🚫 **No API Key Required** - Works out of the box\n- 📦 **Zero Config** - Just install and use\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install @aitofy/youtube\n```\n\n```bash\nyarn add @aitofy/youtube\n```\n\n```bash\npnpm add @aitofy/youtube\n```\n\n---\n\n## 🚀 Quick Start\n\n### Get Transcript\n\n```typescript\nimport { getTranscript, getTranscriptText } from '@aitofy/youtube';\n\n// ✨ NEW: Now accepts both video IDs and URLs!\n\n// Using video ID\nconst segments = await getTranscript('dQw4w9WgXcQ');\n\n// Using YouTube URLs (all formats supported)\nconst segments = await getTranscript('https://youtu.be/dQw4w9WgXcQ');\nconst segments = await getTranscript('https://www.youtube.com/watch?v=dQw4w9WgXcQ');\nconst segments = await getTranscript('https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=120s');\n\nconsole.log(segments);\n// [\n//   { start: 0.24, duration: 2.5, text: 'Never gonna give you up' },\n//   { start: 2.74, duration: 2.3, text: 'Never gonna let you down' },\n//   ...\n// ]\n\n// Get transcript as plain text\nconst text = await getTranscriptText('https://youtu.be/dQw4w9WgXcQ');\nconsole.log(text);\n// \"Never gonna give you up\\nNever gonna let you down\\n...\"\n```\n\n### Supported URL Formats\n\nAll video functions accept these URL formats:\n\n```typescript\n// ✅ Video ID\n'J6OnBDmErUg'\n\n// ✅ Short URLs\n'https://youtu.be/J6OnBDmErUg'\n'https://youtu.be/J6OnBDmErUg?si=xyz123'\n\n// ✅ Watch URLs\n'https://www.youtube.com/watch?v=J6OnBDmErUg'\n'https://www.youtube.com/watch?v=J6OnBDmErUg&t=120s'\n'https://www.youtube.com/watch?v=J6OnBDmErUg&list=PLxxx'\n\n// ✅ Embed URLs\n'https://www.youtube.com/embed/J6OnBDmErUg'\n\n// ✅ Shorts URLs\n'https://www.youtube.com/shorts/J6OnBDmErUg'\n\n// ✅ Other formats\n'https://www.youtube.com/v/J6OnBDmErUg'\n'https://www.youtube.com/live/J6OnBDmErUg'\n```\n\n### Get Channel Videos\n\n```typescript\nimport { getChannelVideos } from '@aitofy/youtube';\n\n// By channel ID\nconst videos = await getChannelVideos('UCsBjURrPoezykLs9EqgamOA');\n\n// By handle\nconst videos = await getChannelVideos('@Fireship');\n\n// With options\nconst videos = await getChannelVideos({\n  channel: '@Fireship',\n  limit: 50,\n  sortBy: 'popular', // 'newest' | 'oldest' | 'popular'\n});\n\nconsole.log(videos);\n// [\n//   { videoId: 'abc123', title: 'Video Title', viewCount: 12345, ... },\n//   ...\n// ]\n```\n\n### Search Videos\n\n```typescript\nimport { searchVideos } from '@aitofy/youtube';\n\nconst results = await searchVideos('nodejs tutorial');\n\n// With options\nconst results = await searchVideos({\n  query: 'react hooks',\n  limit: 20,\n  sortBy: 'viewCount', // 'relevance' | 'date' | 'viewCount' | 'rating'\n});\n```\n\n### Get Video Info\n\n```typescript\nimport { getVideoInfo } from '@aitofy/youtube';\n\nconst info = await getVideoInfo('dQw4w9WgXcQ');\nconsole.log(info);\n// {\n//   videoId: 'dQw4w9WgXcQ',\n//   title: 'Rick Astley - Never Gonna Give You Up',\n//   duration: '3:33',\n//   viewCount: 1500000000,\n//   channelTitle: 'Rick Astley',\n//   thumbnails: { ... },\n//   ...\n// }\n```\n\n---\n\n## 📖 API Reference\n\n### Transcript Functions\n\nAll transcript functions accept both **video IDs** and **YouTube URLs**.\n\n| Function | Description |\n|----------|-------------|\n| `getTranscript(videoIdOrUrl, options?)` | Get transcript segments |\n| `getTranscriptText(videoIdOrUrl, options?)` | Get transcript as plain text |\n| `getTranscriptSRT(videoIdOrUrl, options?)` | Get transcript as SRT subtitles |\n| `getTranscriptVTT(videoIdOrUrl, options?)` | Get transcript as WebVTT |\n| `listTranscripts(videoIdOrUrl)` | List available transcript languages |\n\n### Channel Functions\n\n| Function | Description |\n|----------|-------------|\n| `getChannelVideos(options)` | Get videos from a channel |\n| `getChannelInfo(channel)` | Get channel metadata |\n\n### Video Functions\n\nAll video functions accept both **video IDs** and **YouTube URLs**.\n\n| Function | Description |\n|----------|-------------|\n| `getVideoInfo(videoIdOrUrl)` | Get detailed video info |\n| `getBasicVideoInfo(videoIdOrUrl)` | Get basic video info (faster) |\n| `searchVideos(query, options?)` | Search YouTube videos |\n\n---\n\n## 🔧 Options\n\n### Transcript Options\n\n```typescript\ninterface FetchTranscriptOptions {\n  languages?: string[];      // Preferred languages, e.g. ['en', 'vi']\n  preferGenerated?: boolean; // Prefer auto-generated over manual\n}\n```\n\n### Channel Videos Options\n\n```typescript\ninterface GetChannelVideosOptions {\n  channel: string;                    // Channel ID, URL, or @handle\n  limit?: number;                     // Max videos (default: 15)\n  sortBy?: 'newest' | 'oldest' | 'popular';\n  contentType?: 'videos' | 'shorts' | 'streams';\n}\n```\n\n### Search Options\n\n```typescript\ninterface SearchOptions {\n  query: string;\n  limit?: number;\n  sortBy?: 'relevance' | 'date' | 'viewCount' | 'rating';\n}\n```\n\n---\n\n## 🎯 Use Cases\n\n- 📊 **Content Analysis** - Analyze video transcripts for SEO\n- 🤖 **AI/ML Training** - Collect transcripts for datasets\n- 📱 **App Development** - Build YouTube-related apps\n- 🔍 **Research** - Academic video content analysis\n- ♿ **Accessibility** - Generate subtitles for accessibility\n\n---\n\n## 🤖 MCP Integration (Claude, ChatGPT)\n\nUse YouTube tools directly in AI assistants via [Model Context Protocol](https://modelcontextprotocol.io/).\n\n### Setup for Claude Desktop\n\n1. Install the package globally:\n```bash\nnpm install -g @aitofy/youtube\n```\n\n2. Add to Claude's config (`~/Library/Application Support/Claude/claude_desktop_config.json`):\n```json\n{\n  \"mcpServers\": {\n    \"youtube\": {\n      \"command\": \"youtube-mcp\"\n    }\n  }\n}\n```\n\n3. Restart Claude Desktop\n\n### Available MCP Tools\n\n| Tool | Description |\n|------|-------------|\n| `get_youtube_transcript` | Get video transcript with timestamps |\n| `get_youtube_transcript_text` | Get transcript as plain text |\n| `list_youtube_transcripts` | List available languages |\n| `get_youtube_video_info` | Get video metadata |\n| `get_youtube_channel_videos` | List channel videos |\n| `get_youtube_channel_info` | Get channel info |\n| `search_youtube_videos` | Search YouTube |\n\n### Example Usage in Claude\n\n```\nYou: Get the transcript for YouTube video dQw4w9WgXcQ\n\nClaude: [Uses get_youtube_transcript tool]\n        Here's the transcript for \"Never Gonna Give You Up\"...\n```\n\n---\n\n## ⚡ Rate Limiting\n\nTo avoid being blocked by YouTube:\n\n```typescript\n// Add delays between requests\nconst sleep = (ms: number) => new Promise(r => setTimeout(r, ms));\n\nfor (const videoId of videoIds) {\n  const transcript = await getTranscript(videoId);\n  await sleep(1000); // Wait 1 second between requests\n}\n```\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please read our contributing guidelines.\n\n---\n\n## 📄 License\n\nMIT © [Aitofy](https://github.com/aitofy)\n\n---\n\n## 🙏 Credits\n\nInspired by:\n- [youtube-transcript-api](https://github.com/jdepoix/youtube-transcript-api) (Python)\n- [youtubei.js](https://github.com/LuanRT/YouTube.js)\n","readmeFilename":"README.md"}