Run your Mailchimp marketing operations through AI.
A Model Context Protocol (MCP) server that exposes Mailchimp's Marketing API for reading and managing automations, audiences, campaigns, templates, landing pages, and e-commerce data.
The MewCP Mailchimp MCP Server provides authenticated access to the Mailchimp Marketing API:
- Inspect classic automation workflows, their individual emails, and the subscribers queued in each email's send queue
- List and read audiences (lists) and campaigns, including full campaign performance reports
- Manage Classic templates and folders, and inspect landing pages and their published HTML content
- Query connected e-commerce stores, products, and orders — including orders attributed to a specific campaign
Perfect for:
- AI assistants that need to read or manage Mailchimp marketing data
- Automating campaign and automation performance reporting
- Building tools that connect Mailchimp audience, campaign, and e-commerce data to other systems
list_automations — List all classic automation workflows
Get a summary of an account's classic automations with optional filtering and pagination
Inputs:
- `count` (int, optional, default: 10) — Number of records to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
- `fields` (string, optional, default: null) — Comma-separated list of fields to return
- `exclude_fields` (string, optional, default: null) — Comma-separated list of fields to exclude
- `before_create_time` (string, optional, default: null) — Restrict to automations created before this time (ISO 8601: 2015-10-21T15:41:36+00:00)
- `since_create_time` (string, optional, default: null) — Restrict to automations created after this time (ISO 8601: 2015-10-21T15:41:36+00:00)
- `before_start_time` (string, optional, default: null) — Restrict to automations started before this time (ISO 8601: 2015-10-21T15:41:36+00:00)
- `since_start_time` (string, optional, default: null) — Restrict to automations started after this time (ISO 8601: 2015-10-21T15:41:36+00:00)
- `status` (string, optional, default: null) — Filter by status: 'save', 'paused', or 'sending'
Output data schema:
{
automations: {
id: string | null;
create_time: string | null;
start_time: string | null;
status: string | null;
emails_sent: number | null;
recipients: {
list_id: string | null;
store_id: string | null;
} | null;
}[];
total_items: number | null;
}get_automation_info — Get details of a specific automation workflow
Get detailed information about a specific automation workflow by ID
Inputs:
- `workflow_id` (string, required) — The unique ID of the Automation workflow
- `fields` (string, optional, default: null) — Comma-separated list of fields to return
- `exclude_fields` (string, optional, default: null) — Comma-separated list of fields to exclude
Output data schema:
{
id: string | null;
create_time: string | null;
start_time: string | null;
status: string | null;
emails_sent: number | null;
recipients: {
list_id: string | null;
store_id: string | null;
} | null;
}list_automated_emails — List emails in an automation workflow
Get a summary of the emails in a classic automation workflow
Inputs:
- `workflow_id` (string, required) — The unique ID of the Automation workflow
Output data schema:
{
emails: {
id: string | null;
workflow_id: string | null;
position: number | null;
status: string | null;
emails_sent: number | null;
send_time: string | null;
content_type: string | null;
settings: {
subject_line: string | null;
title: string | null;
from_name: string | null;
reply_to: string | null;
} | null;
}[];
total_items: number | null;
}get_workflow_email_info — Get details of a specific automation email
Get detailed information about a specific email in an automation workflow
Inputs:
- `workflow_id` (string, required) — The unique ID of the Automation workflow
- `workflow_email_id` (string, required) — The unique ID of the Automation workflow email
Output data schema:
{
id: string | null;
workflow_id: string | null;
position: number | null;
status: string | null;
emails_sent: number | null;
send_time: string | null;
content_type: string | null;
settings: {
subject_line: string | null;
title: string | null;
from_name: string | null;
reply_to: string | null;
} | null;
}list_automated_email_subscribers — List subscribers queued for an automation email
Get information about subscribers queued to receive a specific automation email
Inputs:
- `workflow_id` (string, required) — The unique ID of the Automation workflow
- `workflow_email_id` (string, required) — The unique ID of the Automation workflow email
Output data schema:
{
queue: {
id: string | null;
workflow_id: string | null;
email_id: string | null;
list_id: string | null;
email_address: string | null;
next_send: string | null;
}[];
total_items: number | null;
}get_automated_email_subscriber — Get a specific subscriber in an automation email queue
Get detailed information about a specific subscriber to an automation email queue
Inputs:
- `workflow_id` (string, required) — The unique ID of the Automation workflow
- `workflow_email_id` (string, required) — The unique ID of the Automation workflow email
- `subscriber_hash` (string, required) — The MD5 hash of the lowercase version of the subscriber's email address
Output data schema:
{
id: string | null;
workflow_id: string | null;
email_id: string | null;
list_id: string | null;
email_address: string | null;
next_send: string | null;
}list_audience — List all audiences (lists)
Get information about all lists (audiences) in the account
Inputs:
(no parameters)
Output data schema:
{
lists: {
id: string | null;
web_id: number | null;
name: string | null;
date_created: string | null;
stats: {
member_count: number | null;
unsubscribe_count: number | null;
open_rate: number | null;
click_rate: number | null;
} | null;
}[];
total_items: number | null;
}get_list_info — Get details of a specific audience
Get detailed information about a specific list (audience) in your Mailchimp account
Inputs:
- `list_id` (string, required) — The unique ID for the list
Output data schema:
{
id: string | null;
web_id: number | null;
name: string | null;
date_created: string | null;
stats: {
member_count: number | null;
unsubscribe_count: number | null;
open_rate: number | null;
click_rate: number | null;
} | null;
}list_campaigns — List all campaigns
Get all campaigns in an account
Inputs:
(no parameters)
Output data schema:
{
campaigns: {
id: string | null;
web_id: number | null;
type: string | null;
create_time: string | null;
status: string | null;
emails_sent: number | null;
send_time: string | null;
recipients: {
list_id: string | null;
segment_text: string | null;
recipient_count: number | null;
} | null;
settings: {
subject_line: string | null;
title: string | null;
from_name: string | null;
reply_to: string | null;
} | null;
}[];
total_items: number | null;
}get_campaign_info — Get details of a specific campaign
Get detailed information about a specific campaign
Inputs:
- `campaign_id` (string, required) — The unique ID for the campaign
Output data schema:
{
id: string | null;
web_id: number | null;
type: string | null;
create_time: string | null;
status: string | null;
emails_sent: number | null;
send_time: string | null;
recipients: {
list_id: string | null;
segment_text: string | null;
recipient_count: number | null;
} | null;
settings: {
subject_line: string | null;
title: string | null;
from_name: string | null;
reply_to: string | null;
} | null;
}list_campaign_reports — List all campaign reports
Get all campaign reports with performance metrics
Inputs:
- `count` (int, optional, default: 10) — Number of reports to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
- `type` (string, optional, default: null) — Filter by campaign type: 'regular', 'plaintext', 'absplit', 'rss', or 'variate'
Output data schema:
{
reports: {
id: string | null;
campaign_title: string | null;
type: string | null;
list_id: string | null;
list_name: string | null;
emails_sent: number | null;
send_time: string | null;
opens: {
opens_total: number | null;
unique_opens: number | null;
open_rate: number | null;
} | null;
clicks: {
clicks_total: number | null;
unique_clicks: number | null;
click_rate: number | null;
} | null;
}[];
total_items: number | null;
}get_campaign_report — Get report for a specific campaign
Get detailed report for a specific sent campaign
Inputs:
- `campaign_id` (string, required) — The unique ID for the campaign
Output data schema:
{
id: string | null;
campaign_title: string | null;
type: string | null;
list_id: string | null;
list_name: string | null;
emails_sent: number | null;
send_time: string | null;
opens: {
opens_total: number | null;
unique_opens: number | null;
open_rate: number | null;
} | null;
clicks: {
clicks_total: number | null;
unique_clicks: number | null;
click_rate: number | null;
} | null;
}list_landing_pages — List all landing pages
Get all landing pages in your account
Inputs:
- `count` (int, optional, default: 10) — Number of landing pages to return (max: 1000)
- `sort_field` (string, optional, default: null) — Sort by: 'created_at' or 'updated_at'
- `sort_dir` (string, optional, default: null) — Sort direction: 'ASC' or 'DESC'
Output data schema:
{
landing_pages: {
id: string | null;
name: string | null;
title: string | null;
status: string | null;
url: string | null;
store_id: string | null;
list_id: string | null;
template_id: number | null;
created_at: string | null;
published_at: string | null;
updated_at: string | null;
}[];
total_items: number | null;
}get_landing_page_info — Get details of a specific landing page
Get detailed information about a specific landing page by ID
Inputs:
- `page_id` (string, required) — The unique ID for the landing page
Output data schema:
{
id: string | null;
name: string | null;
title: string | null;
status: string | null;
url: string | null;
store_id: string | null;
list_id: string | null;
template_id: number | null;
created_at: string | null;
published_at: string | null;
updated_at: string | null;
}get_landing_page_content — Get the HTML content of a landing page
Get the HTML content for a specific landing page
Inputs:
- `page_id` (string, required) — The unique ID for the landing page
Output data schema:
{
html: string | null;
}list_template_folders — List all template folders
Get all folders used to organize templates
Inputs:
- `count` (int, optional, default: 10) — Number of folders to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
Output data schema:
{
folders: {
id: string | null;
name: string | null;
count: number | null;
}[];
total_items: number | null;
}add_template_folder — Create a new template folder
Create a new template folder
Inputs:
- `name` (string, required) — The name of the folder
Output data schema:
{
id: string | null;
name: string | null;
count: number | null;
}list_templates — List all templates
Get all templates in your account
Inputs:
- `count` (int, optional, default: 10) — Number of templates to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
- `type` (string, optional, default: null) — Filter by type: 'user', 'base', or 'gallery'
- `content_type` (string, optional, default: null) — Filter by content type: 'html', 'template', or 'multichannel'
Output data schema:
{
templates: {
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
}[];
total_items: number | null;
}get_template_info — Get details of a specific template
Get detailed information about a specific template by ID
Inputs:
- `template_id` (string, required) — The unique ID for the template
Output data schema:
{
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
html: string | null;
}add_template — Create a new template
Create a new Classic template for the account. It supports Mailchimp Template Language
Inputs:
- `name` (string, required) — The name of the template
- `html` (string, required) — The raw HTML for the template. Supports Mailchimp Template Language
- `folder_id` (string, optional, default: null) — The ID of the folder to place the template in
Output data schema:
{
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
}update_template — Update an existing template
Updates the name, HTML, or folder of an existing Classic template. This overwrites the current name and HTML with the values you provide (folder_id is only changed if given) — the original state is not stored by the API after the call. The response includes both the before and after state so you have a full record of what changed.
Inputs:
- `template_id` (string, required) — The unique ID for the template
- `name` (string, required) — The name of the template
- `html` (string, required) — The raw HTML for the template. Supports Mailchimp Template Language
- `folder_id` (string, optional, default: null) — The ID of the folder to move the template to
Output data schema:
{
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
before: {
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
html: string | null;
};
after: {
id: number | null;
type: string | null;
name: string | null;
date_created: string | null;
date_edited: string | null;
active: boolean | null;
folder_id: string | null;
thumbnail: string | null;
share_url: string | null;
html: string | null;
};
}list_stores — List all e-commerce stores
Get information about all e-commerce stores in the account
Inputs:
- `count` (int, optional, default: 10) — Number of stores to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
Output data schema:
{
stores: {
id: string | null;
list_id: string | null;
name: string | null;
platform: string | null;
domain: string | null;
currency_code: string | null;
}[];
total_items: number | null;
}get_store_info — Get details of a specific e-commerce store
Get detailed information about a specific e-commerce store
Inputs:
- `store_id` (string, required) — The unique ID for the store
Output data schema:
{
id: string | null;
list_id: string | null;
name: string | null;
platform: string | null;
domain: string | null;
currency_code: string | null;
}list_products — List products in an e-commerce store
Get information about all products in a specific e-commerce store
Inputs:
- `store_id` (string, required) — The unique ID for the store
- `count` (int, optional, default: 10) — Number of products to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
Output data schema:
{
products: {
id: string | null;
title: string | null;
handle: string | null;
url: string | null;
type: string | null;
vendor: string | null;
image_url: string | null;
}[];
total_items: number | null;
}get_product_info — Get details of a specific product
Get detailed information about a specific product in an e-commerce store
Inputs:
- `store_id` (string, required) — The unique ID for the store
- `product_id` (string, required) — The unique ID for the product
Output data schema:
{
id: string | null;
title: string | null;
handle: string | null;
url: string | null;
type: string | null;
vendor: string | null;
image_url: string | null;
}list_store_orders — List orders in an e-commerce store
Get information about all orders in a specific e-commerce store
Inputs:
- `store_id` (string, required) — The unique ID for the store
- `count` (int, optional, default: 10) — Number of orders to return (max: 1000)
- `offset` (int, optional, default: 0) — Number of records to skip for pagination
- `customer_id` (string, optional, default: null) — Restrict results to orders made by a specific customer
- `campaign_id` (string, optional, default: null) — Restrict results to orders with a specific campaign ID
Output data schema:
{
orders: {
id: string | null;
customer: {
id: string | null;
email_address: string | null;
} | null;
campaign_id: string | null;
financial_status: string | null;
fulfillment_status: string | null;
currency_code: string | null;
order_total: number | null;
processed_at_foreign: string | null;
}[];
total_items: number | null;
}get_order_info — Get details of a specific order
Get detailed information about a specific order in an e-commerce store
Inputs:
- `store_id` (string, required) — The unique ID for the store
- `order_id` (string, required) — The unique ID for the order
Output data schema:
{
id: string | null;
customer: {
id: string | null;
email_address: string | null;
} | null;
campaign_id: string | null;
financial_status: string | null;
fulfillment_status: string | null;
currency_code: string | null;
order_total: number | null;
processed_at_foreign: string | null;
}health_check — Check Mailchimp API connectivity
Check Mailchimp API connectivity
Inputs:
(no parameters)
Output data schema:
{
health_status: string | null;
}Response Envelope
Every tool returns the same top-level envelope. Only data varies per tool.
// Success
{
"success": true,
"statusCode": 200,
"retriable": false,
"retry_after_seconds": null,
"error": null,
"data": { ... }
}
// Error
{
"success": false,
"statusCode": 400,
"retriable": false,
"retry_after_seconds": null,
"error": { "code": "ERROR_CODE", "message": "description", "details": {} },
"data": null
}retriable—truewhen it is safe to retry (rate limit, network error, 503).falsefor validation and auth errors.retry_after_seconds— seconds to wait before retrying; present only whenretriableistrueand the upstream specifies a delay.error.code— machine-readable string:VALIDATION_ERROR,AUTH_ERROR,UPSTREAM_ERROR,SERVER_ERROR.
Pagination Parameters
count— Number of records to return per request (default: 10, max: 1000)offset— Number of records to skip; use withcountto page through results
Field Filtering
list_automations and get_automation_info support field filtering to shrink the response payload.
fields— Comma-separated list of response fields to includeexclude_fields— Comma-separated list of response fields to omit
Example:
fields: "automations.id,automations.status"
exclude_fields: "_links"
Date/Time Format
All datetime parameters use ISO 8601 format:
Format: YYYY-MM-DDTHH:MM:SS+HH:MM
Example: 2015-10-21T15:41:36+00:00
Subscriber Hash
The subscriber_hash parameter used by get_automated_email_subscriber is the MD5 hash of the subscriber's lowercase email address.
Input: user@example.com → lowercase → user@example.com
Hash: md5("user@example.com") → b58996c504c5638798eb6b511e6f49af
Server Prefix
Every request is signed with your Mailchimp OAuth access token plus a server_prefix credential extra (e.g. us21) — the data center your Mailchimp account lives on. This is not part of any tool's inputs; it is stored on the credential itself and read automatically for every call.
Find it in the URL you use to log in to Mailchimp: https://usXX.admin.mailchimp.com — usXX is your server_prefix.
Missing or Invalid Headers
- Cause: OAuth token not provided in request headers, or the linked credential is missing its
server_prefixextra - Solution:
- Verify
Authorization: Bearer YOUR_TOKENandX-Mewcp-Credential-Id: CREDENTIAL-IDheaders are present - Check that the credential's extras include a valid
server_prefixmatching your Mailchimp account's data center - Check the OAuth token has not expired — reconnect in your MewCP account if needed
- Verify
Insufficient Credits
- Cause: API calls have exceeded your request limits
- Solution:
- Check credit usage in your Curious Layer dashboard
- Upgrade to a paid plan or add credits for higher limits
- Contact support for credit adjustments
Credential Not Connected
- Cause: No Mailchimp credential linked to your account, or the credential has no
server_prefixstored - Solution:
- Go to Credentials in your MewCP dashboard
- Connect your Mailchimp account via OAuth — this stores both the access token and your account's
server_prefix - Retry the request with the correct
X-Mewcp-Credential-Idheader
Malformed Request Payload
- Cause: JSON payload is invalid or missing required fields
- Solution:
- Validate JSON syntax before sending
- Ensure all required tool parameters are included
- Check parameter types match expected values (e.g.
countmust be an integer)
Server Not Found
- Cause: Incorrect server name in the API endpoint
- Solution:
- Verify endpoint format:
{server-name}/mcp/{tool-name} - Use the correct server name from documentation
- Check available servers in your Curious Layer account
- Verify endpoint format:
Mailchimp API Error
- Cause: Upstream Mailchimp API returned an error
- Solution:
- Check the Mailchimp Status Page for service issues
- Verify your OAuth credential has the required permissions for the requested resource
- Review the error message returned in the response for specific details
Resources
- Mailchimp Marketing API Documentation — Official API reference
- Mailchimp API Reference — Complete endpoint reference
- FastMCP Docs — FastMCP specification
- FastMCP Credentials — FastMCP Credentials package for credential handling