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);
    }

Tool Definition Quality

Score is being calculated. Check back soon.

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