youtube-data-mcp
Version:
MCP server for YouTube data extraction - transcripts, comments, and search
93 lines • 3.52 kB
JavaScript
import { z } from "zod";
export const VideoUrlSchema = z.object({
url: z.string().describe("YouTube video URL or video ID"),
});
export const TranscriptInputSchema = {
url: z.string().describe("YouTube video URL or video ID"),
lang: z.string().default("en").describe('Language code for transcript (e.g., "en", "ko", "ja")'),
};
export const VideoInfoInputSchema = {
url: z.string().describe("YouTube video URL or video ID"),
};
export const CommentsInputSchema = {
url: z.string().optional().describe("YouTube video URL or video ID"),
limit: z.number().default(100).describe("Maximum number of comments to retrieve"),
sort: z.enum(["relevance", "time"]).default("relevance").describe("Sort order for comments"),
pageToken: z.string().optional().describe("Token for pagination (from previous response)"),
};
export const RepliesInputSchema = {
pageToken: z.string().describe("Reply token from a comment to get its replies"),
};
export const SearchInputSchema = {
query: z.string().describe("Search query for YouTube"),
limit: z.number().default(10).describe("Maximum number of results to return"),
gl: z.string().optional().describe("Country code for search results (e.g., 'us', 'kr', 'jp')"),
hl: z.string().optional().describe("Language code for search results (e.g., 'en', 'ko', 'ja')"),
sp: z.string().optional().describe("Special parameter for filtering or pagination"),
pageToken: z.string().optional().describe("Token for pagination from previous response"),
};
export const TranscriptOutputSchema = {
videoInfo: z.object({
id: z.string(),
title: z.string().optional(),
channelName: z.string().optional(),
publishedAt: z.string().optional(),
viewCount: z.string().optional(),
}),
fullText: z.string(),
language: z.string(),
};
export const VideoInfoOutputSchema = {
videoId: z.string(),
title: z.string().optional(),
viewCount: z.string().optional(),
publishDate: z.string().optional(),
channelName: z.string().optional(),
commentCount: z.number().optional(),
commentsNextPageToken: z.string().optional(),
commentsSortingTokens: z.array(z.object({
title: z.string(),
token: z.string(),
})).optional(),
};
export const CommentSchema = z.object({
commentId: z.string(),
author: z.string(),
text: z.string(),
time: z.string(),
likes: z.number(),
replies: z.number().optional(),
repliesToken: z.string().nullable().optional(),
});
export const CommentsOutputSchema = {
videoId: z.string(),
videoTitle: z.string().optional(),
comments: z.array(CommentSchema),
commentCount: z.number(),
nextPageToken: z.string().optional(),
};
export const RepliesOutputSchema = {
parentCommentId: z.string(),
replies: z.array(z.object({
commentId: z.string(),
author: z.string(),
text: z.string(),
time: z.string(),
likes: z.number(),
})),
replyCount: z.number(),
nextPageToken: z.string().optional(),
};
export const SearchOutputSchema = {
searchMetadata: z.any().optional(),
searchParameters: z.any().optional(),
videoResults: z.array(z.any()),
channelResults: z.array(z.any()).optional(),
playlistResults: z.array(z.any()).optional(),
pagination: z.object({
current: z.number().optional(),
next: z.string().optional(),
nextPageToken: z.string().optional(),
}).optional(),
};
//# sourceMappingURL=index.js.map