FluentCRM MCP integration

Grow the list and send the campaign, with nothing sent by accident.

EMCP Pro runs FluentCRM's own abilities and REST API, so FluentCRM checks its permissions and validation. Manage contacts, tags, lists and notes, import in batches, build templates and campaigns, and schedule sends that must name the recipient count FluentCRM reports. Automations stay still unless you ask.

Pro integrationFluentCRM 3.x (free is enough)

ContactsActual screenshot
FluentCRM All Contacts list with eight subscribed contacts on the Autumn term list, tagged Pasta class, Knife skills or Bread and pastry.
The imported contacts, each with its list and tag. See the real run

A real run on our test site

A tagged audience, and a campaign that checks its count.

The assistant created tags and a list, imported eight contacts, added a note, wrote a campaign and scheduled it for exactly the number of recipients FluentCRM counted.

What we asked
In FluentCRM, tag our autumn students by class, put them on an Autumn term list, add a note to Maya’s profile, and draft a campaign announcing the autumn term to that list. Schedule it for 12 October at 9.
Recorded
Plugin
FluentCRM 3.2.5
Connection
EMCP 3.19.0 over MCP (WP-CLI stdio)
Calls shown
8, in the order they ran
What happened along the way
  • schedule-campaign needs expected_recipients equal to FluentCRM’s live estimate (8 here) and confirm: true.
  • The first import nested the names under a fields key, which was ignored; the merge import shown here filled them in.
  • The campaign was unscheduled again after the screenshots, so nothing was sent.
The tool callsActual answers, shortened
  1. 01fluentcrm-write · create-tag
    {"title": "Pasta class"}Answer: {"tag_id": 1, "version": "aea10928d0ff34f9", "change_id": "4ba30b167493"}
  2. 02fluentcrm-write · create-list
    {"title": "Autumn term", "description": "Students who booked a class this autumn"}Answer: {"list_id": 1, "version": "942878661d6e1eed", "change_id": "74acf7cfb574"}
  3. 03fluentcrm-write · import-contacts
    {"if_exists": "merge", "contacts": [{"email": "[email protected]", "tags": ["Pasta class"], "lists": ["Autumn term"], "first_name": "Maya", "last_name": "Ortiz", "status": "subscribed"}, {"email": "[email protected]", "tags": ["Knife skills"], "lists": ["Autumn term"], "first_name": "Sam", "last_name": "Reed", "status": "subscribed"}, {"email": "[email protected]", "tags": ["Pasta class"], "lists": ["Autumn term"], "first_name": "Priya", "last_name": "Nair", "status": "subscribed"}, "… 5 more"]}Answer: {"summary": {"created": 0, "updated": 8, "skipped": 0, "invalid": 0, "warnings": 0}, "created": [], "updated": [{"id": 1, "email": "[email protected]", "status": "subscribed"}, {"id": 2, "email": "[email protected]", "status": "subscribed"}, {"id": 3, "email": "[email protected]", "status": "subscribed"}, "… 5 more"], "skipped": [], "emails": {"sent": 0, "queued": 0}, "automations": [], "change_id": "20314c26243b"}
  4. 04fluentcrm-write · add-note
    {"contact_id": 1, "title": "Private lesson booked", "description": "Booked a private risotto lesson for 14 October. Prefers Satur…"}Answer: {"note_id": 1, "version": "c32d4ed74bdff8f1", "change_id": "028c01a10fd5"}
  5. 05fluentcrm-write · create-campaign
    {"title": "Autumn term is open", "email_subject": "Your autumn classes are ready to book", "email_pre_header": "Students from last term book a week early", "email_body": "<h2>The autumn term is open</h2><p>Hi {{contact.first_name}},…", "recipients": {"lists": [1]}}Answer: {"campaign_id": 1, "version": "0f93ea81bc517f22", "emails": {"sent": 0, "queued": 0}, "change_id": "1c99a5b4f931"}
  6. 06fluentcrm-read · get-campaign
    {"campaign_id": 1, "include": ["recipients_estimate"]}Answer: {"id": 1, "title": "Autumn term is open", "email_subject": "Your autumn classes are ready to book", "email_pre_header": "Students from last term book a week early", "status": "draft", "design_template": "simple", "body_html": "<h2>The autumn term is open</h2><p>Hi {{contact.first_name}},…", "…": "9 more fields"}
  7. 07fluentcrm-write · schedule-campaign
    {"campaign_id": 1, "version": "0f93ea81bc517f22", "scheduled_at": "2026-10-12 09:00", "expected_recipients": 8, "confirm": true}Answer: {"campaign_id": 1, "version": "27a5bd3e363a4663", "emails": {"sent": 0, "queued": 0}, "change_id": "1ade0cd7b4cc", "status": "pending-scheduled", "scheduled_at": "2026-10-12 09:00", "recipients": 8}
  8. 08fluentcrm-write · unschedule-campaign
    {"campaign_id": 1}Answer: {"campaign_id": 1, "status": "draft", "change_id": "797b068eb526"}

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 FluentCRM 3.2.5, over a real MCP connection. Email was held on the test site, so nothing was sent. The FluentCRM 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 a lead list to a scheduled campaign.

  1. 01

    Bring the contacts in

    import-contacts takes up to 200 rows with fields, custom fields, tags and lists. Automations do not start unless run_automations is true.

  2. 02

    Draft the campaign

    Build a template and a draft campaign for the right tags and lists. get-campaign reports the recipient estimate, and preview-email renders it for one contact.

  3. 03

    Schedule with a check

    schedule-campaign needs confirm and the exact recipient count. If the live count differs, nothing is queued.

Built for FluentCRM

FluentCRM’s own code, with a safety net

EMCP calls FluentCRM’s abilities and its REST API in-process, so every FluentCRM permission and rule applies. On top, every contact, tag, list, campaign and automation answers a version, every write is read back, and History can undo it.

Automations and emails on your word

Tagging a contact can start an automation that emails them in the same call. EMCP holds FluentCRM’s automation triggers for every write unless you pass run_automations: true, and then the answer lists what started and what was sent. Campaign schedules must match FluentCRM’s live recipient count, and an unschedule withdraws the queue only while no email has left it.

Undo never restores a contact who unsubscribed, bounced or complained since, and never puts back a list they left. Deleting a contact erases them from FluentCRM and from every earlier History entry. Every change is in History in EMCP Tools.

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

Get connected

Put FluentCRM in your AI’s toolkit.

  1. 1

    Install FluentCRM

    Install EMCP Pro 3.19 or later with FluentCRM 3.x. The free edition is enough.

  2. 2

    Switch on FluentCRM's AI access

    EMCP respects FluentCRM > Settings > MCP: while it is off, only get-setup answers.

  3. 3

    Enable the write tool

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

Install EMCP

Then connect Claude Code, Claude Desktop, or Cursor to use the FluentCRM 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 FluentCRM, supported operations, and the workflow on your site.

FluentCRM has its own MCP server. Which should I use?

Use EMCP's tools for anything that needs versions, History or the safeguards. EMCP respects FluentCRM's AI access switch, and get-setup names FluentCRM's own endpoint when it is on.

Can it email people by accident?

Nothing is emailed without confirm. Test emails go only to your own address, and a schedule must name the recipient count FluentCRM reports, or nothing is queued.

Do automations run when tags change?

Not unless the call passes run_automations: true. EMCP holds FluentCRM's automation triggers for every write and refuses when it cannot hold one.

What can be undone?

Most writes. Sends, unschedules, pauses, contact automation moves and erasures are recorded for the audit trail only, and undo never resubscribes anyone.

Your tools. Your WordPress site.

Make FluentCRM part of the conversation.

Get EMCP Pro