MailKite
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MAILKITE_API_KEY | Yes | Your MailKite API key (starts with mk_live_) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mailkite_sendA | Send a message over a verified domain. Pass |
| mailkite_send_batchA | Send one personalized message per recipient (up to 50) in a single call. Shared fields form the base message; each |
| mailkite_send_eventA | Record one application-level fact about a user — |
| mailkite_list_eventsA | List recorded events, newest first — the surface for confirming a POST landed and for debugging a sequence that did not trigger. Filter by |
| mailkite_list_event_namesA | List the distinct event names this account works with, so an editor can offer them instead of asking you to remember one. Returns both events actually posted (with a count and when one last arrived) and events your sequences already trigger on or wait for but that may never have been sent — sequences are routinely written before the application emits the event, so a list of only-what-you-have-sent would be a trap. Requires an API key (mk_live_…). |
| mailkite_list_sequencesA | List your sequences, newest first, each with live enrollment counts. Archived sequences are omitted. Requires an API key (mk_live_…). |
| mailkite_create_sequenceA | Create a sequence: a declared input shape, the steps a contact walks over time, and zero or more triggers. A sequence is a function — |
| mailkite_get_sequenceA | Get one sequence with its definition and live enrollment counts. Requires an API key (mk_live_…). |
| mailkite_update_sequenceA | Edit a sequence. Changing the STEPS bumps its version and contacts already in flight keep walking the version they started on, so an edit can never make someone skip or repeat a step. Nothing else re-pins anybody — a rename, a pause, the input signature, and the trigger set are all editable while people are mid-flight. Archiving retires everyone in flight; pausing deliberately does not, so unpausing resumes rather than restarts. Requires an API key (mk_live_…). |
| mailkite_delete_sequenceA | Delete a sequence and retire every contact still walking it. The response reports how many were canceled. Requires an API key (mk_live_…). |
| mailkite_list_triggersA | List the triggers attached to a sequence — the doors into it. Requires an API key (mk_live_…). |
| mailkite_create_triggerA | Attach a trigger: when this event arrives, enroll the contact it is about. Attaching never bumps the sequence's version and never touches anyone already in flight — a trigger is a fact about the outside world, a sequence is a program, and they change on different rhythms. The sequence needs a |
| mailkite_update_triggerA | Edit a trigger, or toggle |
| mailkite_delete_triggerA | Detach a trigger. Stops future enrollments through that door and nothing else. Requires an API key (mk_live_…). |
| mailkite_start_sequenceA | Start a sequence for one contact, directly — when your code already knows WHICH sequence it wants. Takes a sequence NAME or id, so "start the dunning sequence" needs no lookup. Returns the enrollment it created: the run you then inspect, follow, or cancel. Refused with 409 when the address is suppressed, is already running on a |
| mailkite_stop_sequenceA | Stop whatever is chasing someone. Pass the |
| mailkite_list_enrollmentsA | List who is in a sequence and where each of them is. Filter with |
| mailkite_get_enrollmentA | Get one enrollment — which sequence, which step, and what happens next. Requires an API key (mk_live_…). |
| mailkite_list_enrollment_runsA | Every step this enrollment has executed, with the outcome and the reason for it. This is the "why didn't step 3 fire" view. Requires an API key (mk_live_…). |
| mailkite_cancel_enrollmentA | Cancel one specific run by its enrollment id — the per-row action when you are looking at the enrollments table. To stop whatever is chasing a contact without knowing which run, use stopSequence. Requires an API key (mk_live_…). |
| mailkite_upload_attachmentA | Upload a file to MailKite storage and get back a secure, time-limited URL. Reference the returned |
| mailkite_list_templatesA | List your saved email templates (light metadata only — no body). Use getTemplate for the full template. Requires a management session token. |
| mailkite_list_base_templatesA | List the premade base templates (light metadata). Clone one with createTemplate({ baseId }) or send from it directly via send({ templateId }). Requires a management session token. |
| mailkite_get_templateA | Get one template (full: subject, html, text, theme). Works for your templates (tpl_…) and base templates (base_…). Requires a management session token. |
| mailkite_create_templateA | Create a template. Pass |
| mailkite_list_domainsA | List your domains, each with its webhook URL. Requires a management session token. |
| mailkite_create_domainB | Add a domain. Returns the domain + DNS records. Paid plans may pass |
| mailkite_suggest_subdomainA | Suggest a free, currently-unclaimed subdomain label to prefill the input with, plus the |
| mailkite_check_subdomainA | Check whether a free subdomain label can be claimed. Read-only and cheap — call it as the user types. |
| mailkite_claim_subdomainA | Claim a free MailKite subdomain — a |
| mailkite_get_domainA | Get one domain with DNS records + webhook. Requires a management session token. |
| mailkite_delete_domainA | Remove a domain. Requires a management session token. |
| mailkite_verify_domainA | Check DNS and update status. Requires a management session token. |
| mailkite_set_webhookB | Set or replace the domain's catch-all webhook. Requires a management session token. |
| mailkite_set_tracking_webhookA | Set or replace the domain's dedicated tracking-event webhook: an HTTPS endpoint that receives signed email.* engagement events (email.sent / email.bounced / email.complained / email.opened / email.clicked, shaped per the tracking-event schema) SEPARATELY from inbound mail. This is the split-endpoint override for consumers that keep engagement events away from their inbound webhook (e.g. django-anymail's paired views); most consumers should prefer setWebhookEvents, which delivers everything to the one inbound webhook. When both are configured, this URL wins for engagement events. Returns the signing secret (the same account secret as inbound deliveries). Requires a management session token. |
| mailkite_delete_tracking_webhookA | Remove the domain's tracking-event webhook (engagement events stop). Requires a management session token. |
| mailkite_set_webhook_eventsA | Opt the domain's inbound webhook into engagement events — one webhook, all events. Pass "all" or a list of email.* tracking types (email.sent / email.bounced / email.complained / email.opened / email.clicked) and MailKite delivers them to the same webhook route that receives the domain's inbound mail; consumers switch on the payload's |
| mailkite_delete_webhook_eventsB | Opt the domain's inbound webhook back out of engagement events (inbound email.received only — the default). Requires a management session token. |
| mailkite_delete_webhookB | Remove the domain's webhook. Requires a management session token. |
| mailkite_test_webhookA | Send a signed test event to the domain's webhook. Requires a management session token. |
| mailkite_check_domain_availabilityA | Check whether a domain is available to register, and at what price. Read-only — no charge. Requires a management session token. |
| mailkite_register_domainA | Register (buy) a domain on the customer's behalf; provisions mail DNS and adds it to the account in one call. Charges the registrar. Requires a management session token. Does NOT register automatically — returns a dashboard link for the user to review the price and confirm. An assistant can never purchase a domain on its own. |
| mailkite_list_routesA | List inbound routing rules. Requires a management session token. |
| mailkite_create_routeA | Create a route (match, action, destination). Requires a management session token. |
| mailkite_delete_routeA | Delete an inbound routing rule by id. Pair with createRoute to register and tear down a webhook destination — e.g. an automation platform subscribing on enable and cleaning up on disable. Requires a management session token. |
| mailkite_agentA | Send a message to one of your inbox agents and get its reply. Defaults to the account's default agent; pass |
| mailkite_routeA | Route a message to one of your registered routes (by |
| mailkite_list_messagesA | List stored messages, newest first. Optionally filter with |
| mailkite_get_messageA | Get a message with deliveries + attachments. Requires a management session token. |
| mailkite_retry_deliveryB | Re-deliver a stored message to its webhook. Requires a management session token. |
| mailkite_retry_deliveriesA | Replay a whole selection of webhook deliveries in one call — the bulk form of retryDelivery. Pass |
| mailkite_list_delivery_attemptsA | Every captured attempt for one delivery, newest first: the request headers and payload we POSTed, and the status, headers, and body that came back. This is the per-attempt record behind a webhook post-mortem, fetched without pulling the whole message. Captures are retained for 45 days. Requires a management session token. |
| mailkite_deliver_to_routeA | POST stored messages to one webhook route — including messages that arrived BEFORE the route existed, which no retry can reach (a retry replays an existing delivery row, and a new route has none). Use listRouteCandidates to find what a route could be sent. Webhook routes only: a forward would re-send real mail to a third party and an agent would re-spend model tokens, so both answer 400 |
| mailkite_list_route_candidatesA | Stored inbound messages this route could be asked to deliver, newest first — the preview for replaying mail to a route defined after that mail arrived. Each row carries |
| mailkite_create_realtime_tokenA | Mint a short-lived, single-use token that authorises one Realtime API connection. For browsers: EventSource cannot set headers, so this is what a page passes as ?token= instead of putting an API key in a URL. Inherits the calling credential's scope, expires in five minutes, and burns on first use. The stream itself is GET /v1/realtime — a subscription, not a request/response call, so it is contracted in sdks/spec/realtime.json rather than here. Requires an API key (mk_live_…). |
| mailkite_list_listsA | List your contact lists (static, curated broadcast audiences), each with its member count. Requires a management session token. |
| mailkite_create_listA | Create a contact list. Returns the list with its id (lst_…); add contacts with addListContacts. Requires a management session token. |
| mailkite_get_listA | Get one contact list with its member count. Requires a management session token. |
| mailkite_update_listA | Rename a contact list. Requires a management session token. |
| mailkite_delete_listA | Delete a contact list. The list is removed; the contacts themselves are kept. Requires a management session token. |
| mailkite_list_list_contactsA | List the contacts that are members of a list, newest first. Optionally page with |
| mailkite_add_list_contactsA | Add contacts (by id, ctr_…) to a list. Returns how many were newly added; contacts already on the list are ignored. Requires a management session token. |
| mailkite_remove_list_contactA | Remove one contact from a list (the contact itself is kept). Requires a management session token. |
| mailkite_list_broadcastsA | List your broadcasts (one-to-many sends) with status and send stats. Requires a management session token. |
| mailkite_create_broadcastB | Create a broadcast draft. |
| mailkite_get_broadcastA | Get one broadcast with its status and recipient summary. Requires a management session token. |
| mailkite_update_broadcastA | Edit a draft broadcast (any of from/subject/audience/html/… ). Drafts only. Requires a management session token. |
| mailkite_delete_broadcastA | Delete a broadcast draft. Requires a management session token. |
| mailkite_send_broadcastA | Send a broadcast now, or pass an ISO 8601 |
| mailkite_verify_webhookA | Verify the |
| mailkite_semantic_searchA | Semantic search over the MailKite documentation — returns the most relevant doc sections for a natural-language query (hybrid vector + keyword search over https://mailkite.dev/docs). Public; no authentication required. Requires an API key (mk_live_…). |
| mailkite_register_oauth_clientA | Register an OAuth client for this installation (RFC 7591 dynamic client registration) — step 1 of linking an existing MailKite account to your app. No pre-shared secret and no manual app review: you get a client_id back immediately and prove yourself with PKCE. Register once per install and keep the client_id. Requires a management session token. |
| mailkite_exchange_oauth_tokenA | Exchange an authorization code for an access token (or rotate a refresh token) — step 3 of linking. Between steps you send the user's browser to /oauth/authorize with your client_id, redirect_uri, state, and an S256 code_challenge; they sign in with whatever method they already use and approve, and the code comes back to your redirect_uri. Then call getApiKey with the access token and store the key. Requires a management session token. |
| mailkite_get_api_keyA | Get the account's unrestricted API key (mk_live_…). Read-or-create: the first call mints it. Requires a management session token. |
| mailkite_rotate_api_keyA | Rotate the account API key: the old key stops working immediately and a fresh one is returned. The plaintext is only shown here. Requires a management session token. |
| mailkite_list_scoped_keysA | List the account's domain-scoped API keys. A scoped key can send and manage only its one domain — hand one to each site or CI job so a leak burns only that surface. Requires a management session token. |
| mailkite_create_scoped_keyA | Create a key scoped to one domain. Ideal for per-site installs (e.g. a WordPress plugin) — the site never holds the account master key. Requires a management session token. |
| mailkite_delete_scoped_keyA | Revoke a domain-scoped key. Takes effect immediately. Requires a management session token. |
| mailkite_list_app_passwordsA | List the account's app passwords. Each one opens a mailbox over IMAP and/or the mailbox API, scoped to a domain and an address pattern within it. Requires a management session token. |
| mailkite_create_app_passwordA | Create an app password for one domain and address pattern. Hand it to a mail client or an agent — the secret is returned once and never again. Requires a management session token. |
| mailkite_update_app_passwordA | Change what an app password covers — its label, address pattern, or protocols. The domain is fixed for the life of the password: repointing a live credential would hand its holder mail they were never granted, so create a new password instead. Requires a management session token. |
| mailkite_rotate_app_passwordA | Replace an app password's secret, keeping its scope. The old secret stops authenticating immediately; the new one is returned once. Use after a leak, when revoking would mean reconfiguring every client. Requires a management session token. |
| mailkite_delete_app_passwordA | Revoke an app password. Takes effect immediately — any IMAP session or API call using it stops authenticating. Requires a management session token. |
| mailkite_list_mailbox_messagesA | List a mailbox's messages, newest first. Authenticated with an app password granting |
| mailkite_get_mailbox_message_rawA | Fetch one message's raw RFC822 bytes from a mailbox. Same app password auth as the list. Requires a management session token. |
| mailkite_set_mailbox_message_flagsA | Replace a message's IMAP flags (e.g. mark it |
| mailkite_get_usageA | Current billing-period usage: emails used vs the plan's included bucket (null = unlimited), AI actions, and the overage state that gates sending. Powers quota meters in dashboards and integrations. Requires a management session token. |
| mailkite_list_suppressionsA | List suppressed addresses (unsubscribes, hard bounces, spam complaints, manual). Sends to a suppressed address are dropped before delivery. Requires a management session token. |
| mailkite_add_suppressionA | Suppress an address so this account never sends to it again (reason defaults to manual). Requires a management session token. |
| mailkite_remove_suppressionA | Remove an address from the suppression list (URL-encode the email in the path). Removing an unsuppressed address is a no-op success. Requires a management session token. |
| mailkite_registerA | Create a MailKite account from just an email — no password. Returns the new account's API key immediately; a verification link is emailed, and SENDING stays blocked until the address is verified (poll me()). An existing email returns 409 account_exists with no credentials. Powers plugin/CLI onboarding. Requires a management session token. |
| mailkite_meA | The account behind this credential: email, whether it is verified (sending is blocked until it is), and plan. Use to poll verification state after register(). Requires an API key (mk_live_…). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 92 tools
Most tools target distinct resources and actions with detailed descriptions that prevent confusion. A few overlapping pairs exist (e.g., send_event vs start_sequence, agent vs route), but the descriptions explicitly clarify when to use each.
The vast majority follow a consistent `mailkite_verb_noun` pattern (list_domains, create_trigger, delete_broadcast). A few outliers like `agent`, `route`, `me`, and `semantic_search` break the convention, but they are rare and the pattern is otherwise strong.
At 92 tools, the surface is far beyond the typical 3–15 range and even exceeds the 25+ threshold for 'too many'. While the broad scope of a full email platform justifies many endpoints, this count still overwhelms an agent's selection process and feels excessive.
The toolset covers a wide range of email functionality (sending, sequences, templates, domains, webhooks, lists, broadcasts, suppressions, keys). However, notable gaps exist: templates lack update/delete, routes have no update or get, and there is no standalone contact management beyond list membership.