image-to-markdown
Transform images into markdown format by extracting metadata and descriptions, enabling efficient content conversion with Markdownify MCP Server's UTF-8 enhanced capabilities.
Instructions
Convert an image to markdown, including metadata and description
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Absolute path of the image file to convert |
Input Schema (JSON Schema)
{
"properties": {
"filepath": {
"description": "Absolute path of the image file to convert",
"type": "string"
}
},
"required": [
"filepath"
],
"type": "object"
}
Implementation Reference
- src/server.ts:60-74 (handler)MCP server handler for the 'image-to-markdown' tool (grouped with other file converters): validates filepath argument and delegates conversion to Markdownify.toMarkdowncase tools.PDFToMarkdownTool.name: case tools.ImageToMarkdownTool.name: case tools.AudioToMarkdownTool.name: case tools.DocxToMarkdownTool.name: case tools.XlsxToMarkdownTool.name: case tools.PptxToMarkdownTool.name: if (!validatedArgs.filepath) { throw new Error("File path is required for this tool"); } result = await Markdownify.toMarkdown({ filePath: validatedArgs.filepath, projectRoot: validatedArgs.projectRoot, uvPath: validatedArgs.uvPath || process.env.UV_PATH, }); break;
- src/Markdownify.ts:51-92 (handler)Core conversion logic for file-based tools like 'image-to-markdown': processes filepath by executing markitdown CLI, handles temp files, returns markdown path and contentstatic 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:64-78 (schema)Input/output schema definition for the 'image-to-markdown' tool using MCP ToolSchemaexport const ImageToMarkdownTool = ToolSchema.parse({ name: "image-to-markdown", description: "Convert an image to markdown, including metadata and description", inputSchema: { type: "object", properties: { filepath: { type: "string", description: "Absolute path of the image file to convert", }, }, required: ["filepath"], }, });
- src/server.ts:31-35 (registration)Registers 'image-to-markdown' tool schema (via Object.values(tools)) for MCP listTools requestserver.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: Object.values(tools), }; });
- src/Markdownify.ts:19-40 (helper)Helper function that executes the markitdown CLI tool on the image filepath within the project's .venv to generate markdown outputprivate static async _markitdown( filePath: string, projectRoot: string, uvPath: string, ): Promise<string> { const venvPath = path.join(projectRoot, ".venv"); const markitdownPath = path.join(venvPath, "Scripts", "markitdown.exe"); if (!fs.existsSync(markitdownPath)) { throw new Error("markitdown executable not found"); } const { stdout, stderr } = await execAsync( `${venvPath}\\Scripts\\activate.bat && ${markitdownPath} "${filePath}"`, ); if (stderr) { throw new Error(`Error executing command: ${stderr}`); } return stdout; }