youtube-knowledge-mcp 1.1.1 → 2.0.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 (134) hide show
  1. package/README.md +221 -177
  2. package/dist/http.d.ts +64 -0
  3. package/dist/http.d.ts.map +1 -0
  4. package/dist/http.js +283 -0
  5. package/dist/http.js.map +1 -0
  6. package/dist/index.d.ts +19 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +342 -164
  9. package/dist/index.js.map +1 -1
  10. package/dist/prompts.d.ts +3 -0
  11. package/dist/prompts.d.ts.map +1 -0
  12. package/dist/prompts.js +167 -0
  13. package/dist/prompts.js.map +1 -0
  14. package/dist/resources.d.ts +10 -0
  15. package/dist/resources.d.ts.map +1 -0
  16. package/dist/resources.js +72 -0
  17. package/dist/resources.js.map +1 -0
  18. package/dist/schemas.d.ts +326 -0
  19. package/dist/schemas.d.ts.map +1 -0
  20. package/dist/schemas.js +128 -0
  21. package/dist/schemas.js.map +1 -0
  22. package/dist/tools/batch.d.ts +111 -0
  23. package/dist/tools/batch.d.ts.map +1 -0
  24. package/dist/tools/batch.js +187 -0
  25. package/dist/tools/batch.js.map +1 -0
  26. package/dist/tools/check-health.d.ts +59 -0
  27. package/dist/tools/check-health.d.ts.map +1 -0
  28. package/dist/tools/check-health.js +38 -0
  29. package/dist/tools/check-health.js.map +1 -0
  30. package/dist/tools/clips.d.ts +158 -0
  31. package/dist/tools/clips.d.ts.map +1 -0
  32. package/dist/tools/clips.js +279 -0
  33. package/dist/tools/clips.js.map +1 -0
  34. package/dist/tools/download-video.d.ts +43 -12
  35. package/dist/tools/download-video.d.ts.map +1 -1
  36. package/dist/tools/download-video.js +32 -3
  37. package/dist/tools/download-video.js.map +1 -1
  38. package/dist/tools/fetch-videos.d.ts +39 -7
  39. package/dist/tools/fetch-videos.d.ts.map +1 -1
  40. package/dist/tools/fetch-videos.js +20 -3
  41. package/dist/tools/fetch-videos.js.map +1 -1
  42. package/dist/tools/get-channel-info.d.ts +11 -7
  43. package/dist/tools/get-channel-info.d.ts.map +1 -1
  44. package/dist/tools/get-channel-info.js +5 -3
  45. package/dist/tools/get-channel-info.js.map +1 -1
  46. package/dist/tools/get-chapters.d.ts +28 -6
  47. package/dist/tools/get-chapters.d.ts.map +1 -1
  48. package/dist/tools/get-chapters.js +24 -4
  49. package/dist/tools/get-chapters.js.map +1 -1
  50. package/dist/tools/get-comments.d.ts +26 -7
  51. package/dist/tools/get-comments.d.ts.map +1 -1
  52. package/dist/tools/get-comments.js +10 -4
  53. package/dist/tools/get-comments.js.map +1 -1
  54. package/dist/tools/get-playlist-info.d.ts +13 -6
  55. package/dist/tools/get-playlist-info.d.ts.map +1 -1
  56. package/dist/tools/get-playlist-info.js +4 -2
  57. package/dist/tools/get-playlist-info.js.map +1 -1
  58. package/dist/tools/get-transcript.d.ts +42 -7
  59. package/dist/tools/get-transcript.d.ts.map +1 -1
  60. package/dist/tools/get-transcript.js +139 -10
  61. package/dist/tools/get-transcript.js.map +1 -1
  62. package/dist/tools/get-video-info.d.ts +17 -6
  63. package/dist/tools/get-video-info.d.ts.map +1 -1
  64. package/dist/tools/get-video-info.js +5 -2
  65. package/dist/tools/get-video-info.js.map +1 -1
  66. package/dist/tools/library.d.ts +127 -0
  67. package/dist/tools/library.d.ts.map +1 -0
  68. package/dist/tools/library.js +118 -0
  69. package/dist/tools/library.js.map +1 -0
  70. package/dist/tools/list-library.d.ts +40 -6
  71. package/dist/tools/list-library.d.ts.map +1 -1
  72. package/dist/tools/list-library.js +8 -2
  73. package/dist/tools/list-library.js.map +1 -1
  74. package/dist/tools/save-to-library.d.ts +9 -6
  75. package/dist/tools/save-to-library.d.ts.map +1 -1
  76. package/dist/tools/save-to-library.js +9 -2
  77. package/dist/tools/save-to-library.js.map +1 -1
  78. package/dist/tools/search-channels.d.ts +33 -7
  79. package/dist/tools/search-channels.d.ts.map +1 -1
  80. package/dist/tools/search-channels.js +11 -4
  81. package/dist/tools/search-channels.js.map +1 -1
  82. package/dist/tools/search-transcript.d.ts +52 -0
  83. package/dist/tools/search-transcript.d.ts.map +1 -0
  84. package/dist/tools/search-transcript.js +103 -0
  85. package/dist/tools/search-transcript.js.map +1 -0
  86. package/dist/tools/search-videos.d.ts +39 -7
  87. package/dist/tools/search-videos.d.ts.map +1 -1
  88. package/dist/tools/search-videos.js +21 -3
  89. package/dist/tools/search-videos.js.map +1 -1
  90. package/dist/utils/clips.d.ts +69 -0
  91. package/dist/utils/clips.d.ts.map +1 -0
  92. package/dist/utils/clips.js +202 -0
  93. package/dist/utils/clips.js.map +1 -0
  94. package/dist/utils/context.d.ts +24 -0
  95. package/dist/utils/context.d.ts.map +1 -0
  96. package/dist/utils/context.js +19 -0
  97. package/dist/utils/context.js.map +1 -0
  98. package/dist/utils/errors.d.ts +58 -0
  99. package/dist/utils/errors.d.ts.map +1 -0
  100. package/dist/utils/errors.js +152 -0
  101. package/dist/utils/errors.js.map +1 -0
  102. package/dist/utils/format.d.ts +34 -5
  103. package/dist/utils/format.d.ts.map +1 -1
  104. package/dist/utils/format.js +45 -0
  105. package/dist/utils/format.js.map +1 -1
  106. package/dist/utils/preflight.d.ts +30 -0
  107. package/dist/utils/preflight.d.ts.map +1 -0
  108. package/dist/utils/preflight.js +79 -0
  109. package/dist/utils/preflight.js.map +1 -0
  110. package/dist/utils/search-index.d.ts +58 -0
  111. package/dist/utils/search-index.d.ts.map +1 -0
  112. package/dist/utils/search-index.js +192 -0
  113. package/dist/utils/search-index.js.map +1 -0
  114. package/dist/utils/storage.d.ts +83 -6
  115. package/dist/utils/storage.d.ts.map +1 -1
  116. package/dist/utils/storage.js +204 -21
  117. package/dist/utils/storage.js.map +1 -1
  118. package/dist/utils/transcript.d.ts +142 -0
  119. package/dist/utils/transcript.d.ts.map +1 -0
  120. package/dist/utils/transcript.js +216 -0
  121. package/dist/utils/transcript.js.map +1 -0
  122. package/dist/utils/validate.d.ts +16 -0
  123. package/dist/utils/validate.d.ts.map +1 -0
  124. package/dist/utils/validate.js +64 -0
  125. package/dist/utils/validate.js.map +1 -0
  126. package/dist/utils/youtube.d.ts +15 -1
  127. package/dist/utils/youtube.d.ts.map +1 -1
  128. package/dist/utils/youtube.js +231 -174
  129. package/dist/utils/youtube.js.map +1 -1
  130. package/dist/utils/ytdlp.d.ts +51 -0
  131. package/dist/utils/ytdlp.d.ts.map +1 -0
  132. package/dist/utils/ytdlp.js +191 -0
  133. package/dist/utils/ytdlp.js.map +1 -0
  134. package/package.json +20 -15
@@ -1,15 +1,47 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const fetchVideosSchema: {
3
4
  url: z.ZodString;
4
5
  limit: z.ZodDefault<z.ZodNumber>;
5
6
  };
6
- export declare function fetchVideosHandler({ url, limit }: {
7
+ export declare const fetchVideosOutputSchema: {
8
+ total: z.ZodNumber;
9
+ count: z.ZodNumber;
10
+ offset: z.ZodNumber;
11
+ hasMore: z.ZodBoolean;
12
+ nextOffset: z.ZodOptional<z.ZodNumber>;
13
+ source: z.ZodString;
14
+ videos: z.ZodArray<z.ZodObject<{
15
+ id: z.ZodString;
16
+ title: z.ZodString;
17
+ durationSeconds: z.ZodNumber;
18
+ durationFormatted: z.ZodString;
19
+ url: z.ZodString;
20
+ channel: z.ZodOptional<z.ZodString>;
21
+ viewCount: z.ZodOptional<z.ZodNumber>;
22
+ uploadDate: z.ZodOptional<z.ZodString>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ url: string;
25
+ title: string;
26
+ id: string;
27
+ durationFormatted: string;
28
+ durationSeconds: number;
29
+ channel?: string | undefined;
30
+ uploadDate?: string | undefined;
31
+ viewCount?: number | undefined;
32
+ }, {
33
+ url: string;
34
+ title: string;
35
+ id: string;
36
+ durationFormatted: string;
37
+ durationSeconds: number;
38
+ channel?: string | undefined;
39
+ uploadDate?: string | undefined;
40
+ viewCount?: number | undefined;
41
+ }>, "many">;
42
+ };
43
+ export declare function fetchVideosHandler({ url, limit, }: {
7
44
  url: string;
8
45
  limit: number;
9
- }): Promise<{
10
- content: [{
11
- type: "text";
12
- text: string;
13
- }];
14
- }>;
46
+ }): Promise<CallToolResult>;
15
47
  //# sourceMappingURL=fetch-videos.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-videos.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;CAY7B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GAatF"}
1
+ {"version":3,"file":"fetch-videos.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;;CAY7B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAInC,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EACvC,GAAG,EACH,KAAK,GACN,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CAwB1B"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { listVideos } from '../utils/youtube.js';
3
- import { textContent } from '../utils/format.js';
3
+ import { pageInfo, toolResult } from '../utils/format.js';
4
+ import { paginationShape, videoSummarySchema } from '../schemas.js';
4
5
  export const fetchVideosSchema = {
5
6
  url: z
6
7
  .string()
@@ -12,7 +13,12 @@ export const fetchVideosSchema = {
12
13
  .default(20)
13
14
  .describe('Maximum number of videos to return (1-100, default: 20)'),
14
15
  };
15
- export async function fetchVideosHandler({ url, limit }) {
16
+ export const fetchVideosOutputSchema = {
17
+ source: z.string(),
18
+ videos: z.array(videoSummarySchema),
19
+ ...paginationShape,
20
+ };
21
+ export async function fetchVideosHandler({ url, limit, }) {
16
22
  const videos = await listVideos(url, limit);
17
23
  const lines = [`✓ Found ${videos.length} video${videos.length !== 1 ? 's' : ''}`, ''];
18
24
  videos.forEach((v, i) => {
@@ -21,6 +27,17 @@ export async function fetchVideosHandler({ url, limit }) {
21
27
  lines.push(` ${v.url}`);
22
28
  lines.push('');
23
29
  });
24
- return textContent(lines.join('\n'));
30
+ return toolResult(lines.join('\n'), {
31
+ source: url,
32
+ videos: videos.map((v) => ({
33
+ id: v.id,
34
+ title: v.title,
35
+ durationSeconds: v.duration,
36
+ durationFormatted: v.durationFormatted,
37
+ url: v.url,
38
+ uploadDate: v.uploadDate,
39
+ })),
40
+ ...pageInfo(videos.length, videos.length),
41
+ });
25
42
  }
26
43
  //# sourceMappingURL=fetch-videos.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-videos.js","sourceRoot":"","sources":["../../src/tools/fetch-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,CACP,+FAA+F,CAChG;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAkC;IACrF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAa,CAAC,WAAW,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB,MAAM,CAAC,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"fetch-videos.js","sourceRoot":"","sources":["../../src/tools/fetch-videos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGpE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,CACP,+FAA+F,CAChG;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACnC,GAAG,eAAe;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,GAAG,EACH,KAAK,GAIN;IACC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAa,CAAC,WAAW,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,iBAAiB,MAAM,CAAC,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAClC,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,eAAe,EAAE,CAAC,CAAC,QAAQ;YAC3B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC;QACH,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC"}
@@ -1,13 +1,17 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const getChannelInfoSchema: {
3
4
  channel: z.ZodString;
4
5
  };
5
- export declare function getChannelInfoHandler({ channel }: {
6
+ export declare const getChannelInfoOutputSchema: {
7
+ name: z.ZodString;
8
+ channelId: z.ZodString;
9
+ handle: z.ZodString;
10
+ subscriberCount: z.ZodNumber;
11
+ channelUrl: z.ZodString;
12
+ description: z.ZodString;
13
+ };
14
+ export declare function getChannelInfoHandler({ channel, }: {
6
15
  channel: string;
7
- }): Promise<{
8
- content: [{
9
- type: "text";
10
- text: string;
11
- }];
12
- }>;
16
+ }): Promise<CallToolResult>;
13
17
  //# sourceMappingURL=get-channel-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-channel-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;GAgB3E"}
1
+ {"version":3,"file":"get-channel-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;CAA0B,CAAC;AAElE,wBAAsB,qBAAqB,CAAC,EAC1C,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B"}
@@ -1,10 +1,12 @@
1
1
  import { z } from 'zod';
2
2
  import { getChannelInfo } from '../utils/youtube.js';
3
- import { formatCount, textContent } from '../utils/format.js';
3
+ import { formatCount, toolResult } from '../utils/format.js';
4
+ import { channelInfoSchema } from '../schemas.js';
4
5
  export const getChannelInfoSchema = {
5
6
  channel: z.string().describe('YouTube channel URL, handle (e.g., @Fireship), or channel name'),
6
7
  };
7
- export async function getChannelInfoHandler({ channel }) {
8
+ export const getChannelInfoOutputSchema = channelInfoSchema.shape;
9
+ export async function getChannelInfoHandler({ channel, }) {
8
10
  const info = await getChannelInfo(channel);
9
11
  const lines = [
10
12
  info.name,
@@ -16,6 +18,6 @@ export async function getChannelInfoHandler({ channel }) {
16
18
  lines.push('');
17
19
  lines.push(info.description);
18
20
  }
19
- return textContent(lines.join('\n'));
21
+ return toolResult(lines.join('\n'), { ...info });
20
22
  }
21
23
  //# sourceMappingURL=get-channel-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-channel-info.js","sourceRoot":"","sources":["../../src/tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;CAC/F,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAE,OAAO,EAAuB;IAC1E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAa;QACtB,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QAC9B,GAAG,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc;QAClD,IAAI,CAAC,UAAU;KAChB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"get-channel-info.js","sourceRoot":"","sources":["../../src/tools/get-channel-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;CAC/F,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC,KAAK,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,OAAO,GAGR;IACC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAa;QACtB,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QAC9B,GAAG,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc;QAClD,IAAI,CAAC,UAAU;KAChB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -1,13 +1,35 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const getChaptersSchema: {
3
4
  video: z.ZodString;
4
5
  };
6
+ export declare const getChaptersOutputSchema: {
7
+ videoId: z.ZodString;
8
+ chapters: z.ZodArray<z.ZodObject<{
9
+ title: z.ZodString;
10
+ startSeconds: z.ZodNumber;
11
+ startFormatted: z.ZodString;
12
+ endSeconds: z.ZodNumber;
13
+ endFormatted: z.ZodString;
14
+ url: z.ZodString;
15
+ }, "strip", z.ZodTypeAny, {
16
+ url: string;
17
+ title: string;
18
+ startSeconds: number;
19
+ startFormatted: string;
20
+ endSeconds: number;
21
+ endFormatted: string;
22
+ }, {
23
+ url: string;
24
+ title: string;
25
+ startSeconds: number;
26
+ startFormatted: string;
27
+ endSeconds: number;
28
+ endFormatted: string;
29
+ }>, "many">;
30
+ count: z.ZodNumber;
31
+ };
5
32
  export declare function getChaptersHandler({ video }: {
6
33
  video: string;
7
- }): Promise<{
8
- content: [{
9
- type: "text";
10
- text: string;
11
- }];
12
- }>;
34
+ }): Promise<CallToolResult>;
13
35
  //# sourceMappingURL=get-chapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-chapters.d.ts","sourceRoot":"","sources":["../../src/tools/get-chapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GAcpE"}
1
+ {"version":3,"file":"get-chapters.d.ts","sourceRoot":"","sources":["../../src/tools/get-chapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;CAInC,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CA4B9F"}
@@ -1,18 +1,38 @@
1
1
  import { z } from 'zod';
2
- import { getChapters } from '../utils/youtube.js';
3
- import { textContent } from '../utils/format.js';
2
+ import { toolResult } from '../utils/format.js';
3
+ import { chapterSchema } from '../schemas.js';
4
+ import { deepLink } from '../utils/transcript.js';
5
+ import { extractVideoId, getChapters } from '../utils/youtube.js';
4
6
  export const getChaptersSchema = {
5
7
  video: z.string().describe('YouTube video ID (e.g., dQw4w9WgXcQ) or full URL'),
6
8
  };
9
+ export const getChaptersOutputSchema = {
10
+ videoId: z.string(),
11
+ chapters: z.array(chapterSchema),
12
+ count: z.number().int(),
13
+ };
7
14
  export async function getChaptersHandler({ video }) {
8
15
  const chapters = await getChapters(video);
16
+ const videoId = extractVideoId(video);
17
+ const structured = {
18
+ videoId,
19
+ chapters: chapters.map((ch) => ({
20
+ title: ch.title,
21
+ startSeconds: ch.startTime,
22
+ startFormatted: ch.startTimeFormatted,
23
+ endSeconds: ch.endTime,
24
+ endFormatted: ch.endTimeFormatted,
25
+ url: deepLink(videoId, ch.startTime),
26
+ })),
27
+ count: chapters.length,
28
+ };
9
29
  if (chapters.length === 0) {
10
- return textContent('No chapters found for this video.');
30
+ return toolResult('No chapters found for this video.', structured);
11
31
  }
12
32
  const lines = [`${chapters.length} chapters`, ''];
13
33
  chapters.forEach((ch, i) => {
14
34
  lines.push(`${i + 1}. [${ch.startTimeFormatted} - ${ch.endTimeFormatted}] ${ch.title}`);
15
35
  });
16
- return textContent(lines.join('\n'));
36
+ return toolResult(lines.join('\n'), structured);
17
37
  }
18
38
  //# sourceMappingURL=get-chapters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-chapters.js","sourceRoot":"","sources":["../../src/tools/get-chapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAC/E,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAqB;IACnE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,mCAAmC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,EAAE,CAAC,CAAC;IAE5D,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,kBAAkB,MAAM,EAAE,CAAC,gBAAgB,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"get-chapters.js","sourceRoot":"","sources":["../../src/tools/get-chapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAC/E,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAqB;IACnE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG;QACjB,OAAO;QACP,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,YAAY,EAAE,EAAE,CAAC,SAAS;YAC1B,cAAc,EAAE,EAAE,CAAC,kBAAkB;YACrC,UAAU,EAAE,EAAE,CAAC,OAAO;YACtB,YAAY,EAAE,EAAE,CAAC,gBAAgB;YACjC,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC;SACrC,CAAC,CAAC;QACH,KAAK,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,mCAAmC,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,EAAE,CAAC,CAAC;IAE5D,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,kBAAkB,MAAM,EAAE,CAAC,gBAAgB,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC"}
@@ -1,15 +1,34 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const getCommentsSchema: {
3
4
  video: z.ZodString;
4
5
  limit: z.ZodDefault<z.ZodNumber>;
5
6
  };
6
- export declare function getCommentsHandler({ video, limit }: {
7
+ export declare const getCommentsOutputSchema: {
8
+ total: z.ZodNumber;
9
+ count: z.ZodNumber;
10
+ offset: z.ZodNumber;
11
+ hasMore: z.ZodBoolean;
12
+ nextOffset: z.ZodOptional<z.ZodNumber>;
13
+ comments: z.ZodArray<z.ZodObject<{
14
+ author: z.ZodString;
15
+ text: z.ZodString;
16
+ likeCount: z.ZodNumber;
17
+ isPinned: z.ZodBoolean;
18
+ }, "strip", z.ZodTypeAny, {
19
+ text: string;
20
+ likeCount: number;
21
+ author: string;
22
+ isPinned: boolean;
23
+ }, {
24
+ text: string;
25
+ likeCount: number;
26
+ author: string;
27
+ isPinned: boolean;
28
+ }>, "many">;
29
+ };
30
+ export declare function getCommentsHandler({ video, limit, }: {
7
31
  video: string;
8
32
  limit: number;
9
- }): Promise<{
10
- content: [{
11
- type: "text";
12
- text: string;
13
- }];
14
- }>;
33
+ }): Promise<CallToolResult>;
15
34
  //# sourceMappingURL=get-comments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-comments.d.ts","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;CAQ7B,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GAkB1F"}
1
+ {"version":3,"file":"get-comments.d.ts","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;;CAQ7B,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;CAGnC,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,EACvC,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB1B"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { getComments } from '../utils/youtube.js';
3
- import { textContent } from '../utils/format.js';
3
+ import { pageInfo, toolResult } from '../utils/format.js';
4
+ import { commentSchema, paginationShape } from '../schemas.js';
4
5
  export const getCommentsSchema = {
5
6
  video: z.string().describe('YouTube video ID (e.g., dQw4w9WgXcQ) or full URL'),
6
7
  limit: z
@@ -10,10 +11,15 @@ export const getCommentsSchema = {
10
11
  .default(20)
11
12
  .describe('Maximum number of top-level comments to return (1-50, default: 20)'),
12
13
  };
13
- export async function getCommentsHandler({ video, limit }) {
14
+ export const getCommentsOutputSchema = {
15
+ comments: z.array(commentSchema),
16
+ ...paginationShape,
17
+ };
18
+ export async function getCommentsHandler({ video, limit, }) {
14
19
  const comments = await getComments(video, limit);
20
+ const structured = { comments, ...pageInfo(comments.length, comments.length) };
15
21
  if (comments.length === 0) {
16
- return textContent('No comments found for this video.');
22
+ return toolResult('No comments found for this video.', structured);
17
23
  }
18
24
  const lines = [`${comments.length} top comments`, ''];
19
25
  comments.forEach((c, i) => {
@@ -23,6 +29,6 @@ export async function getCommentsHandler({ video, limit }) {
23
29
  lines.push(` ${c.text}`);
24
30
  lines.push('');
25
31
  });
26
- return textContent(lines.join('\n'));
32
+ return toolResult(lines.join('\n'), structured);
27
33
  }
28
34
  //# sourceMappingURL=get-comments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-comments.js","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC9E,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,oEAAoE,CAAC;CAClF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAoC;IACzF,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,mCAAmC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,EAAE,EAAE,CAAC,CAAC;IAEhE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"get-comments.js","sourceRoot":"","sources":["../../src/tools/get-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC9E,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,oEAAoE,CAAC;CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,GAAG,eAAe;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,KAAK,EACL,KAAK,GAIN;IACC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IAE/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,mCAAmC,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,EAAE,EAAE,CAAC,CAAC;IAEhE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC"}
@@ -1,13 +1,20 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const getPlaylistInfoSchema: {
3
4
  url: z.ZodString;
4
5
  };
6
+ export declare const getPlaylistInfoOutputSchema: {
7
+ id: z.ZodString;
8
+ title: z.ZodString;
9
+ channel: z.ZodString;
10
+ handle: z.ZodString;
11
+ channelUrl: z.ZodString;
12
+ videoCount: z.ZodNumber;
13
+ lastModified: z.ZodString;
14
+ url: z.ZodString;
15
+ description: z.ZodString;
16
+ };
5
17
  export declare function getPlaylistInfoHandler({ url }: {
6
18
  url: string;
7
- }): Promise<{
8
- content: [{
9
- type: "text";
10
- text: string;
11
- }];
12
- }>;
19
+ }): Promise<CallToolResult>;
13
20
  //# sourceMappingURL=get-playlist-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-playlist-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-playlist-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,qBAAqB;;CAMjC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE;;;;;GAkBpE"}
1
+ {"version":3,"file":"get-playlist-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-playlist-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,qBAAqB;;CAMjC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;CAA2B,CAAC;AAEpE,wBAAsB,sBAAsB,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAkB9F"}
@@ -1,11 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  import { getPlaylistInfo } from '../utils/youtube.js';
3
- import { formatCount, textContent } from '../utils/format.js';
3
+ import { formatCount, toolResult } from '../utils/format.js';
4
+ import { playlistInfoSchema } from '../schemas.js';
4
5
  export const getPlaylistInfoSchema = {
5
6
  url: z
6
7
  .string()
7
8
  .describe('YouTube playlist URL (e.g., https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb)'),
8
9
  };
10
+ export const getPlaylistInfoOutputSchema = playlistInfoSchema.shape;
9
11
  export async function getPlaylistInfoHandler({ url }) {
10
12
  const info = await getPlaylistInfo(url);
11
13
  const lines = [
@@ -20,6 +22,6 @@ export async function getPlaylistInfoHandler({ url }) {
20
22
  lines.push('');
21
23
  lines.push(info.description);
22
24
  }
23
- return textContent(lines.join('\n'));
25
+ return toolResult(lines.join('\n'), { ...info });
24
26
  }
25
27
  //# sourceMappingURL=get-playlist-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-playlist-info.js","sourceRoot":"","sources":["../../src/tools/get-playlist-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,CACP,uGAAuG,CACxG;CACJ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAE,GAAG,EAAmB;IACnE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,KAAK,GAAa;QACtB,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QACjF,EAAE;QACF,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;QACxC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7D,IAAI,CAAC,GAAG;KACT,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"get-playlist-info.js","sourceRoot":"","sources":["../../src/tools/get-playlist-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,CACP,uGAAuG,CACxG;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAAkB,CAAC,KAAK,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAAE,GAAG,EAAmB;IACnE,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,KAAK,GAAa;QACtB,IAAI,CAAC,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QACjF,EAAE;QACF,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;QACxC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7D,IAAI,CAAC,GAAG;KACT,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -1,15 +1,50 @@
1
1
  import { z } from 'zod';
2
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
3
  export declare const getTranscriptSchema: {
3
4
  video: z.ZodString;
4
5
  language: z.ZodDefault<z.ZodString>;
6
+ format: z.ZodDefault<z.ZodEnum<["text", "timestamped", "segments"]>>;
7
+ startTime: z.ZodOptional<z.ZodString>;
8
+ endTime: z.ZodOptional<z.ZodString>;
9
+ chapter: z.ZodOptional<z.ZodString>;
10
+ maxChars: z.ZodOptional<z.ZodNumber>;
11
+ offset: z.ZodDefault<z.ZodNumber>;
12
+ refresh: z.ZodDefault<z.ZodBoolean>;
5
13
  };
6
- export declare function getTranscriptHandler({ video, language, }: {
14
+ export declare const getTranscriptOutputSchema: {
15
+ videoId: z.ZodString;
16
+ language: z.ZodString;
17
+ text: z.ZodString;
18
+ segments: z.ZodArray<z.ZodObject<{
19
+ startSeconds: z.ZodNumber;
20
+ endSeconds: z.ZodNumber;
21
+ text: z.ZodString;
22
+ }, "strip", z.ZodTypeAny, {
23
+ text: string;
24
+ startSeconds: number;
25
+ endSeconds: number;
26
+ }, {
27
+ text: string;
28
+ startSeconds: number;
29
+ endSeconds: number;
30
+ }>, "many">;
31
+ wordCount: z.ZodNumber;
32
+ chapter: z.ZodOptional<z.ZodString>;
33
+ truncated: z.ZodBoolean;
34
+ nextOffset: z.ZodOptional<z.ZodNumber>;
35
+ totalChars: z.ZodNumber;
36
+ cached: z.ZodBoolean;
37
+ };
38
+ export interface GetTranscriptArgs {
7
39
  video: string;
8
40
  language: string;
9
- }): Promise<{
10
- content: [{
11
- type: "text";
12
- text: string;
13
- }];
14
- }>;
41
+ format: 'text' | 'timestamped' | 'segments';
42
+ startTime?: string;
43
+ endTime?: string;
44
+ chapter?: string;
45
+ maxChars?: number;
46
+ offset: number;
47
+ refresh: boolean;
48
+ }
49
+ export declare function getTranscriptHandler(args: GetTranscriptArgs): Promise<CallToolResult>;
15
50
  //# sourceMappingURL=get-transcript.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-transcript.d.ts","sourceRoot":"","sources":["../../src/tools/get-transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB;;;CAQ/B,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,EACzC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;;;;;GAaA"}
1
+ {"version":3,"file":"get-transcript.d.ts","sourceRoot":"","sources":["../../src/tools/get-transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,eAAO,MAAM,mBAAmB;;;;;;;;;;CA+C/B,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;CAWrC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAuCD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwF3F"}