E-mail versturen vanuit Model Context Protocol
Bouw een MCP-server die je AI-model rechtstreeks e-mails laat versturen via Wesender.
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.