Laposta MCP by usefulapi

Read Laposta lists, members, campaigns and reports; add members and build campaigns.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
95%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,132Tokens (tool definitions)
~1.7 KBTypical response size
Significant attention impact (3.23% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "laposta": {
      "url": "https://laposta.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://laposta.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (18)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢laposta_list_lists

List all mailing lists of the Laposta account with member counts (active, unsubscribed, cleaned). Use the list_id in the other tools.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_list(list_id)

Get one mailing list: name, state, notification addresses and member counts.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    }
  },
  "required": [
    "list_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_list_fields(list_id)

List the custom fields of a mailing list (name, custom_name used as the key in custom_fields, datatype, required, options). Call this before adding or updating a member.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    }
  },
  "required": [
    "list_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_list_segments(list_id)

List the segments of a mailing list (a segment id can be a campaign recipient together with its list).

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    }
  },
  "required": [
    "list_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_list_members(list_id, state, search, label, order_by, ...)

List the members (subscribers) of a mailing list, one page at a time. Filter by state, free-text search (email and field values) or label. Contains personal data: only fetch what the task needs.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    },
    "state": {
      "description": "Only members in this state (default: all).",
      "type": "string",
      "enum": [
        "active",
        "unsubscribed",
        "cleaned"
      ]
    },
    "search": {
      "description": "Only members containing this text in the email or any text/number/choice field.",
      "type": "string",
      "minLength": 1,
      "maxLength": 255
    },
    "label": {
      "description": "Only members with this label (by name).",
      "type": "string",
      "minLength": 1,
      "maxLength": 255
    },
    "order_by": {
      "description": "email, signup_date, or a text field's custom_name (comma-separated for several).",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "order": {
      "description": "Sort direction for order_by (default asc).",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "limit": {
      "description": "Items per page (default 25, max 100; a large page can be cut at 50,000 characters and lose its next_cursor).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Cursor: pass the previous reply's next_cursor unchanged, with the same filters.",
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    }
  },
  "required": [
    "list_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_member(list_id, member)

Get one member of a list by member id or email address: state, signup/confirm dates and custom field values.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    },
    "member": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "description": "The member id OR the member's email address."
    }
  },
  "required": [
    "list_id",
    "member"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_member_history(list_id, member, campaign_id, event_date_from, event_date_to, ...)

The event history of one member (subscribed, confirmed, opened, clicked, bounced, unsubscribed, automations ...), newest first by default. Optionally limited to one campaign or a date range. Paged by cursor.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    },
    "member": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "description": "The member id OR the member's email address."
    },
    "campaign_id": {
      "description": "Only events of this campaign.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "event_date_from": {
      "description": "Events from this moment, inclusive.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}([ T]\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "event_date_to": {
      "description": "Events before this moment, exclusive.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}([ T]\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "order": {
      "description": "Sort by event date (default desc).",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "limit": {
      "description": "Items per page (default 25, max 100; a large page can be cut at 50,000 characters and lose its next_cursor).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Cursor: pass the previous reply's next_cursor unchanged, with the same filters.",
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    }
  },
  "required": [
    "list_id",
    "member"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_list_campaigns(limit, offset)

List the account's campaigns (name, subject, sender, recipient lists, delivery moments). Use limit/offset to page.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Items to return (default 100, max 500).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "offset": {
      "description": "Items to skip (default 0). Pass the previous reply's next_offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_campaign(campaign_id)

Get one campaign: name, subject, preview text, sender, reply-to, recipients, delivery moments and web version URL.

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    }
  },
  "required": [
    "campaign_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_campaign_content(campaign_id, include_html)

Get the plain-text content of a campaign (and its import_url if it was imported). Set include_html to also get the full HTML (large).

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    },
    "include_html": {
      "description": "Also return the HTML body (default false).",
      "type": "boolean"
    }
  },
  "required": [
    "campaign_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_campaign_history(campaign_id, event_date_from, event_date_to, order, limit, ...)

Recipient events of one campaign (delivered, opened, clicked, bounced, unsubscribed ...), newest first by default, optionally within a date range. Paged by cursor. For totals use laposta_get_report.

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    },
    "event_date_from": {
      "description": "Events from this moment, inclusive.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}([ T]\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "event_date_to": {
      "description": "Events before this moment, exclusive.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}([ T]\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "order": {
      "description": "Sort by event date (default desc).",
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "limit": {
      "description": "Items per page (default 25, max 100; a large page can be cut at 50,000 characters and lose its next_cursor).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Cursor: pass the previous reply's next_cursor unchanged, with the same filters.",
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    }
  },
  "required": [
    "campaign_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_list_reports(limit, offset)

Result figures of all campaigns: sent, accepted, opened, clicked, bounced, unsubscribed, with ratios. Use limit/offset to page.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Items to return (default 100, max 500).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "offset": {
      "description": "Items to skip (default 0). Pass the previous reply's next_offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢laposta_get_report(campaign_id)

Result figures of one campaign: sent, accepted, unique opens and clicks, bounces, complaints, unsubscribes and their ratios.

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    }
  },
  "required": [
    "campaign_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴laposta_add_member(list_id, email, ip, source_url, custom_fields, ...)

WRITE: add one email address to a mailing list (subscribe). On a double opt-in list Laposta sends the confirmation email to that address. The address must have given consent. With upsert, an existing active member's fields are overwritten; an unsubscribed member is re-activated unless suppress_reactivation is set.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    },
    "email": {
      "type": "string",
      "minLength": 3,
      "maxLength": 320,
      "pattern": "^[^\\s@]+@[^\\s@]+$"
    },
    "ip": {
      "type": "string",
      "minLength": 3,
      "maxLength": 45,
      "pattern": "^[0-9a-fA-F:.]+$",
      "description": "IP address the signup came from (required by Laposta; use the signup source's address, or your own server's if it was entered by staff)."
    },
    "source_url": {
      "description": "URL the signup came from.",
      "type": "string",
      "maxLength": 2000,
      "format": "uri"
    },
    "custom_fields": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      },
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 5000
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 500
            }
          }
        ]
      },
      "description": "Custom field values keyed by the field's custom_name (the variable name shown by laposta_list_fields). Multi-choice fields take an array of option values."
    },
    "upsert": {
      "description": "Overwrite the fields if the address is already an active member (default false: error).",
      "type": "boolean"
    },
    "suppress_reactivation": {
      "description": "With upsert: do not re-activate an unsubscribed member.",
      "type": "boolean"
    },
    "suppress_email_notification": {
      "description": "Do not send the list's signup notification email.",
      "type": "boolean"
    }
  },
  "required": [
    "list_id",
    "email",
    "ip"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴laposta_update_member(list_id, member, email, state, custom_fields)

WRITE: change a member's custom field values and/or email address, or unsubscribe the member (state: unsubscribed). Only the fields you pass change. Re-subscribing a person is not offered here: do it in the Laposta app or with laposta_add_member upsert only when they asked for it.

Input Schema

{
  "type": "object",
  "properties": {
    "list_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The list id (from laposta_list_lists)."
    },
    "member": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "description": "The member id OR the member's email address."
    },
    "email": {
      "description": "A new email address for this member.",
      "type": "string",
      "minLength": 3,
      "maxLength": 320,
      "pattern": "^[^\\s@]+@[^\\s@]+$"
    },
    "state": {
      "description": "Set to unsubscribed to unsubscribe the member.",
      "type": "string",
      "const": "unsubscribed"
    },
    "custom_fields": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100
      },
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 5000
          },
          {
            "type": "number"
          },
          {
            "type": "boolean"
          },
          {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 500
            }
          }
        ]
      },
      "description": "Custom field values keyed by the field's custom_name (the variable name shown by laposta_list_fields). Multi-choice fields take an array of option values."
    }
  },
  "required": [
    "list_id",
    "member"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡laposta_create_campaign(name, subject, from_name, from_email, list_ids, ...)

WRITE: create a new regular campaign (a draft: it is NOT filled, scheduled or sent). Fill it with laposta_set_campaign_content, check it with laposta_send_test_email and send it in the Laposta app. The from_email must be an approved sender address of the account.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Internal campaign name."
    },
    "subject": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Subject line."
    },
    "from_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Sender name."
    },
    "from_email": {
      "type": "string",
      "minLength": 3,
      "maxLength": 320,
      "pattern": "^[^\\s@]+@[^\\s@]+$",
      "description": "Sender email address (must be an approved sender in Laposta)."
    },
    "list_ids": {
      "minItems": 1,
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 64,
        "description": "Laposta id (a short alphanumeric string, e.g. BaImMu3JZA)."
      },
      "description": "Recipients: list ids and optionally segment ids."
    },
    "reply_to": {
      "description": "Reply-to address.",
      "type": "string",
      "minLength": 3,
      "maxLength": 320,
      "pattern": "^[^\\s@]+@[^\\s@]+$"
    },
    "previewtext": {
      "description": "Preview text (max 120 characters).",
      "type": "string",
      "maxLength": 120
    },
    "google_analytics": {
      "description": "Link Google Analytics tracking.",
      "type": "boolean"
    }
  },
  "required": [
    "name",
    "subject",
    "from_name",
    "from_email",
    "list_ids"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴laposta_set_campaign_content(campaign_id, html, import_url, inline_css)

WRITE: replace a campaign's content with your HTML, or let Laposta import it from a URL (html wins if both are given). Does not send anything. The reply's report lists problems Laposta found (javascript, missing unsubscribe link, missing images).

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    },
    "html": {
      "description": "The complete HTML of the email.",
      "type": "string",
      "minLength": 1,
      "maxLength": 2000000
    },
    "import_url": {
      "description": "A public URL Laposta fetches the HTML from.",
      "type": "string",
      "maxLength": 2000,
      "format": "uri"
    },
    "inline_css": {
      "description": "Inline the CSS.",
      "type": "boolean"
    }
  },
  "required": [
    "campaign_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡laposta_send_test_email(campaign_id, email)

WRITE: send a test copy of a campaign (it must have content and not be sent yet) to ONE email address. Does not send the campaign to its recipients.

Input Schema

{
  "type": "object",
  "properties": {
    "campaign_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "The campaign id (from laposta_list_campaigns)."
    },
    "email": {
      "type": "string",
      "minLength": 3,
      "maxLength": 320,
      "pattern": "^[^\\s@]+@[^\\s@]+$",
      "description": "Where to send the test."
    }
  },
  "required": [
    "campaign_id",
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded18 tools