PostStack MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| POSTSTACK_API_KEY | Yes | PostStack API key (`sk_live_…` or `sk_test_…`) | |
| POSTSTACK_MCP_TRACE | No | Set to `1` to emit per-tool-call NDJSON telemetry to stderr |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_api_keyA | Generate a new PostStack API key. The full key is returned ONCE in this response and cannot be retrieved again. When to use: agent needs to provision credentials for a new integration. Pick "sending_access" for send-only keys (recommended for app servers) or "full_access" for management. Returns: shaped key including the secret string — display it once and tell the user to store it securely. Example: { name: "Backend prod", permission: "sending_access" } |
| list_api_keysA | List API keys (only the prefix is returned, never the full secret). When to use: audit which keys exist, find a key id to revoke. Returns: { keys: [{ id, name, keyPrefix, permission, mode, ... }] }. Example: { per_page: 50 } |
| get_api_keyA | Get an API key's metadata (the secret is never returned after creation). When to use: confirm a key's permission, mode or last-used timestamp before revoking. Returns: shaped key without secret. Example: { id: 17 } |
| revoke_api_keyA | Permanently revoke an API key — all subsequent requests using it will fail. When to use: a key has leaked or is no longer needed. Confirm with the user — irreversible. Returns: { success: boolean }. Example: { id: 17 } |
| create_broadcastA | Create a draft broadcast targeted at a segment. When to use: agent has assembled a campaign body + segment id and wants to stage it for review or scheduled send. Created in "draft" status — call send_broadcast to dispatch. Returns: shaped broadcast (id, subject, status=draft, recipient counts will populate on send). Example: { segment_id: "seg_abc", from: "Acme hi@acme.io", subject: "April update", html } |
| list_broadcastsA | List broadcasts. When to use: find recent campaigns, audit which broadcasts were sent, or pick one to inspect with get_broadcast. Returns: { items[], meta } — paginated shaped broadcasts with status and counts. Example: { per_page: 20 } |
| get_broadcastA | Get a broadcast's details and aggregate delivery stats. When to use: report on send results (delivered/opened/clicked/bounced) for a specific broadcast. Returns: shaped broadcast (subject, status, recipient counts). Example: { id: "br_abc" } |
| update_broadcastA | Edit a draft broadcast in place. Only draft broadcasts can be updated. When to use: tweak subject/body/segment before sending or before the scheduled time. Returns: shaped broadcast reflecting the new state. Example: { id: "br_abc", subject: "April update (revised)" } |
| send_broadcastA | Dispatch a draft broadcast to its segment immediately. When to use: after the user has reviewed the staged broadcast and approved sending. The broadcast must be in "draft" status. Returns: { success: boolean }. Example: { id: "br_abc" } |
| cancel_broadcastA | Cancel a queued or sending broadcast. When to use: stop a broadcast mid-flight. Already-delivered messages cannot be recalled. Returns: { success: boolean }. Example: { id: "br_abc" } |
| broadcast_performanceA | Get broadcast performance — either for one broadcast (variant breakdown if A/B) or for a leaderboard ranked by a chosen metric. When to use: agent wants to find the best-performing broadcast in a date range, or drill into one broadcast's stats. Pass broadcast_id for single mode, or { since, best_metric } for leaderboard mode. Returns: single mode → { broadcast: { id, subject, status, sent_at, total_recipients, delivered, opened, clicked, bounced, open_rate, click_rate }, variants: [...]|null }. Leaderboard → { metric, since, broadcasts: [...] } sorted by metric desc. Example: { broadcast_id: "br_abc" } — single mode. Example: { since: "2026-03-01T00:00:00Z", best_metric: "click_rate", limit: 5 } — leaderboard mode. |
| find_non_clickersA | List contacts who received a broadcast but did NOT click any tracked link in it. When to use: build a follow-up campaign to "people who saw it but didn't act". Pair with create_segment + send_broadcast (or send_email) to re-engage them. Returns: { broadcast: { id, subject }, count, contacts: [{ id, email, first_name, last_name }] }. Example: { broadcast_id: "br_abc", limit: 500 } |
| create_contact_propertyA | Define a custom contact property (typed schema for the contact.properties field). When to use: agent is extending the contact data model — e.g. add a "plan" or "company" field that other tools can filter on. Returns: shaped property definition. Example: { name: "plan", label: "Subscription Plan", type: "select", options: ["free","pro","scale"] } |
| list_contact_propertiesA | List all custom contact properties defined for this account. When to use: discover which custom fields are available before creating/updating contacts. Returns: { items: [property, ...] }. Example: {} |
| update_contact_propertyA | Edit a custom contact property's label, options or required flag. When to use: rename a label, expand the option list for a select, or toggle the required flag. Cannot change the type after creation. Returns: shaped property. Example: { id: 5, options: ["free","pro","scale","enterprise"] } |
| delete_contact_propertyA | Remove a custom contact property definition. Existing contact values for this property are dropped. When to use: a property is unused and being retired. Confirm with the user — values are not recoverable. Returns: { success: boolean }. Example: { id: 5 } |
| create_contactA | Create a new contact (person who can receive emails / broadcasts). When to use: ingest a new signup, programmatic enrollment, or one-off addition. For bulk imports prefer the API import endpoint. Returns: shaped contact (id, email, names, properties, createdAt). Example: { email: "ada@lovelace.io", first_name: "Ada", properties: { plan: "pro" } } |
| list_contactsA | List contacts with optional search and segment filtering. When to use: browse the contact book, find candidates by email/name fragment, or list members of a segment. Returns: { items[], meta } — paginated shaped contacts. Example: { search: "@acme.io", segment_id: "seg_xyz" } |
| get_contactA | Get full details of a contact by id. When to use: inspect a specific contact's properties, subscription state, or last activity. Returns: shaped contact with email, names, properties, unsubscribed flag, createdAt. Example: { id: "con_abc123" } |
| update_contactA | Update an existing contact's name, properties, or subscription state. When to use: keep the contact record in sync with your app (name change, plan upgrade, opt-out). Returns: shaped contact reflecting the new state. Example: { id: "con_abc123", properties: { plan: "scale" } } |
| delete_contactA | Permanently delete a contact (irreversible — use unsubscribe_contact for opt-outs). When to use: GDPR erasure or removing a test contact. For unsubscribes, prefer unsubscribe_contact which preserves history. Returns: { success: boolean }. Example: { id: "con_abc123" } |
| unsubscribe_contactA | Mark a contact as unsubscribed from all email (preserves the contact record). When to use: handle an unsubscribe request received outside PostStack (e.g. CS ticket, app preference). Returns: { success: boolean }. Example: { id: "con_abc123" } |
| get_contact_by_emailA | Look up a contact by their email address. When to use: agent has an email address (e.g. from a webhook, signup, or user message) and wants the full contact record without paginating list_contacts. Returns 404 if no contact exists with that email — use create_contact to add one. Returns: shaped contact (id, email, names, properties, unsubscribed, createdAt). Example: { email: "ada@lovelace.io" } |
| get_contact_activityA | Get a contact's recent email-event timeline grouped by event type (sent / delivered / opened / clicked / bounced / complained / failed). When to use: investigate a specific contact's engagement history before sending — e.g. did they bounce on the last campaign, are they frequently opening, when did they last click. Pass email OR id; email triggers a lookup, id is direct. Returns: { contact_id, email, total, events: { sent, delivered, opened, clicked, bounced, complained, failed, other } } where each is an array of { event_id, event_type, created_at, email_id, subject, from, geo_country, ua_client, is_prefetch, metadata }. Example: { email: "ada@lovelace.io", limit: 20 } |
| get_engagement_summaryA | Get a single contact's engagement summary: segment + lifetime counts + open / click rates + last open / click + top tags. When to use: agent wants to qualify a contact before sending — e.g. "is Ada a frequent opener?", "should we exclude her from a re-engagement push?". Distinct from get_contact_activity which returns the raw timeline. Returns: { segment, last_engaged_at, engagement_calculated_at, lifetime_sent, lifetime_delivered, lifetime_opened, lifetime_clicked, open_rate, click_rate, last_open, last_click, top_tags: [{ tag, count }] }. Example: { email: "ada@lovelace.io" } |
| search_contactsA | Search contacts with filters (segment, engagement, unsubscribed) and a fuzzy query across email/first_name/last_name. Adds a match_reason on each row indicating which field matched the query. When to use: agent needs to find a candidate set — e.g. "active contacts at @acme.io", "all dormant contacts", "people called Sarah". Use list_contacts for plain pagination without query, or use this when you need filtering or per-row match annotation. Returns: { items: [shaped contact + match_reason], meta: { page, perPage, total, totalPages } }. Example: { query: "ada", filters: { engagement_segment: "active" }, limit: 25 } |
| create_domainA | Add a new sending domain to PostStack. When to use: a customer is onboarding a new sending domain. The response includes DNS records (SPF, DKIM, DMARC, return-path) the user must configure before verify_domain succeeds. Returns: shaped domain with dnsRecords[] and pending status. Example: { name: "send.acme.io", region: "eu-west-1" } |
| list_domainsA | List sending domains. When to use: choose which domain to send from, or audit which domains are verified. Returns: { domains: [...] } — array of shaped domains with status and tracking flags. Example: { per_page: 50 } |
| get_domainA | Get domain details including DNS records and verification status. When to use: read DNS records to display, or check whether the domain is verified before sending. Returns: shaped domain (status, dnsRecords[], tracking flags, verifiedAt). Example: { id: 42 } |
| verify_domainA | Trigger DNS verification for a domain. When to use: user has configured DNS records (SPF/DKIM/DMARC/return-path) and wants PostStack to re-check them. Returns the new status — "verified" means sending is unblocked. Returns: shaped domain with updated status and per-record verified flags. Example: { id: 42 } |
| update_domainA | Update domain settings (open/click tracking, TLS mode). When to use: toggle tracking on/off, or switch between opportunistic and enforced TLS. Returns: shaped domain with updated settings. Example: { id: 42, click_tracking: false, tls_mode: "enforced" } |
| delete_domainA | Permanently delete a sending domain (irreversible — historical email records remain). When to use: a domain is being decommissioned. Confirm with the user first since future sends from any matching from-address will fail. Returns: { success: boolean }. Example: { id: 42 } |
| check_deliverabilityA | Check whether a from-address is safe to send from RIGHT NOW. When to use: BEFORE sending agent-generated content from a non-default domain. Combines DNS verification (DKIM/SPF/DMARC), 30-day bounce + complaint rates, and the standard deliverability warnings (no plain-text body, link-domain mismatch, oversized HTML, etc.) into one response. Returns: { from, domain, domain_verified, dkim, spf, dmarc, return_path, volume_30d, bounce_rate, complaint_rate, warnings[] }. Example: { from: "Acme hi@acme.io" } |
| send_emailA | Send a single transactional email immediately, or schedule it for a future time. When to use: the agent has decided what to send (subject + html/text + recipients) and wants PostStack to deliver it. Run preview_email and lint_email first if the body was generated by the agent. Returns: { id } — the new email id, suitable for get_email or cancel_email. Example: { from: "Ada ada@example.com", to: ["new@user.io"], subject: "Welcome", html: "Hi" } |
| send_batch_emailsA | Send multiple emails in a single batch request (up to 100 per call). When to use: agent needs to send the same or different content to many recipients in one round-trip. For broadcasts to a saved segment use create_broadcast/send_broadcast instead. Returns: { data: [{ id }, ...] } — one id per email in the order submitted. Example: { emails: [{ from, to: ["a@x"], subject: "hi", html }] } |
| list_emailsA | List previously-sent emails with optional filters and pagination. When to use: triage delivery, look up a specific recipient's history, or filter by status/tag/date. Returns: { items[], meta } — paginated emails with status, recipient, subject, timestamps. Example: { status: "bounced", date_from: "2026-04-10" } |
| get_emailA | Get full details and event timeline for a specific email by id. When to use: investigate why one email failed/bounced, or confirm delivery for a single send. Returns: shaped email record + events (queued, sent, delivered, opened, clicked, bounced). Example: { id: "em_7kf2x9" } |
| cancel_emailA | Cancel a scheduled email that has not yet entered the sending pipeline. When to use: agent wants to recall a scheduled send before it goes out. Cannot cancel emails already delivered. Returns: { success: boolean }. Example: { id: "em_7kf2x9" } |
| reschedule_emailA | Reschedule a scheduled email to a new send time. When to use: a queued email needs its delivery time adjusted (e.g. send earlier/later in business hours). Returns: { success: boolean }. Example: { id: "em_7kf2x9", scheduled_at: "2026-04-18T09:00:00Z" } |
| lint_emailA | Run a Rspamd-backed spam pre-flight on a draft email and return the score, action, and per-rule symbols. When to use: BEFORE sending agent-generated content. The score (0–15+) and action (no_action / greylist / add_header / soft_reject / reject) tell you whether the message is likely to be filtered. Symbols list the specific rules that fired. Returns: { score, action, symbols[], skipped, suggestions[] } — suggestions[] is derived from symbols whose score > 1. Example: { from: "Acme hi@acme.io", to: ["a@b.io"], subject: "Welcome", html: "hi" } |
| preview_emailA | Render + lint + measure an email in one shot WITHOUT sending it. When to use: BEFORE send_email when the body was generated by the agent. Combines render_template (if template_id given), spam check, deliverability warnings, and size measurement so you only need one round-trip to know if it's safe to send. Returns: { rendered_subject, rendered_html, rendered_text, size: { html_bytes, text_bytes }, spam: { score, action, symbols[], skipped }, warnings: [{ severity, code, message }] }. Example: { from: "Acme hi@acme.io", to: ["a@b.io"], template_id: "tpl_welcome", variables: { first_name: "Ada" } } |
| list_inbound_emailsA | List inbound emails received by mailboxes on this account. When to use: triage support inbox, find a recent message to inspect, or filter for messages needing reply. Returns: { data: [...], meta } shaped — id, from, subject, receivedAt per message. Example: { per_page: 20 } |
| get_inbound_emailA | Get a received inbound email's full headers and body. When to use: read a specific message before drafting a reply (use draft_from_thread or reply_to_inbound_email next). Returns: shaped inbound email with html/text body and headers. Example: { id: 7 } |
| list_inbound_email_attachmentsA | List attachments on an inbound email (filename, size, contentType). When to use: decide whether to download attachments before forwarding or processing. Returns: { items: [{ filename, contentType, size }] }. Example: { id: 7 } |
| reply_to_inbound_emailA | Send a reply to an inbound email (subject and threading headers are set automatically). When to use: the agent has drafted a reply body and wants to dispatch it. Quote the original message in the body if needed. Returns: { id } of the new outbound email. Example: { id: 7, from: "support@acme.io", html: "Thanks for reaching out…" } |
| forward_inbound_emailA | Forward an inbound email to other recipients with an optional cover note. When to use: route a message to a teammate or another address. Returns: { id } of the forwarded outbound email. Example: { id: 7, from: "support@acme.io", to: ["dev@acme.io"], message: "FYI" } |
| draft_from_threadA | Build a reply-draft skeleton for an inbound email — proper threading, quoted original, salutation/sign-off, suggested from + subject. Heuristic only; the agent fills in the body text. When to use: agent received an inbound email and wants to reply. Call this to get the draft scaffold, fill in body_placeholder with the actual reply, then call reply_to_inbound_email. Returns: { inbound, suggested_from, suggested_subject, salutation, body_placeholder, quoted_html, quoted_text, threading: { in_reply_to, references }, suggested_html, suggested_text }. Example: { inbound_id: 7, tone: "friendly" } |
| create_mailboxA | Provision a mailbox (IMAP/SMTP inbox) on a verified domain. When to use: agent is setting up a real human-readable inbox (e.g. support@acme.io). The password is required for IMAP/SMTP login. The domain must already be verified. Returns: shaped mailbox with emailAddress and quotaBytes. Example: { domainId: 42, localPart: "support", password: "", displayName: "Acme Support" } |
| list_mailboxesA | List mailboxes across all domains. When to use: see which inboxes exist, find a mailbox id by email address. Returns: { items[], meta } — paginated shaped mailboxes. Example: { per_page: 50 } |
| get_mailboxA | Get a mailbox's metadata (status, quota, last login). When to use: inspect a specific mailbox before updating or deleting. Returns: shaped mailbox. Example: { id: 17 } |
| update_mailboxA | Update a mailbox's display name, quota, status, or webhook setting. When to use: change ownership label, suspend a mailbox, raise quota. Returns: shaped mailbox with new state. Example: { id: 17, status: "suspended" } |
| delete_mailboxA | Permanently delete a mailbox and all its stored mail. When to use: decommissioning a mailbox. IRREVERSIBLE — confirm with the user, mail is gone. Returns: { success: boolean }. Example: { id: 17 } |
| change_mailbox_passwordA | Reset a mailbox's IMAP/SMTP password. When to use: rotate after suspected exposure, or onboarding handoff. Returns: { success: boolean }. Example: { id: 17, password: "" } |
| suggest_from_addressA | Suggest sensible from-addresses for a given purpose, drawn from the team's verified domains + existing mailboxes. When to use: agent doesn't know which from-address to use. Pass the purpose ("transactional", "marketing", "support", "newsletter", etc.); the tool ranks options based on existing mailboxes (real inboxes) and conventional local-parts for the purpose. Returns: { recommended: string|null, alternatives: string[], reasoning: string }. Example: { purpose: "transactional" } |
| create_segmentA | Create a static contact segment (manually-managed list). When to use: agent needs a named bucket of contacts to send a broadcast to. Add members via add_contacts_to_segment. Returns: shaped segment with id and contactCount=0. Example: { name: "Spring 2026 launch" } |
| list_segmentsA | List contact segments. When to use: pick a segment id for create_broadcast or list_contacts(segment_id=…). Returns: { segments: [...] } — array of shaped segments with contactCount. Example: { per_page: 50 } |
| get_segmentA | Get a segment's details and member count. When to use: confirm a segment's contactCount before broadcasting (to estimate volume). Returns: shaped segment (name, contactCount, createdAt). Example: { id: "seg_abc" } |
| update_segmentA | Rename an existing segment. When to use: clean up segment names. Membership is unaffected. Returns: shaped segment with new name. Example: { id: "seg_abc", name: "Spring 2026 launch (final)" } |
| delete_segmentA | Delete a segment definition. Contacts in it are NOT deleted. When to use: remove an obsolete segment. Confirm with the user. Returns: { success: boolean }. Example: { id: "seg_abc" } |
| add_contacts_to_segmentA | Add one or more contacts to a segment. When to use: enroll specific contacts in an existing segment (e.g. agent built a list and wants to materialise it). Returns: { added: number } or similar success indicator. Example: { id: "seg_abc", contact_ids: ["con_1", "con_2"] } |
| remove_contact_from_segmentA | Remove a single contact from a segment. When to use: targeted removal (e.g. opt-out, manual exclusion). Does not delete the contact. Returns: { success: boolean }. Example: { id: "seg_abc", contact_id: "con_1" } |
| create_subscription_topicA | Create a subscription topic (named opt-in/opt-out preference like "Product Updates"). When to use: agent is setting up granular preferences so contacts can subscribe per topic instead of all-or-nothing. Returns: shaped topic. Example: { name: "Product Updates", description: "Monthly product news" } |
| list_subscription_topicsA | List all subscription topics defined for this account. When to use: pick a topic_id for a broadcast, or audit which preferences exist. Returns: { items: [topic, ...] } shaped. Example: {} |
| delete_subscription_topicA | Permanently delete a subscription topic. Subscriptions are removed. When to use: a topic is being retired. Confirm with the user. Returns: { success: boolean }. Example: { id: 3 } |
| get_contact_subscriptionsA | List the subscription topics a contact is currently opted in to. When to use: check whether a contact is subscribed to a specific topic before sending. Returns: { items: [{ topicId, subscribedAt }] }. Example: { contact_id: "con_abc" } |
| subscribe_contact_to_topicA | Opt a contact in to a subscription topic. When to use: explicit user consent ("subscribe me to product updates"). Returns: shaped subscription record. Example: { contact_id: "con_abc", topic_id: 3 } |
| unsubscribe_contact_from_topicA | Opt a contact out of a subscription topic. When to use: explicit user opt-out for a single preference (the contact remains in other topics and the global list). Returns: { success: boolean }. Example: { contact_id: "con_abc", topic_id: 3 } |
| list_suppressionsA | List suppressed email addresses (will not receive any emails). When to use: audit which addresses are blocked, or paginate to find a specific entry. Returns: { items[], meta } — paginated suppressions with reason and createdAt. Example: { per_page: 100 } |
| add_suppressionA | Block an email address from receiving any future sends. When to use: a recipient asked to be removed (manual), or you're importing prior bounces/complaints. Returns: shaped suppression record. Example: { email: "bouncy@aol.com", reason: "hard_bounce" } |
| remove_suppressionA | Remove an address from the suppression list (sends will resume). When to use: a previously-suppressed user has explicitly opted back in, or a bounce was a misconfiguration. Returns: { success: boolean }. Example: { email: "fixed@aol.com" } |
| create_templateA | Create a new email template with {{variable}} placeholders. When to use: store a re-usable email body the agent (or app) will send repeatedly. Newly created templates are unpublished — call publish_template before sending. Returns: shaped template with id, version, published=false. Example: { name: "welcome-v3", subject: "Welcome {{first_name}}", html: "Hi {{first_name}}" } |
| list_templatesA | List email templates. When to use: pick a template id for send_email or render_template, or audit which templates exist. Returns: { items[], meta } — paginated shaped templates with name, version, published flag. Example: { per_page: 50 } |
| get_templateA | Get a template's full body, subject and variables. When to use: read the source HTML/text before editing, or extract the variable list to know what to pass in. Returns: shaped template with htmlBody, textBody, variables[], version. Example: { id: "tpl_abc" } |
| update_templateA | Update an existing template's name, subject, body or variable list. When to use: edit a template in place. The template version is bumped on update. Returns: shaped template with new version. Example: { id: "tpl_abc", subject: "Updated subject" } |
| delete_templateA | Permanently delete a template (irreversible). When to use: an unused template should be removed. Confirm with the user — emails referencing this template_id will fail. Returns: { success: boolean }. Example: { id: "tpl_abc" } |
| publish_templateA | Mark a template as published so it can be referenced by send_email. When to use: after creating or editing a template you have validated and want available for sending. Returns: shaped template with published=true. Example: { id: "tpl_abc" } |
| unpublish_templateA | Mark a template as unpublished so it cannot be sent. When to use: hide a template from sending without deleting it (e.g. retiring a campaign while keeping history). Returns: shaped template with published=false. Example: { id: "tpl_abc" } |
| duplicate_templateA | Create a copy of an existing template (new id, same body, name suffixed " (copy)"). When to use: agent wants to fork a template before editing so the original remains intact. Returns: shaped new template (unpublished draft). Example: { id: 17 } |
| render_templateA | Server-side render a template with the provided variables. When to use: agent wants to preview the final subject/html/text before sending, or needs to inspect what variables a template requires. Returns missing_variables[] so the agent can prompt the user / fill in defaults. Returns: { subject, html, text, missing_variables[], template_variables[] }. Example: { template_id: "tpl_welcome", variables: { first_name: "Ada" } } |
| create_webhookA | Subscribe a URL to receive event notifications via signed POST requests. When to use: agent is configuring an integration that needs to react to email/contact/domain events in real time. Returns: shaped webhook with id, url, events[], active=true. Example: { url: "https://hooks.acme.io/poststack", events: ["email.bounced", "email.complained"] } |
| list_webhooksA | List configured webhook endpoints. When to use: audit which integrations are receiving events. Returns: { webhooks: [...] } — array of shaped webhooks. Example: { per_page: 50 } |
| get_webhookA | Get a webhook's details. When to use: inspect the URL, event list, or active state for a specific webhook. Returns: shaped webhook. Example: { id: 17 } |
| update_webhookA | Edit a webhook's URL, event list, or enabled state. When to use: rotate to a new endpoint, expand/narrow events, or temporarily disable. Returns: shaped webhook with new state. Example: { id: 17, enabled: false } |
| delete_webhookA | Permanently delete a webhook endpoint. When to use: the integration is being removed. Confirm with the user — events will no longer be delivered. Returns: { success: boolean }. Example: { id: 17 } |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| draft_welcome_email | Guide the agent through drafting and sending a personalised welcome email to a new contact. Looks the contact up, picks a published welcome template, renders it, lints, and sends. |
| reengage_dormant | Find dormant contacts and draft a re-engagement campaign. Pulls the dormant segment, picks an opt-out-friendly template, and stages a broadcast for review. |
| followup_non_clickers | Demo B path — find the best-performing recent broadcast, identify recipients who did NOT click, and draft a follow-up to them. |
| summarize_campaign | Produce a short performance report for a broadcast: headline metrics, A/B winner if applicable, and a one-line recommendation. |
| triage_inbound | Read an inbound email, classify it (support / sales / billing / spam / other), and propose the next action. Drafts a reply skeleton if appropriate. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| templates | List of all email templates for the authenticated team. Includes id, name, subject, version, published flag. |
| domains | List of sending domains for the authenticated team — name, status, DNS records, tracking flags. |
| segments | List of contact segments for the authenticated team — id, name, contact count. |
| brand | Authenticated team identity + a default sending suggestion. Includes team name, verified domain count, and the recommended from-address derived from existing mailboxes. |
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/getpoststack/mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server