# Mailchimp MCP Server > **Mailchimp MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Mailchimp. > > MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows, > token refresh, and production-grade auto-scaling — so your AI agents can connect to > third-party services and run freely without you managing any MCP server yourself. > > To connect your agent to this server you need a MewCP account and two values: > - MEWCP_KEY — your personal API key (dashboard → Developer) > - CREDENTIAL_ID — the stored credential MewCP securely injects per request > > Server page: https://mewcp.com/mcp/mailchimp > MewCP docs: https://docs.mewcp.com > Full catalog: https://mewcp.com/llms.txt ## About Manage audiences, subscribers, campaigns and email marketing workflows. Create and monitor campaigns, automate outreach and work with customer engagement data through Mailchimp. ## How to connect Server Page URL: https://mewcp.com/mcp/mailchimp Gateway URL: https://gateway.mewcp.com/mailchimp/mcp Every request to this server requires two headers: Authorization: Bearer — your MewCP API key (dashboard → Developer) x-mewcp-credential-id: — the stored credential ID for this service All connection snippets and ready-to-use code examples are available on the server page and in this document below. --- ## Server documentation **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. ## Overview 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 ## Tools ### Automations
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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { id: string | null; workflow_id: string | null; email_id: string | null; list_id: string | null; email_address: string | null; next_send: string | null; } ```
### Audiences
list_audience — List all audiences (lists) Get information about all lists (audiences) in the account **Inputs:** ``` (no parameters) ``` **Output `data` schema:** ```typescript { 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:** ```typescript { 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; } ```
### Campaigns
list_campaigns — List all campaigns Get all campaigns in an account **Inputs:** ``` (no parameters) ``` **Output `data` schema:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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; } ```
### Landing Pages
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:** ```typescript { 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:** ```typescript { 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:** ```typescript { html: string | null; } ```
### Templates
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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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; }; } ```
### E-commerce
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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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:** ```typescript { 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; } ```
### System
health_check — Check Mailchimp API connectivity Check Mailchimp API connectivity **Inputs:** ``` (no parameters) ``` **Output `data` schema:** ```typescript { health_status: string | null; } ```
## API Parameters Reference
Response Envelope Every tool returns the same top-level envelope. Only `data` varies per tool. ```json // 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` — `true` when it is safe to retry (rate limit, network error, 503). `false` for validation and auth errors. - `retry_after_seconds` — seconds to wait before retrying; present only when `retriable` is `true` and 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 with `count` to 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 include - `exclude_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`.
## Troubleshooting
Missing or Invalid Headers - **Cause:** OAuth token not provided in request headers, or the linked credential is missing its `server_prefix` extra - **Solution:** 1. Verify `Authorization: Bearer YOUR_TOKEN` and `X-Mewcp-Credential-Id: CREDENTIAL-ID` headers are present 2. Check that the credential's extras include a valid `server_prefix` matching your Mailchimp account's data center 3. Check the OAuth token has not expired — reconnect in your MewCP account if needed
Insufficient Credits - **Cause:** API calls have exceeded your request limits - **Solution:** 1. Check credit usage in your Curious Layer dashboard 2. Upgrade to a paid plan or add credits for higher limits 3. Contact support for credit adjustments
Credential Not Connected - **Cause:** No Mailchimp credential linked to your account, or the credential has no `server_prefix` stored - **Solution:** 1. Go to **Credentials** in your MewCP dashboard 2. Connect your Mailchimp account via OAuth — this stores both the access token and your account's `server_prefix` 3. Retry the request with the correct `X-Mewcp-Credential-Id` header
Malformed Request Payload - **Cause:** JSON payload is invalid or missing required fields - **Solution:** 1. Validate JSON syntax before sending 2. Ensure all required tool parameters are included 3. Check parameter types match expected values (e.g. `count` must be an integer)
Server Not Found - **Cause:** Incorrect server name in the API endpoint - **Solution:** 1. Verify endpoint format: `{server-name}/mcp/{tool-name}` 2. Use the correct server name from documentation 3. Check available servers in your Curious Layer account
Mailchimp API Error - **Cause:** Upstream Mailchimp API returned an error - **Solution:** 1. Check the [Mailchimp Status Page](https://status.mailchimp.com) for service issues 2. Verify your OAuth credential has the required permissions for the requested resource 3. Review the error message returned in the response for specific details
---
Resources - **[Mailchimp Marketing API Documentation](https://mailchimp.com/developer/marketing/docs/fundamentals/)** — Official API reference - **[Mailchimp API Reference](https://mailchimp.com/developer/marketing/api/)** — Complete endpoint reference - **[FastMCP Docs](https://gofastmcp.com/v2/getting-started/welcome)** — FastMCP specification - **[FastMCP Credentials](https://pypi.org/project/fastmcp-credentials/)** — FastMCP Credentials package for credential handling
--- ## Connection snippets ### Python (fastmcp) ```python import asyncio from fastmcp import Client from fastmcp.client.transports import StreamableHttpTransport SERVER_URL = "https://gateway.mewcp.com/mailchimp/mcp" MEWCP_KEY = "YOUR_MEWCP_KEY" CREDENTIAL_ID = "YOUR_CREDENTIAL_ID" transport = StreamableHttpTransport( url=SERVER_URL, headers={ "Authorization": f"Bearer {MEWCP_KEY}", "x-mewcp-credential-id": CREDENTIAL_ID, } ) async def main(): client = Client(transport) async with client: await client.ping() tools = await client.list_tools() resources = await client.list_resources() prompts = await client.list_prompts() # Change the tool name and arguments with actual tool and arguments available in server result = await client.call_tool("example_tool", {"param": "value"}) print(result) asyncio.run(main()) ``` ### TypeScript (MCP SDK) ```typescript import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const SERVER_URL = "https://gateway.mewcp.com/mailchimp/mcp"; const MEWCP_KEY = "YOUR_MEWCP_KEY"; const CREDENTIAL_ID = "YOUR_CREDENTIAL_ID"; const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), { requestInit: { headers: { Authorization: `Bearer ${MEWCP_KEY}`, "x-mewcp-credential-id": CREDENTIAL_ID, }, }, }); const client = new Client({ name: "mewcp-client", version: "1.0.0", }); await client.connect(transport); const tools = await client.listTools(); console.log("Available tools:", tools.tools.map(t => t.name)); // Change the tool name and arguments to a tool available on your server const result = await client.callTool({ name: "example_tool", arguments: { param: "value" }, }); console.log("Tool result:", result); ``` ### VS Code (settings.json) ```json { "servers": { "mewcp-mailchimp": { "type": "http", "url": "https://gateway.mewcp.com/mailchimp/mcp", "headers": { "Authorization": "Bearer YOUR_MEWCP_KEY", "x-mewcp-credential-id": "YOUR_CREDENTIAL_ID" } } } } ``` ### Cursor (mcp.json) ```json { "mcpServers": { "mailchimp": { "url": "https://gateway.mewcp.com/mailchimp/mcp", "headers": { "Authorization": "Bearer YOUR_MEWCP_KEY", "x-mewcp-credential-id": "YOUR_CREDENTIAL_ID" } } } } ``` ### Claude Desktop (claude_desktop_config.json) ```json "mcpServers": { "mailchimp": { "command": "npx", "args": [ "-y", "mcp-remote@latest", "https://gateway.mewcp.com/mailchimp/mcp", "--transport", "http-only", "--header", "Authorization: Bearer YOUR_MEWCP_KEY", "--header", "x-mewcp-credential-id: YOUR_CREDENTIAL_ID" ] } } ```