Integraties

E-mail versturen vanuit Model Context Protocol

Bouw een MCP-server die je AI-model rechtstreeks e-mails laat versturen via Wesender.

Agent-framework Webhooks

Vereisten

  • Wesender-account met geverifieerd verzenddomein
  • API-sleutel (WESENDER_API_KEY)
  • Node.js 18 of nieuwer
  • Een MCP-client zoals Claude Desktop of een eigen implementatie

Stap 1: Installeer de benodigde packages

Maak een nieuw Node.js-project aan en installeer de MCP SDK en de Wesender Node.js SDK.

npm init -y
npm install @modelcontextprotocol/sdk @wesender/node
npm install -D typescript @types/node tsx

Stap 2: Definieer de send_email tool

Registreer een ListTools-handler die jouw MCP-client vertelt welke tools beschikbaar zijn. De send_email tool accepteert from, to, subject en html.

import { Server } from "@modelcontextprotocol/sdk/server/index.js"
import { ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"

server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "send_email",
      description: "Verstuur een transactionele e-mail via Wesender",
      inputSchema: {
        type: "object" as const,
        properties: {
          from:    { type: "string", description: "Afzenderadres op je geverifieerde domein" },
          to:      { type: "string", description: "Ontvanger-e-mailadres" },
          subject: { type: "string", description: "Onderwerpregel" },
          html:    { type: "string", description: "HTML-inhoud van het bericht" },
        },
        required: ["from", "to", "subject", "html"],
      },
    },
  ],
}))

Stap 3: Verwerk de tool-aanroep

De CallTool-handler ontvangt de argumenten van het AI-model en roept de Wesender API aan. Fouten worden teruggegeven zodat het model ze kan verwerken.

import { CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js"
import { Wesender } from "@wesender/node"

const emailClient = new Wesender(process.env.WESENDER_API_KEY!)

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name !== "send_email") {
    return { isError: true, content: [{ type: "text" as const, text: "Onbekend tool" }] }
  }
  const { from, to, subject, html } = request.params.arguments as Record<string, string>
  try {
    const result = await emailClient.emails.send({ from, to, subject, html })
    return { content: [{ type: "text" as const, text: "E-mail verstuurd: " + result.id }] }
  } catch (err) {
    return { isError: true, content: [{ type: "text" as const, text: "Fout: " + String(err) }] }
  }
})

Stap 4: Start de server en koppel aan je MCP-client

Verbind de server met een StdioServerTransport en voeg hem toe aan de configuratie van je MCP-client.

// mcp-client-config.json (bijvoorbeeld Claude Desktop)
{
  "mcpServers": {
    "wesender": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "WESENDER_API_KEY": "ws_jouw_sleutel"
      }
    }
  }
}

Volledig voorbeeld

Hier is de volledige implementatie in src/index.ts:

import { Server } from "@modelcontextprotocol/sdk/server/index.js"
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js"
import { Wesender } from "@wesender/node"

const emailClient = new Wesender(process.env.WESENDER_API_KEY!)

const server = new Server(
  { name: "wesender-mcp", version: "1.0.0" },
  { capabilities: { tools: {} } }
)

server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "send_email",
      description: "Verstuur een transactionele e-mail via Wesender",
      inputSchema: {
        type: "object" as const,
        properties: {
          from:    { type: "string", description: "Afzenderadres op je geverifieerde domein" },
          to:      { type: "string", description: "Ontvanger-e-mailadres" },
          subject: { type: "string", description: "Onderwerpregel" },
          html:    { type: "string", description: "HTML-inhoud van het bericht" },
        },
        required: ["from", "to", "subject", "html"],
      },
    },
  ],
}))

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name !== "send_email") {
    return {
      isError: true,
      content: [{ type: "text" as const, text: "Onbekend tool: " + request.params.name }],
    }
  }
  const { from, to, subject, html } = request.params.arguments as Record<string, string>
  try {
    const result = await emailClient.emails.send({ from, to, subject, html })
    return {
      content: [{ type: "text" as const, text: "E-mail verstuurd, id: " + result.id }],
    }
  } catch (err) {
    return {
      isError: true,
      content: [{ type: "text" as const, text: "Verzending mislukt: " + String(err) }],
    }
  }
})

const transport = new StdioServerTransport()
await server.connect(transport)

Bezorgstatussen via webhooks

Model Context Protocol kan bezorg-, bounce- en klachtsignalen ontvangen via webhooks. Configureer een webhook-endpoint in je Model Context Protocol-workflow dat POST-verzoeken van Wesender accepteert. Zie Webhooks instellen voor de volledige configuratiestappen en het payload-formaat.

Veelgestelde vragen

Is dit een officiele Wesender MCP-server?

Nee, dit is een referentie-implementatie die laat zien hoe je de Wesender REST API omhult met het Model Context Protocol. Je kunt hem direct gebruiken of aanpassen aan je eigen situatie.

Welke MCP-clients werken met deze server?

Elke MCP-client die het Model Context Protocol ondersteunt, waaronder Claude Desktop, Cursor en zelfgebouwde clients via de officiiele MCP SDK. Voeg de serverconfiguratie toe aan het JSON-configuratiebestand van je client.

Kan ik meerdere tools toevoegen, zoals een tool om e-mailstatus op te vragen?

Ja. Voeg extra items toe aan de tools-array in de ListTools-handler en verwerk ze in de CallTool-handler. De Wesender API biedt ook endpoints voor berichtstatus en berichtgeschiedenis.

Volgende stappen