listmonk-mcp-ts
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LISTMONK_MCP_URL | Yes | Listmonk base URL, http:// or https:// | |
| LISTMONK_MCP_TIMEOUT | No | HTTP timeout in seconds | 30 |
| LISTMONK_MCP_PASSWORD | Yes | Listmonk API user token | |
| LISTMONK_MCP_USERNAME | Yes | Listmonk API user name | |
| LISTMONK_MCP_FILES_DIR | No | Directory the file tools may read from. File tools are disabled when it is not set | |
| LISTMONK_MCP_MAX_RETRIES | No | Retries on network errors. Only GET requests are retried | 3 |
| LISTMONK_MCP_SERVER_NAME | No | Server name reported to the client | Listmonk MCP Server |
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": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_listmonk_healthA | Check that the Listmonk server is reachable and responding, and return its health data. Makes a single request with no retries. Use it first when other tools fail with connection errors. |
| add_subscriberA | Create a new subscriber and optionally subscribe them to mailing lists. Fails if a subscriber with the same email already exists. Returns the new subscriber ID. To change an existing subscriber use update_subscriber. |
| update_subscriberA | Update an existing subscriber's email, name, status, list memberships or attributes. Only the fields you provide are sent to Listmonk. When |
| remove_subscriberA | Permanently delete a subscriber and all their list subscriptions. This cannot be undone. To stop mailing someone but keep their record, use change_subscriber_status with 'blocklisted' instead. |
| change_subscriber_statusA | Change only a subscriber's status to enabled, disabled or blocklisted. Blocklisted subscribers are excluded from all campaigns. Use remove_subscriber to delete the record instead. |
| list_subscribersA | List subscribers, newest first, one page at a time. Returns the total subscriber count and each subscriber's name, email, status and list names. Use |
| get_subscriber_by_idA | Get one subscriber by numeric ID: email, name, status, timestamps, list memberships and custom attributes. Returns an error if the ID does not exist. Use get_subscriber_by_email when you only know the address. |
| get_subscriber_by_emailA | Look up one subscriber by exact email address and return the same details as get_subscriber_by_id. Returns a not-found error if no subscriber has that address. |
| get_mailing_listsA | List mailing lists with ID, type, subscriber count and tags. Use it to find the list IDs required by add_subscriber, create_campaign and other tools. |
| create_mailing_listA | Create a mailing list and return its ID, which other tools use to subscribe people and target campaigns. A list is public or private and uses single or double opt-in. |
| update_mailing_listA | Update a mailing list's name, type, opt-in mode, tags or description. Only the fields you provide are sent. Existing subscribers are not removed. |
| delete_mailing_listA | Permanently delete a mailing list and its subscriptions. The subscribers themselves are kept and only leave this list. This cannot be undone. |
| get_list_subscribers_toolA | List the subscribers of one mailing list, one page at a time, with name, email and status, plus the list's total subscriber count. Use get_mailing_lists to find list IDs. |
| get_list_by_idA | Get one mailing list by ID: name, type, opt-in mode, subscriber count, tags, description and timestamps. |
| get_campaignsA | List campaigns, one page at a time, with ID, name, status, sent/total progress and target list IDs. Optionally filter by status. Use get_campaign for one campaign's full details and body. |
| get_campaignA | Get one campaign by ID: name, subject, status, type, template, target lists, send progress, view and click counts, and the full body (which can be large). |
| get_campaign_previewA | Render a preview of the campaign as the HTML subscribers would see. Read-only: nothing is sent. Use it to check a campaign before send_campaign or schedule_campaign. |
| create_campaignA | Create a campaign in draft status; nothing is sent yet. |
| update_campaignA | Update a campaign's name, subject, target lists, body or tags. Only the fields you provide are sent, and the target lists are kept if you omit |
| send_campaignA | Start sending a campaign to its target lists right now by setting its status to running. This emails real subscribers and cannot be undone, so check get_campaign_preview first. It returns as soon as sending starts and delivery continues in the background; follow progress with get_campaign. To send later use schedule_campaign. |
| schedule_campaignA | Schedule a campaign to start sending automatically at a future date and time. Nothing is sent now. Use send_campaign to send immediately instead. |
| get_templatesA | List all templates (campaign layouts and transactional) with ID, name, type and default flag. Use the IDs with create_campaign, send_transactional_email or update_template. |
| get_templateA | Get one template by ID: name, type (campaign or tx), default flag, subject (tx only), update time and the full HTML body, which can be large. |
| create_templateA | Create a template and return its ID. Type 'campaign' is a layout that wraps campaign bodies; type 'tx' is a transactional email template that needs a subject and is sent with send_transactional_email. For large HTML bodies prefer create_template_from_file. |
| update_templateA | Update a template's name, body, default flag or subject. Only the fields you provide are sent, and a provided |
| create_template_from_fileA | Create a template whose HTML body is read from a UTF-8 file inside LISTMONK_MCP_FILES_DIR, so large bodies such as MJML exports are stored byte for byte. Otherwise identical to create_template. Fails if LISTMONK_MCP_FILES_DIR is not set or the path is outside it. |
| update_template_from_fileA | Update an existing template, replacing its HTML body with the contents of a UTF-8 file inside LISTMONK_MCP_FILES_DIR. Otherwise identical to update_template. Fails if LISTMONK_MCP_FILES_DIR is not set or the path is outside it. |
| delete_templateA | Permanently delete a template by ID. This cannot be undone. Check get_templates first so you do not delete one that is still needed. |
| send_transactional_emailA | Send one transactional email right away, using a 'tx' template, to a subscriber that already exists in Listmonk. The email cannot be recalled. |
| get_media_listA | List uploaded media files with ID, filename, title, size, creation date and public URL. The URL can be used in campaign and template HTML. |
| upload_media_fileA | Upload a file from LISTMONK_MCP_FILES_DIR to the Listmonk media library and return its ID and public URL for use in campaign bodies. Fails if LISTMONK_MCP_FILES_DIR is not set or the path is outside it. Image types (jpg, png, gif, webp, svg) get the right MIME type; other types upload as generic binary and Listmonk may reject them. |
| rename_mediaA | Change a media file's display title in the media library. The filename and public URL stay the same, so existing links keep working. |
| delete_media_fileA | Permanently delete a media file. Campaigns or templates that still link to its URL will show a broken file. This cannot be undone. |
| replace_in_campaign_bodyA | Replace every occurrence of a literal text in a campaign's body (case-sensitive, not a regex) and save the campaign. Reports how many replacements were made and changes nothing if the text is not found. For patterns use regex_replace_in_campaign_body; for several replacements in one save use batch_replace_in_campaign_body. |
| regex_replace_in_campaign_bodyA | Replace all matches of a JavaScript regular expression in a campaign's body and save the campaign. Reports how many matches were replaced and changes nothing if there is no match. An invalid pattern returns an error. For plain text use replace_in_campaign_body. |
| batch_replace_in_campaign_bodyA | Apply several literal search and replace pairs to a campaign's body in the given order, then save once. Later pairs see the result of earlier ones, and empty search texts are skipped. Nothing is saved if no pair matches. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 36 tools
Most tools target clearly distinct resources and actions, with helpful cross-references in descriptions (e.g. get_subscriber_by_id vs get_subscriber_by_email, send_campaign vs schedule_campaign). The main overlaps are the three campaign-body replacement variants and the file-based template creation/update variants, but each is explicitly differentiated.
The set predominantly follows a verb_noun convention (add_subscriber, update_campaign, delete_template), with mostly snake_case names. Minor deviations exist: listing uses both 'get' (get_mailing_lists, get_media_list) and 'list' (list_subscribers), and get_list_subscribers_tool has an inconsistent '_tool' suffix.
At 36 tools, the surface is quite large for one MCP server and exceeds the typical well-scoped range. While the domain is broad (subscribers, lists, campaigns, templates, media), several tools are close variants, making the set heavier than necessary.
Core newsletter workflows are well covered: subscriber and list CRUD, campaign creation/preview/send/schedule, template CRUD with file-based variants, transactional email, and media management. A few lifecycle gaps remain, such as campaign deletion or duplication and broader subscriber import/bulk operations, but agents can work around these.