Skip to main content
Glama

xlsx-to-markdown

Transform XLSX files into Markdown text using the Markdownify MCP Server, enabling structured and readable document conversion for easy sharing and formatting.

Instructions

Convert an XLSX file to markdown

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filepathYesAbsolute path of the XLSX file to convert

Implementation Reference

  • Tool schema definition for 'xlsx-to-markdown', specifying input as filepath
    export const XlsxToMarkdownTool = ToolSchema.parse({ name: "xlsx-to-markdown", description: "Convert an XLSX file to markdown", inputSchema: { type: "object", properties: { filepath: { type: "string", description: "Absolute path of the XLSX file to convert", }, }, required: ["filepath"], }, });
  • Handler dispatch for 'xlsx-to-markdown' (and similar file tools) in CallToolRequestHandler, validates filepath and calls 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;
  • Main conversion logic for file-to-markdown tools including XLSX; downloads if URL, saves temp file, calls _markitdown, saves output to temp MD file
    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"); } } }
  • Core helper that executes the 'markitdown' CLI tool via 'uv run' to convert XLSX 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; }
  • src/server.ts:33-37 (registration)
    Tool registration via ListToolsRequestHandler, which returns all tools from tools.ts including 'xlsx-to-markdown'
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: Object.values(tools), }; });

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