@mailkite/mcp
v0.20.0
Published
Model Context Protocol server for MailKite — exposes the MailKite API to LLM agents as tools. A thin layer over the MailKite Node SDK and the shared sdks/spec contract.
Maintainers
Readme
Read-only mirror. This repo is a generated, release-time mirror of the MailKite monorepo (the private source of truth) — development doesn't happen here. Install from npm and open issues against the MailKite docs.
Install
{
"mcpServers": {
"mailkite": {
"command": "npx",
"args": ["-y", "@mailkite/mcp"],
"env": { "MAILKITE_API_KEY": "mk_live_…" }
}
}
}Tools
One tool per MailKite API method, generated from the shared contract. Full list + schemas: https://mailkite.dev/docs/libraries#mcp.
92 tools, generated from the shared API contract — the same spec the server registers at startup. * marks a required argument. Access: API key (mk_live_…), session (management token), or local (runs in-process, no network).
| Tool | Signature | Access | What it does |
| --- | --- | --- | --- |
| mailkite_send | from*: string, to*: any, subject: string, html: string, text: string, templateId: string, templateData: object, cc: any, bcc: any, replyTo: string, inReplyTo: string, headers: object, metadata: object, sequence: string, sequenceInput: object, attachments: array, scheduledAt: string,number, trackOpens: boolean, trackClicks: boolean | API key · write | Send a message over a verified domain. |
| mailkite_send_batch | from*: string, recipients*: array, subject: string, html: string, text: string, templateId: string, templateData: object, headers: object, replyTo: string, inReplyTo: string, attachments: array, scheduledAt: string,number, trackOpens: boolean, trackClicks: boolean | API key · write | Send one personalized message per recipient (up to 50) in a single call. |
| mailkite_send_event | name*: string, event: string, email: string, contactId: string, payload: object, dedupeKey: string | API key · write | Record one application-level fact about a user — user.created, trial.expiring, payment.failed. |
| mailkite_list_events | — | API key · read | List recorded events, newest first — the surface for confirming a POST landed and for debugging a sequence that did not trigger. |
| mailkite_list_event_names | — | API key · read | List the distinct event names this account works with, so an editor can offer them instead of asking you to remember one. |
| mailkite_list_sequences | — | API key · read | List your sequences, newest first, each with live enrollment counts. |
| mailkite_create_sequence | name*: string, status: string, from: string, input: object,null, triggers: array, steps*: array, reentry: string, exitOn: object,null | API key · write | Create a sequence: a declared input shape, the steps a contact walks over time, and zero or more triggers. |
| mailkite_get_sequence | id* | API key · read | Get one sequence with its definition and live enrollment counts. |
| mailkite_update_sequence | id*, name: string, status: string, from: string, input: object,null, triggers: array, steps: array, reentry: string, exitOn: object,null | API key · write | Edit a sequence. |
| mailkite_delete_sequence | id* | API key · delete/replace | Delete a sequence and retire every contact still walking it. |
| mailkite_list_triggers | id* | API key · read | List the triggers attached to a sequence — the doors into it. |
| mailkite_create_trigger | id*, event*: string, filter: any, enabled: boolean | API key · write | Attach a trigger: when this event arrives, enroll the contact it is about. |
| mailkite_update_trigger | id*, event: string, filter: any, enabled: boolean | API key · write | Edit a trigger, or toggle enabled to switch the door off without deleting it. |
| mailkite_delete_trigger | id* | API key · delete/replace | Detach a trigger. |
| mailkite_start_sequence | sequence*, email: string, contactId: string, from: string, input: object, cancelKey: string | API key · write | Start a sequence for one contact, directly — when your code already knows WHICH sequence it wants. |
| mailkite_stop_sequence | cancelKey: string, sequence: string, email: string | API key · write | Stop whatever is chasing someone. |
| mailkite_list_enrollments | id* | API key · read | List who is in a sequence and where each of them is. |
| mailkite_get_enrollment | id* | API key · read | Get one enrollment — which sequence, which step, and what happens next. |
| mailkite_list_enrollment_runs | id* | API key · read | Every step this enrollment has executed, with the outcome and the reason for it. |
| mailkite_cancel_enrollment | id* | API key · delete/replace | Cancel one specific run by its enrollment id — the per-row action when you are looking at the enrollments table. |
| mailkite_upload_attachment | filename: string, path: string, url: string, content: string, contentType: string, retentionDays: integer | API key · write | Upload a file to MailKite storage and get back a secure, time-limited URL. |
| mailkite_list_templates | — | session · read | List your saved email templates (light metadata only — no body). |
| mailkite_list_base_templates | — | session · read | List the premade base templates (light metadata). |
| mailkite_get_template | id* | session · read | Get one template (full: subject, html, text, theme). |
| mailkite_create_template | baseId: string, name: string, subject: string, html: string, text: string, json: string, theme: string | session · write | Create a template. |
| mailkite_list_domains | — | session · read | List your domains, each with its webhook URL. |
| mailkite_create_domain | domain*: string | session · write | Add a domain. |
| mailkite_suggest_subdomain | — | session · read | Suggest a free, currently-unclaimed subdomain label to prefill the input with, plus the base zone it would live on. |
| mailkite_check_subdomain | name* | session · read | Check whether a free subdomain label can be claimed. |
| mailkite_claim_subdomain | subdomain*: string | session · write | Claim a free MailKite subdomain — a <label>.<base> host on a zone we run (call suggestSubdomain for the current base; the pool changes over time and more than one may be offered). |
| mailkite_get_domain | id* | session · read | Get one domain with DNS records + webhook. |
| mailkite_delete_domain | id* | session · delete/replace | Remove a domain. |
| mailkite_verify_domain | id* | session · write | Check DNS and update status. |
| mailkite_set_webhook | id*, url*: string | session · delete/replace | Set or replace the domain's catch-all webhook. |
| mailkite_set_tracking_webhook | id*, url*: string | session · delete/replace | 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. |
| mailkite_delete_tracking_webhook | id* | session · delete/replace | Remove the domain's tracking-event webhook (engagement events stop). |
| mailkite_set_webhook_events | id*, events*: any | session · delete/replace | Opt the domain's inbound webhook into engagement events — one webhook, all events. |
| mailkite_delete_webhook_events | id* | session · delete/replace | Opt the domain's inbound webhook back out of engagement events (inbound email.received only — the default). |
| mailkite_delete_webhook | id* | session · delete/replace | Remove the domain's webhook. |
| mailkite_test_webhook | id* | session · write | Send a signed test event to the domain's webhook. |
| mailkite_check_domain_availability | domain* | session · read | Check whether a domain is available to register, and at what price. |
| mailkite_register_domain | domain*: string, contact*: object, years: integer, dryRun: boolean | session · write | Register (buy) a domain on the customer's behalf; provisions mail DNS and adds it to the account in one call. |
| mailkite_list_routes | — | session · read | List inbound routing rules. |
| mailkite_create_route | match*: string, action: string, destination: string, agentPrompt: string, agentForwardTo: array, agentContext: string | session · write | Create a route (match, action, destination). |
| mailkite_delete_route | id* | session · delete/replace | Delete an inbound routing rule by id. |
| mailkite_agent | text*: string, subject: string, from: string, html: string, routeId: string, address: string, model: string | API key · write | Send a message to one of your inbox agents and get its reply. |
| mailkite_route | routeId: string, address: string, from*: string, subject: string, text: string, html: string | API key · write | Route a message to one of your registered routes (by routeId or address), running that route's action — agent, webhook, or forward. |
| mailkite_list_messages | — | session · read | List stored messages, newest first. |
| mailkite_get_message | id* | session · read | Get a message with deliveries + attachments. |
| mailkite_retry_delivery | id* | session · write | Re-deliver a stored message to its webhook. |
| mailkite_retry_deliveries | deliveryIds: array, messageIds: array, threadIds: array | session · write | Replay a whole selection of webhook deliveries in one call — the bulk form of retryDelivery. |
| mailkite_list_delivery_attempts | id* | session · read | Every captured attempt for one delivery, newest first: the request headers and payload we POSTed, and the status, headers, and body that came back. |
| mailkite_deliver_to_route | id*, messageIds*: array | session · write | 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). |
| mailkite_list_route_candidates | id* | session · read | 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. |
| mailkite_create_realtime_token | — | API key · write | Mint a short-lived, single-use token that authorises one Realtime API connection. |
| mailkite_list_lists | — | session · read | List your contact lists (static, curated broadcast audiences), each with its member count. |
| mailkite_create_list | name*: string | session · write | Create a contact list. |
| mailkite_get_list | id* | session · read | Get one contact list with its member count. |
| mailkite_update_list | id*, name*: string | session · write | Rename a contact list. |
| mailkite_delete_list | id* | session · delete/replace | Delete a contact list. |
| mailkite_list_list_contacts | id* | session · read | List the contacts that are members of a list, newest first. |
| mailkite_add_list_contacts | id*, contactIds*: array | session · write | Add contacts (by id, ctr_…) to a list. |
| mailkite_remove_list_contact | id*, contactId* | session · delete/replace | Remove one contact from a list (the contact itself is kept). |
| mailkite_list_broadcasts | — | session · read | List your broadcasts (one-to-many sends) with status and send stats. |
| mailkite_create_broadcast | name: string, from*: string, replyTo: string, subject: string, preview: string, audience: object, templateId: string, html: string, text: string, footerAddress: string | session · write | Create a broadcast draft. |
| mailkite_get_broadcast | id* | session · read | Get one broadcast with its status and recipient summary. |
| mailkite_update_broadcast | id*, name: string, from: string, replyTo: string, subject: string, preview: string, audience: object, templateId: string, html: string, text: string, footerAddress: string | session · write | Edit a draft broadcast (any of from/subject/audience/html/… ). |
| mailkite_delete_broadcast | id* | session · delete/replace | Delete a broadcast draft. |
| mailkite_send_broadcast | id*, scheduledAt: string | session · write | Send a broadcast now, or pass an ISO 8601 scheduledAt to schedule it. |
| mailkite_verify_webhook | payload*: string, signature*: string, secret*: string, toleranceMs: integer | local · read | Verify the x-mailkite-signature header on an inbound webhook delivery. |
| mailkite_semantic_search | query* | API key · read | 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). |
| mailkite_register_oauth_client | redirect_uris*: array, client_name: string | session · write | Register an OAuth client for this installation (RFC 7591 dynamic client registration) — step 1 of linking an existing MailKite account to your app. |
| mailkite_exchange_oauth_token | grant_type*: string, code: string, redirect_uri: string, client_id: string, code_verifier: string, refresh_token: string | session · write | Exchange an authorization code for an access token (or rotate a refresh token) — step 3 of linking. |
| mailkite_get_api_key | — | session · read | Get the account's unrestricted API key (mk_live_…). |
| mailkite_rotate_api_key | — | session · write | Rotate the account API key: the old key stops working immediately and a fresh one is returned. |
| mailkite_list_scoped_keys | — | session · read | List the account's domain-scoped API keys. |
| mailkite_create_scoped_key | domainId*: string, name: string | session · write | Create a key scoped to one domain. |
| mailkite_delete_scoped_key | id* | session · delete/replace | Revoke a domain-scoped key. |
| mailkite_list_app_passwords | — | session · read | List the account's app passwords. |
| mailkite_create_app_password | domain*: string, domainId: string, address: string, protocols: array, label: string | session · write | Create an app password for one domain and address pattern. |
| mailkite_update_app_password | id*, address: string, protocols: array, label: string | session · write | Change what an app password covers — its label, address pattern, or protocols. |
| mailkite_rotate_app_password | id* | session · write | Replace an app password's secret, keeping its scope. |
| mailkite_delete_app_password | id* | session · delete/replace | Revoke an app password. |
| mailkite_list_mailbox_messages | address* | session · read | List a mailbox's messages, newest first. |
| mailkite_get_mailbox_message_raw | uid*, address* | session · read | Fetch one message's raw RFC822 bytes from a mailbox. |
| mailkite_set_mailbox_message_flags | uid*, address*, flags*: string | session · write | Replace a message's IMAP flags (e.g. |
| mailkite_get_usage | — | session · read | Current billing-period usage: emails used vs the plan's included bucket (null = unlimited), AI actions, and the overage state that gates sending. |
| mailkite_list_suppressions | — | session · read | List suppressed addresses (unsubscribes, hard bounces, spam complaints, manual). |
| mailkite_add_suppression | email*: string, reason: string, note: string | session · write | Suppress an address so this account never sends to it again (reason defaults to manual). |
| mailkite_remove_suppression | email* | session · delete/replace | Remove an address from the suppression list (URL-encode the email in the path). |
| mailkite_register | email*: string, channel: string, ref: string, referrer: string | session · write | Create a MailKite account from just an email — no password. |
| mailkite_me | — | API key · read | The account behind this credential: email, whether it is verified (sending is blocked until it is), and plan. |
Use it from an AI agent — MCP + Agent connectors
MailKite speaks the Model Context Protocol: every API method is a tool your AI assistant (Claude, Cursor, …) can call — send mail, manage domains, search the docs, and give an agent its own inbox. Full guide: https://mailkite.dev/docs/ai-agents.
Hosted (recommended) — one-click OAuth, no key to copy:
claude mcp add --transport http mailkite https://mcp.mailkite.dev/mcpIn Claude Code you can also install the plugin:
/plugin marketplace add mailkite/claude-code
/plugin install mailkite@mailkiteAny chat/UI agent: "Add the MCP server at https://mcp.mailkite.dev/mcp and authenticate in the browser when prompted."
Local (static key, offline / CI):
{ "mcpServers": { "mailkite": { "command": "npx", "args": ["-y", "@mailkite/mcp"], "env": { "MAILKITE_API_KEY": "mk_live_…" } } } }Give an agent its own inbox. Route inbound mail to a built-in inbox agent (the agent route action) and it answers, files, or escalates on its own — see https://mailkite.dev/docs/ai-agents.
All MailKite libraries
Same contract, every language — pick the one for your stack (full list: https://mailkite.dev/docs/libraries):
| Library | Repo | Distribution |
| --- | --- | --- |
| MailKite for Node.js | mailkite-node | npm |
| MailKite for Python | mailkite-python | PyPI |
| MailKite for Ruby | mailkite-ruby | RubyGems |
| MailKite for Java | mailkite-java | Maven Central |
| MailKite for PHP | mailkite-php | Packagist |
| MailKite for Go | mailkite-go | Go modules |
| @mailkite/cli | mailkite-cli | npm |
| @mailkite/mcp (this repo) | mailkite-mcp | npm |
| @mailkite/client | mailkite-js | npm |
| @mailkite/expo | mailkite-expo | npm |
| MailKiteClient | mailkite-swift | Swift Package Manager |
| dev.mailkite:mailkite-client | mailkite-kotlin | Maven Central |
| mailkite_client | mailkite-flutter | pub.dev |
Docs & links
- 📚 Documentation: https://mailkite.dev/docs
- 📦 This library's guide: https://mailkite.dev/docs/libraries#mcp
- 🤖 AI agents (MCP + inbox agents): https://mailkite.dev/docs/ai-agents
- 🌐 Website: https://mailkite.dev
- 🧭 All libraries: https://mailkite.dev/docs/libraries
Generated from the shared MailKite API contract. © MailKite.
