send_custom_email
Send personalized emails programmatically using the Advanced PocketBase MCP Server. Integrate custom email functionality for user notifications, updates, or alerts directly within your database workflows.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/agent-simple.ts:802-836 (handler)Primary MCP tool handler function for 'send_custom_email'. Ensures email service is loaded, calls the underlying sendCustomEmail helper, handles errors, and returns formatted MCP response with email log details.async ({ to, from, subject, html, text }) => { // Lazy load Email service await this.ensureEmailService(); if (!this.emailService) { throw new Error('Email service not available. Please configure EMAIL_SERVICE or SMTP settings.'); } try { const result = await this.emailService.sendCustomEmail({ to, from, subject, html, text }); return { content: [{ type: 'text', text: JSON.stringify({ success: true, emailLog: { id: result.id, to: result.to, subject: result.subject, status: result.status, sentAt: result.created } }, null, 2) }] }; } catch (error: any) { throw new Error(`Failed to send email: ${error.message}`); } }
- src/services/email.ts:176-212 (helper)Core helper function in EmailService that sends the email using nodemailer transporter and creates an email log record in PocketBase database.async sendCustomEmail(data: { to: string; from?: string; subject: string; html: string; text?: string; }): Promise<EmailLog> { try { // Send email const info = await this.transporter.sendMail({ from: data.from || process.env.SMTP_USER || process.env.DEFAULT_FROM_EMAIL, to: data.to, subject: data.subject, html: data.html, text: data.text, }); // Log email const emailLog = await this.pb.collection('email_logs').create({ to: data.to, from: data.from || process.env.SMTP_USER || process.env.DEFAULT_FROM_EMAIL, subject: data.subject, status: 'sent', }); return emailLog as unknown as EmailLog; } catch (error: any) { // Log failed email const emailLog = await this.pb.collection('email_logs').create({ to: data.to, from: data.from || process.env.SMTP_USER || process.env.DEFAULT_FROM_EMAIL, subject: data.subject, status: 'failed', error: error.message, }); throw new Error(`Failed to send custom email: ${error.message}`); } }
- src/agent-simple.ts:793-800 (schema)Zod input schema defining the parameters accepted by the send_custom_email tool.description: 'Send a custom email with specified content', inputSchema: { to: z.string().email().describe('Recipient email address'), from: z.string().email().optional().describe('Sender email address'), subject: z.string().describe('Email subject'), html: z.string().describe('HTML email body'), text: z.string().optional().describe('Plain text email body') }
- src/agent-simple.ts:790-837 (registration)Registration of the 'send_custom_email' tool on the MCP server, including schema and inline handler function.this.server.tool( 'send_custom_email', { description: 'Send a custom email with specified content', inputSchema: { to: z.string().email().describe('Recipient email address'), from: z.string().email().optional().describe('Sender email address'), subject: z.string().describe('Email subject'), html: z.string().describe('HTML email body'), text: z.string().optional().describe('Plain text email body') } }, async ({ to, from, subject, html, text }) => { // Lazy load Email service await this.ensureEmailService(); if (!this.emailService) { throw new Error('Email service not available. Please configure EMAIL_SERVICE or SMTP settings.'); } try { const result = await this.emailService.sendCustomEmail({ to, from, subject, html, text }); return { content: [{ type: 'text', text: JSON.stringify({ success: true, emailLog: { id: result.id, to: result.to, subject: result.subject, status: result.status, sentAt: result.created } }, null, 2) }] }; } catch (error: any) { throw new Error(`Failed to send email: ${error.message}`); } } );
- src/worker.ts:329-342 (schema)Tool schema definition in Cloudflare Worker tools/list response for send_custom_email.name: 'send_custom_email', description: 'Send a custom email with specified content', inputSchema: { type: 'object', properties: { to: { type: 'string', format: 'email', description: 'Recipient email address' }, from: { type: 'string', format: 'email', description: 'Sender email address' }, subject: { type: 'string', description: 'Email subject' }, html: { type: 'string', description: 'HTML email body' }, text: { type: 'string', description: 'Plain text email body' } }, required: ['to', 'subject', 'html'] } }