Drin MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DRIN_SENDER | No | Default product externalId; required when using an account-wide API key. | |
| DRIN_API_KEY | Yes | Your Drin API key (Bearer token from Settings → API Keys). | |
| DRIN_BASE_URL | No | Override base URL for self-hosted or preview environments. | https://api.drin.run |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| send_emailA | Send a transactional email. Provide |
| send_batchA | Send up to 100 emails in one call. |
| 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 |
| 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 |
| create_templateA | Create a reusable server-side template. |
| update_templateA | Update a saved template by id or slug (partial — only provided fields change). Pass an explicit null for |
| 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 |
| 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. |
| update_webhookA | Update a webhook by id (partial). Pause/resume with |
| 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 |
| 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 |
| 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. |
| update_topicB | Update a topic by id (partial — only provided fields change). Pass an explicit null for |
| 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. |
| 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. |
| update_segmentA | Update a segment by id (partial). Pass an explicit null for |
| 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 |
| 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 = |
| 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 |
| 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). |
| update_automationA | Update an automation by id (partial) — only while draft or paused (pause an active one first). A new |
| 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 |
| 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 |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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