MailPoet MCP integration

Write the newsletter, check who gets it, then send.

EMCP Pro drives MailPoet's own code in-process: its API for lists, tags and custom fields, its save controller for subscribers, and its endpoints for newsletters and sending. Manage subscribers, build newsletters in MailPoet's block email editor and send or schedule them with a recipient check. Consent stays with the subscriber.

Pro integrationMailPoet 5.x (free is enough)

MailPoet’s email editorActual screenshot
MailPoet block email editor with the newsletter: a photo of fresh tagliatelle, the heading This month in the kitchen, two paragraphs and a Book your autumn class button.
The newsletter in MailPoet’s own email editor, ready to review. See the real run

A real run on our test site

A newsletter that refuses the wrong count.

The assistant created a list and a tag, imported subscribers, wrote the October newsletter in MailPoet’s block email editor, sent itself a test and scheduled it.

What we asked
In MailPoet, create a Kitchen notes list and a Past student tag, add our students, and write the October newsletter with the pasta photo, the class news and a sage butter recipe. Send me a test, then schedule it for 15 October at 8.
Recorded
Plugin
MailPoet 5.41.0
Connection
EMCP 3.19.0 over MCP (WP-CLI stdio)
Calls shown
10, in the order they ran
What happened along the way
  • Maya and Sam were already in MailPoet as unconfirmed WordPress users. EMCP refused the whole first import rather than change their consent; the second import left them out.
  • A send with expected_recipients 3 was refused because the list had 4 subscribers. With 4 it was scheduled, and it was unscheduled again after the screenshots.
  • send-test-email goes to the current user only.
The tool callsActual answers, shortened
  1. 01mailpoet-write · create-list
    {"name": "Kitchen notes", "description": "Monthly recipes and class news from Larkspur Kitchen School"}Answer: {"id": 4, "name": "Kitchen notes", "change_id": "a61c3a6f328e"}
  2. 02mailpoet-write · create-tag
    {"name": "Past student", "description": "Has taken at least one class"}Answer: {"id": 1, "name": "Past student", "change_id": "6b2e91c297ac"}
  3. 03mailpoet-write · import-subscribersRefused
    {"subscribers": [{"email": "[email protected]", "first_name": "Maya", "last_name": "Ortiz", "list_ids": [4], "tag_ids": [1]}, {"email": "[email protected]", "first_name": "Sam", "last_name": "Reed", "list_ids": [4], "tag_ids": [1]}, {"email": "[email protected]", "first_name": "Priya", "last_name": "Nair", "list_ids": [4], "tag_ids": [1]}, "… 3 more"]}Refusal: 2 of these subscribers cannot be added to a list without changing their consent (unsubscribed, bounced, inactive, trashed, or unconfirmed with double opt-in off); nothing was written. Leave them out, for example with a filter on status subscribed.
  4. 04mailpoet-write · import-subscribers
    {"subscribers": [{"email": "[email protected]", "first_name": "Priya", "last_name": "Nair", "list_ids": [4], "tag_ids": [1]}, {"email": "[email protected]", "first_name": "Tom", "last_name": "Becker", "list_ids": [4], "tag_ids": [1]}, {"email": "[email protected]", "first_name": "Lena", "last_name": "Fischer", "list_ids": [4], "tag_ids": [1]}, "… 1 more"]}Answer: {"created": [4, 5, 6, "… 1 more"], "updated": [], "skipped": [], "emails": {"sent": 0, "queued": 0}, "automations": [], "change_id": "abac73c89c74"}
  5. 05mailpoet-write · create-newsletter
    {"subject": "Kitchen notes: October", "preheader": "Pasta Saturdays are back, plus a sage butter recipe", "sender_name": "Larkspur Kitchen School", "sender_address": "[email protected]", "list_ids": [4], "content": "<!-- wp:image {\"sizeSlug\":\"large\"} --> <figure class=\"wp-bloc…"}Answer: {"id": 1, "status": "draft", "editor": "block", "change_id": "408cc0f6e9c1"}
  6. 06mailpoet-read · get-recipient-count
    {"newsletter_id": 1}Answer: {"list_ids": [4], "count": 4}
  7. 07mailpoet-write · send-test-email
    {"newsletter_id": 1, "confirm": true}Answer: {"id": 1, "sent_to": "[email protected]"}
  8. 08mailpoet-write · send-newsletterRefused
    {"newsletter_id": 1, "version": "f40e0a130dbe97b9", "expected_recipients": 3, "scheduled_at": "2026-10-15 08:00", "confirm": true}Refusal: This send would reach 4 subscribers, not 3; nothing was queued. Check get-recipient-count and send again with that number.
  9. 09mailpoet-write · send-newsletter
    {"newsletter_id": 1, "version": "f40e0a130dbe97b9", "expected_recipients": 4, "scheduled_at": "2026-10-15 08:00", "confirm": true}Answer: {"status": "scheduled", "scheduled_at": "2026-10-15 08:00:00", "change_id": "1d156ae26a70"}
  10. 10mailpoet-write · unschedule-newsletter
    {"newsletter_id": 1}Answer: {"status": "draft", "scheduled_at": "2026-10-15 08:00:00", "change_id": "170827c97b3b"}

Larkspur Kitchen School is a fictional demonstration, and so are its staff and students. Recorded on our test site on October 7, 2026 with EMCP 3.19.0 and MailPoet 5.41.0, over a real MCP connection. Food photos from Pexels. Email was held on the test site, so nothing was sent. The MailPoet screens are the plugin’s own; values and ids in the calls are the ones this run returned, with long text shortened.

A practical place to start

From new subscribers to a sent newsletter.

  1. 01

    Add the subscribers

    Create or import up to 200 subscribers with their lists, tags and custom fields. Welcome emails and automations run only with run_automations: true.

  2. 02

    Build the newsletter

    create-newsletter writes a standard newsletter in MailPoet's block email editor. send-test-email sends a preview to your own address only.

  3. 03

    Send with a check

    send-newsletter needs confirm and the recipient count from get-recipient-count. Send now, or schedule in site time; a schedule can be taken back until two minutes before.

Built for MailPoet

MailPoet’s own code, no shortcuts

EMCP never writes MailPoet’s tables for a normal write. Lists, tags and memberships go through MailPoet’s public API, subscriber profiles through its save controller, and newsletters through the endpoints its admin uses. Every subscriber, list, tag, newsletter and automation answers a version, and every write is read back.

MailPoet’s consent record, the source, sign-up and confirmation IPs and dates, is never written. Adding a list to someone who opted out is refused before MailPoet is called, because MailPoet’s own list add would make them sendable again. A subscriber marked subscribed by hand needs confirm, and only from unconfirmed.

Sends you can check first

A send names the recipient count it expects, counted the way MailPoet counts: globally subscribed, untrashed members, each once. A mismatch queues nothing. Every change is in History in EMCP Tools, and erasure removes a subscriber from History as well.

Use the MailPoet tool reference for operation names and arguments. FluentCRM sites use the FluentCRM integration.

Get connected

Put MailPoet in your AI’s toolkit.

  1. 1

    Install MailPoet

    Install EMCP Pro 3.19 or later with MailPoet 5.x. The free edition is enough.

  2. 2

    Enable the write tool

    mailpoet-read is on; mailpoet-write starts disabled. Enable it under EMCP Tools > Tools > Plugins > MailPoet and reconnect your AI client.

  3. 3

    Check the sending setup

    get-setup reports double opt-in, the sending method, the sender, the subscriber limit and the active automations.

Install EMCP

Then connect Claude Code, Claude Desktop, or Cursor to use the MailPoet tools enabled on your site. Compare Free and Pro access.

Build with AIRun your email marketing with AIImport and tag contacts, draft campaigns, check the recipient count, then schedule the send.See how it works

A few useful details

Before you connect.

Questions about MailPoet, supported operations, and the workflow on your site.

Will it resubscribe people who unsubscribed?

No. Adding a list to someone who unsubscribed, bounced or went inactive is refused with consent_required, and undo never makes anyone sendable again, force included.

Do welcome emails and automations run?

Only with run_automations: true. Otherwise EMCP holds MailPoet's automation triggers and welcome emails for the call.

How are schedules handled?

You give the site's local time. MailPoet stores it in UTC, and EMCP converts it, so the send goes out when you asked on any site time zone.

What happens when I erase a subscriber?

delete-subscriber erases them with their memberships, custom field values and tags, and removes their data from every earlier History entry. A WordPress privacy erasure does the same.

Your tools. Your WordPress site.

Make MailPoet part of the conversation.

Get EMCP Pro