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
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Absolute path of the XLSX file to convert |
Implementation Reference
- src/tools.ts:111-124 (schema)Tool schema definition for 'xlsx-to-markdown', specifying input as filepathexport 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"], }, });
- src/server.ts:72-86 (handler)Handler dispatch for 'xlsx-to-markdown' (and similar file tools) in CallToolRequestHandler, validates filepath and calls 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:74-124 (handler)Main conversion logic for file-to-markdown tools including XLSX; downloads if URL, saves temp file, calls _markitdown, saves output to temp MD filestatic 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"); } } }
- src/Markdownify.ts:20-51 (helper)Core helper that executes the 'markitdown' CLI tool via 'uv run' to convert XLSX file to markdown textprivate 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), }; });