youtube-knowledge-mcp 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/README.md +105 -34
  2. package/dist/brain-schemas.d.ts +10 -10
  3. package/dist/brain-schemas.d.ts.map +1 -1
  4. package/dist/brain-schemas.js +0 -4
  5. package/dist/brain-schemas.js.map +1 -1
  6. package/dist/http/app.d.ts +16 -0
  7. package/dist/http/app.d.ts.map +1 -0
  8. package/dist/http/app.js +176 -0
  9. package/dist/http/app.js.map +1 -0
  10. package/dist/http/auth.d.ts +38 -0
  11. package/dist/http/auth.d.ts.map +1 -0
  12. package/dist/http/auth.js +79 -0
  13. package/dist/http/auth.js.map +1 -0
  14. package/dist/http/config.d.ts +41 -0
  15. package/dist/http/config.d.ts.map +1 -0
  16. package/dist/http/config.js +65 -0
  17. package/dist/http/config.js.map +1 -0
  18. package/dist/http/rate-limiter.d.ts +24 -0
  19. package/dist/http/rate-limiter.d.ts.map +1 -0
  20. package/dist/http/rate-limiter.js +55 -0
  21. package/dist/http/rate-limiter.js.map +1 -0
  22. package/dist/http/sessions.d.ts +34 -0
  23. package/dist/http/sessions.d.ts.map +1 -0
  24. package/dist/http/sessions.js +62 -0
  25. package/dist/http/sessions.js.map +1 -0
  26. package/dist/http.d.ts +6 -48
  27. package/dist/http.d.ts.map +1 -1
  28. package/dist/http.js +35 -252
  29. package/dist/http.js.map +1 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +11 -517
  32. package/dist/index.js.map +1 -1
  33. package/dist/prompts-brain.d.ts +4 -0
  34. package/dist/prompts-brain.d.ts.map +1 -0
  35. package/dist/prompts-brain.js +48 -0
  36. package/dist/prompts-brain.js.map +1 -0
  37. package/dist/prompts-research.d.ts +4 -0
  38. package/dist/prompts-research.d.ts.map +1 -0
  39. package/dist/prompts-research.js +74 -0
  40. package/dist/prompts-research.js.map +1 -0
  41. package/dist/prompts-shared.d.ts +13 -0
  42. package/dist/prompts-shared.d.ts.map +1 -0
  43. package/dist/prompts-shared.js +7 -0
  44. package/dist/prompts-shared.js.map +1 -0
  45. package/dist/prompts.d.ts.map +1 -1
  46. package/dist/prompts.js +5 -100
  47. package/dist/prompts.js.map +1 -1
  48. package/dist/registry/brain-tools.d.ts +4 -0
  49. package/dist/registry/brain-tools.d.ts.map +1 -0
  50. package/dist/registry/brain-tools.js +104 -0
  51. package/dist/registry/brain-tools.js.map +1 -0
  52. package/dist/registry/channel-tools.d.ts +4 -0
  53. package/dist/registry/channel-tools.d.ts.map +1 -0
  54. package/dist/registry/channel-tools.js +53 -0
  55. package/dist/registry/channel-tools.js.map +1 -0
  56. package/dist/registry/health-tools.d.ts +4 -0
  57. package/dist/registry/health-tools.d.ts.map +1 -0
  58. package/dist/registry/health-tools.js +21 -0
  59. package/dist/registry/health-tools.js.map +1 -0
  60. package/dist/registry/index.d.ts +8 -0
  61. package/dist/registry/index.d.ts.map +1 -0
  62. package/dist/registry/index.js +27 -0
  63. package/dist/registry/index.js.map +1 -0
  64. package/dist/registry/library-tools.d.ts +4 -0
  65. package/dist/registry/library-tools.d.ts.map +1 -0
  66. package/dist/registry/library-tools.js +116 -0
  67. package/dist/registry/library-tools.js.map +1 -0
  68. package/dist/registry/media-tools.d.ts +4 -0
  69. package/dist/registry/media-tools.d.ts.map +1 -0
  70. package/dist/registry/media-tools.js +100 -0
  71. package/dist/registry/media-tools.js.map +1 -0
  72. package/dist/registry/thumbnail-tools.d.ts +7 -0
  73. package/dist/registry/thumbnail-tools.d.ts.map +1 -0
  74. package/dist/registry/thumbnail-tools.js +72 -0
  75. package/dist/registry/thumbnail-tools.js.map +1 -0
  76. package/dist/registry/transcript-tools.d.ts +4 -0
  77. package/dist/registry/transcript-tools.d.ts.map +1 -0
  78. package/dist/registry/transcript-tools.js +68 -0
  79. package/dist/registry/transcript-tools.js.map +1 -0
  80. package/dist/registry/types.d.ts +41 -0
  81. package/dist/registry/types.d.ts.map +1 -0
  82. package/dist/registry/types.js +17 -0
  83. package/dist/registry/types.js.map +1 -0
  84. package/dist/registry/video-tools.d.ts +4 -0
  85. package/dist/registry/video-tools.d.ts.map +1 -0
  86. package/dist/registry/video-tools.js +101 -0
  87. package/dist/registry/video-tools.js.map +1 -0
  88. package/dist/resources.d.ts.map +1 -1
  89. package/dist/resources.js +13 -10
  90. package/dist/resources.js.map +1 -1
  91. package/dist/schemas.d.ts +11 -2
  92. package/dist/schemas.d.ts.map +1 -1
  93. package/dist/schemas.js +5 -0
  94. package/dist/schemas.js.map +1 -1
  95. package/dist/thumbnail-resource.d.ts +8 -0
  96. package/dist/thumbnail-resource.d.ts.map +1 -0
  97. package/dist/thumbnail-resource.js +38 -0
  98. package/dist/thumbnail-resource.js.map +1 -0
  99. package/dist/thumbnail-schemas.d.ts +512 -0
  100. package/dist/thumbnail-schemas.d.ts.map +1 -0
  101. package/dist/thumbnail-schemas.js +95 -0
  102. package/dist/thumbnail-schemas.js.map +1 -0
  103. package/dist/tools/batch.js +1 -1
  104. package/dist/tools/batch.js.map +1 -1
  105. package/dist/tools/build-brain.js +1 -1
  106. package/dist/tools/build-brain.js.map +1 -1
  107. package/dist/tools/check-health.d.ts +2 -0
  108. package/dist/tools/check-health.d.ts.map +1 -1
  109. package/dist/tools/check-health.js +9 -0
  110. package/dist/tools/check-health.js.map +1 -1
  111. package/dist/tools/clips.d.ts +9 -41
  112. package/dist/tools/clips.d.ts.map +1 -1
  113. package/dist/tools/clips.js +52 -128
  114. package/dist/tools/clips.js.map +1 -1
  115. package/dist/tools/fetch-channel-thumbnails.d.ts +179 -0
  116. package/dist/tools/fetch-channel-thumbnails.d.ts.map +1 -0
  117. package/dist/tools/fetch-channel-thumbnails.js +123 -0
  118. package/dist/tools/fetch-channel-thumbnails.js.map +1 -0
  119. package/dist/tools/fetch-videos.d.ts +3 -0
  120. package/dist/tools/fetch-videos.d.ts.map +1 -1
  121. package/dist/tools/fetch-videos.js +3 -0
  122. package/dist/tools/fetch-videos.js.map +1 -1
  123. package/dist/tools/frames-subtitles.d.ts +44 -0
  124. package/dist/tools/frames-subtitles.d.ts.map +1 -0
  125. package/dist/tools/frames-subtitles.js +104 -0
  126. package/dist/tools/frames-subtitles.js.map +1 -0
  127. package/dist/tools/get-channel-info.d.ts +2 -0
  128. package/dist/tools/get-channel-info.d.ts.map +1 -1
  129. package/dist/tools/get-channel-info.js +8 -1
  130. package/dist/tools/get-channel-info.js.map +1 -1
  131. package/dist/tools/get-playlist-info.d.ts.map +1 -1
  132. package/dist/tools/get-playlist-info.js +1 -0
  133. package/dist/tools/get-playlist-info.js.map +1 -1
  134. package/dist/tools/get-thumbnail.d.ts +38 -0
  135. package/dist/tools/get-thumbnail.d.ts.map +1 -0
  136. package/dist/tools/get-thumbnail.js +152 -0
  137. package/dist/tools/get-thumbnail.js.map +1 -0
  138. package/dist/tools/get-transcript.d.ts.map +1 -1
  139. package/dist/tools/get-transcript.js +2 -14
  140. package/dist/tools/get-transcript.js.map +1 -1
  141. package/dist/tools/library.d.ts.map +1 -1
  142. package/dist/tools/library.js +13 -3
  143. package/dist/tools/library.js.map +1 -1
  144. package/dist/tools/list-channel-thumbnails.d.ts +235 -0
  145. package/dist/tools/list-channel-thumbnails.d.ts.map +1 -0
  146. package/dist/tools/list-channel-thumbnails.js +79 -0
  147. package/dist/tools/list-channel-thumbnails.js.map +1 -0
  148. package/dist/tools/save-to-library.d.ts.map +1 -1
  149. package/dist/tools/save-to-library.js +5 -1
  150. package/dist/tools/save-to-library.js.map +1 -1
  151. package/dist/tools/search-channels.d.ts +6 -0
  152. package/dist/tools/search-channels.d.ts.map +1 -1
  153. package/dist/tools/search-transcript.d.ts.map +1 -1
  154. package/dist/tools/search-transcript.js +6 -13
  155. package/dist/tools/search-transcript.js.map +1 -1
  156. package/dist/tools/search-videos.d.ts +3 -0
  157. package/dist/tools/search-videos.d.ts.map +1 -1
  158. package/dist/utils/batches.d.ts +15 -0
  159. package/dist/utils/batches.d.ts.map +1 -0
  160. package/dist/utils/batches.js +31 -0
  161. package/dist/utils/batches.js.map +1 -0
  162. package/dist/utils/brain-build.d.ts.map +1 -1
  163. package/dist/utils/brain-build.js +1 -12
  164. package/dist/utils/brain-build.js.map +1 -1
  165. package/dist/utils/brain-index.d.ts.map +1 -1
  166. package/dist/utils/brain-index.js +3 -2
  167. package/dist/utils/brain-index.js.map +1 -1
  168. package/dist/utils/brain-lock.d.ts +2 -18
  169. package/dist/utils/brain-lock.d.ts.map +1 -1
  170. package/dist/utils/brain-lock.js +4 -80
  171. package/dist/utils/brain-lock.js.map +1 -1
  172. package/dist/utils/brain-lookup.d.ts +8 -0
  173. package/dist/utils/brain-lookup.d.ts.map +1 -1
  174. package/dist/utils/brain-lookup.js +5 -31
  175. package/dist/utils/brain-lookup.js.map +1 -1
  176. package/dist/utils/brain-storage.d.ts.map +1 -1
  177. package/dist/utils/brain-storage.js +5 -5
  178. package/dist/utils/brain-storage.js.map +1 -1
  179. package/dist/utils/caption-probe.d.ts +7 -0
  180. package/dist/utils/caption-probe.d.ts.map +1 -0
  181. package/dist/utils/caption-probe.js +36 -0
  182. package/dist/utils/caption-probe.js.map +1 -0
  183. package/dist/utils/channel-images.d.ts +16 -0
  184. package/dist/utils/channel-images.d.ts.map +1 -0
  185. package/dist/utils/channel-images.js +35 -0
  186. package/dist/utils/channel-images.js.map +1 -0
  187. package/dist/utils/channel-lookup.d.ts +5 -0
  188. package/dist/utils/channel-lookup.d.ts.map +1 -0
  189. package/dist/utils/channel-lookup.js +37 -0
  190. package/dist/utils/channel-lookup.js.map +1 -0
  191. package/dist/utils/chapters.d.ts +11 -0
  192. package/dist/utils/chapters.d.ts.map +1 -0
  193. package/dist/utils/chapters.js +24 -0
  194. package/dist/utils/chapters.js.map +1 -0
  195. package/dist/utils/clips.d.ts.map +1 -1
  196. package/dist/utils/clips.js +18 -26
  197. package/dist/utils/clips.js.map +1 -1
  198. package/dist/utils/env.d.ts +26 -0
  199. package/dist/utils/env.d.ts.map +1 -0
  200. package/dist/utils/env.js +72 -0
  201. package/dist/utils/env.js.map +1 -0
  202. package/dist/utils/errors.d.ts +1 -1
  203. package/dist/utils/errors.d.ts.map +1 -1
  204. package/dist/utils/errors.js +20 -2
  205. package/dist/utils/errors.js.map +1 -1
  206. package/dist/utils/file-lock.d.ts +34 -0
  207. package/dist/utils/file-lock.d.ts.map +1 -0
  208. package/dist/utils/file-lock.js +91 -0
  209. package/dist/utils/file-lock.js.map +1 -0
  210. package/dist/utils/flat-listing.d.ts +89 -0
  211. package/dist/utils/flat-listing.d.ts.map +1 -0
  212. package/dist/utils/flat-listing.js +68 -0
  213. package/dist/utils/flat-listing.js.map +1 -0
  214. package/dist/utils/format.d.ts +1 -3
  215. package/dist/utils/format.d.ts.map +1 -1
  216. package/dist/utils/format.js +1 -5
  217. package/dist/utils/format.js.map +1 -1
  218. package/dist/utils/guard.d.ts +21 -0
  219. package/dist/utils/guard.d.ts.map +1 -0
  220. package/dist/utils/guard.js +105 -0
  221. package/dist/utils/guard.js.map +1 -0
  222. package/dist/utils/image-dimensions.d.ts +19 -0
  223. package/dist/utils/image-dimensions.d.ts.map +1 -0
  224. package/dist/utils/image-dimensions.js +93 -0
  225. package/dist/utils/image-dimensions.js.map +1 -0
  226. package/dist/utils/image-fetch.d.ts +31 -0
  227. package/dist/utils/image-fetch.d.ts.map +1 -0
  228. package/dist/utils/image-fetch.js +141 -0
  229. package/dist/utils/image-fetch.js.map +1 -0
  230. package/dist/utils/json-file.d.ts +14 -5
  231. package/dist/utils/json-file.d.ts.map +1 -1
  232. package/dist/utils/json-file.js +24 -9
  233. package/dist/utils/json-file.js.map +1 -1
  234. package/dist/utils/paths.d.ts +10 -0
  235. package/dist/utils/paths.d.ts.map +1 -1
  236. package/dist/utils/paths.js +14 -0
  237. package/dist/utils/paths.js.map +1 -1
  238. package/dist/utils/pattern.d.ts +30 -0
  239. package/dist/utils/pattern.d.ts.map +1 -0
  240. package/dist/utils/pattern.js +130 -0
  241. package/dist/utils/pattern.js.map +1 -0
  242. package/dist/utils/search-index.d.ts.map +1 -1
  243. package/dist/utils/search-index.js +9 -4
  244. package/dist/utils/search-index.js.map +1 -1
  245. package/dist/utils/storage.d.ts.map +1 -1
  246. package/dist/utils/storage.js +14 -8
  247. package/dist/utils/storage.js.map +1 -1
  248. package/dist/utils/subtitles.d.ts +7 -0
  249. package/dist/utils/subtitles.d.ts.map +1 -0
  250. package/dist/utils/subtitles.js +30 -0
  251. package/dist/utils/subtitles.js.map +1 -0
  252. package/dist/utils/thumbnail-entry.d.ts +19 -0
  253. package/dist/utils/thumbnail-entry.d.ts.map +1 -0
  254. package/dist/utils/thumbnail-entry.js +119 -0
  255. package/dist/utils/thumbnail-entry.js.map +1 -0
  256. package/dist/utils/thumbnail-fetch.d.ts +37 -0
  257. package/dist/utils/thumbnail-fetch.d.ts.map +1 -0
  258. package/dist/utils/thumbnail-fetch.js +89 -0
  259. package/dist/utils/thumbnail-fetch.js.map +1 -0
  260. package/dist/utils/thumbnail-ladder.d.ts +44 -0
  261. package/dist/utils/thumbnail-ladder.d.ts.map +1 -0
  262. package/dist/utils/thumbnail-ladder.js +68 -0
  263. package/dist/utils/thumbnail-ladder.js.map +1 -0
  264. package/dist/utils/thumbnail-listing.d.ts +16 -0
  265. package/dist/utils/thumbnail-listing.d.ts.map +1 -0
  266. package/dist/utils/thumbnail-listing.js +26 -0
  267. package/dist/utils/thumbnail-listing.js.map +1 -0
  268. package/dist/utils/thumbnail-paths.d.ts +20 -0
  269. package/dist/utils/thumbnail-paths.d.ts.map +1 -0
  270. package/dist/utils/thumbnail-paths.js +35 -0
  271. package/dist/utils/thumbnail-paths.js.map +1 -0
  272. package/dist/utils/thumbnail-store.d.ts +19 -0
  273. package/dist/utils/thumbnail-store.d.ts.map +1 -0
  274. package/dist/utils/thumbnail-store.js +125 -0
  275. package/dist/utils/thumbnail-store.js.map +1 -0
  276. package/dist/utils/transcript-cache.d.ts +20 -0
  277. package/dist/utils/transcript-cache.d.ts.map +1 -0
  278. package/dist/utils/transcript-cache.js +127 -0
  279. package/dist/utils/transcript-cache.js.map +1 -0
  280. package/dist/utils/transcript-search.d.ts +20 -0
  281. package/dist/utils/transcript-search.d.ts.map +1 -0
  282. package/dist/utils/transcript-search.js +35 -0
  283. package/dist/utils/transcript-search.js.map +1 -0
  284. package/dist/utils/transcript.d.ts +10 -31
  285. package/dist/utils/transcript.d.ts.map +1 -1
  286. package/dist/utils/transcript.js +2 -64
  287. package/dist/utils/transcript.js.map +1 -1
  288. package/dist/utils/validate-youtube.d.ts +35 -0
  289. package/dist/utils/validate-youtube.d.ts.map +1 -0
  290. package/dist/utils/validate-youtube.js +87 -0
  291. package/dist/utils/validate-youtube.js.map +1 -0
  292. package/dist/utils/validate.d.ts +11 -4
  293. package/dist/utils/validate.d.ts.map +1 -1
  294. package/dist/utils/validate.js +43 -36
  295. package/dist/utils/validate.js.map +1 -1
  296. package/dist/utils/version.d.ts +2 -0
  297. package/dist/utils/version.d.ts.map +1 -0
  298. package/dist/utils/version.js +19 -0
  299. package/dist/utils/version.js.map +1 -0
  300. package/dist/utils/youtube-channel.d.ts +44 -0
  301. package/dist/utils/youtube-channel.d.ts.map +1 -0
  302. package/dist/utils/youtube-channel.js +61 -0
  303. package/dist/utils/youtube-channel.js.map +1 -0
  304. package/dist/utils/youtube-download.d.ts +27 -0
  305. package/dist/utils/youtube-download.d.ts.map +1 -0
  306. package/dist/utils/youtube-download.js +118 -0
  307. package/dist/utils/youtube-download.js.map +1 -0
  308. package/dist/utils/youtube-schemas.d.ts +394 -0
  309. package/dist/utils/youtube-schemas.d.ts.map +1 -0
  310. package/dist/utils/youtube-schemas.js +118 -0
  311. package/dist/utils/youtube-schemas.js.map +1 -0
  312. package/dist/utils/youtube-search.d.ts +14 -0
  313. package/dist/utils/youtube-search.d.ts.map +1 -0
  314. package/dist/utils/youtube-search.js +39 -0
  315. package/dist/utils/youtube-search.js.map +1 -0
  316. package/dist/utils/youtube-url.d.ts +25 -0
  317. package/dist/utils/youtube-url.d.ts.map +1 -0
  318. package/dist/utils/youtube-url.js +75 -0
  319. package/dist/utils/youtube-url.js.map +1 -0
  320. package/dist/utils/youtube-video.d.ts +47 -0
  321. package/dist/utils/youtube-video.d.ts.map +1 -0
  322. package/dist/utils/youtube-video.js +98 -0
  323. package/dist/utils/youtube-video.js.map +1 -0
  324. package/dist/utils/youtube.d.ts +10 -122
  325. package/dist/utils/youtube.d.ts.map +1 -1
  326. package/dist/utils/youtube.js +11 -486
  327. package/dist/utils/youtube.js.map +1 -1
  328. package/dist/utils/ytdlp-env.d.ts +33 -0
  329. package/dist/utils/ytdlp-env.d.ts.map +1 -0
  330. package/dist/utils/ytdlp-env.js +121 -0
  331. package/dist/utils/ytdlp-env.js.map +1 -0
  332. package/dist/utils/ytdlp-limiter.d.ts +24 -0
  333. package/dist/utils/ytdlp-limiter.d.ts.map +1 -0
  334. package/dist/utils/ytdlp-limiter.js +69 -0
  335. package/dist/utils/ytdlp-limiter.js.map +1 -0
  336. package/dist/utils/ytdlp-parse.d.ts +13 -0
  337. package/dist/utils/ytdlp-parse.d.ts.map +1 -0
  338. package/dist/utils/ytdlp-parse.js +48 -0
  339. package/dist/utils/ytdlp-parse.js.map +1 -0
  340. package/dist/utils/ytdlp.d.ts +13 -18
  341. package/dist/utils/ytdlp.d.ts.map +1 -1
  342. package/dist/utils/ytdlp.js +21 -110
  343. package/dist/utils/ytdlp.js.map +1 -1
  344. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -1,43 +1,12 @@
1
- import { readFileSync } from 'fs';
2
- import { dirname, join } from 'path';
3
- import { z } from 'zod';
4
- import { fileURLToPath } from 'url';
5
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
- import { fetchVideosSchema, fetchVideosOutputSchema, fetchVideosHandler, } from './tools/fetch-videos.js';
8
- import { getVideoInfoSchema, getVideoInfoOutputSchema, getVideoInfoHandler, } from './tools/get-video-info.js';
9
- import { getTranscriptSchema, getTranscriptOutputSchema, getTranscriptHandler, } from './tools/get-transcript.js';
10
- import { searchVideosSchema, searchVideosOutputSchema, searchVideosHandler, } from './tools/search-videos.js';
11
- import { getChaptersSchema, getChaptersOutputSchema, getChaptersHandler, } from './tools/get-chapters.js';
12
- import { getCommentsSchema, getCommentsOutputSchema, getCommentsHandler, } from './tools/get-comments.js';
13
- import { getChannelInfoSchema, getChannelInfoOutputSchema, getChannelInfoHandler, } from './tools/get-channel-info.js';
14
- import { searchChannelsSchema, searchChannelsOutputSchema, searchChannelsHandler, } from './tools/search-channels.js';
15
- import { getPlaylistInfoSchema, getPlaylistInfoOutputSchema, getPlaylistInfoHandler, } from './tools/get-playlist-info.js';
16
- import { saveToLibrarySchema, saveToLibraryOutputSchema, saveToLibraryHandler, } from './tools/save-to-library.js';
17
- import { listLibrarySchema, listLibraryOutputSchema, listLibraryHandler, } from './tools/list-library.js';
18
- import { listFormatsSchema, listFormatsOutputSchema, listFormatsHandler, downloadVideoSchema, downloadVideoOutputSchema, downloadVideoHandler, } from './tools/download-video.js';
19
- import { checkHealthSchema, checkHealthOutputSchema, checkHealthHandler, } from './tools/check-health.js';
20
- import { searchTranscriptSchema, searchTranscriptOutputSchema, searchTranscriptHandler, } from './tools/search-transcript.js';
21
- import { getTranscriptsSchema, getTranscriptsOutputSchema, getTranscriptsHandler, digestPlaylistSchema, digestPlaylistOutputSchema, digestPlaylistHandler, } from './tools/batch.js';
22
- import { extractClipSchema, extractClipOutputSchema, extractClipHandler, extractAudioClipSchema, extractAudioClipOutputSchema, extractAudioClipHandler, extractClipsSchema, extractClipsOutputSchema, extractClipsHandler, extractFrameSchema, extractFrameOutputSchema, extractFrameHandler, exportSubtitlesSchema, exportSubtitlesOutputSchema, exportSubtitlesHandler, } from './tools/clips.js';
23
- import { getLibraryItemSchema, getLibraryItemOutputSchema, getLibraryItemHandler, searchLibrarySchema, searchLibraryOutputSchema, searchLibraryHandler, deleteLibraryItemSchema, deleteLibraryItemOutputSchema, deleteLibraryItemHandler, updateLibraryTagsSchema, updateLibraryTagsOutputSchema, updateLibraryTagsHandler, rebuildLibraryIndexSchema, rebuildLibraryIndexOutputSchema, rebuildLibraryIndexHandler, } from './tools/library.js';
24
- import { buildBrainHandler, buildBrainOutputSchema, buildBrainSchema, } from './tools/build-brain.js';
25
- import { askBrainHandler, askBrainOutputSchema, askBrainSchema } from './tools/ask-brain.js';
26
- import { getBrainInfoHandler, getBrainInfoOutputSchema, getBrainInfoSchema, listBrainsHandler, listBrainsOutputSchema, listBrainsSchema, } from './tools/brain-info.js';
27
- import { deleteBrainHandler, deleteBrainOutputSchema, deleteBrainSchema, saveBrainProfileHandler, saveBrainProfileOutputSchema, saveBrainProfileSchema, } from './tools/manage-brain.js';
28
- import { runWithRequestContext } from './utils/context.js';
29
- import { toToolError } from './utils/errors.js';
30
3
  import { formatPreflightReport, runPreflight } from './utils/preflight.js';
31
4
  import { startHttp } from './http.js';
5
+ import { serverVersion } from './utils/version.js';
6
+ import { describeYtDlpEnv, readYtDlpEnv } from './utils/ytdlp-env.js';
32
7
  import { registerPrompts } from './prompts.js';
8
+ import { registerTools } from './registry/index.js';
33
9
  import { registerResources } from './resources.js';
34
- const __dirname = dirname(fileURLToPath(import.meta.url));
35
- // The version is advertised in the MCP initialize response, so a package.json
36
- // that has lost it should fail loudly at startup rather than telling every
37
- // client the server is version `undefined`.
38
- const pkg = z
39
- .object({ version: z.string() })
40
- .parse(JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')));
41
10
  const SERVER_INSTRUCTIONS = `YouTube Knowledge MCP provides tools to search, analyze, and extract knowledge from YouTube videos.
42
11
 
43
12
  Recommended workflows:
@@ -45,76 +14,10 @@ Recommended workflows:
45
14
  - Use get_chapters to understand video structure before reading the full transcript
46
15
  - Use get_comments for audience sentiment and discussion highlights
47
16
  - Use get_channel_info to contextualize a creator's content
17
+ - Use get_thumbnail to look at a video's thumbnail or a channel's avatar
48
18
  - Combine transcript + chapters for structured, timestamped summaries
49
19
 
50
20
  All tools accept YouTube video IDs (e.g., dQw4w9WgXcQ) or full URLs.`;
51
- /**
52
- * Wrap a tool handler so that every call gets a request context and no call can
53
- * throw out of the server.
54
- *
55
- * Two things happen here, once, instead of thirteen times in thirteen files:
56
- * the MCP request's AbortSignal is published to the request context so an
57
- * in-flight yt-dlp is killed when the client cancels, and anything thrown is
58
- * rendered as an `isError` result carrying an actionable message rather than a
59
- * raw stack trace or yt-dlp command line.
60
- */
61
- /**
62
- * The parts of the SDK's `RequestHandlerExtra` this server uses.
63
- *
64
- * `sendNotification` is described with `z.custom` because a function is not
65
- * something Zod can take apart structurally — the predicate is a real runtime
66
- * check, and it is what lets the property be called without asserting a type
67
- * over it.
68
- */
69
- const requestExtraSchema = z.object({
70
- signal: z.instanceof(AbortSignal).optional(),
71
- sendNotification: z
72
- .custom((value) => typeof value === 'function')
73
- .optional(),
74
- _meta: z.object({ progressToken: z.union([z.string(), z.number()]).optional() }).optional(),
75
- });
76
- function guarded(handler) {
77
- return async (...args) => {
78
- // Handlers declare only their own parameters; the SDK appends
79
- // RequestHandlerExtra to every call, so it is whatever arrived last.
80
- const parsed = requestExtraSchema.safeParse(args[args.length - 1]);
81
- const context = parsed.success ? parsed.data : undefined;
82
- const signal = context?.signal;
83
- return runWithRequestContext({
84
- signal,
85
- // Progress is only meaningful when the client asked for it by sending a
86
- // token; without one the notification would be dropped anyway.
87
- reportProgress: context?.sendNotification && context._meta?.progressToken !== undefined
88
- ? (progress, total, message) => {
89
- void context.sendNotification?.({
90
- method: 'notifications/progress',
91
- params: {
92
- progressToken: context._meta?.progressToken,
93
- progress,
94
- ...(total === undefined ? {} : { total }),
95
- ...(message === undefined ? {} : { message }),
96
- },
97
- });
98
- }
99
- : undefined,
100
- log: context?.sendNotification
101
- ? (level, message) => {
102
- void context.sendNotification?.({
103
- method: 'notifications/message',
104
- params: { level, logger: 'youtube-knowledge-mcp', data: message },
105
- });
106
- }
107
- : undefined,
108
- }, async () => {
109
- try {
110
- return await handler(...args);
111
- }
112
- catch (error) {
113
- return toToolError(error);
114
- }
115
- });
116
- };
117
- }
118
21
  /**
119
22
  * Build a fully configured server.
120
23
  *
@@ -122,422 +25,8 @@ function guarded(handler) {
122
25
  * MCP client, rather than only testing handlers in isolation.
123
26
  */
124
27
  export function createServer(mode = 'stdio') {
125
- const server = new McpServer({ name: 'youtube-knowledge-mcp', version: pkg.version }, { instructions: SERVER_INSTRUCTIONS, capabilities: { logging: {} } });
126
- // -- Remote-safe tools (registered in all modes) --
127
- server.registerTool('search_videos', {
128
- title: 'Search YouTube Videos',
129
- description: 'Search YouTube for videos by keyword or phrase. Returns video IDs, titles, durations, channels, view counts, and URLs. Results sorted by relevance.',
130
- inputSchema: searchVideosSchema,
131
- outputSchema: searchVideosOutputSchema,
132
- annotations: {
133
- readOnlyHint: true,
134
- destructiveHint: false,
135
- idempotentHint: true,
136
- openWorldHint: true,
137
- },
138
- }, guarded(searchVideosHandler));
139
- server.registerTool('fetch_videos', {
140
- title: 'Fetch YouTube Videos',
141
- description: 'List videos from a YouTube playlist or channel. Returns video IDs, titles, durations, upload dates, and URLs. Sorted by playlist or channel order.',
142
- inputSchema: fetchVideosSchema,
143
- outputSchema: fetchVideosOutputSchema,
144
- annotations: {
145
- readOnlyHint: true,
146
- destructiveHint: false,
147
- idempotentHint: true,
148
- openWorldHint: true,
149
- },
150
- }, guarded(fetchVideosHandler));
151
- server.registerTool('get_video_info', {
152
- title: 'Get YouTube Video Info',
153
- description: 'Get detailed metadata for a single YouTube video. Returns title, channel, duration, upload date, view count, like count, comment count, description, tags, and thumbnail URL.',
154
- inputSchema: getVideoInfoSchema,
155
- outputSchema: getVideoInfoOutputSchema,
156
- annotations: {
157
- readOnlyHint: true,
158
- destructiveHint: false,
159
- idempotentHint: true,
160
- openWorldHint: true,
161
- },
162
- }, guarded(getVideoInfoHandler));
163
- server.registerTool('get_transcript', {
164
- title: 'Get YouTube Video Transcript',
165
- description: 'Extract the full transcript from a YouTube video. Supports auto-generated and manual captions. Returns plain text with word count and detected language. Results are cached locally.',
166
- inputSchema: getTranscriptSchema,
167
- outputSchema: getTranscriptOutputSchema,
168
- annotations: {
169
- readOnlyHint: true,
170
- destructiveHint: false,
171
- idempotentHint: true,
172
- openWorldHint: true,
173
- },
174
- }, guarded(getTranscriptHandler));
175
- server.registerTool('get_chapters', {
176
- title: 'Get YouTube Video Chapters',
177
- description: 'Extract chapter markers and timestamps from a YouTube video. Returns chapter titles with start and end times. Not all videos have chapters. Returns empty list if none found.',
178
- inputSchema: getChaptersSchema,
179
- outputSchema: getChaptersOutputSchema,
180
- annotations: {
181
- readOnlyHint: true,
182
- destructiveHint: false,
183
- idempotentHint: true,
184
- openWorldHint: true,
185
- },
186
- }, guarded(getChaptersHandler));
187
- server.registerTool('get_comments', {
188
- title: 'Get YouTube Video Comments',
189
- description: 'Get top comments from a YouTube video sorted by popularity. Returns author, text, like count, and pinned status. Only top-level comments, no replies.',
190
- inputSchema: getCommentsSchema,
191
- outputSchema: getCommentsOutputSchema,
192
- annotations: {
193
- readOnlyHint: true,
194
- destructiveHint: false,
195
- idempotentHint: true,
196
- openWorldHint: true,
197
- },
198
- }, guarded(getCommentsHandler));
199
- server.registerTool('get_channel_info', {
200
- title: 'Get YouTube Channel Info',
201
- description: 'Get metadata for a YouTube channel. Returns channel name, handle, subscriber count, description, and channel URL.',
202
- inputSchema: getChannelInfoSchema,
203
- outputSchema: getChannelInfoOutputSchema,
204
- annotations: {
205
- readOnlyHint: true,
206
- destructiveHint: false,
207
- idempotentHint: true,
208
- openWorldHint: true,
209
- },
210
- }, guarded(getChannelInfoHandler));
211
- server.registerTool('search_channels', {
212
- title: 'Search YouTube Channels',
213
- description: 'Search YouTube for channels by keyword or phrase. Returns channel names, handles, subscriber counts, descriptions, and URLs.',
214
- inputSchema: searchChannelsSchema,
215
- outputSchema: searchChannelsOutputSchema,
216
- annotations: {
217
- readOnlyHint: true,
218
- destructiveHint: false,
219
- idempotentHint: true,
220
- openWorldHint: true,
221
- },
222
- }, guarded(searchChannelsHandler));
223
- server.registerTool('get_playlist_info', {
224
- title: 'Get YouTube Playlist Info',
225
- description: 'Get metadata for a YouTube playlist. Returns title, channel, video count, last updated date, and description.',
226
- inputSchema: getPlaylistInfoSchema,
227
- outputSchema: getPlaylistInfoOutputSchema,
228
- annotations: {
229
- readOnlyHint: true,
230
- destructiveHint: false,
231
- idempotentHint: true,
232
- openWorldHint: true,
233
- },
234
- }, guarded(getPlaylistInfoHandler));
235
- server.registerTool('list_formats', {
236
- title: 'List YouTube Video Formats',
237
- description: 'List all available download formats for a YouTube video. Returns format IDs, extensions, resolutions, FPS, codecs, and file sizes. Grouped by video+audio, video-only, and audio-only.',
238
- inputSchema: listFormatsSchema,
239
- outputSchema: listFormatsOutputSchema,
240
- annotations: {
241
- readOnlyHint: true,
242
- destructiveHint: false,
243
- idempotentHint: true,
244
- openWorldHint: true,
245
- },
246
- }, guarded(listFormatsHandler));
247
- server.registerTool('search_transcript', {
248
- title: 'Search Inside a Transcript',
249
- description: 'Find a phrase or pattern inside a video transcript and return each match with its timestamp and a link that opens the video at that moment. Use this instead of reading a whole transcript when you need to locate or cite a specific moment.',
250
- inputSchema: searchTranscriptSchema,
251
- outputSchema: searchTranscriptOutputSchema,
252
- annotations: {
253
- readOnlyHint: true,
254
- destructiveHint: false,
255
- idempotentHint: true,
256
- openWorldHint: true,
257
- },
258
- }, guarded(searchTranscriptHandler));
259
- server.registerTool('get_transcripts', {
260
- title: 'Get Transcripts for Several Videos',
261
- description: 'Fetch transcripts for up to 25 videos in one call, each capped so the batch cannot flood the context. Videos that have no captions are reported individually rather than failing the whole call.',
262
- inputSchema: getTranscriptsSchema,
263
- outputSchema: getTranscriptsOutputSchema,
264
- annotations: {
265
- readOnlyHint: true,
266
- destructiveHint: false,
267
- idempotentHint: true,
268
- openWorldHint: true,
269
- },
270
- }, guarded(getTranscriptsHandler));
271
- server.registerTool('digest_playlist', {
272
- title: 'Digest a Playlist or Channel',
273
- description: 'Summarize a playlist or channel in one call: per-video metadata, chapter markers, and optionally transcript word counts. Use this to survey a body of content before deciding what to read in full.',
274
- inputSchema: digestPlaylistSchema,
275
- outputSchema: digestPlaylistOutputSchema,
276
- annotations: {
277
- readOnlyHint: true,
278
- destructiveHint: false,
279
- idempotentHint: true,
280
- openWorldHint: true,
281
- },
282
- }, guarded(digestPlaylistHandler));
283
- server.registerTool('check_health', {
284
- title: 'Check Server Health',
285
- description: 'Report whether yt-dlp and ffmpeg are installed, their versions, and whether yt-dlp is stale. Call this first when tools start failing unexpectedly — an outdated yt-dlp is the most common cause.',
286
- inputSchema: checkHealthSchema,
287
- outputSchema: checkHealthOutputSchema,
288
- annotations: {
289
- readOnlyHint: true,
290
- destructiveHint: false,
291
- idempotentHint: true,
292
- openWorldHint: false,
293
- },
294
- }, guarded(checkHealthHandler));
295
- // -- Local-only tools (stdio mode only) --
296
- if (mode === 'stdio') {
297
- server.registerTool('save_to_library', {
298
- title: 'Save to YouTube Knowledge Library',
299
- description: 'Save a summary or skill note to the local YouTube knowledge library. Overwrites existing content of the same type for the same video. Returns the saved file path.',
300
- inputSchema: saveToLibrarySchema,
301
- outputSchema: saveToLibraryOutputSchema,
302
- annotations: {
303
- readOnlyHint: false,
304
- // Overwrites an existing note of the same type in place, which is a
305
- // destructive update: the previous content is not recoverable.
306
- destructiveHint: true,
307
- idempotentHint: true,
308
- openWorldHint: false,
309
- },
310
- }, guarded(saveToLibraryHandler));
311
- server.registerTool('list_library', {
312
- title: 'List YouTube Knowledge Library',
313
- description: 'List all saved items in the local YouTube knowledge library. Returns titles, channels, content types, tags, and save dates. Optionally filter by tag. Sorted by most recently saved.',
314
- inputSchema: listLibrarySchema,
315
- outputSchema: listLibraryOutputSchema,
316
- annotations: {
317
- readOnlyHint: true,
318
- destructiveHint: false,
319
- idempotentHint: true,
320
- openWorldHint: false,
321
- },
322
- }, guarded(listLibraryHandler));
323
- server.registerTool('get_library_item', {
324
- title: 'Read a Saved Library Item',
325
- description: 'Read back a summary or skill note previously saved with save_to_library. Returns the markdown content plus the saved metadata.',
326
- inputSchema: getLibraryItemSchema,
327
- outputSchema: getLibraryItemOutputSchema,
328
- annotations: {
329
- readOnlyHint: true,
330
- destructiveHint: false,
331
- idempotentHint: true,
332
- openWorldHint: false,
333
- },
334
- }, guarded(getLibraryItemHandler));
335
- server.registerTool('search_library', {
336
- title: 'Search the Knowledge Library',
337
- description: 'Full-text search across every saved summary and skill note, ranked by relevance. Returns matching excerpts with the video IDs needed to read the full note.',
338
- inputSchema: searchLibrarySchema,
339
- outputSchema: searchLibraryOutputSchema,
340
- annotations: {
341
- readOnlyHint: true,
342
- destructiveHint: false,
343
- idempotentHint: true,
344
- openWorldHint: false,
345
- },
346
- }, guarded(searchLibraryHandler));
347
- server.registerTool('update_library_tags', {
348
- title: 'Update Library Tags',
349
- description: 'Add, remove or replace the tags on a saved library item. Tags are how list_library filters, so this is the way to reorganize a growing library. The replace parameter discards all existing tags.',
350
- inputSchema: updateLibraryTagsSchema,
351
- outputSchema: updateLibraryTagsOutputSchema,
352
- annotations: {
353
- readOnlyHint: false,
354
- // The replace parameter discards every existing tag.
355
- destructiveHint: true,
356
- idempotentHint: true,
357
- openWorldHint: false,
358
- },
359
- }, guarded(updateLibraryTagsHandler));
360
- server.registerTool('delete_library_item', {
361
- title: 'Delete a Library Item',
362
- description: 'Permanently delete a saved summary or skill note, or the entire library entry for a video. This removes files from disk and cannot be undone.',
363
- inputSchema: deleteLibraryItemSchema,
364
- outputSchema: deleteLibraryItemOutputSchema,
365
- annotations: {
366
- readOnlyHint: false,
367
- destructiveHint: true,
368
- idempotentHint: true,
369
- openWorldHint: false,
370
- },
371
- }, guarded(deleteLibraryItemHandler));
372
- server.registerTool('rebuild_library_index', {
373
- title: 'Rebuild the Library Search Index',
374
- description: 'Rebuild the full-text search index from the notes on disk. Use this if search_library results look stale or incomplete, for example after editing files by hand.',
375
- inputSchema: rebuildLibraryIndexSchema,
376
- outputSchema: rebuildLibraryIndexOutputSchema,
377
- annotations: {
378
- readOnlyHint: false,
379
- destructiveHint: false,
380
- idempotentHint: true,
381
- openWorldHint: false,
382
- },
383
- }, guarded(rebuildLibraryIndexHandler));
384
- server.registerTool('extract_clip', {
385
- title: 'Extract a Video Clip',
386
- description: 'Cut a time range out of a YouTube video without downloading the whole thing. Give start and end, or a chapter name. Pair with search_transcript to find the moment first. Requires ffmpeg.',
387
- inputSchema: extractClipSchema,
388
- outputSchema: extractClipOutputSchema,
389
- annotations: {
390
- readOnlyHint: false,
391
- destructiveHint: false,
392
- idempotentHint: true,
393
- openWorldHint: true,
394
- },
395
- }, guarded(extractClipHandler));
396
- server.registerTool('extract_audio_clip', {
397
- title: 'Extract an Audio Clip',
398
- description: 'Cut a time range out of a video as audio only, in an editor-friendly format (mp3, m4a, wav, flac, opus). Use for podcast pulls and voice-over sourcing. Requires ffmpeg.',
399
- inputSchema: extractAudioClipSchema,
400
- outputSchema: extractAudioClipOutputSchema,
401
- annotations: {
402
- readOnlyHint: false,
403
- destructiveHint: false,
404
- idempotentHint: true,
405
- openWorldHint: true,
406
- },
407
- }, guarded(extractAudioClipHandler));
408
- server.registerTool('extract_clips', {
409
- title: 'Extract Several Clips',
410
- description: 'Cut several time ranges out of one video in a single call. A range that fails is reported individually rather than losing the clips that succeeded. Requires ffmpeg.',
411
- inputSchema: extractClipsSchema,
412
- outputSchema: extractClipsOutputSchema,
413
- annotations: {
414
- readOnlyHint: false,
415
- destructiveHint: false,
416
- idempotentHint: true,
417
- openWorldHint: true,
418
- },
419
- }, guarded(extractClipsHandler));
420
- server.registerTool('extract_frame', {
421
- title: 'Capture a Frame',
422
- description: 'Capture a single still image from a video at a given timestamp, without downloading the file. Use for thumbnails and reference frames. Requires ffmpeg.',
423
- inputSchema: extractFrameSchema,
424
- outputSchema: extractFrameOutputSchema,
425
- annotations: {
426
- readOnlyHint: false,
427
- destructiveHint: false,
428
- idempotentHint: true,
429
- openWorldHint: true,
430
- },
431
- }, guarded(extractFrameHandler));
432
- server.registerTool('export_subtitles', {
433
- title: 'Export Subtitles',
434
- description: 'Write a video transcript to disk as SRT, WebVTT or plain text, ready to import into a video editor such as Premiere, Resolve or CapCut.',
435
- inputSchema: exportSubtitlesSchema,
436
- outputSchema: exportSubtitlesOutputSchema,
437
- annotations: {
438
- readOnlyHint: false,
439
- destructiveHint: false,
440
- idempotentHint: true,
441
- openWorldHint: true,
442
- },
443
- }, guarded(exportSubtitlesHandler));
444
- server.registerTool('download_video', {
445
- title: 'Download YouTube Video',
446
- description: 'Download a YouTube video to local disk. Use the quality parameter for automatic format selection with smart fallbacks, or formatId for a specific format from list_formats. Returns the downloaded file path, title, and format details.',
447
- inputSchema: downloadVideoSchema,
448
- outputSchema: downloadVideoOutputSchema,
449
- annotations: {
450
- readOnlyHint: false,
451
- destructiveHint: false,
452
- // Writes to a deterministic path and overwrites, exactly like the
453
- // extract_* tools; repeating the call leaves the same state.
454
- idempotentHint: true,
455
- openWorldHint: true,
456
- },
457
- }, guarded(downloadVideoHandler));
458
- // -- Channel brains --
459
- //
460
- // Local like the library, and for the same reason: a brain is tens of
461
- // megabytes of one user's reading, and in HTTP mode any client could fill
462
- // the server's disk by naming a channel.
463
- server.registerTool('build_brain', {
464
- title: 'Build a Channel Brain',
465
- description: "Read a channel's videos into a searchable corpus of timestamped passages, so you can later ask what its creator has said about anything. Long-running: several hundred videos is several hundred fetches. Safe to interrupt and call again — it continues where it stopped, and on a finished brain it picks up new uploads. The since and minDurationSeconds filters describe the brain, not just the call: narrowing one discards the passages of the videos it excludes, and widening it reads them again. Ask it questions with ask_brain.",
466
- inputSchema: buildBrainSchema,
467
- outputSchema: buildBrainOutputSchema,
468
- annotations: {
469
- readOnlyHint: false,
470
- // A plain build only adds, but narrowing a filter drops the passages
471
- // of videos it excludes, and a client should be able to ask first.
472
- destructiveHint: true,
473
- // Re-running converges on the same brain rather than duplicating
474
- // anything: that is the same code path as resuming.
475
- idempotentHint: true,
476
- openWorldHint: true,
477
- },
478
- }, guarded(buildBrainHandler));
479
- server.registerTool('ask_brain', {
480
- title: 'Ask a Channel Brain',
481
- description: 'Search everything a creator has said, across every video in their brain. Returns the passages that match, each with the timestamp and a link that opens the video at that moment, so every claim can be checked. Matches the words as spoken, so phrase the query the way the creator would say it. Requires build_brain first.',
482
- inputSchema: askBrainSchema,
483
- outputSchema: askBrainOutputSchema,
484
- annotations: {
485
- readOnlyHint: true,
486
- destructiveHint: false,
487
- idempotentHint: true,
488
- openWorldHint: false,
489
- },
490
- }, guarded(askBrainHandler));
491
- server.registerTool('list_brains', {
492
- title: 'List Channel Brains',
493
- description: 'List every channel brain built locally, with how much of each channel is indexed and whether a written profile exists.',
494
- inputSchema: listBrainsSchema,
495
- outputSchema: listBrainsOutputSchema,
496
- annotations: {
497
- readOnlyHint: true,
498
- destructiveHint: false,
499
- idempotentHint: true,
500
- openWorldHint: false,
501
- },
502
- }, guarded(listBrainsHandler));
503
- server.registerTool('get_brain_info', {
504
- title: 'Get Channel Brain Details',
505
- description: "What a brain actually covers: how many videos were read, how many had no captions, how many are still outstanding, the channel's upload rhythm and speaking rate, and the phrases it repeats across videos. Read this before trusting an answer built from ask_brain.",
506
- inputSchema: getBrainInfoSchema,
507
- outputSchema: getBrainInfoOutputSchema,
508
- annotations: {
509
- readOnlyHint: true,
510
- destructiveHint: false,
511
- idempotentHint: true,
512
- openWorldHint: false,
513
- },
514
- }, guarded(getBrainInfoHandler));
515
- server.registerTool('save_brain_profile', {
516
- title: 'Save a Channel Brain Profile',
517
- description: 'Store a written account of a creator alongside their brain — voice, recurring arguments, how their thinking has changed. Write it from passages returned by ask_brain and cite them, because this server cannot check a claim it was handed. Overwrites any existing profile for that channel.',
518
- inputSchema: saveBrainProfileSchema,
519
- outputSchema: saveBrainProfileOutputSchema,
520
- annotations: {
521
- readOnlyHint: false,
522
- // Replaces the previous profile in place; the old text is not recoverable.
523
- destructiveHint: true,
524
- idempotentHint: true,
525
- openWorldHint: false,
526
- },
527
- }, guarded(saveBrainProfileHandler));
528
- server.registerTool('delete_brain', {
529
- title: 'Delete a Channel Brain',
530
- description: 'Permanently delete a channel brain: its passages, its manifest and its profile. The transcripts it was built from stay cached, so rebuilding is much faster than the first build was.',
531
- inputSchema: deleteBrainSchema,
532
- outputSchema: deleteBrainOutputSchema,
533
- annotations: {
534
- readOnlyHint: false,
535
- destructiveHint: true,
536
- idempotentHint: true,
537
- openWorldHint: false,
538
- },
539
- }, guarded(deleteBrainHandler));
540
- }
28
+ const server = new McpServer({ name: 'youtube-knowledge-mcp', version: serverVersion() }, { instructions: SERVER_INSTRUCTIONS, capabilities: { logging: {} } });
29
+ registerTools(server, mode);
541
30
  registerPrompts(server, mode);
542
31
  registerResources(server, mode);
543
32
  return server;
@@ -572,6 +61,11 @@ export async function announcePreflight() {
572
61
  }
573
62
  export async function main() {
574
63
  const mode = getTransportMode();
64
+ // Validated once, here, so a misspelt browser name or an unreadable cookies
65
+ // file stops the server at boot rather than failing the first tool call.
66
+ const session = readYtDlpEnv();
67
+ if (session.cookies !== 'none' || session.proxy)
68
+ console.error(describeYtDlpEnv(session));
575
69
  await announcePreflight();
576
70
  if (mode === 'http') {
577
71
  startHttp(createServer);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,mBAAmB,GAAG;;;;;;;;;;qEAUyC,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAyB,OAAO;IAC3D,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAC3D,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CACrE,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACnD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO;IAE1E,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,MAAM,iBAAiB,EAAE,CAAC;IAE1B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,SAAS,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,sEAAsE"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /** Prompts for the channel brains. Local only, like the tools they drive. */
3
+ export declare function registerBrainPrompts(server: McpServer): void;
4
+ //# sourceMappingURL=prompts-brain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts-brain.d.ts","sourceRoot":"","sources":["../src/prompts-brain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4D5D"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import { userMessage } from './prompts-shared.js';
3
+ /** Prompts for the channel brains. Local only, like the tools they drive. */
4
+ export function registerBrainPrompts(server) {
5
+ server.registerPrompt('create_brain', {
6
+ title: 'Create a brain for a YouTuber',
7
+ description: 'Read a channel into a searchable corpus, then write a grounded account of the creator from what they actually said.',
8
+ argsSchema: {
9
+ channel: z.string().describe('Channel URL, @handle, or name'),
10
+ limit: z.string().optional().describe('How many videos to read. Default: 100'),
11
+ },
12
+ }, ({ channel, limit }) => userMessage([
13
+ `Build a brain for the YouTube channel ${channel}, then write its profile.`,
14
+ '',
15
+ `1. build_brain with maxVideos=${limit ?? '100'}. This takes a while. If it reports`,
16
+ ' stoppedEarly, call it again until it does not.',
17
+ '2. get_brain_info to see what was actually read — a profile written over a channel',
18
+ ' that is half unread is a profile of the half that loaded.',
19
+ '3. Probe the corpus with several ask_brain calls: the subjects it returns to, the',
20
+ ' positions it argues for, the advice it repeats, how it opens and closes a video.',
21
+ ' The recurring phrases in get_brain_info are a good place to start.',
22
+ '4. save_brain_profile with what you found.',
23
+ '',
24
+ 'Every claim in the profile must be supported by a passage you retrieved, cited as',
25
+ '[MM:SS] with its link. Where the corpus does not support a claim, leave the claim out.',
26
+ 'Do not describe the creator as a person, a personality or a brand — describe what',
27
+ 'their videos say and how they say it.',
28
+ ].join('\n')));
29
+ server.registerPrompt('ask_creator', {
30
+ title: 'Ask what a creator has said',
31
+ description: 'Answer a question strictly from a channel brain, citing the moments the answer comes from.',
32
+ argsSchema: {
33
+ channel: z.string().describe('Channel URL, @handle, or name of an existing brain'),
34
+ question: z.string().describe('What you want to know'),
35
+ },
36
+ }, ({ channel, question }) => userMessage([
37
+ `Answer this about ${channel}, using only their brain: ${question}`,
38
+ '',
39
+ '1. ask_brain with the question. Then ask again with the words the creator would',
40
+ ' actually use — passages are matched as spoken, not as summarised.',
41
+ '2. Answer from the passages you got back, citing each point as [MM:SS] with its link.',
42
+ '',
43
+ 'If the passages do not answer the question, say so and say what they do cover.',
44
+ 'Do not fill the gap from what you already know about this person: an answer that',
45
+ 'cannot be traced to a timestamp is not an answer from the brain.',
46
+ ].join('\n')));
47
+ }
48
+ //# sourceMappingURL=prompts-brain.js.map