Mailazy MCP
Run email marketing from your AI assistant: contacts, campaigns, automations and behavior emails.
Hosted MCP Server
npx add-mcp 'https://mcp.mailazy.com'Installs into Claude Code, Codex, Cursor and more
Documentation
Mailazy MCP server
Mailazy has an MCP server, so AI apps — Claude, ChatGPT, Cursor and any other MCP client — can run Mailazy for a marketer: read contacts and reports, create lists and newsletters, schedule sends. Everything goes through the same API and permission checks as the dashboard.
For the marketer-facing guide, see Mailazy MCP: connect ChatGPT, Claude and other AI apps.
Address
https://mcp.mailazy.com
https://mcp.mailazy.com/mcp works too. Transport: Streamable HTTP, stateless (POST, JSON responses); GET and DELETE return 405.
Connect a client
Claude Code
claude mcp add --transport http mailazy https://mcp.mailazy.com
Then run /mcp, pick mailazy and authenticate.
Claude, ChatGPT and other apps with connectors — add a custom connector with the address above.
MCP Inspector (testing)
npx @modelcontextprotocol/inspector
Set the URL to the MCP address and connect.
Login (OAuth)
The MCP server is its own OAuth 2.1 authorization server in front of the Mailazy login, so marketers log in with their normal Mailazy account.
- The client reads
/.well-known/oauth-protected-resource/mcpand/.well-known/oauth-authorization-server. - It registers itself:
POST /register(dynamic client registration, public client,token_endpoint_auth_method: none). - It opens
/authorize(authorization code + PKCE S256, required). - The marketer enters their email (used to pick the right organization), logs in with their Mailazy account, ticks the products the AI may use (grouped by organization) and agrees to share data with their AI app.
- The client calls
POST /tokenand gets:- an access pass: RS256 JWT, 1 hour, holding the user, the picked products and the connection id;
- a renewal pass: 60 days, rotated on every use (an old one stops working).
- an access pass: RS256 JWT, 1 hour, holding the user, the picked products and the connection id;
Public keys: /.well-known/jwks.json.
What a pass can do
- Only product-scoped API routes, and only for the products picked at login (others return
404). - The marketer's role is checked live per organization, exactly like the dashboard.
- Never organization, team, profile or connection settings (
403). - Disconnect from the dashboard (MCP page) stops the pass and its renewals at once.
Safety
| Rule | How it works |
|---|---|
| Preview, then yes | Tools marked needs yes first return a preview and a confirm_code (10 minutes, only for the same tool and arguments). Calling again with the code runs it. |
| Practice mode | On by default per person. Real sends (schedule, send, resume automation) are refused and people can't be put on a list whose automation is on; test sends work. Automations already on keep sending by themselves. Toggle in the dashboard or with update_practice_mode. |
| Pre-send check | check_newsletter / POST /newsletters/:id/check returns blockers (no unsubscribe link, empty subject, broken links, empty list, SMTP not set up) and warnings (spammy, all-caps or long subject, image-heavy, missing names, not tested). Sends refuse while there are blockers. |
| Cancel window | send_newsletter sends 5 minutes later (send-now with delaySeconds: 300), so it can still be cancelled. |
| Undo | Reversible changes are logged with their reverse calls and can be undone for 1 day (undo_change, or Undo in the dashboard's Logs → Activity logs / MCP logs). Sent emails, deletes and imports can't be undone. |
| Activity log | Every change — by team members in the dashboard and by AI apps — is kept for 7 days and shown under Logs (Activity logs and MCP logs tabs), per product or for the whole organization. |
Tools
84 tools. Type says what a tool does to data: GET (reads), CREATE, UPDATE, DELETE, SEND. Every tool takes an optional product (name or id; automatic when only one product is connected). Lists, tags, templates, newsletters and automations are named in plain words, not ids.
Account
| Tool | Type | What it does |
|---|---|---|
get_account | GET | Shows the connected organizations and products, and the marketer's role in each. |
get_setup_status | GET | Checks if the product is ready to send, and what is missing. |
get_overview | GET | Account numbers for the last 30 days. |
get_report | GET | Numbers for any date range (product time zone), optionally compared with another range. |
list_docs | GET | Lists every docs page: guide, developer pages and the API reference (api/contacts, api/events, …). |
read_doc | GET | Returns one docs page in full. The same pages are also MCP resources (mailazy-docs://guide/mcp, …). |
get_suggestions | GET | Answers "What needs my attention?" with up to 5 next steps, most important first. |
Contacts
| Tool | Type | What it does |
|---|---|---|
list_contacts | GET | Finds contacts. |
get_contact | GET | Everything about one contact. |
create_contact | CREATE | Adds one new contact. |
update_contact | UPDATE | Changes one contact's details. |
delete_contacts | DELETE · needs yes | Deletes contacts and their pending emails. |
check_contacts_import | GET | Checks contacts before import. Changes nothing. |
import_contacts | CREATE | Adds many contacts at once. |
add_contacts_tags | UPDATE | Adds tags to many contacts. |
remove_contacts_tags | UPDATE | Removes tags from many contacts. |
add_contacts_to_list | UPDATE | Adds contacts to a list. |
remove_contacts_from_list | UPDATE | Removes contacts from a list. They stay in Mailazy. |
move_contacts_to_list | UPDATE | Moves contacts from one list to another. |
stop_contact_automations | UPDATE | Stops automated emails for some contacts. |
Lists & Segments
| Tool | Type | What it does |
|---|---|---|
list_lists | GET | All lists with contact counts. |
get_list | GET | One list and its contacts. |
create_list | CREATE | Makes an empty list. |
update_list | UPDATE | Renames a list. |
delete_list | DELETE · needs yes | Deletes a list. Contacts stay. |
preview_segment | GET | Counts contacts that match rules. Saves nothing. |
create_list_from_segment | CREATE | Saves matching contacts as a new list. |
| Tool | Type | What it does |
|---|---|---|
list_tags | GET | All tags with contact counts. |
create_tag | CREATE | |
update_tag | UPDATE | Renames a tag everywhere. |
delete_tag | DELETE · needs yes | Removes a tag from all contacts and deletes it. |
Templates
| Tool | Type | What it does |
|---|---|---|
list_templates | GET | |
get_template | GET | |
write_template | GET | Mailazy's AI writer drafts a subject and HTML in the brand's style. Uses the plan's AI credits (not on Free), so the AI asks first and offers to write the HTML itself instead. Saves nothing; create_template saves it after a yes. |
create_template | CREATE | Saves content (usually written by the AI) as a new template. |
update_template | UPDATE | Edits a template. Old versions are kept; emails already scheduled keep their version. |
turn_off_template | UPDATE · needs yes | Turns a template off. The warning lists every newsletter, automation and event rule that uses it. |
turn_on_template | UPDATE | Turns a turned-off template back on (newest version). |
delete_template | DELETE · needs yes | Only if no scheduled newsletter or active automation uses it. |
preview_template | GET | In AI apps that support MCP Apps (Claude, ChatGPT and others), shows the real email in the chat with Send me a test / Change it / Use it buttons. Others get the text. |
send_test_template | SEND (test) | Sends a test to the marketer only. |
Newsletters
| Tool | Type | What it does |
|---|---|---|
list_newsletters | GET | |
get_newsletter | GET | |
create_newsletter | CREATE | Creates a draft. |
update_newsletter | UPDATE | Changes a draft or scheduled newsletter. Clears the "tested" mark. |
delete_newsletter | DELETE · needs yes | Only drafts and cancelled newsletters. |
duplicate_newsletter | CREATE | Copies any newsletter into a new draft. |
check_newsletter | GET | Pre-send checker. |
preview_newsletter | GET | Same email preview. Schedule it: pick a time (or Send now), see the send preview, then click Yes or No. Uses the same confirm code as typing yes, so practice mode and blockers still apply. |
send_test_newsletter | SEND (test) | Sends a test to the marketer only. Marks the newsletter "tested". |
schedule_newsletter | SEND · needs yes | |
send_newsletter | SEND · needs yes | Sends now, after a 5-minute wait (can be cancelled in that time). |
turn_off_newsletter | UPDATE · needs yes | Moves a scheduled newsletter back to draft so it won't send. schedule_newsletter turns it back on. |
cancel_newsletter | UPDATE | Stops a scheduled newsletter, or one still in its 5-minute wait. |
Reports
| Tool | Type | What it does |
|---|---|---|
get_newsletter_report | GET | How a sent newsletter did. |
list_newsletter_recipients | GET | Who got a newsletter and what they did. |
compare_newsletters | GET |
Email Logs & Unsubscribes
| Tool | Type | What it does |
|---|---|---|
why_no_email | GET | Why one address isn't getting emails: SMTP setup, unsubscribed, last errors. Plain words, most likely reason first. |
check_sending | SEND (test) | Shows the SMTP server and sender (never the password); optionally sends a test to the marketer. |
list_email_logs | GET | All emails sent to one address. |
get_email_log | GET | One sent email in detail. |
list_scheduled_emails | GET | Emails waiting to go out (or stopped or failed ones): counts by automation, newsletter or event, and the next 20. |
stop_scheduled_emails | UPDATE · needs yes | Pauses waiting emails, filtered by source, list, template or address. Can be resumed. |
resume_scheduled_emails | UPDATE · needs yes | Puts stopped emails back. Send times move later by how long they were stopped; people who left, unsubscribed or were blocked are skipped. |
resend_failed_emails | UPDATE · needs yes | Sends failed emails again now. Skips the same people and sources as resume; the plan's monthly limit applies. Warns that "Interrupted while sending" emails may arrive twice. |
cancel_scheduled_emails | UPDATE · needs yes | Drops waiting or stopped emails for good. Can't be undone. |
list_unsubscribes | GET | Unsubscribed and blocked addresses. |
create_unsubscribe | CREATE | Unsubscribes an address. Pending emails are cancelled. |
delete_unsubscribe | DELETE · needs yes | Lets an unsubscribed person get emails again. Only if they asked. |
Automations
| Tool | Type | What it does |
|---|---|---|
list_automations | GET | |
get_automation | GET | |
create_automation | CREATE · needs yes | Creates an automatic email series that starts when someone joins a list. |
update_automation | UPDATE | |
pause_automation | UPDATE · needs yes | Turns an automation off. Waiting emails are cancelled. |
resume_automation | UPDATE · needs yes | Turns an automation back on. |
delete_automation | DELETE · needs yes |
Brand Settings
| Tool | Type | What it does |
|---|---|---|
get_product_settings | GET | - Branding: logo, colours, company name and address, footer, white-label |
update_brand_voice | UPDATE | Changes only the brand voice (Settings → Brand). |
Safety
| Tool | Type | What it does |
|---|---|---|
help_me | GET | Start here. Without a goal: what is set up and a short menu of next steps. With a goal: a step-by-step guide (first email, welcome series, sale, email not arriving, results, import, clean up, win-back). Same guides as the prompts, for AI apps that hide prompts. |
get_practice_mode | GET | |
update_practice_mode | UPDATE · needs yes | |
list_changes | GET | Recent changes (last 1 day). |
undo_change | UPDATE | Undoes a change from the last 1 day. |
Guided workflows (prompts)
plan_and_send_newsletter · clean_up_list · weekly_report · import_new_list · win_back_inactive
Errors
Tool errors come back as normal results with isError: true and a plain sentence, for example "Your Mailazy connection expired. Please reconnect Mailazy in your AI app." or "Two lists match "Leads": … Which one?".