Skip to main content
Glama

image-to-markdown

Convert images into Markdown format with metadata and descriptions for easy readability and sharing. Use this tool to streamline the transformation of visual content into text-based Markdown files.

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

  • MCP tool call handler for image-to-markdown (grouped with other file converters), validates filepath and delegates to Markdownify.toMarkdown
    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;
  • Input schema definition for the image-to-markdown tool using ToolSchema
    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 (among others from tools.ts) in the MCP server's listTools handler
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: Object.values(tools), }; });
  • Core helper method that performs the actual conversion for file inputs like images by executing the 'markitdown' tool via uv
    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"); } } }
  • Private helper that executes the external 'markitdown' binary to convert image (and other files) to markdown
    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; }

Other Tools

Related Tools

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