The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Mailchimp MCP Server listing page.
The most complete Model Context Protocol (MCP) server for the Mailchimp Marketing API: 227 tools to query and manage your Mailchimp account from any MCP-compatible client. It covers the full campaign, audience, member, segment, automation and reporting surface, complete e-commerce (read and write), landing pages, File Manager, surveys, signup forms and verified domains, plus multi-account support and runtime-security guardrails (read-only, dry-run and audit modes, with per-tool risk metadata).
Uses the Mailchimp Marketing API via requests. Not based on the official mailchimp-marketing-python client. I hit too many issues with it so I went with raw HTTP calls instead.
Add it to your MCP client (Claude Desktop, Cursor, Cline, …):
Tip: start with MAILCHIMP_READ_ONLY=true to explore safely, then flip it off when you are ready to write. See Configuration for all options.
A prebuilt image is published to the GitHub Container Registry on every release:
Or point your MCP client at it:
Read
Write
Runtime security
describe_toolsMAILCHIMP_AUDIT_LOG)uvx (recommended)No installation needed — run directly:
pipThen run:
| Variable | Required | Description |
|---|---|---|
MAILCHIMP_API_KEY | Yes | Your Mailchimp API key (format: <key>-<dc>, e.g. abc123-us8) |
MAILCHIMP_READ_ONLY | No | Set to true to disable all write operations (default: false) |
MAILCHIMP_DRY_RUN | No | Set to true to preview write operations without executing them (default: false) |
MAILCHIMP_API_KEY_<NAME> | No | API key for an additional named account (e.g. MAILCHIMP_API_KEY_MARKETING). Target it with the account argument. See Multi-account. |
MAILCHIMP_READ_ONLY_<NAME> | No | Read-only mode for a specific named account (default: false) |
MAILCHIMP_DRY_RUN_<NAME> | No | Dry-run mode for a specific named account (default: false) |
MAILCHIMP_AUDIT_LOG | No | Set to true to emit a structured JSON audit event per tool dispatch to stderr (default: false). See Runtime security. |
MAILCHIMP_TOOLS | No | Expose only a subset of tools to shrink the model's tool-list footprint (default: all). See Tool profiles. |
The datacenter (us8, us21, etc.) is automatically extracted from each key.
Read-only mode — When MAILCHIMP_READ_ONLY=true, all write tools (create, update, delete, schedule, etc.) are blocked and return an error. Read tools work normally. This is the recommended default for shared or exploratory setups where you only need reporting and analytics.
Dry-run mode — When MAILCHIMP_DRY_RUN=true, write tools return a preview of the action they would perform (tool name, target resource, parameters, and its risk tier) without making any API call. Useful for testing prompts before going live.
The server is designed for defense-in-depth alongside an external MCP gateway: it owns the semantics (which tools are reads, reversible writes, or irreversible) and exposes them as machine-readable signals a gateway can enforce on, rather than making the gateway guess which calls are dangerous.
Risk metadata — Every tool is classified as read, write, or destructive (irreversible data loss or an irreversible send). This surfaces two ways:
readOnlyHint, destructiveHint, and idempotentHint travel through the standard tools/list, so any compliant client or gateway reads them directly.describe_tools — a read tool returning {name, risk, read_only, destructive, idempotent} for every tool plus per-tier counts, for gateways that prefer a tool call.Structured audit log — With MAILCHIMP_AUDIT_LOG=true, each dispatch emits one JSON event to stderr with the tool, its risk tier, the destructive flag, the target account, the outcome (executed / blocked_read_only / dry_run), and the inspected arguments. Bulky or sensitive values (e.g. base64 file_data) are redacted and response bodies are never logged, so the stream is a safe audit sink to tail centrally.
Argument-contract validation — All writes funnel through a single _guard_write chokepoint, and every request is validated before dispatch (pagination count capped to 1–1000, missing path IDs rejected), so malformed calls fail fast and consistently instead of hitting the API.
Exposing all 227 tools sends a large tool list to the model on every turn (~63k tokens). If you only need part of the surface, load a subset with one line:
MAILCHIMP_TOOLS accepts a comma-separated mix of risk tiers (read, write, destructive) and/or exact tool names; a tool is kept if either matches. Unset (or all) exposes everything.
read — reporting and analytics only (~115 tools, ~29k tokens). A safe, lightweight default for exploration.read,write — everything except irreversible tools.list_campaigns,get_campaign_report,send_campaign — a hand-picked minimal set.Tool descriptions are also trimmed of repeated boilerplate before they reach the model, so even the full set is leaner than the raw docstrings. Use describe_tools to see each tool's risk tier.
By default the server uses the single MAILCHIMP_API_KEY, exposed as the default account. To manage several Mailchimp accounts from one server, add MAILCHIMP_API_KEY_<NAME> variables — the suffix becomes the lowercased account name (e.g. MAILCHIMP_API_KEY_MARKETING → marketing).
Every tool then accepts an optional account argument, e.g. list_audiences(account="marketing"). Selection is per call and stateless — there is no "current account" to switch, so a write always names its target. Omitting account uses default. Call list_accounts to see the configured names and their safety-flag state, and each account can carry its own MAILCHIMP_READ_ONLY_<NAME> / MAILCHIMP_DRY_RUN_<NAME> flags (so a write-protected account and a writable one can live side by side). An unknown account returns an error listing the configured names.
Single-key setups are unaffected: with only MAILCHIMP_API_KEY set, nothing changes.
Most MCP clients accept a JSON configuration block describing how to launch the server.
Configure yours to invoke uvx mailchimp-mcp (or mailchimp-mcp if installed via pip)
with MAILCHIMP_API_KEY exported in the environment.
If your MCP client provides a CLI to register servers, the equivalent invocation is:
Replace mcp-cli with your client's binary name. For read-only mode, add
-e MAILCHIMP_READ_ONLY=true to the command.
| Tool | Description |
|---|---|
get_account_info | Get account name, email, and subscriber count |
list_accounts | List configured accounts and their read-only / dry-run state (for multi-account setups) |
describe_tools | List every tool with its risk tier (read / write / destructive) for policy enforcement |
| Tool | Description |
|---|---|
list_campaigns | List campaigns with optional filters (status, date) |
get_campaign_details | Get full details of a specific campaign |
list_campaign_folders | List campaign folders |
| Tool | Description |
|---|---|
get_campaign_report | Get performance metrics (opens, clicks, bounces) |
get_campaign_click_details | Get per-link click data for a campaign |
get_email_activity | Per-recipient activity (opens, clicks, bounces) |
get_open_details | Who opened, when, how many times |
get_campaign_recipients | List of recipients with delivery status |
get_campaign_unsubscribes | Who unsubscribed after a campaign |
get_domain_performance | Performance by email domain (gmail, outlook, etc.) |
get_ecommerce_product_activity | Revenue per product for a campaign |
get_campaign_sub_reports | Sub-reports (A/B tests, RSS, etc.) |
get_campaign_advice | Mailchimp's automated post-send feedback on a campaign |
get_campaign_locations | Geographic open data (country, region) |
get_eepurl_activity | Social sharing stats (Twitter, Facebook, referrers) |
| Tool | Description |
|---|---|
create_campaign | Create a new campaign draft (regular or A/B variate, with optional segment targeting) |
update_campaign | Update settings or segment targeting of a campaign |
set_campaign_content | Set the HTML content of a campaign draft |
schedule_campaign | Schedule a campaign for a specific date/time |
unschedule_campaign | Unschedule a campaign (back to draft) |
replicate_campaign | Duplicate an existing campaign |
delete_campaign | Delete an unsent campaign |
send_campaign | Send a campaign immediately |
send_test_email | Send a test email for a campaign |
cancel_send | Cancel a campaign that is currently sending |
| Tool | Description |
|---|---|
list_audiences | List all audiences with stats, opt-in mode, GDPR flag, and sender defaults |
get_audience_details | Get detailed info for a specific audience |
list_audience_members | List members with optional status filter |
search_members | Search members by email or name |
get_audience_growth_history | Monthly growth data (subscribes, unsubscribes) |
| Tool | Description |
|---|---|
get_member_activity | Activity history of a specific contact |
get_member_tags | All tags assigned to a contact |
get_member_events | Custom events for a contact |
list_member_notes | List CRM-style internal notes attached to a contact |
| Tool | Description |
|---|---|
add_member | Add a new contact to an audience |
update_member | Update a contact's name or status |
unsubscribe_member | Unsubscribe a contact |
delete_member | Permanently delete a contact |
tag_member | Add or remove tags from a contact |
add_member_note | Attach a CRM-style internal note to a contact |
update_member_note | Update the text of an existing member note |
delete_member_note | Delete a member note |
| Tool | Description |
|---|---|
batch_subscribe | Batch add/update multiple members in an audience |
update_audience | Update audience settings (name, defaults, permission reminder) |
create_audience | Create a new audience with contact info and campaign defaults |
delete_audience | Permanently delete an audience and all its data |
| Tool | Description |
|---|---|
list_segments | List segments and tags for an audience |
get_segment | Get segment details including conditions |
list_segment_members | List members in a segment |
create_segment | Create a new segment or tag (static or dynamic with conditions) |
update_segment | Update a segment's name or conditions |
delete_segment | Delete a segment or tag |
add_members_to_segment | Add contacts to a segment/tag |
remove_members_from_segment | Remove contacts from a segment/tag |
| Tool | Description |
|---|---|
list_merge_fields | List custom fields for an audience |
create_merge_field | Create a new custom field (text, number, dropdown, etc.) |
update_merge_field | Update a custom field |
delete_merge_field | Delete a custom field |
| Tool | Description |
|---|---|
list_interest_categories | List interest categories for an audience |
create_interest_category | Create a new interest category |
list_interests | List interests within a category |
create_interest | Create a new interest option |
delete_interest_category | Delete an interest category |
delete_interest | Delete an interest option |
| Tool | Description |
|---|---|
list_webhooks | List webhooks for an audience |
create_webhook | Create a new webhook |
delete_webhook | Delete a webhook |
| Tool | Description |
|---|---|
list_automations | List Classic Automation workflows (Customer Journeys are not exposed by Mailchimp's API) |
get_automation_emails | List emails in a Classic workflow |
get_automation_email_queue | View the send queue for an automation email |
pause_automation | Pause all emails in a Classic workflow |
start_automation | Start/resume all emails in a Classic workflow |
trigger_customer_journey | Enroll a contact into a Customer Journey step (the only journey write Mailchimp exposes) |
search_automation_campaigns | List campaigns emitted by either Classic Automations or Customer Journeys |
get_member_journey_events | Filter a member's activity feed to automation/journey-related events |
get_automation_summary | Combined overview: Classic workflows by status + recent automation send volume |
Mailchimp does not expose a public read API for Customer Journeys (only the trigger endpoint above). The
search_automation_campaigns,get_member_journey_eventsandget_automation_summarytools provide the recommended workarounds — they surface every campaign emitted by automations or journeys, even though the journey graph itself remains private.
| Tool | Description |
|---|---|
list_templates | List available email templates |
get_template | Get template metadata (name, type, dates, thumbnail) |
get_template_default_content | Get template HTML content |
create_template | Create a new email template |
update_template | Update template name or HTML |
delete_template | Delete a user-created template |
| Tool | Description |
|---|---|
list_landing_pages | List all landing pages |
get_landing_page | Get details of a landing page |
create_landing_page | Create a new landing page from a template |
update_landing_page | Update settings of an existing landing page |
delete_landing_page | Permanently delete a landing page |
publish_landing_page | Publish a landing page to its public URL |
unpublish_landing_page | Take a published landing page offline |
| Tool | Description |
|---|---|
list_files | List images and files stored in the File Manager |
get_file | Get a single file's metadata and hosted URL |
upload_file | Upload a new image or file (base64-encoded) |
delete_file | Permanently delete a file |
list_file_folders | List File Manager folders |
| Tool | Description |
|---|---|
list_surveys | List an audience's surveys with status and public URL |
get_survey | Get a single survey's full details |
publish_survey | Publish a survey to its public URL |
unpublish_survey | Take a published survey offline |
| Tool | Description |
|---|---|
list_signup_forms | Get the signup forms configured for an audience |
customize_signup_form | Customize a signup form's header, contents, and styles |
| Tool | Description |
|---|---|
list_ecommerce_stores | List connected e-commerce stores |
list_store_orders | List orders from a store |
list_store_products | List products from a store |
list_store_customers | List customers from a store |
| Tool | Description |
|---|---|
list_store_carts | List carts (including abandoned) for a store |
get_store_cart | Get a single cart with full line items |
create_store_cart | Push a cart (e.g. an abandoned cart from an external system) |
update_store_cart | Update a cart's totals, currency, checkout URL, or line items |
delete_store_cart | Permanently delete a cart |
| Tool | Description |
|---|---|
list_promo_rules | List discount rules for a store |
get_promo_rule | Get a single promo rule's configuration |
create_promo_rule | Create a discount rule (fixed amount, percentage, free shipping) |
update_promo_rule | Update a rule's amount, target, dates, or enabled state |
delete_promo_rule | Permanently delete a rule and all its codes |
list_promo_codes | List redeemable codes attached to a rule |
get_promo_code | Get a single promo code with usage stats |
create_promo_code | Create a redeemable code (e.g. 'SUMMER20') under a rule |
update_promo_code | Update a code's string, redemption URL, or enabled state |
delete_promo_code | Permanently delete a promo code |
| Tool | Description |
|---|---|
create_batch | Run multiple API operations in bulk |
get_batch_status | Check status of a batch operation |
list_batches | List recent batch operations |
list_batch_webhooks | List batch-completion webhooks |
get_batch_webhook | Get a single batch webhook |
create_batch_webhook | Create a batch-completion webhook |
update_batch_webhook | Update a batch webhook's URL |
delete_batch_webhook | Delete a batch webhook |
| Tool | Description |
|---|---|
list_verified_domains | List sending domains and their verification state |
get_verified_domain | Get a single sending domain's record |
create_verified_domain | Start verification for a sending domain |
verify_verified_domain | Complete verification with the emailed code |
delete_verified_domain | Remove a verified sending domain |
| Tool | Description |
|---|---|
list_connected_sites | List connected sites for tracking and pop-ups |
get_connected_site | Get a single connected site with its script |
create_connected_site | Connect a website and generate its script |
delete_connected_site | Remove a connected site |
verify_connected_site_script | Verify the tracking script is installed |
list_authorized_apps | List OAuth-authorized applications |
get_authorized_app | Get a single authorized application |
get_chimp_chatter | Read the account activity feed |
list_account_exports | List account data export jobs |
get_account_export | Get an export job's status and download URL |
create_account_export | Start an account data export |
| Tool | Description |
|---|---|
create_campaign_folder | Create a campaign folder |
get_campaign_folder | Get a single campaign folder |
update_campaign_folder | Rename a campaign folder |
delete_campaign_folder | Delete a campaign folder |
list_template_folders | List template folders |
get_template_folder | Get a single template folder |
create_template_folder | Create a template folder |
update_template_folder | Rename a template folder |
delete_template_folder | Delete a template folder |
| Tool | Description |
|---|---|
get_campaign_send_checklist | Pre-send readiness checklist |
list_campaign_feedback | List team collaboration comments |
get_campaign_feedback | Get a single comment |
create_campaign_feedback | Add a collaboration comment |
update_campaign_feedback | Edit a comment |
delete_campaign_feedback | Delete a comment |
pause_rss_campaign | Pause an RSS-driven campaign |
resume_rss_campaign | Resume an RSS-driven campaign |
| Tool | Description |
|---|---|
get_audience_activity | Recent daily activity for an audience |
get_audience_top_locations | Top countries of an audience |
get_audience_clients | Top email clients used by an audience |
list_audience_abuse_reports | Spam complaints for an audience |
get_audience_abuse_report | A single audience abuse report |
| Tool | Description |
|---|---|
upsert_member | Add-or-update a member idempotently (PUT) |
delete_member_permanent | GDPR permanent erasure of a member |
get_member_goals | A member's recent tracked goal events |
add_member_event | Record a custom event on a member |
| Tool | Description |
|---|---|
get_automation_email | Get one email in a classic automation |
pause_automation_email | Pause a single automation email |
start_automation_email | Start a single automation email |
add_automation_queue_subscriber | Enqueue a subscriber for an automation email |
get_automation_queue_subscriber | Get a subscriber's queue status |
list_automation_removed_subscribers | List subscribers removed from a workflow |
remove_automation_subscriber | Remove a subscriber from a workflow |
get_automation_removed_subscriber | Get a single removed subscriber |
| Tool | Description |
|---|---|
get_campaign_sent_to | Per-recipient delivery status for a campaign |
get_campaign_abuse_reports | Spam complaints for a campaign |
get_campaign_abuse_report | A single campaign abuse report |
list_landing_page_reports | Reports across all landing pages |
get_landing_page_report | Report for a single landing page |
list_survey_reports | Reports across all surveys |
get_survey_report | Report for a single survey |
get_survey_responses | List a survey's responses |
get_survey_response | Get a single survey response |
get_survey_questions_report | Per-question survey report |
get_survey_question_answers | Answers for a single survey question |
| Tool | Description |
|---|---|
create_store / get_store / update_store / delete_store | Store lifecycle |
get_store_product / create_store_product / update_store_product / delete_store_product | Product lifecycle |
list_store_product_variants / get_store_product_variant / create_store_product_variant / update_store_product_variant / delete_store_product_variant | Product variants |
list_store_product_images / get_store_product_image / create_store_product_image / update_store_product_image / delete_store_product_image | Product images |
get_store_order / create_store_order / update_store_order / delete_store_order | Order lifecycle |
list_store_order_lines / get_store_order_line / create_store_order_line / update_store_order_line / delete_store_order_line | Order line items |
get_store_customer / create_store_customer / update_store_customer / delete_store_customer | Customer lifecycle |
list_account_orders | List orders across every store |
Once connected, you can ask your MCP client to perform requests like:
Multi-step requests that chain tools end to end:
search_campaigns → get_campaign_report → get_campaign_advice.list_verified_domains → get_campaign_abuse_reports → get_domain_performance.get_campaign_report → resend_to_non_openers.MAILCHIMP_DRY_RUN=true, previews via create_campaign → get_campaign_send_checklist → send_campaign.acme and globex accounts, list this month's top campaign by open rate." Passes account="acme" / account="globex" per call. See Multi-account.Contributions are welcome. See CONTRIBUTING.md for development setup, test instructions, and pull request guidelines.
If you find a security vulnerability, please follow the responsible disclosure process described in SECURITY.md.
See CHANGELOG.md for the full release history.
Built by Damien Tilman — damien@tilman.marketing
MIT — see LICENSE for details.