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 |
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 | {
"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