Minimal handler
Et plugin består af to filer: et manifest og en handler.
import type { PluginManifest } from "@maili/plugin-sdk";
export const manifest: PluginManifest = {
slug: "mit-plugin",
name: "Mit plugin",
description: "Beskrivelse af hvad plugin'et gør.",
auth: { type: "apiKey" },
hooks: ["onDraft"],
};import { createPluginHttpHandler, type PluginHandler } from "@maili/plugin-sdk";
import { manifest } from "./manifest.js";
const handler: PluginHandler = async (ctx) => {
// ctx.email, ctx.inbox, ctx.config, ctx.secrets
return { context: "### Min kontekst\nNoget nyttigt info." };
};
export const httpHandler = createPluginHttpHandler(handler);
export { manifest };PluginContext
Handleren får en PluginContext med al information om den aktuelle mail:
- ctx.user — brugerens id.
- ctx.inbox — indbakkens email og provider (gmail/outlook).
- ctx.email — from, subject, bodyPlain, receivedAt.
- ctx.config — brugerens konfiguration fra plugin-formularen.
- ctx.secrets — krypterede hemmeligheder (API-nøgler, OAuth-tokens).
Returnér kontekst eller label-forslag
return {
context: "### Slack-kontekst\nBrugeren har 3 åbne tråde i #support",
suggestedLabels: [{ name: "Kundeservice" }],
};Plugins må ikke throwe. Returnér altid et objekt — tomt hvis pluginnet ikke har noget at bidrage med.
Deploy
- Vercel: eksporter httpHandler som default fra en /api/handler.ts.
- Supabase Edge Functions: serve ved at kalde httpHandler inde i Deno.serve.
- Cloudflare Workers, AWS Lambda, osv. — alle understøttes.
Registrer plugin'et ved at indsætte en række i plugins-tabellen med manifest og entrypoint_url. Kontakt hej@maili.dk for at få det listet i Mailis officielle plugin-galleri.
Ydelseskrav
- Plugins skal svare inden for 5 sekunder.
- Plugins må ikke kaste uopfangede fejl — returnér {} i stedet.
- Begræns output til ca. 1000 tokens markdown, så promptbudgettet ikke sprænges.