Skip to main content
Glama

image-to-markdown

Convert images to markdown format with metadata and descriptions for easy integration into documentation and content.

Instructions

Convert an image to markdown, including metadata and description

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filepathYesAbsolute path of the image file to convert

Implementation Reference

  • Core handler function that performs the image-to-markdown conversion by executing the markitdown tool via uv on the provided filepath, handling temporary files, and returning the markdown output path and text.
    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); let extension = null; if (url.endsWith(".pdf")) { extension = "pdf"; } const arrayBuffer = await response.arrayBuffer(); const content = Buffer.from(arrayBuffer); inputPath = await this.saveToTempFile(content, extension); 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"); } } }
  • Input schema definition for the image-to-markdown tool, specifying the required filepath parameter.
    export 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:33-37 (registration)
    Registers the image-to-markdown tool (along with others) by including it in the list of available tools returned via Object.values(tools).
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: Object.values(tools), }; });
  • Dispatch handler in the tool call switch statement that matches image-to-markdown and invokes the Markdownify.toMarkdown helper with the filepath argument.
    case 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;
  • Private helper method that executes the markitdown binary using uv run to convert the image file to markdown text.
    private static async _markitdown( filePath: string, projectRoot: string, uvPath: string, ): Promise<string> { const venvPath = path.join(projectRoot, ".venv"); const markitdownPath = path.join( venvPath, process.platform === "win32" ? "Scripts" : "bin", `markitdown${process.platform === "win32" ? ".exe" : ""}`, ); if (!fs.existsSync(markitdownPath)) { throw new Error("markitdown executable not found"); } // Expand tilde in uvPath if present const expandedUvPath = expandHome(uvPath); // Use execFile to prevent command injection const { stdout, stderr } = await execFileAsync(expandedUvPath, [ "run", markitdownPath, filePath, ]); if (stderr) { throw new Error(`Error executing command: ${stderr}`); } return stdout; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zcaceres/markdownify-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server