Skip to main content
Glama
nam090320251

Dynamic Excel MCP Server

by nam090320251

generate_excel

Create Excel files from JSON schemas with custom layouts, multiple sheets, formulas, charts, and advanced formatting for reports, dashboards, and data exports.

Instructions

Generate an Excel file from a structured JSON schema.

Use this tool when the user wants to:

  • Create an Excel file

  • Export data to Excel

  • Generate a report/spreadsheet

  • Download data as .xlsx file

The tool accepts a JSON schema describing the structure, data, and formatting of the Excel file.

Supported features:

  • Multiple sheets

  • Custom column widths and formats

  • Cell styling (fonts, colors, borders, alignment)

  • Data validation

  • Conditional formatting

  • Formulas and totals

  • Charts and images

  • Page setup and printing options

  • Freeze panes, auto-filter

  • Merged cells

  • Grouped rows/columns

  • Sheet protection

Layout types:

  • table: Simple data table (default)

  • report: Formatted report with headers and styling

  • form: Form-style layout

  • dashboard: Dashboard with charts

  • calendar: Calendar view

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
file_nameNoName of the Excel file (e.g., "report.xlsx")
sheetsYesArray of sheet configurations
metadataNoWorkbook metadata
optionsNoOutput options

Implementation Reference

  • Main handler for the 'generate_excel' tool: validates input schema, selects generator (Basic or Report), generates Excel file buffer, uploads to storage (S3 or local), generates presigned URL, returns structured response with download link.
    server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name !== 'generate_excel') { throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` ); } try { logger.info('Received generate_excel request'); // Validate schema const validation = SchemaValidator.validate(request.params.arguments); if (!validation.success) { throw new McpError( ErrorCode.InvalidParams, `Schema validation failed: ${validation.errors.join(', ')}` ); } const config: ExcelConfig = validation.data; // Select appropriate generator const generator = selectGenerator(config); // Generate Excel file logger.info(`Generating Excel file: ${config.file_name}`); const buffer = await generator.generate(config); logger.info(`Excel file generated, size: ${buffer.length} bytes`); // Upload to storage const fileName = config.file_name || `report_${Date.now()}.xlsx`; const key = await storage.upload(buffer, fileName); // Get download URL let downloadUrl: string; if (storage instanceof S3Storage) { const expiresIn = parseInt(process.env.PRESIGNED_URL_EXPIRY || '3600'); downloadUrl = await storage.getPresignedUrl(key, expiresIn); } else { downloadUrl = await (storage as LocalStorage).getFileUrl(key); } logger.info('Excel file ready for download'); // Return result return { content: [ { type: 'text', text: JSON.stringify({ success: true, download_url: downloadUrl, file_name: fileName, file_size: buffer.length, sheets_count: config.sheets.length, message: 'Excel file generated successfully', expires_in: storageType === 's3' ? parseInt(process.env.PRESIGNED_URL_EXPIRY || '3600') : null, }, null, 2), }, ], }; } catch (error) { logger.error('Error generating Excel:', error); if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to generate Excel file: ${error instanceof Error ? error.message : 'Unknown error'}` ); } });
  • src/index.ts:57-148 (registration)
    Registers the 'generate_excel' tool in the MCP server with detailed description and comprehensive input schema for Excel generation configuration.
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: 'generate_excel', description: `Generate an Excel file from a structured JSON schema. Use this tool when the user wants to: - Create an Excel file - Export data to Excel - Generate a report/spreadsheet - Download data as .xlsx file The tool accepts a JSON schema describing the structure, data, and formatting of the Excel file. Supported features: - Multiple sheets - Custom column widths and formats - Cell styling (fonts, colors, borders, alignment) - Data validation - Conditional formatting - Formulas and totals - Charts and images - Page setup and printing options - Freeze panes, auto-filter - Merged cells - Grouped rows/columns - Sheet protection Layout types: - table: Simple data table (default) - report: Formatted report with headers and styling - form: Form-style layout - dashboard: Dashboard with charts - calendar: Calendar view`, inputSchema: { type: 'object', properties: { file_name: { type: 'string', description: 'Name of the Excel file (e.g., "report.xlsx")', }, sheets: { type: 'array', description: 'Array of sheet configurations', items: { type: 'object', properties: { name: { type: 'string', description: 'Sheet name', }, layout: { type: 'string', enum: ['table', 'report', 'form', 'dashboard', 'calendar'], description: 'Layout type for the sheet', }, columns: { type: 'array', description: 'Column definitions', }, data: { type: 'array', description: 'Array of data rows', }, formatting: { type: 'object', description: 'Formatting options', }, charts: { type: 'array', description: 'Charts to add to the sheet', }, }, required: ['name', 'columns', 'data'], }, }, metadata: { type: 'object', description: 'Workbook metadata', }, options: { type: 'object', description: 'Output options', }, }, required: ['sheets'], }, }, ], }; });
  • Zod schema definition for ExcelConfig used for input validation, defining structure for workbook, sheets, columns, data, formatting, charts, etc.
    export const ExcelSchema = z.object({ file_name: z.string().describe('Name of the Excel file'), sheets: z.array(SheetSchema).min(1), // Workbook metadata metadata: z.object({ title: z.string().optional(), subject: z.string().optional(), author: z.string().optional().default('AI Assistant'), description: z.string().optional(), company: z.string().optional(), category: z.string().optional(), keywords: z.array(z.string()).optional(), }).optional(), // Output options options: z.object({ storage: z.enum(['s3', 'local']).optional(), compress: z.boolean().optional(), password: z.string().optional(), }).optional(), }); // Export types export type ColumnConfig = z.infer<typeof ColumnSchema>; export type ConditionalFormatting = z.infer<typeof ConditionalFormattingSchema>; export type ChartConfig = z.infer<typeof ChartSchema>; export type FormattingConfig = z.infer<typeof FormattingSchema>; export type SheetConfig = z.infer<typeof SheetSchema>; export type ExcelConfig = z.infer<typeof ExcelSchema>;
  • Core method in BaseGenerator that creates an Excel worksheet: sets columns, applies header styles, adds data rows with formatting/validation, applies sheet-level formatting (freeze panes, filters, etc.), adds charts.
    protected async createSheet(sheetConfig: SheetConfig): Promise<ExcelJS.Worksheet> { const worksheet = this.workbook.addWorksheet(sheetConfig.name); // Setup columns worksheet.columns = sheetConfig.columns.map(col => ({ header: col.header, key: col.key, width: col.width || 15, })); // Apply header styling this.applyHeaderStyle(worksheet, sheetConfig.columns); // Add data rows await this.addDataRows(worksheet, sheetConfig); // Apply formatting if (sheetConfig.formatting) { await this.applyFormatting(worksheet, sheetConfig); } // Add charts if (sheetConfig.charts) { await this.addCharts(worksheet, sheetConfig.charts); } return worksheet; }
  • Generates the final Excel file buffer from the workbook using ExcelJS writeBuffer.
    protected async generateBuffer(): Promise<Buffer> { const buffer = await this.workbook.xlsx.writeBuffer(); return Buffer.from(buffer); }
Install Server

Other 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/nam090320251/dynamic-excel-mcp-server'

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