Integration

Groundmail integration

Groundmail is a transactional email API that runs its own mail servers. Send single, batch or scheduled emails (raw HTML or published templates), resend, reschedule or cancel them, read their delivery status and received (inbound) email, validate addresses, and manage sending domains (DNS records, verification, one-click DNS through a provider connected in the dashboard, DMARC monitoring), templates, suppressions, webhooks, event-triggered automations and their runs, tenants for platforms that send for their own customers, deliverability insights and the email test inbox. Not exposed: API key and SMTP credential management (creation returns a secret), OAuth client routes, Cloudflare, Vercel and Twilio connections (they store third-party tokens), DNS apply with an inline provider token, imports from other providers (they take the old provider's key), and template image uploads (a presigned upload URL). Authentication is an API key (gm_...) from the Groundmail dashboard, sent as a Bearer token; each key carries scopes (full, emails:send, emails:read, domains:read, domains:write, webhooks:write, templates:write, suppressions:write, account:read); full grants every scope, and a call without the right one gets 403 insufficient_scope.

Ask it in chat

Say what should happen.
The workflow builds itself.

When this happens, do that in Groundmail.Built from the 66 Groundmail tools below, on the connection you add once.

What you can do with Groundmail

Each of these is one operation on one endpoint, available both as a workflow step and as a tool an AI agent can call on its own. Nothing bundles several operations into one action, so what a run did stays readable afterwards.

Each badge shows the default agent permission of an endpoint (allowed: an agent calls it without asking; ask first: you are asked before an agent calls it, when the agent or chat asks permission for sensitive actions; never: no agent may call it), which every user can change endpoint by endpoint in their credential settings.

Most endpoints run on the free plan. A few, mainly the ones that publish on your behalf, need a paid plan.

Template, 7 operations

  • create_templateCreate templatePOSTAgents: ask firstCreates an email template as a draft (HTML or builder blocks) with {{variable}} placeholders; publish it with publish_or_duplicate_template before sending it. Key scope: templates:write.
  • create_template_from_starterCreate template from starterPOSTAgents: ask firstCopies a catalog starter into the account as a published template, by the starter's alias from list_template_starters. Returns 409 when a template with that name or alias already exists. Key scope: templates:write.
  • delete_templateDelete templateDELETEAgents: ask firstDeletes a template by id or alias. Key scope: templates:write.
  • get_templateGet templateGETAgents: ask firstReturns one template by id or alias: status, subject, preheader, HTML, text or design, variables, published version, category and deliverability warnings. Key scope: templates:write.
  • list_templatesList templatesGETAgents: ask firstLists the account's email templates (draft or published) with subject, body, variables and category. Page with cursor. Key scope: templates:write.
  • publish_or_duplicate_templatePublish or duplicate templatePOSTAgents: ask firstPublishes a template's draft (it becomes the version sends use) or duplicates the template into a new draft, per action. Key scope: templates:write.
  • update_templateUpdate templatePATCHAgents: ask firstUpdates a template's draft (name, subject, body, design, alias, variables, category, folder); sends keep using the last published version until it is published again. Leave a field out to keep it. Key scope: templates:write.

Automation, 6 operations

  • activate_or_pause_automationActivate or pause automationPOSTAgents: ask firstActivates an automation (matching events then start runs that send its emails and SMS) or pauses it, per action. Key scope: full.
  • create_automationCreate automationPOSTAgents: ask firstCreates an automation as a draft: a trigger event (sent with trigger_event) followed by steps (delay, send email, send SMS, condition, wait for event). It sends nothing until activated with activate_or_pause_automation. Key scope: full.
  • delete_automationDelete automationDELETEAgents: ask firstDeletes an automation. Key scope: full.
  • get_automationGet automationGETAgents: ask firstReturns one automation: name, status, trigger and steps. Key scope: full.
  • list_automationsList automationsGETAgents: ask firstLists the account's automations: name, status (draft, active, paused), trigger event and steps. Key scope: full.
  • update_automationUpdate automationPATCHAgents: ask firstUpdates an automation's name, trigger, steps or folder. Leave a field out to keep it; steps replaces the whole step list. Key scope: full.

Domain, 6 operations

  • create_domainCreate domainPOSTAgents: ask firstAdds a domain to send from and returns the DNS records to publish (ownership, DKIM, return path, SPF, DMARC, inbound MX); then publish them and call verify_domain, or apply_domain_dns through a connected provider. Key scope: domains:write.
  • delete_domainDelete domainDELETEAgents: ask firstDeletes a sending domain from the account and revokes its sending authorization; mail can no longer be sent from it. If the mail-server teardown fails, the domain is kept and the call answers 502. Key scope: domains:write.
  • get_domainGet domainGETAgents: ask firstReturns one domain with its DNS records to publish, inbound records, DMARC and BIMI analysis, tracking DNS and status. Call it after publishing records or after verify_domain. Key scope: domains:read.
  • list_domainsList domainsGETAgents: ask firstLists the account's sending domains with status (pending, verified, failed), tracking, TLS, inbound and blocklist state. Filter by inbound or tenant; page with cursor. Key scope: domains:read.
  • update_domainUpdate domainPATCHAgents: ask firstChanges a domain's open and click tracking, TLS mode, inbound receiving and inbound spam handling; returns the domain and its records. Leave a field out to keep its current setting. Key scope: domains:write.
  • verify_domainVerify domainPOSTAgents: ask firstChecks a domain's published DNS (ownership, SPF, DKIM, DMARC, return path) and marks it verified when ready. A 400 with pending true means DNS has not propagated yet: publish the missing records and call it again. Key scope: domains:write.

Tenant, 5 operations

  • create_tenantCreate tenantPOSTAgents: ask firstCreates a tenant for one of your customers, with its own domains, suppression list, stats, sending ramp and pause switch. Tenants exist only on plans that include them; elsewhere naming one gets 403 tenants_not_enabled. Key scope: full.
  • delete_tenantDelete tenantDELETEAgents: ask firstDeletes a tenant and its suppression list: its domains return to the account, API keys limited to it are revoked and webhook endpoints left with no tenant are disabled. Sent emails stay in history. Key scope: full.
  • get_tenantGet tenantGETAgents: ask firstReturns one tenant: status, who paused it and why, default from domain, stream policy, daily limit and metadata. Key scope: full.
  • list_tenantsList tenantsGETAgents: ask firstLists tenants (your own customers inside the account, each with its own domains, suppression list, stats, sending ramp and pause switch). Tenants exist only on plans that include them; elsewhere naming one gets 403 tenants_not_enabled.
  • update_tenantUpdate tenantPATCHAgents: ask firstChanges a tenant's settings, or pauses (its new sends are refused) and resumes it with status. Leave a field out to keep it; external_id cannot change. Key scope: full.

Webhook, 5 operations

  • create_webhookCreate webhookPOSTAgents: ask firstCreates a webhook endpoint that receives Groundmail events by POST. The signing secret is returned only once and this tool does not pass it on, so deliveries to an endpoint made here cannot be verified. Key scope: webhooks:write.
  • delete_webhookDelete webhookDELETEAgents: ask firstDeletes a webhook endpoint; it stops receiving events. Key scope: webhooks:write.
  • get_webhookGet webhookGETAgents: ask firstReturns one webhook endpoint: URL, events, enabled state and tenant filter. Key scope: webhooks:write.
  • list_webhooksList webhooksGETAgents: ask firstLists webhook endpoints: URL, subscribed events, enabled state and tenant filter. Page with cursor. Key scope: webhooks:write.
  • update_webhookUpdate webhookPATCHAgents: ask firstChanges a webhook endpoint's URL, events, tenant filter or enabled state. Leave a field out to keep it. Key scope: webhooks:write.

Dmarc monitoring, 4 operations

  • disable_dmarc_monitoringDisable dmarc monitoringDELETEAgents: ask firstStops DMARC monitoring for a domain: reports sent to its address are ignored from now on. Remove the address from the DMARC record's rua= tag too. Key scope: domains:write.
  • enable_dmarc_monitoringEnable dmarc monitoringPOSTAgents: ask firstTurns DMARC monitoring on and returns the report address and the DMARC record to publish (your record with the address added to rua=). With apply, writes it through a DNS provider connected in the dashboard. Key scope: domains:write.
  • get_dmarc_monitoringGet dmarc monitoringGETAgents: ask firstReturns a domain's DMARC monitoring: sending sources by provider (unknown senders flagged as possible spoofing), DMARC, SPF and DKIM pass rates over 30 days, and whether it is safe to move the policy to quarantine. Key scope: domains:read.
  • update_dmarc_monitoringUpdate dmarc monitoringPATCHAgents: ask firstTurns a domain's weekly DMARC digest email on or off. Key scope: domains:write.

Email, 4 operations

  • get_emailGet emailGETAgents: ask firstReturns one sent email: recipients, subject, status (queued, scheduled, sent, delivered, delayed, held, opened, clicked, bounced, complained, failed, suppressed, cancelled), bounce details and the receiving server's reply. Key scope: emails:read.
  • list_emailsList emailsGETAgents: ask firstLists recently sent emails, newest first: recipients, subject, status, bounce reason, tags and timestamps. Filter by test or live, tenant or mail stream; page with cursor. Key scope: emails:read.
  • resend_emailResend emailPOSTAgents: ask firstSends a stored email again as a new send (same from, to, subject, body, tags and headers) and returns the new email's id. It really sends; attachments are not stored, so they are left out. Key scope: emails:send.
  • send_emailSend emailPOSTAgents: ask firstSends one email now (or at scheduled_at) from a verified domain and returns its id and status (queued, sent, scheduled...). It really sends: follow delivery with get_email. Simulator addresses and gm_test_ keys deliver nothing.

Suppression, 4 operations

  • create_suppressionCreate suppressionPOSTAgents: ask firstAdds an address to the suppression list (account-wide, or one tenant's list) so Groundmail sends it no email. Key scope: suppressions:write.
  • delete_suppressionDelete suppressionDELETEAgents: ask firstRemoves one suppression (or with type category_opt_out one category opt-out) by its id or by the address itself, so it can be emailed again. 404 when nothing matches. Key scope: suppressions:write.
  • delete_suppression_by_emailDelete suppression by emailDELETEAgents: ask firstRemoves an address from the suppression list, or with type category_opt_out removes its category opt-outs, so it can be emailed again. Address given as a query value. Key scope: suppressions:write.
  • list_suppressionsList suppressionsGETAgents: ask firstLists suppressed addresses (never mailed: bounces, complaints, manual or API adds, unsubscribes) or, with type category_opt_out, readers' category opt-outs. Filter by email or tenant; page with cursor. Personal data. Key scope: suppressions:write.

Automation run, 3 operations

  • cancel_or_retry_automation_runCancel or retry automation runPOSTAgents: ask firstCancels or retries an automation run, per action. A retried run can send emails again through its send steps. Key scope: full.
  • get_automation_runGet automation runGETAgents: ask firstReturns one automation run with its automation, trigger event and every step's status, output and error. Key scope: full.
  • list_automation_runsList automation runsGETAgents: ask firstLists automation runs (one per enrolled event): status (queued, running, waiting, completed, failed, cancelled), current step, waiting event, error and times. Filter by automation. Key scope: full.

Tenant domain, 3 operations

  • assign_tenant_domainAssign tenant domainPOSTAgents: ask firstGives an existing domain to a tenant: only that tenant can then send from it, and sends from it without tenant are attributed to it. Key scope: full.
  • list_tenant_domainsList tenant domainsGETAgents: ask firstLists the domains a tenant owns (only it can send from them). Key scope: full.
  • remove_tenant_domainRemove tenant domainDELETEAgents: ask firstGives a tenant's domain back to the account; the domain itself stays and every tenant can send from it again. Key scope: full.

Test inbox email, 3 operations

  • get_test_inbox_emailGet test inbox emailGETAgents: ask firstReturns one caught test email in full: text and HTML bodies, headers, raw source, plus the extracted one-time code and links. Key scope: emails:read.
  • list_test_inbox_emailsList test inbox emailsGETAgents: ask firstLists emails caught at your test domain plus emails sent with a gm_test_ key, newest first, with the one-time code and links found in each. Kept 14 days. Key scope: emails:read.
  • wait_for_test_inbox_emailWait for test inbox emailGETAgents: ask firstWaits up to timeout seconds (default 30, at most 60) for an email to an exact test address and returns it, with its one-time code and links; one already there returns at once. Nothing in time answers 408 timeout. Key scope: emails:read.

Received email, 2 operations

  • get_received_emailGet received emailGETAgents: ask firstReturns one received email with its text and HTML bodies, envelope and Message-ID headers, spam verdict, the sent email it replies to, and its attachments' base64 content. Key scope: emails:read.
  • list_received_emailsList received emailsGETAgents: ask firstLists email received on domains with inbound receiving enabled, newest first: sender, recipients, subject, spam verdict and attachment metadata. Filter by domain or by the sent email it replies to. Key scope: emails:read.

Template version, 2 operations

  • list_template_versionsList template versionsGETAgents: ask firstLists a template's immutable published versions (subject, body, variables, label), newest first; restore one with restore_template_version. Key scope: templates:write.
  • restore_template_versionRestore template versionPOSTAgents: ask firstCopies a published version back into the template's draft, replacing the current draft; publish it to send it again. Key scope: templates:write.

Deliverability, 1 operation

  • get_deliverabilityGet deliverabilityGETAgents: ask firstReturns deliverability insights for recent sends: totals and rates (delivered, bounced, complained, opened, clicked) overall and per domain, top bounce reasons, notes, and per-stream counts over 24 hours. Key scope: emails:read or account:read.

Domain dns, 1 operation

  • apply_domain_dnsApply domain dnsPOSTAgents: ask firstWrites a domain's DNS records (ownership, DKIM, return path, SPF, DMARC, tracking) through a DNS provider connected in the Groundmail dashboard. Changes live DNS; an existing DMARC record is never replaced. Then call verify_domain.

Email address, 1 operation

  • validate_emailValidate emailPOSTAgents: ask firstChecks one email address without sending anything: verdict valid, risky or invalid, the reasons (syntax, no mail server, mailbox not found, previous bounce, disposable, catch-all, typo, role) and a typo suggestion. Free.

Email batch, 1 operation

  • send_email_batchSend email batchPOSTAgents: ask firstSends several emails in one call, in order, and returns a result per item (id and status, or an error). It really sends; attachments are refused in a batch. Once a daily limit is used up the remaining items fail. Key scope: emails:send.

Event, 1 operation

  • trigger_eventTrigger eventPOSTAgents: ask firstSends a custom event (for example user.created) that starts, resumes or cancels matching automations; an active automation can then send emails. Returns the stored event and how many automations it matched. Key scope: emails:send.

Scheduled email, 1 operation

  • update_scheduled_emailUpdate scheduled emailPATCHAgents: ask firstReschedules a scheduled email (scheduled_at) or cancels it (cancel true) before it goes out. Only emails sent with scheduled_at can be changed. Key scope: emails:send.

Template asset, 1 operation

  • list_template_assetsList template assetsGETAgents: ask firstLists images uploaded for templates: URL, content type, size and dimensions. Page with cursor. Key scope: templates:write.

Template starter, 1 operation

  • list_template_startersList template startersGETAgents: ask firstLists the global starter template catalog (password reset, welcome and others) with subject, body and variables. Copy one into the account with create_template_from_starter. Key scope: templates:write.

Template test, 1 operation

  • send_template_testSend template testPOSTAgents: ask firstSends a one-off test of a template's current draft to an address. It really sends an email. Key scope: templates:write and emails:send.

Tenant stats, 1 operation

  • get_tenant_statsGet tenant statsGETAgents: ask firstReturns a tenant's email counts and rates (sent, delivered, bounced, complained, opened...) over the last days, and its sending ramp today (stage, limits and use per stream). Key scope: full.

Test inbox, 1 operation

  • get_test_inboxGet test inboxGETAgents: ask firstReturns your team's test domain (created on the first call), an example address, this month's usage and whether the email testing add-on is on. Mail to any address at the test domain is caught, never delivered. Key scope: emails:read.

Webhook event, 1 operation

  • simulate_webhook_eventSimulate webhook eventPOSTAgents: ask firstBuilds a sample webhook payload for an email event and, with deliver true, POSTs it to the account's webhook endpoints (or one endpoint with webhook_id). For testing a webhook handler; no email is sent. Key scope: webhooks:write.

Use Groundmail from Claude Code, Cursor or Codex

Connect Groundmail in LiveContext, create an API key in Settings, then add the LiveContext MCP server to your client. Its Groundmail operations become tools the client can call, next to every other integration you connected.

Claude Code
claude mcp add --transport http livecontext https://livecontext.ai/mcp --header "X-API-Key: YOUR_API_KEY"
Codex (~/.codex/config.toml)
[mcp_servers.livecontext]
url = "https://livecontext.ai/mcp"

[mcp_servers.livecontext.http_headers]
"X-API-Key" = "YOUR_API_KEY"
Cursor, Claude Desktop and other JSON configs
{
  "mcpServers": {
    "livecontext": {
      "type": "http",
      "url": "https://livecontext.ai/mcp",
      "headers": {
        "X-API-Key": "YOUR_API_KEY"
      }
    }
  }
}

Set up the MCP server step by step

How to connect Groundmail

  1. Create your workspace

    Sign up free. Nothing to install.

  2. Connect Groundmail once

    Add your Groundmail connection in Settings. Every tool from this integration reuses it, and secrets are encrypted at rest and visible only to you.

  3. Describe the job in chat

    The workflow builds itself in front of you and picks the endpoints it needs. Drag the steps yourself on the canvas whenever you would rather be explicit.

Groundmail integration FAQ

What can you do with the Groundmail integration?

LiveContext exposes 66 operations on Groundmail, covering template, automation, domain and tenant.

Popular integrations

Browse the whole catalog