Skip to main content
Glama
ATOM00blue

Drin MCP Server

by ATOM00blue

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
DRIN_SENDERNoDefault product externalId; required when using an account-wide API key.
DRIN_API_KEYYesYour Drin API key (Bearer token from Settings → API Keys).
DRIN_BASE_URLNoOverride base URL for self-hosted or preview environments.https://api.drin.run

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
send_emailA

Send a transactional email. Provide html and/or text, or render a saved template with templateId + data. Addresses accept "Name " or bare "email".

send_batchA

Send up to 100 emails in one call. emails is an array of objects shaped like send_email (without idempotencyKey/sender).

reply_emailA

Reply to a received (or sent) message by id. Threading headers (In-Reply-To/References) and a 'Re:' subject are set automatically; From defaults to the inbox address and To to the original sender.

list_emailsA

List sent and received messages (most recent first). Filter by direction/status/search.

get_emailA

Get one message's full detail (recipients, status, lifecycle events, attachments).

get_email_bodyB

Get the exact rendered { html, text } body archived for a message at send/receive time.

list_email_attachmentsA

List attachment metadata for a message. Download bytes with an authenticated GET on each url.

list_domainsA

List sending domains and their verification status. Pass status=verified to get only sendable domains.

get_domainA

Get a domain by id, including the DNS records to publish and their per-record verification state.

add_domainA

Add a sending domain. Returns the DNS records (DKIM/SPF/DMARC) the user must publish to verify it.

get_domain_receivingA

Read a domain's inbound-receiving state and the MX record(s) required to receive email on it.

set_domain_receivingA

Enable or disable inbound receiving on a domain. Enabling returns the MX record(s) to publish.

verify_domainA

Re-check a domain's identity/DNS with the provider right now and return its fresh status + per-record verification state. Use right after publishing DNS records instead of waiting for the background poll.

delete_domainA

Delete a sending domain and tear down its identity. Refused with a 409 (domain_in_use) if the domain still has inboxes (sending or receiving addresses).

list_inboxesA

List receive addresses (inboxes) for the active sender. Optionally filter by domainId.

create_inboxB

Create a receive address on a receiving-enabled domain so the agent can get replies and inbound mail.

get_inboxB

Get one receive address (inbox) by id.

delete_inboxA

Delete a receive address (inbox) by id. Refused with a 409 (inbox_in_use) if it already has messages (the audit trail is preserved).

list_threadsA

List conversation threads (inbound + outbound joined), most recent first. Filter by inboxId.

get_threadA

Get a full conversation: header plus every message in the thread, oldest→newest, both directions.

simulate_inboundA

Synthesize a test inbound email (test_mode, excluded from metrics/billing) to exercise the receive→thread→webhook path without sending real mail.

list_contactsA

List address-book contacts for the active sender. Filter by subscribed state or free-text search.

create_contactB

Add a contact to the sender's address book.

update_contactB

Update a contact by id (partial — only provided fields change).

unsubscribe_contactA

Opt a contact out (stamps unsubscribedAt). Future sends should honor this.

resubscribe_contactA

Opt a contact back in (clears unsubscribedAt).

get_contactB

Get one address-book contact by id.

delete_contactA

Permanently delete a contact from the address book.

list_suppressionsB

List suppressed recipient addresses (hard bounces, complaints, manual, unsubscribes). Sends to these are blocked.

add_suppressionA

Manually suppress an address so it can never be emailed (e.g. an opt-out request).

remove_suppressionA

Remove an address from the suppression list so it can be emailed again.

list_templatesB

List reusable server-side email templates for the active sender.

get_templateA

Get one template (subject, html, text, variables) by id or slug.

render_templateA

Render a saved template with merge data and return the resulting subject/html/text (no send).

create_templateA

Create a reusable server-side template. subject and at least one of html/text are required; all fields support the {{handlebars}} subset. slug defaults to a slugified name and must be unique per sender.

update_templateA

Update a saved template by id or slug (partial — only provided fields change). Pass an explicit null for html or text to clear that body.

delete_templateA

Delete a saved template by id or slug. Sends that reference it will then fail.

preview_templateA

Render an UNSAVED template draft with merge data and return the resulting subject/html/text (no save, no send). Use to test a template before create_template.

list_template_galleryA

List curated starter templates (subject/html/text + sample data) you can copy into a new template.

get_metricsA

Get send/delivery/bounce/complaint/open/click totals plus a daily series, optionally bounded by from/to ISO dates.

list_webhooksB

List webhook endpoints for the active sender (signing secrets are redacted).

get_webhookA

Get one webhook endpoint by id (signing secret redacted).

create_webhookA

Create a webhook endpoint that receives HMAC-signed event callbacks. eventTypes is a non-empty list from: accepted, queued, sending, sent, delivery, bounce, complaint, open, click, delivery_delayed, rejected, rendering_failure, failed, inbound_received, inbound_rejected. The signingSecret is returned ONCE — store it to verify deliveries.

update_webhookA

Update a webhook by id (partial). Pause/resume with enabled, repoint url, or change eventTypes — without rotating the signing secret. Provide at least one field.

delete_webhookB

Delete a webhook endpoint by id.

list_api_keysA

List active API keys for the account (secrets are never included; internal service keys are hidden).

create_api_keyA

Create a new API key. The plaintext secret is returned ONCE — store it now. Optionally scope it to a single product with senderId (omit for a tenant-wide key).

revoke_api_keyA

Revoke (delete) an API key by id. Access is cut immediately. Refused for the key authenticating this request and for internal service keys.

list_account_messagesA

List messages across ALL products in the account (tenant-wide), newest first. Like list_emails but not scoped to one sender — use an account-wide key to see every product's mail in one feed.

list_integrationsB

List the integration catalog plus the account's installed integrations (Vercel, Supabase, Neon, …).

get_integrationA

Get one installed integration by id (secrets redacted).

install_integrationA

Install an integration by provider. A webhook-kind provider returns a webhookUrl + webhookSecret (shown once); an OAuth-kind provider returns an authorizeUrl to open in a browser to finish connecting. from is required for webhook-kind providers.

update_integrationB

Update an installed integration by id (partial): displayName, senderId (string or null), status (active|disabled), defaultTemplateSlug (string or null), metadata.

uninstall_integrationB

Uninstall (delete) an integration by id.

list_topicsA

List marketing preference topics ("Product updates", "Newsletter") for the active sender. Topics let contacts opt in/out per category; visible topics render on the public /preferences page.

get_topicC

Get one preference topic by id (name, slug, default subscription, visibility).

create_topicA

Create a preference topic. Contacts can opt in/out of it independently of their global subscription; campaigns can target it. defaultSubscription is what a contact WITHOUT an explicit choice counts as.

update_topicB

Update a topic by id (partial — only provided fields change). Pass an explicit null for description to clear it.

delete_topicA

Delete a preference topic by id. Campaigns referencing it fall back to no topic gate.

get_contact_topicsA

List every topic of the sender with one contact's EFFECTIVE subscription state (their explicit choice, else the topic's default).

set_contact_topicsA

Set a contact's explicit per-topic subscription states. topics is a list of { topicId, state } where state is opt_in or opt_out. Returns the full updated effective-state list.

import_contactsA

Bulk import (upsert) contacts by email — up to 1000 rows per call; split larger lists into batches. Existing contacts update only the fields a row carries, and an import NEVER re-subscribes an opted-out contact unless the row says subscribed:true explicitly. Returns { created, updated }.

list_segmentsA

List saved audience segments (declarative filters over contacts) for the active sender.

get_segmentA

Get one segment by id, including its { match, conditions[] } definition.

create_segmentA

Create a saved audience segment. definition is { match: "all"|"any", conditions: [{ field, op, value? }] } over email/firstName/lastName/createdAt/metadata. with ops eq/neq/contains/not_contains/exists/not_exists/gt/lt. Omit it to match every contact. Resolution is always live and always excludes unsubscribed/suppressed contacts.

update_segmentA

Update a segment by id (partial). Pass an explicit null for description to clear it; a new definition replaces the old one wholesale.

delete_segmentA

Delete a segment by id. Campaigns referencing it fall back to "all subscribed contacts" — check before deleting.

preview_segmentA

Resolve an audience WITHOUT saving or sending anything: pass a saved segmentId OR an inline definition and get { count, sample: ≤10 contacts }. Use this to sanity-check a filter before attaching it to a campaign.

list_campaignsA

List campaigns (many-recipient sends) with status + counters, newest first. Filter by status to find e.g. pending_approval campaigns waiting on a human.

get_campaignA

Get one campaign by id: status, audience refs, content, schedule, and live counters (totalRecipients/sentCount/failedCount/suppressedCount). Poll this to report send progress.

create_campaignA

Create a campaign DRAFT (nothing sends yet — send_campaign starts the flow). Audience = segmentId (omit for all subscribed contacts), optionally gated by topicId (only contacts opted into that topic). Content = a saved templateId OR inline subject+html/text — never both. approvalRequired defaults to true: the send will park for human approval by email reply. Drafting is free on every plan.

update_campaignA

Update a campaign by id (partial) — only while it is draft or pending_approval (409 once sending). Pass an explicit null to clear a nullable field (segmentId/topicId/templateId/subject/html/text/fromName/replyTo/scheduledAt/throttlePerHour).

delete_campaignA

Delete a campaign by id. Allowed only while draft/pending_approval/completed/aborted — pause or abort a mid-flight campaign first.

send_campaignA

Request the campaign blast. By DEFAULT this does NOT send immediately: the campaign parks in pending_approval and the account owner is emailed a preview spec-sheet — the human approves by REPLYING "APPROVE" to that email or from the dashboard, and only then does dispatch start. Returns the campaign resource: report its status to the user (pending_approval = waiting on the human; scheduled = dispatch is on its way, which happens when approvalRequired is false or it was already approved). Re-calling on a pending campaign re-sends the approval email. Requires a paid plan + a verified fromEmail domain (403 plan_upgrade_required otherwise; the draft stays saved). ALWAYS run dry_run_campaign first.

approve_campaignA

Approve a pending_approval campaign via the API — the alternative to the owner replying APPROVE to the approval email. Re-runs the send gates, transitions it to scheduled, and starts dispatch. Only call this when the human has EXPLICITLY confirmed they want the blast to go out.

pause_campaignA

Pause a sending or scheduled campaign — the dispatch loop stops at its next batch. Resume later with resume_campaign; already-queued messages still deliver.

resume_campaignA

Resume a paused campaign — it returns to the lane it was paused from (sending if it had started, scheduled otherwise) and dispatch picks up where the cursor left off.

abort_campaignA

Permanently stop a campaign (scheduled/sending/paused/pending_approval → aborted). This is terminal — an aborted campaign cannot be resumed. Confirm with the human before calling.

dry_run_campaignA

Preview exactly what a campaign WOULD send — the net recipient count, how many contacts the safety rails excluded (unsubscribed / suppressed / topic opt-out), and up to 3 fully rendered per-recipient samples. Nothing is enqueued. ALWAYS call this before send_campaign and sanity-check the count and rendering with the user.

get_campaign_metricsB

Get a campaign's results: dispatch counters (totalRecipients/sentCount/failedCount/suppressedCount) plus per-type event counts (delivery/bounce/complaint/open/click) from the tracking pipeline.

list_automationsA

List automations (trigger→steps programs) with status + run counters. Filter by status (draft/active/paused). A draft with pendingApproval=true is waiting on a human approval reply.

get_automationA

Get one automation by id: trigger, step program, status, pendingApproval flag, and entered/completed counters.

create_automationA

Create an automation DRAFT (it runs nothing until activate_automation). trigger is one of {type:"contact_created"} | {type:"event", eventName} | {type:"inbound_received", inboxAddress?}. steps is 1-20 of {type:"email", fromEmail, templateId? XOR subject+html/text} | {type:"wait", minutes} | {type:"stop_if", condition}. A contact enters each automation at most once. Drafting is free on every plan.

update_automationA

Update an automation by id (partial) — only while draft or paused (pause an active one first). A new steps array replaces the program wholesale; pass an explicit null for topicId to clear the topic gate.

delete_automationA

Delete an automation by id (its runs cascade with it). Only while draft or paused — pause it first.

activate_automationA

Turn a draft or paused automation live. By DEFAULT activation is approval-gated like campaign sends: the automation stays draft with pendingApproval: true and the account owner is emailed the trigger + step timeline — the human approves by REPLYING "APPROVE" to that email (or from the dashboard), after which it goes active. When approvalRequired is false (or it was already approved) it activates immediately and re-wakes any runs a pause stranded. Returns the automation: report status and pendingApproval to the user. Requires a paid plan + verified fromEmail domains on every email step (403 plan_upgrade_required otherwise; the draft stays saved).

pause_automationA

Pause an active automation — new triggers stop matching and in-flight runs hold at their next step until you reactivate (reactivation re-wakes them; unfinished waits are honored).

list_automation_runsA

List one automation's runs (one per contact who entered): status (running/completed/stopped/failed), current step, trigger context, and next wake time.

send_eventA

Record a custom event about a contact ("order_placed", "trial_started", …) — identify them by email OR contactId (exactly one). An unknown email becomes a new subscribed contact. The event is stored durably and fire-and-forget starts any ACTIVE automations with a matching {type:"event", eventName} trigger. Returns 202 {accepted:true}.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ATOM00blue/drin-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server