Community Gmail server with auto-auth: search, read and send email via MCP.
Listmonk is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Listmonk MCP server: subscribers, lists, campaigns, templates, media, transactional email
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --env 'LISTMONK_MCP_URL=${LISTMONK_MCP_URL}' --env 'LISTMONK_MCP_USERNAME=${LISTMONK_MCP_USERNAME}' --env 'LISTMONK_MCP_PASSWORD=${LISTMONK_MCP_PASSWORD}' --transport stdio listmonk-mcp '--' npx -y listmonk-mcp-ts
# 2 — ask your agent for something these tools do
# check_listmonk_health, add_subscriber, update_subscriber and 33 more
It needs LISTMONK_MCP_URL, LISTMONK_MCP_USERNAME, LISTMONK_MCP_PASSWORD: this reads them from your environment, so export them first.
Listmonk costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Listmonk as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. Claude Code reads LISTMONK_MCP_URL (Listmonk base URL, e.g. https://listmonk.example.com), LISTMONK_MCP_USERNAME (Listmonk API user name), LISTMONK_MCP_PASSWORD (Listmonk API user password or token) from your environment each time it starts the server, so the value stays out of its config: export them in your shell profile (macOS, Linux), or run setx LISTMONK_MCP_URL …, setx LISTMONK_MCP_USERNAME …, setx LISTMONK_MCP_PASSWORD … and open a new terminal (Windows). The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user --env 'LISTMONK_MCP_URL=${LISTMONK_MCP_URL}' --env 'LISTMONK_MCP_USERNAME=${LISTMONK_MCP_USERNAME}' --env 'LISTMONK_MCP_PASSWORD=${LISTMONK_MCP_PASSWORD}' --transport stdio listmonk-mcp '--' npx -y listmonk-mcp-tsReconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: LISTMONK_MCP_URL — Listmonk base URL, e.g. https://listmonk.example.com; LISTMONK_MCP_USERNAME — Listmonk API user name; LISTMONK_MCP_PASSWORD — Listmonk API user password or token. You set them in your own client’s config, on your machine — this marketplace never holds it.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
36 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | yes | Subscriber email | |
| name | string | yes | Subscriber name |
| lists | array | no | IDs of the mailing lists to subscribe them to (see get_mailing_lists); empty means no lists |
| status | string | no | enabled (can receive mail), disabled, or blocklisted (never mailed) |
| attributes | object | no | Free-form JSON object stored with the subscriber, e.g. {"city": "Berlin"} |
| preconfirm | boolean | no | If true, subscriptions to double opt-in lists are marked confirmed and no confirmation email is sent |
Update an existing subscriber's email, name, status, list memberships or attributes. Only the fields you provide are sent to Listmonk. When lists or attributes is provided it is sent as the full new value, not merged with the old one. To only change status use change_subscriber_status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subscriber_id | number | yes | Subscriber ID |
| string | no | New email | |
| name | string | no | New name |
| status | string | no | New status: enabled, disabled or blocklisted |
| lists | array | no | Full new set of mailing list IDs; replaces the current memberships |
| attributes | object | no | Full new attributes object; replaces the current attributes |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subscriber_id | number | yes | Subscriber ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subscriber_id | number | yes | Subscriber ID |
| status | string | yes | New status (enabled, disabled, blocklisted) |
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 query to filter with a SQL expression; use get_subscriber_by_email when you already know the address.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| page | number | no | Page number, starting at 1 |
| per_page | number | no | Subscribers per page |
| query | string | no | Optional SQL condition on the subscribers table, e.g. subscribers.name LIKE '%john%' or subscribers.status = 'blocklisted'. Omit to list everyone |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subscriber_id | number | yes | Subscriber ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | yes | Subscriber email |
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | List name |
| type | string | no | public (can appear on subscription forms) or private (internal only) |
| optin | string | no | single (subscribed at once) or double (subscriber must confirm by email) |
| tags | array | no | Labels for organising lists |
| description | string | no | Short description of the list |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | number | yes | List ID |
| name | string | no | List name |
| type | string | no | public or private |
| optin | string | no | single or double |
| tags | array | no | List tags |
| description | string | no | List description |
Permanently delete a mailing list and its subscriptions. The subscribers themselves are kept and only leave this list. This cannot be undone.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | number | yes | List ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | number | yes | List ID |
| page | number | no | Page number, starting at 1 |
| per_page | number | no | Subscribers per page |
Get one mailing list by ID: name, type, opt-in mode, subscriber count, tags, description and timestamps.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | number | yes | List ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status | string | no | Only campaigns with this status: draft, scheduled, running, paused, cancelled or finished. Omit for all |
| page | number | no | Page number, starting at 1 |
| per_page | number | no | Campaigns per page |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
Create a campaign in draft status; nothing is sent yet. body is the message content and template_id selects the layout template that wraps it. Returns the new campaign ID. Next, review it with get_campaign_preview, then start it with send_campaign or schedule_campaign.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Campaign name |
| subject | string | yes | Email subject |
| lists | array | yes | IDs of the mailing lists to send to, at least one (see get_mailing_lists) |
| type | string | no | regular (normal campaign) or optin (asks subscribers to confirm a double opt-in subscription) |
| content_type | string | no | Format of body: richtext, html, markdown or plain |
| body | string | no | Message content in the chosen content_type; can also be added later with update_campaign |
| template_id | number | no | Layout template that wraps the body (see get_templates); omit to use the default campaign template |
| tags | array | no | Labels for organising campaigns |
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 lists. Use it before sending, because Listmonk may reject edits once a campaign is running. Does not send anything.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
| name | string | no | Campaign name |
| subject | string | no | New email subject line |
| lists | array | no | Full new set of target list IDs; omit to keep the current lists |
| body | string | no | New message content; replaces the whole current body |
| tags | array | no | Tags |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
Schedule a campaign to start sending automatically at a future date and time. Nothing is sent now. Use send_campaign to send immediately instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
| send_at | string | yes | Future start time in ISO 8601 format with a timezone, e.g. 2026-12-25T10:00:00Z |
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | number | yes | Template ID |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Template name |
| body | string | yes | Full template HTML. A 'campaign' template must contain {{ template "content" . }} where the campaign body goes |
| type | string | no | Template type: 'campaign' or 'tx' (transactional) |
| is_default | boolean | no | Whether this is default |
| subject | string | no | Subject line (required for 'tx' transactional templates) |
Update a template's name, body, default flag or subject. Only the fields you provide are sent, and a provided body replaces the old one completely. For large HTML bodies prefer update_template_from_file.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | number | yes | Template ID |
| name | string | no | Template name |
| body | string | no | New full template HTML; replaces the whole current body |
| is_default | boolean | no | Default template flag |
| subject | string | no | Subject line (required for 'tx' transactional templates) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Template name |
| file_path | string | yes | Path to the template HTML file inside LISTMONK_MCP_FILES_DIR (absolute or relative to it) |
| type | string | no | Template type: 'campaign' or 'tx' (transactional) |
| is_default | boolean | no | Whether this is default |
| subject | string | no | Subject line (required for 'tx' transactional templates) |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | number | yes | Template ID |
| file_path | string | yes | Path to the template HTML file inside LISTMONK_MCP_FILES_DIR (absolute or relative to it) |
| name | string | no | Template name |
| is_default | boolean | no | Default template flag |
| subject | string | no | Subject line (required for 'tx' transactional templates) |
Permanently delete a template by ID. This cannot be undone. Check get_templates first so you do not delete one that is still needed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | number | yes | Template ID |
Send one transactional email right away, using a 'tx' template, to a subscriber that already exists in Listmonk. The email cannot be recalled. data fills the template variables. Create tx templates with create_template (type 'tx').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template_id | number | yes | ID of a template of type 'tx' (see get_templates) |
| subscriber_email | string | yes | Email of an existing subscriber to send to |
| data | object | no | Key/value data for the template, available there as {{ .Tx.Data.<key> }} |
| content_type | string | no | Body format: html, markdown or plain |
List uploaded media files with ID, filename, title, size, creation date and public URL. The URL can be used in campaign and template HTML.
No parameter schema on file.
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| file_path | string | yes | Path to the media file inside LISTMONK_MCP_FILES_DIR (absolute or relative to it) |
| title | string | no | Display title in the media library; defaults to the filename |
Change a media file's display title in the media library. The filename and public URL stay the same, so existing links keep working.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| media_id | number | yes | Media ID |
| new_title | string | yes | New media title |
Permanently delete a media file. Campaigns or templates that still link to its URL will show a broken file. This cannot be undone.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| media_id | number | yes | Media ID |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
| search | string | yes | Exact text to find (case-sensitive, not a regex) |
| replace | string | yes | Text to put in place of every match; may be empty to delete |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
| pattern | string | yes | JavaScript regular expression source without slashes, applied globally, e.g. https://old\.example\.com |
| replace | string | yes | Replacement text; may use capture groups such as $1 |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| campaign_id | number | yes | Campaign ID |
| replacements | array | yes | Search/replace pairs applied in order; each search is a literal, case-sensitive text |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Listmonk or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (36 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| check_listmonk_health | no tags | |
| add_subscriber | state-write | state-write: declares readOnlyHint: false |
| update_subscriber | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| remove_subscriber | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| change_subscriber_status | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_subscribers | no tags | |
| get_subscriber_by_id | no tags | |
| get_subscriber_by_email | no tags | |
| get_mailing_lists | no tags | |
| create_mailing_list | state-write | state-write: declares readOnlyHint: false |
| update_mailing_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_mailing_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_list_subscribers_tool | no tags | |
| get_list_by_id | no tags | |
| get_campaigns | no tags | |
| get_campaign | no tags | |
| get_campaign_preview | no tags | |
| create_campaign | state-write | state-write: declares readOnlyHint: false |
| update_campaign | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| send_campaign | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| schedule_campaign | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_templates | no tags | |
| get_template | no tags | |
| create_template | state-write | state-write: declares readOnlyHint: false |
| update_template | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| create_template_from_file | state-write | state-write: declares readOnlyHint: false |
| update_template_from_file | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_template | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| send_transactional_email | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_media_list | no tags | |
| upload_media_file | state-write | state-write: declares readOnlyHint: false |
| rename_media | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_media_file | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| replace_in_campaign_body | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| regex_replace_in_campaign_body | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| batch_replace_in_campaign_body | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.1.3. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Listmonk can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.