Skip to main content
Glama
bugzy-ai

Resend MCP Server

by bugzy-ai

resend_send_email

Send emails to recipients with HTML or plain text content, CC/BCC support, reply-to addresses, and custom tracking tags for monitoring.

Instructions

Send a single email to one or more recipients. Supports HTML and plain text content, CC/BCC, reply-to, and custom tags for tracking.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
toYesRecipient email address(es). Max 50 addresses.
subjectYesEmail subject line
htmlNoHTML version of the email body
textNoPlain text version. Auto-generated from HTML if omitted.
ccNoCC recipient(s)
bccNoBCC recipient(s)
reply_toNoReply-to email address(es)
tagsNoCustom metadata tags for tracking (max 50)

Implementation Reference

  • Handler for 'resend_send_email' tool: parses arguments with SendEmailRequestSchema, builds Resend email options, sends email, returns success with ID.
    case 'resend_send_email': {
      const args = SendEmailRequestSchema.parse(request.params.arguments);
    
      // Build email options - Resend requires html or text
      const emailOptions: Parameters<typeof resend.emails.send>[0] = {
        from: fromEmail,
        to: args.to,
        subject: args.subject,
        ...(args.html ? { html: args.html } : { text: args.text! }),
        ...(args.cc && { cc: args.cc }),
        ...(args.bcc && { bcc: args.bcc }),
        ...(args.reply_to && { replyTo: args.reply_to }),
        ...(args.tags && { tags: args.tags }),
      };
    
      const { data, error } = await resend.emails.send(emailOptions);
    
      if (error) {
        throw new Error(`Failed to send email: ${error.message}`);
      }
    
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify({
              success: true,
              id: data?.id,
              message: 'Email sent successfully',
            }),
          },
        ],
      };
    }
  • Input schema (Zod) for the resend_send_email tool defining parameters like to, subject, html/text, cc, bcc, etc.
    export const SendEmailRequestSchema = z
      .object({
        to: z
          .union([z.string().email(), z.array(z.string().email()).max(50)])
          .describe('Recipient email address(es). Max 50 addresses.'),
        subject: z.string().describe('Email subject line'),
        html: z.string().optional().describe('HTML version of the email body'),
        text: z
          .string()
          .optional()
          .describe('Plain text version. Auto-generated from HTML if omitted.'),
        cc: z
          .union([z.string().email(), z.array(z.string().email())])
          .optional()
          .describe('CC recipient(s)'),
        bcc: z
          .union([z.string().email(), z.array(z.string().email())])
          .optional()
          .describe('BCC recipient(s)'),
        reply_to: z
          .union([z.string().email(), z.array(z.string().email())])
          .optional()
          .describe('Reply-to email address(es)'),
        tags: z
          .array(TagSchema)
          .max(50)
          .optional()
          .describe('Custom metadata tags for tracking (max 50)'),
      })
      .refine((data) => data.html || data.text, {
        message: 'Either html or text must be provided',
        path: ['html', 'text'],
      });
  • src/index.ts:52-56 (registration)
    Tool registration in the MCP server: defines name, description, and inputSchema for listTools.
    {
      name: 'resend_send_email',
      description:
        'Send a single email to one or more recipients. Supports HTML and plain text content, CC/BCC, reply-to, and custom tags for tracking.',
      inputSchema: zodToJsonSchema(SendEmailRequestSchema),
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the action ('Send') and some features, but omits critical details like authentication requirements, rate limits, error handling, whether emails are queued or sent immediately, or what happens on success/failure. For a mutation tool with zero annotation coverage, this is inadequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently lists key features without redundancy. Every element ('Supports HTML and plain text content, CC/BCC, reply-to, and custom tags for tracking') adds value, and it's appropriately front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no annotations and no output schema, the description is insufficient. It covers basic purpose and features but lacks behavioral context (e.g., side effects, error responses), usage prerequisites, and output expectations. The high schema coverage helps, but the description doesn't compensate for the missing structural information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 8 parameters thoroughly. The description adds minimal value by listing some parameter categories (CC/BCC, reply-to, tags) but doesn't provide additional syntax, format, or usage details beyond what the schema provides. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Send a single email') and resource ('to one or more recipients'), with additional details about supported features (HTML/plain text, CC/BCC, reply-to, custom tags). It fully distinguishes what the tool does without relying on sibling tools for context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through feature mentions (e.g., 'for tracking'), but provides no explicit guidance on when to use this tool versus alternatives. Since there are no sibling tools, this is less critical, but it lacks any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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/bugzy-ai/resend-mcp-server'

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