send_invoice_email
Send professional invoices via email by providing invoice data and recipient email address. Create PDF invoices with customizable email subjects and messages for business transactions.
Instructions
Create and send an invoice via email
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_data | Yes | Complete invoice data including company info, bill-to info, items, etc. | |
| recipient_email | Yes | Email address to send the invoice to | |
| subject | No | Optional custom email subject | |
| message | No | Optional custom email message body |
Implementation Reference
- src/email-service.ts:5-80 (handler)The function implementing the actual email sending logic for the 'send_invoice_email' tool.
export async function sendInvoiceEmail( invoiceData: InvoiceData, recipientEmail: string, customSubject?: string, customMessage?: string ): Promise<void> { // Check if email configuration is available const smtpConfig = { host: process.env.SMTP_HOST, port: parseInt(process.env.SMTP_PORT || '587'), secure: false, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS, }, }; if (!smtpConfig.host || !smtpConfig.auth.user || !smtpConfig.auth.pass) { throw new Error('Email configuration missing. Please set SMTP_HOST, SMTP_USER, and SMTP_PASS environment variables.'); } // Generate PDF const pdfPath = await generateInvoicePDF(invoiceData); const pdfBuffer = await fs.readFile(pdfPath); // Create transporter (fixed method name) const transporter = nodemailer.createTransport(smtpConfig); // Email content const subject = customSubject || `Invoice ${invoiceData.invoiceNumber} from ${invoiceData.company.name}`; const defaultMessage = `Dear ${invoiceData.billTo.name}, Please find attached invoice ${invoiceData.invoiceNumber} dated ${invoiceData.date}. ${invoiceData.dueDate ? `Payment is due by ${invoiceData.dueDate}.` : ''} If you have any questions regarding this invoice, please don't hesitate to contact us. Thank you for your business! Best regards, ${invoiceData.company.name} ${invoiceData.company.phone ? `Phone: ${invoiceData.company.phone}` : ''} ${invoiceData.company.email ? `Email: ${invoiceData.company.email}` : ''}`; const message = customMessage || defaultMessage; // Send email const mailOptions = { from: { name: process.env.FROM_NAME || invoiceData.company.name, address: process.env.FROM_EMAIL || process.env.SMTP_USER!, }, to: recipientEmail, subject, text: message, attachments: [ { filename: `invoice-${invoiceData.invoiceNumber}.pdf`, content: pdfBuffer, contentType: 'application/pdf', }, ], }; await transporter.sendMail(mailOptions); // Clean up temporary PDF file try { await fs.unlink(pdfPath); } catch (error) { // Ignore cleanup errors console.warn('Failed to clean up temporary PDF file:', error); } } - src/index.ts:159-175 (registration)The handler in the MCP server setup that invokes the 'sendInvoiceEmail' service function.
case 'send_invoice_email': { const invoiceData = InvoiceDataSchema.parse(args.invoice_data); const recipientEmail = args.recipient_email as string; const subject = args.subject as string | undefined; const message = args.message as string | undefined; await sendInvoiceEmail(invoiceData, recipientEmail, subject, message); return { content: [ { type: 'text', text: `Invoice sent successfully to ${recipientEmail}`, }, ], }; } - src/index.ts:96-120 (schema)The MCP tool definition and input schema for 'send_invoice_email'.
name: 'send_invoice_email', description: 'Create and send an invoice via email', inputSchema: { type: 'object', properties: { invoice_data: { type: 'object', description: 'Complete invoice data including company info, bill-to info, items, etc.', }, recipient_email: { type: 'string', description: 'Email address to send the invoice to', }, subject: { type: 'string', description: 'Optional custom email subject', }, message: { type: 'string', description: 'Optional custom email message body', }, }, required: ['invoice_data', 'recipient_email'], }, },