campaignmonitor_add_ subscriberAdd a subscriber to a list, or update them if they're already on it.
Import subscribers, trace why someone stopped getting email, build a segment, draft a campaign from a template, send a test, schedule it in the client's time zone, then read opens, clicks and bounces.
PopMCPCampaign Monitor
Every Campaign Monitor operation the agent can call, from subscribers and segments to campaign reports and transactional email, plus the events PopMCP can watch.
campaignmonitor_add_ subscriberAdd a subscriber to a list, or update them if they're already on it.
campaignmonitor_get_ lists_ for_ emailEvery list an email address is on, with its state there: [{ ListID, ListName, SubscriberState (Active | Unconfirmed | Unsubscribed | Bounced | Deleted), DateSubscriberAdded }].
campaignmonitor_get_ subscriberOne subscriber on a list: { EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State (Active | Unconfirmed | Unsubscribed | Bounced | Deleted), CustomFields, ReadsEmailWith, ConsentToTrack, ConsentToSendSms }.
campaignmonitor_get_ subscriber_ historyEverything a subscriber did with the campaigns and journey emails sent to them: [{ ID, Type (Campaign | Automation), Name, Actions [{ Event (Open | Click | Bounce …), Date, IPAddress, Detail }] }].
campaignmonitor_import_ subscribersAdd or update up to 1,000 subscribers in one call.
campaignmonitor_list_ active_ subscribersActive (subscribed) subscribers on a list: Results [{ EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State, CustomFields [{ Key, Value }], ReadsEmailWith, ConsentToTrack?, ConsentToSendSms? }].
campaignmonitor_unsubscribe_ subscriberUnsubscribe someone from a list (and from all the client's lists when the list's UnsubscribeSetting is AllClientLists).
campaignmonitor_update_ subscriberUpdate a subscriber's email address, name, mobile number, custom fields or consent.
campaignmonitor_get_ clientThe connected client's details: BasicDetails { ClientID, CompanyName, Country, TimeZone, PrimaryContactName, PrimaryContactEmail } and BillingDetails.
campaignmonitor_create_ campaignCreate a DRAFT campaign from HTML hosted at a public URL.
campaignmonitor_create_ campaign_ from_ templateCreate a DRAFT campaign by filling a template's editable regions.
campaignmonitor_list_ draft_ campaignsDraft (unsent) campaigns: [{ CampaignID, Name, Subject, FromName, FromEmail, ReplyTo, DateCreated, PreviewURL, PreviewTextURL, Tags }].
campaignmonitor_list_ sent_ campaignsSent campaigns, newest first: Results [{ CampaignID, Name, Subject, FromName, FromEmail, ReplyTo, SentDate, TotalRecipients, WebVersionURL, WebVersionTextURL, Tags }].
campaignmonitor_send_ campaignSend or schedule a DRAFT campaign to its lists/segments.
campaignmonitor_send_ campaign_ previewSend a test copy of a draft campaign to up to 15 addresses (240 preview addresses per 24 hours).
campaignmonitor_create_ segmentCreate a segment (a saved filter) on a list.
campaignmonitor_list_ segmentsEvery segment across the client's lists: [{ ListID, SegmentID, Title }].
campaignmonitor_list_ smart_ emailsThe client's smart transactional emails (templates designed in Campaign Monitor for receipts, password resets…): [{ ID, Name, CreatedAt, Status }].
campaignmonitor_list_ transactional_ messagesRecently sent transactional messages, newest first: [{ MessageID, Status, SentAt, Recipient, From, Subject, TotalOpens, TotalClicks, CanBeResent, Group | SmartEmailID, BounceType?, BounceCategory? }].
campaignmonitor_send_ classic_ emailSend an one-off transactional email with your own subject and HTML (no template).
campaignmonitor_send_ smart_ emailSend a smart transactional email to specific people, filling its variables from Data.
campaignmonitor_get_ campaign_ summaryHeadline results of a sent campaign: { Name, Recipients, TotalOpened, UniqueOpened, Clicks, Unsubscribed, Bounced, SpamComplaints, Forwards, Likes, Mentions, WebVersionURL, WebVersionTextURL, WorldviewURL }.
campaignmonitor_get_ journeyA journey's summary and per-email results: { JourneyID, Name, TriggerType, Status, Emails [{ EmailID, Name, Sent, Opened, UniqueOpened, Clicked, Unsubscribed, Bounced }] }.
campaignmonitor_list_ campaign_ bouncesA campaign's bounces: Results [{ EmailAddress, ListID, BounceType (Hard | Soft), Date, Reason }].
campaignmonitor_list_ campaign_ clicksEvery link click in a campaign: Results [{ EmailAddress, URL, ListID, Date, IPAddress, Latitude, Longitude, City, Region, CountryCode, CountryName }].
campaignmonitor_list_ campaign_ opensEvery open of a campaign (one row per open): Results [{ EmailAddress, ListID, Date, IPAddress, Latitude, Longitude, City, Region, CountryCode, CountryName }].
campaignmonitor_list_ journeysThe client's journeys (automations): [{ JourneyID, ListID, Name, Status }].
campaignmonitor_create_ listCreate a subscriber list.
campaignmonitor_get_ list_ statsA list's size and growth: TotalActiveSubscribers, TotalUnsubscribes, TotalDeleted, TotalBounces, plus New/Unsubscribes/Deleted/Bounces for Today, Yesterday, ThisWeek, ThisMonth and ThisYear.
campaignmonitor_list_ listsEvery subscriber list in the client: [{ ListID, Name }].
campaignmonitor_list_ templatesThe client's email templates: [{ TemplateID, Name, PreviewURL, ScreenshotURL }].
campaignmonitor_list_ custom_ fieldsA list's custom fields: [{ FieldName, Key (e.g. "[City]"), DataType, FieldOptions, VisibleInPreferenceCenter }].
campaignmonitor_list_ suppressionsThe client's suppression list (addresses nothing will be sent to): Results [{ EmailAddress, Date, State, SuppressionReason }].
campaignmonitor_add_ administratorInvite a new account administrator (they get an email invitation).
campaignmonitor_create_ clientCreate a new client (agency accounts only; 403 Code 403 otherwise).
campaignmonitor_create_ embedded_ sessionCreate a single-use login URL that opens Campaign Monitor (e.g. in an iframe) as a given user: { SessionUrl }.
campaignmonitor_delete_ administratorRemove an administrator from the account.
campaignmonitor_delete_ subscriberMove a subscriber to the list's Deleted state.
campaignmonitor_get_ billing_ detailsThe account's remaining credits: { Credits }.
campaignmonitor_get_ primary_ contactThe account's primary contact: { EmailAddress }.
campaignmonitor_get_ system_ dateCampaign Monitor's current server date and time: { SystemDate: "YYYY-MM-DD HH:MM:SS" }.
campaignmonitor_list_ administratorsAccount administrators: [{ EmailAddress, Name, Status }].
campaignmonitor_list_ bounced_ subscribersSubscribers removed after bouncing on a list: Results [{ EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State, CustomFields [{ Key, Value }], ReadsEmailWith, ConsentToTrack?, ConsentToSendSms? }].
campaignmonitor_list_ clientsEvery client in the Campaign Monitor account: [{ ClientID, Name }].
campaignmonitor_list_ countriesEvery country name Campaign Monitor accepts (for clients' Country field and Country custom fields).
campaignmonitor_list_ deleted_ subscribersSubscribers deleted from the list on a list: Results [{ EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State, CustomFields [{ Key, Value }], ReadsEmailWith, ConsentToTrack?, ConsentToSendSms? }].
campaignmonitor_list_ timezonesEvery time zone string Campaign Monitor accepts, e.g. "(GMT+10:00) Canberra, Melbourne, Sydney".
campaignmonitor_list_ unconfirmed_ subscribersSubscribers who haven't confirmed yet (double opt-in lists) on a list: Results [{ EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State, CustomFields [{ Key, Value }], ReadsEmailWith, ConsentToTrack?, ConsentToSendSms? }].
campaignmonitor_list_ unsubscribed_ subscribersSubscribers who unsubscribed on a list: Results [{ EmailAddress, Name, MobileNumber, ListJoinedDate, Date, State, CustomFields [{ Key, Value }], ReadsEmailWith, ConsentToTrack?, ConsentToSendSms? }].
campaignmonitor_set_ primary_ contactMake an existing administrator the account's primary contact.
campaignmonitor_update_ administratorChange an administrator's email address or name.
campaignmonitor_add_ personGive someone access to the client.
campaignmonitor_delete_ clientPermanently delete the connected client and ALL its lists, subscribers, campaigns and reports.
campaignmonitor_delete_ personRemove a person's access to the client.
campaignmonitor_get_ client_ primary_ contactThe client's primary contact: { EmailAddress }.
campaignmonitor_list_ peoplePeople (users) with access to the client: [{ EmailAddress, Name, AccessLevel, Status }].
campaignmonitor_set_ client_ basicsUpdate the client's company name, country and time zone.
campaignmonitor_set_ client_ monthly_ billingPut the client on monthly billing.
campaignmonitor_set_ client_ payg_ billingPut the client on pay-as-you-go billing with your markup.
campaignmonitor_set_ client_ primary_ contactMake an existing person (campaignmonitor_list_people) the client's primary contact.
campaignmonitor_transfer_ client_ creditsMove email credits between the account and the client (positive Credits gives the client credits, negative takes them back).
campaignmonitor_update_ personChange a person's email, name, access level or password.
campaignmonitor_delete_ campaignDelete a campaign (a draft or scheduled one will never send; a sent one loses its reports).
campaignmonitor_get_ campaign_ lists_ and_ segmentsThe lists and segments a campaign was (or will be) sent to: { Lists: [{ ListID, Name }], Segments: [{ ListID, SegmentID, Title }] }.
campaignmonitor_list_ scheduled_ campaignsCampaigns scheduled to send: [{ CampaignID, Name, Subject, DateScheduled, ScheduledTimeZone, FromName, FromEmail, ReplyTo, DateCreated, PreviewURL, PreviewTextURL, Tags }].
campaignmonitor_list_ tagsCampaign tags in use: [{ Name, NumberOfCampaigns }].
campaignmonitor_unschedule_ campaignCancel a scheduled send; the campaign goes back to being a draft (Code 341 if it isn't scheduled).
campaignmonitor_add_ segment_ rule_ groupAdd one more rule group to a segment (AND-ed with the existing groups).
campaignmonitor_clear_ segment_ rulesRemove every rule from a segment (it then matches the whole list).
campaignmonitor_delete_ segmentDelete a segment (subscribers are not affected).
campaignmonitor_get_ segmentA segment's definition and size: { SegmentID, ListID, Title, ActiveSubscribers, RuleGroups }.
campaignmonitor_get_ smart_ emailA smart email's details, including Properties.Content.EmailVariables: the variable names to pass as Data when sending it.
campaignmonitor_get_ transactional_ messageOne transactional message: status, recipient, the message itself (From, Subject, To, CC, BCC, Body, Data, attachment names) and, with statistics=true, every open and click.
campaignmonitor_get_ transactional_ statisticsDelivery totals for transactional email: { Sent, Bounces, Delivered, Opened, Clicked, Query }.
campaignmonitor_list_ classic_ email_ groupsThe Group labels used on classic transactional emails: [{ Group, CreatedAt }].
campaignmonitor_list_ list_ segmentsThe segments defined on one list: [{ ListID, SegmentID, Title }].
campaignmonitor_list_ segment_ subscribersActive subscribers matching a segment: Results [{ EmailAddress, Name, ListJoinedDate, Date, State, CustomFields, ReadsEmailWith }].
campaignmonitor_resend_ transactional_ messageSend a transactional message again (only when its CanBeResent is true).
campaignmonitor_update_ segmentRename a segment and/or replace ALL its rules (RuleGroups, when given, replaces every existing group).
campaignmonitor_copy_ journeyCopy a journey to a list in another (or the same) client.
campaignmonitor_get_ campaign_ email_ client_ usageWhich email clients opened a sent campaign: [{ Client, Version, Percentage, Subscribers }].
campaignmonitor_list_ campaign_ recipientsEveryone a campaign was sent to: Results [{ EmailAddress, ListID }].
campaignmonitor_list_ campaign_ spam_ complaintsWho marked a campaign as spam: Results [{ EmailAddress, ListID, Date }].
campaignmonitor_list_ campaign_ unsubscribesWho unsubscribed from a campaign: Results [{ EmailAddress, ListID, Date, IPAddress }].
campaignmonitor_list_ journey_ email_ bouncesBounces of a journey email: Results [{ EmailAddress, BounceType (Hard | Soft), Date, Reason }].
campaignmonitor_list_ journey_ email_ clicksClicks in a journey email: Results [{ EmailAddress, URL, Date, IPAddress, Latitude, Longitude, City, Region, CountryCode, CountryName }].
campaignmonitor_list_ journey_ email_ opensOpens of a journey email: Results [{ EmailAddress, Date, IPAddress, Latitude, Longitude, City, Region, CountryCode, CountryName }].
campaignmonitor_list_ journey_ email_ recipientsWho a journey email was sent to, by send date: Results [{ EmailAddress, SentDate }].
campaignmonitor_list_ journey_ email_ unsubscribesUnsubscribes from a journey email: Results [{ EmailAddress, Date, IPAddress }].
campaignmonitor_activate_ webhookTurn a deactivated webhook back on (webhooks are deactivated automatically after a week of failures).
campaignmonitor_copy_ templateCopy a template to another client in the account.
campaignmonitor_create_ templateCreate an email template from hosted HTML.
campaignmonitor_create_ webhookHave Campaign Monitor POST subscriber changes on a list to a URL.
campaignmonitor_deactivate_ webhookPause a webhook without deleting it.
campaignmonitor_delete_ listPermanently delete a list and all its subscribers, segments and custom fields.
campaignmonitor_delete_ templateDelete a template.
campaignmonitor_delete_ webhookDelete a list webhook.
campaignmonitor_get_ listA list's settings: { ListID, Title, ConfirmedOptIn, UnsubscribeSetting, UnsubscribePage, ConfirmationSuccessPage }.
campaignmonitor_get_ templateA template: { TemplateID, Name, PreviewURL, ScreenshotURL }.
campaignmonitor_list_ webhooksA list's webhooks: [{ WebhookID, Events, Url, Status, PayloadFormat }].
campaignmonitor_test_ webhookSend a sample payload to a webhook's URL to check it responds (an error here means the URL failed).
campaignmonitor_update_ listChange a list's settings.
campaignmonitor_update_ templateReplace a template's name and HTML.
campaignmonitor_add_ sending_ domainAdd a domain to send from.
campaignmonitor_copy_ sending_ domainCopy a VERIFIED sending domain from the connected client to another client in the same account.
campaignmonitor_create_ custom_ fieldAdd a custom field to a list.
campaignmonitor_delete_ custom_ fieldDelete a custom field, its values on every subscriber, and segment rules that use it.
campaignmonitor_delete_ sending_ domainRemove a sending domain + DKIM selector from the client.
campaignmonitor_list_ sending_ domainsThe client's sending domains and their DNS authentication status: [{ SendingDomain, Selector, PublicKey, DNSRecords { DKIM, DMARC, SPF } } where each record has { Validation, Key, Value } to add at the DNS host].
campaignmonitor_update_ custom_ fieldRename a custom field and/or change its preference-center visibility.
campaignmonitor_update_ custom_ field_ optionsSet the options of a MultiSelectOne / MultiSelectMany custom field.
campaignmonitor_verify_ sending_ domainRe-check a sending domain's DNS records now and update its verification status.
campaignmonitor_suppress_ emailsAdd email addresses to the client's suppression list so no campaign or journey email reaches them.
campaignmonitor_unsuppress_ emailRemove one address from the client's suppression list (it does NOT resubscribe them to any list).
campaignmonitor_publish_ eventFire a custom event for a subscriber (e.g. "Purchased") to start journeys whose trigger is "Subscriber activity" with that event name.
Credentials off one Campaign Monitor screen, then an endpoint your client signs into. Nothing to deploy, and nothing to install.
Paste your account API key from profile picture → Account settings → API keys → Show API key, then pick the client. Using one client's own API key instead? Add its Client ID from the same page. No app to register, and the key doesn't expire.
••••••••••••3f7aLeave blank for the account API keysend_campaign, send_smart_email, import_subscribers and unsubscribe_subscriber run as soon as the AI calls them. Tick Campaign Monitor on the PopMCP consent screen only for clients that need it; on Scale and Enterprise, keep reporting teammates read-only.
Drop the PopMCP URL into Claude, ChatGPT, Codex or any other supported client. It signs in through PopMCP with OAuth, so your Campaign Monitor credential never leaves the server.
app.popmcp.com/mcpAsk for something harmless before the agent changes anything. Writes run as soon as it calls them, so confirm it reads the right account first.
Why has priya@lumenlabs.io stopped getting our newsletter
campaignmonitor_get_lists_for_emailok
Then just ask for the work
“Why has priya@lumenlabs.io stopped getting our newsletter”
“Import these 800 webinar attendees into the Events list with their company as a custom field”
“How did Tuesday's spring sale campaign do, and which links got the most clicks”
“Draft the October newsletter from our Monthly template for the VIP segment and send me a test”
One hosted endpoint, registered once per client. The same tools and the same permissions, whichever window the request comes from.
Add the PopMCP URL under Settings → Connectors and the tools appear in every chat.
The same endpoint, registered in the browser. Nothing to install on the machine you are working from.
Register PopMCP as a custom connector, then let ChatGPT read and update the account.
Wire the endpoint into Codex or the Codex CLI when a task needs live business context, not a fixture.
Register the remote MCP server in OpenCode's config for terminal-first and scripted agent runs.
Add PopMCP as an MCP server in Z.ai's desktop app and work the account from the same window.
FAQ
What teams ask before putting Campaign Monitor behind an AI client.
Under Account settings → API keys. In Campaign Monitor, click your profile picture (top right), choose Account settings, then API keys, then Show API key (or Generate API key if none exists yet); you need full access to see it. The key doesn't expire, there is no app or redirect URL to set up, and PopMCP stores it encrypted server-side so your AI client never sees it.
Yes, with its Client ID. A client's own API key reaches only that client and can't list clients, so fill in the optional Client ID field as well; the ID is on the same API keys page. On a client key the account-level tools (listing or creating clients, administrators, billing details, the primary contact and embedded sessions) are not available.
One client per PopMCP workspace. An account API key lists every client in the account, and in the same connect step an agency can pick several clients and assign each one to its own PopMCP workspace. Each connection is pinned to its client: the ClientID is filled in from the connection on every call, so a workspace can't reach another client's lists, subscribers or campaigns.
The client's own time zone. PopMCP records it when you connect, and send_campaign takes SendDate as "Immediately" or "YYYY-MM-DD HH:MM" in that local time. A timestamp with a UTC offset is refused with the time zone named instead of being silently shifted, and a send with no SendDate is refused rather than going out now. The client's primary contact is the default confirmation email.
No. PopMCP maps camelCase or snake_case field names onto Campaign Monitor's PascalCase, defaults ConsentToTrack to Unchanged, and accepts custom fields as a plain object. Updates the API demands in full (list, segment, template, subscriber, custom field) read the current record first, so a rename can't blank the other settings. Limits are checked before the call: 1,000 subscribers per import, 25 transactional recipients, 15 preview addresses.
23 of them. Subscriber joined, updated and deactivated arrive by list webhook, while unsubscribes, bounces, unconfirmed sign-ups, campaign sends, opens, clicks, campaign bounces, campaign unsubscribes and spam complaints are polled. Change detection covers new drafts, scheduled campaigns, new lists, segments and templates, journey status, suppressed addresses and transactional bounces, and three thresholds fire on stalled list growth, a high transactional bounce rate or low credits.
No. PopMCP hosts it and gives you a Streamable HTTP MCP URL. There is nothing to deploy, no callback URL to register, and no infrastructure to keep running or patch.
Any client that supports a remote Streamable HTTP MCP server: Claude Desktop, Claude Web, ChatGPT custom connectors, Codex and the Codex CLI, OpenCode and Z.ai's ZCode, as well as editors such as Cursor, Windsurf and Zed. Your client signs in to PopMCP with OAuth; the provider credential never leaves the server.
Loading 115 tool definitions into every conversation burns context before the work starts. PopMCP loads a curated 33-tool set covering the everyday workflows and keeps the rest searchable, so your AI pulls a specialist tool only when a task needs it. Every tool stays searchable, and on Scale the owner can load the full catalog for a teammate's connection.
A tool is something your AI calls, and there are 115 here. A trigger is something PopMCP watches for you: 23 Campaign Monitor events that can start work on the PopMCP side. Triggers never enter your AI client's context, and none of them ask you to paste a callback URL into Campaign Monitor.
Launch a hosted MCP endpoint for Campaign Monitor, keep tool access under control, and start testing real workflow prompts right away.