youtube-to-markdown
Convert YouTube videos to markdown format with included transcripts using the Markdownify MCP Server, supporting enhanced UTF-8 and multilingual content.
Instructions
Convert a YouTube video to markdown, including transcript if available
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the YouTube video |
Input Schema (JSON Schema)
{
"properties": {
"url": {
"description": "URL of the YouTube video",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
}
Implementation Reference
- src/Markdownify.ts:51-92 (handler)Core handler function that fetches content from the provided YouTube URL, saves it to a temporary file, processes it using the markitdown tool to generate markdown, and returns the markdown text along with its file path.static async toMarkdown({ filePath, url, projectRoot = path.resolve(__dirname, ".."), uvPath = "~/.local/bin/uv", }: { filePath?: string; url?: string; projectRoot?: string; uvPath?: string; }): Promise<MarkdownResult> { try { let inputPath: string; let isTemporary = false; if (url) { const response = await fetch(url); const content = await response.text(); inputPath = await this.saveToTempFile(content); isTemporary = true; } else if (filePath) { inputPath = filePath; } else { throw new Error("Either filePath or url must be provided"); } const text = await this._markitdown(inputPath, projectRoot, uvPath); const outputPath = await this.saveToTempFile(text); if (isTemporary) { fs.unlinkSync(inputPath); } return { path: outputPath, text }; } catch (e: unknown) { if (e instanceof Error) { throw new Error(`Error processing to Markdown: ${e.message}`); } else { throw new Error("Error processing to Markdown: Unknown error occurred"); } } }
- src/tools.ts:3-17 (schema)Defines the tool schema including name, description, and input schema requiring a YouTube video URL.export const YouTubeToMarkdownTool = ToolSchema.parse({ name: "youtube-to-markdown", description: "Convert a YouTube video to markdown, including transcript if available", inputSchema: { type: "object", properties: { url: { type: "string", description: "URL of the YouTube video", }, }, required: ["url"], }, });
- src/server.ts:47-58 (registration)Tool registration in the CallToolRequest handler switch statement, which validates the URL argument and delegates execution to the Markdownify.toMarkdown handler.case tools.YouTubeToMarkdownTool.name: case tools.BingSearchResultToMarkdownTool.name: case tools.WebpageToMarkdownTool.name: if (!validatedArgs.url) { throw new Error("URL is required for this tool"); } result = await Markdownify.toMarkdown({ url: validatedArgs.url, projectRoot: validatedArgs.projectRoot, uvPath: validatedArgs.uvPath || process.env.UV_PATH, }); break;