Skip to main content
Glama

generate_template

Create responsive email templates for newsletters, welcome messages, promotional campaigns, and transactional emails using MJML markup with customizable colors, fonts, and variables.

Instructions

Generate pre-built email templates

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
templateYesTemplate type
variablesNoTemplate variables to replace
customColorsNoCustom color scheme
customFontsNoCustom fonts
outputPathNoSave template to file path

Implementation Reference

  • Main handler function that parses input using GenerateTemplateSchema, generates MJML template via getTemplate helper, optionally saves to outputPath, and returns structured response with the MJML content.
    async handleGenerateTemplate(args) {
      const parsed = GenerateTemplateSchema.parse(args);
      log.info(`Generating template: ${parsed.template}`);
    
      const template = this.getTemplate(parsed.template, parsed.variables, parsed.customColors, parsed.customFonts);
      
      const saveResult = await this.saveOutput(template, parsed.outputPath);
    
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify({
              success: true,
              template: parsed.template,
              mjml: template,
              saved: saveResult,
            }, null, 2),
          },
        ],
      };
    }
  • Zod schema defining input parameters for the generate_template tool: required template type (enum), optional variables, custom colors/fonts, and output path.
    const GenerateTemplateSchema = z.object({
      template: z.enum([
        'newsletter', 'welcome', 'promotional', 'transactional', 
        'password-reset', 'verification', 'announcement', 'invitation'
      ]).describe('Template type'),
      variables: z.record(z.string()).optional().describe('Template variables to replace'),
      customColors: z.record(z.string()).optional().describe('Custom color scheme'),
      customFonts: z.record(z.string()).optional().describe('Custom fonts'),
      outputPath: z.string().optional().describe('Save template to file path'),
    });
  • index.js:211-240 (registration)
    Tool registration in ListToolsRequestHandler, providing name, description, and inputSchema mirroring the Zod schema for MCP tool discovery.
      name: 'generate_template',
      description: 'Generate pre-built email templates',
      inputSchema: {
        type: 'object',
        properties: {
          template: {
            type: 'string',
            enum: ['newsletter', 'welcome', 'promotional', 'transactional', 'password-reset', 'verification', 'announcement', 'invitation'],
            description: 'Template type',
          },
          variables: {
            type: 'object',
            description: 'Template variables to replace',
          },
          customColors: {
            type: 'object',
            description: 'Custom color scheme',
          },
          customFonts: {
            type: 'object',
            description: 'Custom fonts',
          },
          outputPath: {
            type: 'string',
            description: 'Save template to file path',
          },
        },
        required: ['template'],
      },
    },
  • Helper method that selects predefined MJML email templates based on type, applies custom colors/fonts/default variables via replacement, and returns the final MJML string.
      getTemplate(type, variables = {}, customColors = {}, customFonts = {}) {
        const defaultColors = {
          primary: '#007bff',
          secondary: '#6c757d',
          success: '#28a745',
          danger: '#dc3545',
          warning: '#ffc107',
          info: '#17a2b8',
          light: '#f8f9fa',
          dark: '#343a40',
        };
    
        const colors = { ...defaultColors, ...customColors };
    
        const defaultFonts = {
          'Lato': 'https://fonts.googleapis.com/css?family=Lato:300,400,700,900',
          'Open Sans': 'https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800',
        };
    
        const fonts = { ...defaultFonts, ...customFonts };
    
        const defaultVars = {
          company_name: 'Your Company',
          company_logo: 'https://via.placeholder.com/150x50',
          unsubscribe_url: '#',
          website_url: '#',
          support_email: 'support@example.com',
          current_year: new Date().getFullYear(),
          ...variables,
        };
    
        const templates = {
          newsletter: `<mjml>
      <mj-head>
        <mj-attributes>
          <mj-all font-family="Lato, sans-serif" />
          <mj-section background-color="#ffffff" />
          <mj-column padding="0" />
          <mj-text font-size="14px" line-height="22px" color="#4a5568" />
          <mj-button background-color="${colors.primary}" color="#ffffff" border-radius="4px" />
        </mj-attributes>
        <mj-font name="Lato" href="${fonts['Lato']}" />
        <mj-title>{{company_name}} Newsletter</mj-title>
        <mj-preview>Our latest updates and news</mj-preview>
      </mj-head>
      <mj-body background-color="#f7fafc">
        <mj-section background-color="${colors.primary}" padding="40px 0">
          <mj-column>
            <mj-text align="center" color="#ffffff" font-size="24px" font-weight="bold">
              {{company_name}} Newsletter
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="16px" padding-top="10px">
              {{newsletter_date}}
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="40px 30px">
          <mj-column>
            <mj-text font-size="28px" font-weight="bold" color="#2d3748" align="center">
              {{main_title}}
            </mj-text>
            <mj-text align="center" padding-top="10px">
              {{main_subtitle}}
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="0 30px 40px">
          <mj-column>
            <mj-image src="{{featured_image}}" width="100%" border-radius="8px" />
            <mj-text padding-top="20px" font-size="18px" font-weight="600">
              {{featured_title}}
            </mj-text>
            <mj-text padding-top="10px">
              {{featured_content}}
            </mj-text>
            <mj-button href="{{featured_link}}" padding-top="20px">
              Read More
            </mj-button>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#edf2f7" padding="40px 30px">
          <mj-column>
            <mj-text font-size="20px" font-weight="bold" color="#2d3748" align="center">
              More Updates
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#edf2f7" padding="0 30px 40px">
          <mj-column>
            <mj-text font-size="16px" font-weight="600">
              {{update1_title}}
            </mj-text>
            <mj-text padding-top="5px" font-size="14px">
              {{update1_content}}
            </mj-text>
            <mj-divider border-color="#cbd5e0" border-width="1px" padding="20px 0" />
            <mj-text font-size="16px" font-weight="600">
              {{update2_title}}
            </mj-text>
            <mj-text padding-top="5px" font-size="14px">
              {{update2_content}}
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="${colors.dark}" padding="40px 30px">
          <mj-column>
            <mj-social-element-mode>
              <mj-social facebook-url="{{facebook_url}}" twitter-url="{{twitter_url}}" instagram-url="{{instagram_url}}" />
            </mj-social-element-mode>
            <mj-text align="center" color="#ffffff" font-size="12px" padding-top="20px">
              © {{current_year}} {{company_name}}. All rights reserved.
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="12px" padding-top="10px">
              <a href="{{unsubscribe_url}}" style="color: #ffffff; text-decoration: underline;">Unsubscribe</a>
            </mj-text>
          </mj-column>
        </mj-section>
      </mj-body>
    </mjml>`,
    
          welcome: `<mjml>
      <mj-head>
        <mj-attributes>
          <mj-all font-family="Open Sans, sans-serif" />
          <mj-section background-color="#ffffff" />
          <mj-column padding="0" />
          <mj-text font-size="14px" line-height="22px" color="#4a5568" />
          <mj-button background-color="${colors.success}" color="#ffffff" border-radius="6px" font-weight="600" />
        </mj-attributes>
        <mj-font name="Open Sans" href="${fonts['Open Sans']}" />
        <mj-title>Welcome to {{company_name}}!</mj-title>
      </mj-head>
      <mj-body background-color="#f7fafc">
        <mj-section background-color="${colors.success}" padding="60px 0">
          <mj-column>
            <mj-text align="center" color="#ffffff" font-size="36px" font-weight="bold">
              Welcome!
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="18px" padding-top="10px">
              We're excited to have you on board
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="50px 30px">
          <mj-column>
            <mj-text align="center" font-size="24px" font-weight="600" color="#2d3748">
              Hi {{user_name}},
            </mj-text>
            <mj-text align="center" padding-top="20px" font-size="16px">
              Thank you for joining {{company_name}}! We're thrilled to have you as part of our community.
            </mj-text>
            <mj-text align="center" padding-top="15px" font-size="16px">
              Your account has been successfully created and you're ready to start exploring all the amazing features we have to offer.
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#f7fafc" padding="40px 30px">
          <mj-column>
            <mj-text align="center" font-size="20px" font-weight="600" color="#2d3748">
              Next Steps
            </mj-text>
            <mj-text align="center" padding-top="20px">
              Here are a few things you can do to get started:
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="0 30px 40px">
          <mj-column width="50%">
            <mj-text align="center" font-size="16px" font-weight="600" padding-bottom="10px">
              ✓ Complete Your Profile
            </mj-text>
            <mj-text align="center" font-size="14px">
              Add your personal information and preferences
            </mj-text>
          </mj-column>
          <mj-column width="50%">
            <mj-text align="center" font-size="16px" font-weight="600" padding-bottom="10px">
              ✓ Explore Features
            </mj-text>
            <mj-text align="center" font-size="14px">
              Discover everything {{company_name}} can do
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="0 30px 40px">
          <mj-column>
            <mj-button href="{{dashboard_url}}" font-size="16px" padding="15px 30px">
              Go to Dashboard
            </mj-button>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#edf2f7" padding="30px">
          <mj-column>
            <mj-text align="center" font-size="14px" color="#718096">
              If you have any questions, don't hesitate to contact our support team at
              <a href="mailto:{{support_email}}" style="color: ${colors.primary};">{{support_email}}</a>
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="${colors.dark}" padding="30px">
          <mj-column>
            <mj-text align="center" color="#ffffff" font-size="12px">
              © {{current_year}} {{company_name}}. All rights reserved.
            </mj-text>
          </mj-column>
        </mj-section>
      </mj-body>
    </mjml>`,
    
          promotional: `<mjml>
      <mj-head>
        <mj-attributes>
          <mj-all font-family="Lato, sans-serif" />
          <mj-section background-color="#ffffff" />
          <mj-column padding="0" />
          <mj-text font-size="14px" line-height="22px" color="#4a5568" />
          <mj-button background-color="${colors.danger}" color="#ffffff" border-radius="4px" font-weight="bold" />
        </mj-attributes>
        <mj-font name="Lato" href="${fonts['Lato']}" />
        <mj-title>🔥 Limited Time Offer from {{company_name}}</mj-title>
        <mj-preview>Don't miss out on these amazing deals!</mj-preview>
      </mj-head>
      <mj-body background-color="#000000">
        <mj-section background-color="${colors.danger}" padding="20px 0">
          <mj-column>
            <mj-text align="center" color="#ffffff" font-size="24px" font-weight="bold">
              🔥 FLASH SALE
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="18px" padding-top="5px">
              {{discount_percentage}} OFF EVERYTHING
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="16px" padding-top="5px">
              Ends in {{time_remaining}}
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#ffffff" padding="40px 30px">
          <mj-column>
            <mj-text align="center" font-size="28px" font-weight="bold" color="#2d3748">
              {{promotion_title}}
            </mj-text>
            <mj-text align="center" padding-top="15px" font-size="16px">
              {{promotion_description}}
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#fff3cd" padding="20px 30px">
          <mj-column>
            <mj-text align="center" font-size="18px" font-weight="600" color="#856404">
              ⏰ Hurry! Limited Time Offer
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section padding="30px">
          <mj-column>
            <mj-image src="{{product_image}}" width="100%" />
            <mj-text align="center" font-size="20px" font-weight="bold" padding-top="20px">
              {{product_name}}
            </mj-text>
            <mj-text align="center" padding-top="10px">
              {{product_description}}
            </mj-text>
            <mj-text align="center" padding-top="10px">
              <span style="text-decoration: line-through; color: #718096;">${{original_price}}</span>
              <span style="font-size: 24px; font-weight: bold; color: ${colors.danger};">${{sale_price}}</span>
            </mj-text>
            <mj-button href="{{shop_url}}" background-color="${colors.danger}" padding-top="20px">
              Shop Now - {{discount_percentage}} OFF
            </mj-button>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#f8f9fa" padding="40px 30px">
          <mj-column>
            <mj-text align="center" font-size="18px" font-weight="600" color="#2d3748">
              Why Choose {{company_name}}?
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#f8f9fa" padding="0 30px 40px">
          <mj-column width="33%">
            <mj-text align="center" font-size="16px" font-weight="600">
              ✓ Free Shipping
            </mj-text>
          </mj-column>
          <mj-column width="33%">
            <mj-text align="center" font-size="16px" font-weight="600">
              ✓ 30-Day Returns
            </mj-text>
          </mj-column>
          <mj-column width="34%">
            <mj-text align="center" font-size="16px" font-weight="600">
              ✓ 24/7 Support
            </mj-text>
          </mj-column>
        </mj-section>
    
        <mj-section background-color="#343a40" padding="30px">
          <mj-column>
            <mj-text align="center" color="#ffffff" font-size="12px">
              © {{current_year}} {{company_name}}. All rights reserved.
            </mj-text>
            <mj-text align="center" color="#ffffff" font-size="12px" padding-top="10px">
              <a href="{{unsubscribe_url}}" style="color: #ffffff; text-decoration: underline;">Unsubscribe</a>
            </mj-text>
          </mj-column>
        </mj-section>
      </mj-body>
    </mjml>`,
        };
    
        let template = templates[type] || templates.newsletter;
        
        // Replace variables
        Object.entries(defaultVars).forEach(([key, value]) => {
          const regex = new RegExp(`{{${key}}}`, 'g');
          template = template.replace(regex, value);
        });
    
        return template;
      }

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/shaunie2fly/mjml_mcp'

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