Settings
Pabbly Email Marketing has a built-in MCP Server. MCP (Model Context Protocol) is the open standard that lets AI assistants such as ChatGPT and Claude work inside other apps. Once connected, you can manage your email marketing by chatting: add subscribers, check campaign results, create templates and campaigns, build automations, and more.
This guide walks through the connection in four steps. It takes about five minutes.
A Pabbly Email Marketing account with at least one business.
A ChatGPT or Claude account on a plan that supports custom connectors. Free plans generally do not.
Your Pabbly login email and password (or Google login) handy. You will sign in once during setup.
Log in to Pabbly Email Marketing.
In the left sidebar, open Settings.
Click the MCP Server tab.
In the MCP Server URL card, click the copy icon at the right end of the field.
The URL is the same for every account:
https://emails.pabbly.com/mcpThe URL alone does not give anyone access to your account. Access is granted only after you sign in and approve it in Step 3.
Pick the assistant you use. Menu names can shift slightly as ChatGPT and Claude update their apps, but the fields are the same.
Open Settings in ChatGPT, then Connectors.
Click Create (or Add connector). If you do not see it, open Advanced settings on the Connectors page and turn on Developer mode first.
Fill in the form:
Name: Pabbly Email Marketing
Description: anything you like, for example Manage subscribers, campaigns and automations from chat.
MCP Server URL: paste https://emails.pabbly.com/mcp
Authentication: choose OAuth. Leave any Client ID / Client Secret fields empty.
Tick I understand and want to continue and click Create.

Illustration of the form. Your screen may look slightly different.
ChatGPT immediately opens the Pabbly sign-in window. Continue with Step 3.
Open Settings in Claude, then Connectors.
Click Add custom connector.
Fill in the form:
Name: Pabbly Email Marketing
Remote MCP server URL: paste https://emails.pabbly.com/mcp
Leave Advanced settings (OAuth Client ID / Secret) empty.
Click Add.
Find the new connector in the list and click Connect.

Claude opens the Pabbly sign-in window. Continue with Step 3.
A Pabbly window opens inside your assistant.
Choose the business the assistant may work with, then click Approve access.

One connection covers one business. To work with a different business, disconnect and connect again, choosing the other one (see "Switching business" below).
After you approve, the window closes and the connector shows as Connected.
Open a new chat and ask for something. The assistant picks the right Pabbly tools on its own.

Prompts to try:
"Give me an overview of my Pabbly Email Marketing account."
"How many subscribers are in my Newsletter list?"
"Add [email protected] to the Newsletter list with first name Priya."
"Which of my campaigns had the best open rate?"
"Who bounced in the September Newsletter campaign?"
"Create an email template called 'Diwali Offer' with a 20% discount banner and a Shop Now button."
"Create a draft campaign from that template with subject 'Diwali sale starts today' and show me the preview."
"Build an automation: when someone joins the Newsletter list, wait 1 day, then send the Welcome campaign."
"Send new subscribers to this webhook URL: https://example.com/hooks/new-subscriber"
Tip: In ChatGPT, if a chat does not use the connector, click the + button in the message box and enable Pabbly Email Marketing for that conversation.
Area | What you can ask for |
|---|---|
Account | Account overview, list of your businesses, which business is connected |
Subscribers | Search and view subscribers, add or update them, add to or move between lists, unsubscribe, delete |
Lists | View, create, rename, delete lists |
Segments | View segments and their subscribers, create, update, delete |
Campaigns | List campaigns, view content, create drafts, send to a list or to specific emails, per-campaign open / click / bounce rates |
Engagement | Who opened, clicked, bounced or unsubscribed in a campaign, and when |
Templates | View, create (HTML or Drag & Drop builder), update, delete. A live preview link is returned for every template and campaign the assistant creates |
Images | Upload an image (from a URL or a file) and get a hosted link to use in emails |
Automations | View workflows and their stats, build new workflows from a plain-English description, update, delete |
Webhooks | Add a webhook that fires on events such as new subscriber, campaign sent, email opened |
Delivery | See your delivery servers and sending options, custom fields |
You approve, the assistant asks. Sending a campaign, deleting subscribers, lists, templates or automations always requires your confirmation in the chat.
One business per connection. The assistant can see and change only the business you selected during sign-in. Other businesses and other accounts are never visible.
Same limits as the app. Subscriber quota, sending limits and bulk-delete protections apply exactly as they do in Pabbly Email Marketing.
Paged results. Lists are shown 20 rows at a time. Ask for the next page rather than "everything at once".
Compliance footer. Templates and campaigns created through the assistant automatically get the unsubscribe and business-address footer, just like the editor does.
Disconnect any time. Remove the connector in your assistant's Connectors settings. Access ends immediately.
Sending to individual addresses is limited to your subscribers. When you ask the assistant to send a campaign to specific email addresses, each address must already be a subscriber of the connected business with status "subscribed". Unknown, unsubscribed, bounced or complaint addresses are refused, and the sending pipeline applies the same suppression rules again at send time.
In ChatGPT or Claude, open Settings → Connectors, select Pabbly Email Marketing and choose Disconnect (or remove it).
Connect again. On the Authorize access screen, pick the other business.
Any client that supports remote MCP servers over HTTP with OAuth can connect. The URL is always https://emails.pabbly.com/mcp.
Claude Code (terminal)
claude mcp add --transport http pabbly-email-marketing https://emails.pabbly.com/mcpThen run /mcp inside Claude Code and choose Authenticate next to the server.
Cursor and other JSON-configured clients
{
"mcpServers": {
"pabbly-email-marketing": {
"url": "https://emails.pabbly.com/mcp"
}
}
}The client opens the same Pabbly sign-in window as in Step 3.
The sign-in window says "Invalid email or password." Use the same email and password you use at emails.pabbly.com. If you normally sign in with Google, click Login with Google instead.
The connector shows "Disconnected" or the assistant says it is not authorized. Open Settings → Connectors in your assistant and click Connect (or Reconnect) on Pabbly Email Marketing. Sign in again when prompted.
The assistant says it cannot find a tool, or an older feature is missing. Disconnect and reconnect the connector. Assistants cache the tool list at connect time.
The assistant is working on the wrong business. See "Switching business" above.
A campaign the assistant sent shows as "Sending". That is normal. Emails go out through the sending queue, and the status changes to Sent once delivery finishes. Ask the assistant for the campaign status again in a few minutes.
"Quota full" when adding subscribers. Your business has reached its subscriber limit. Upgrade the plan or remove unused subscribers, then try again.
An image the assistant added does not show in the email. Ask the assistant to upload the image first ("upload this image and use the hosted link"). Images must be hosted to display in email clients.
I want to stop the assistant's access completely. Remove the connector in your assistant's Connectors settings. The assistant no longer holds any access to your business after that.
This page holds the authoring and transfer guidance that the connector's reference tools return (get_email_design_guidelines, get_image_upload_reference, get_automation_spec_reference). Publish it on the public documentation page for the connector.
Pabbly Email Marketing: HTML email authoring guidelines
Layout
A 600px centered container on a soft off-white or grey page background.
Table-based layout with inline CSS for email-client compatibility; container max-width 100% so it works on mobile.
Clear hierarchy: a hero image or a colored header/accent bar at the top, a small uppercase eyebrow label, a large bold heading, then body text with line-height around 1.6 and 24-32px padding.
One brand accent color used consistently for the accent bar, labels and button.
A table-based call-to-action button (a colored td wrapping an a with padding) rather than a bare link.
Optional feature rows with small colored number or icon badges.
Rich inline styles are preserved by the platform. The compliance footer (unsubscribe link and business address) is appended automatically by the server.
Images
Every image must be hosted by the platform before it is referenced: upload_image returns a hosted URL on assets-emails.pabbly.com, which is then used as the img src.
Raw external or stock URLs and redirect or random-image services (source.unsplash.com, loremflickr, picsum "random", placeholder services) are not supported as img src; they fail or hotlink-block and the email shows a broken image.
Typographic or geometric artwork (banners, headers, colour blocks, gradients, patterns, icons, badges, charts) can be supplied to upload_image as SVG markup (imageSvg); the server renders it to a hosted PNG. SVG cannot produce photographs of people, fabric, food or products.
Photographs generated outside the platform are transferred with the chunked upload tools (begin_image_upload, put_image_chunks, finish_image_upload); see get_image_upload_reference. Large inline base64 data is not a supported transfer path because it is truncated in transit.
A user-supplied image URL or logo is hosted with upload_image (imageUrl) and then referenced.
When no hostable image is available, an image-less design with a colored header or accent bar is the supported fallback.
Image sizing
Set only the width: style="width:100%;max-width:600px;height:auto;display:block". A fixed pixel height together with a width distorts the picture; height:auto keeps the natural aspect ratio.
Source images should be at least about 600px wide (a hero ideally about 1200px). Small or low-resolution images look pixelated when enlarged.
Logos are usually 150-180px wide with height:auto.
Pabbly Email Marketing: chunked image upload reference
Purpose: transfer an image that exists only as a file in the assistant's environment (for example a generated photograph) to Pabbly's hosting in verified base64 chunks, then reference the hosted URL in a campaign or template.
Sequence
begin_image_upload with sha256, total_bytes, zbytes, total_chunks, mime and encoding "deflate". Returns upload_id and any chunk indexes already received (the session is resumable by sha256).
put_image_chunks with upload_id and a batch of up to 4 chunks {index, data, crc}. Returns stored, failed and next. Only indexes listed under failed need to be re-sent.
finish_image_upload with upload_id. Returns {ok: true, url} when every chunk is present and the sha256 and length match; {ok: false, missing: [...]} when chunks are still missing.
Reference the returned url in the email HTML (update_campaign, create_campaign or create_email_template).
Preparation (Python, run in the assistant's environment) from PIL import Image; import base64, io, zlib, hashlib, glob, os p = max(glob.glob("/mnt/data/.png"), key=os.path.getmtime) img = Image.open(p).convert("RGB"); img.thumbnail((1200, 1200)) buf = io.BytesIO(); img.save(buf, "WEBP", quality=82, method=6); raw = buf.getvalue() z = zlib.compress(raw, 9) b64 = base64.b64encode(z).decode(); CH = 1500 chunks = [b64[i:i+CH] for i in range(0, len(b64), CH)] print("sha256", hashlib.sha256(raw).hexdigest(), "bytes", len(raw), "zbytes", len(z), "chunks", len(chunks)) N = 4 b = 0 # batch number: 0, 1, 2, ... for i in range(bN, min((b+1)*N, len(chunks))): print(i, zlib.crc32(chunks[i].encode()), chunks[i])
Notes
WebP at 1200px is about half the bytes of JPEG for the same picture; the server converts it to JPEG for the email.
The zlib step removes repeated runs that are otherwise miscopied; encoding is therefore always "deflate".
Each chunk line is copied exactly as printed, with no line breaks inside a chunk. A batch larger than 4 chunks is rejected.
If the same index fails twice, a different CH value (reported by the server) and a new begin_image_upload with the new chunk count resolves it. If the upload is reported too large, thumbnail((1000, 1000)) with quality=75 reduces it.
Pabbly Email Marketing: build_automation spec reference
SPEC: { name, active?, layout?, trigger, steps:[ ...in order ] } layout is optional and defaults to "horizontal" (nodes laid left-to-right); "vertical" lays them top-to-bottom.
TRIGGER (exactly one): • subscriber_lifecycle: {app:"subscriber_lifecycle", event, ...} — event new_subscriber_added|subscriber_removed → lists:[names] or ["all"]; "all" expands to every list of the business; tag_added|tag_removed → tags:[names]; custom_field_updated → customFields:[names]; subscriber_updated → any of lists/segments/customFields/tags. • campaign_engagement: {app:"campaign_engagement", event:"email_opened"|"link_clicked"|"specific_link_clicked", campaignId:<id or [ids]>, link?(required for specific_link_clicked)}. • scheduler: {app:"scheduler", lists:[names], schedule:{method:"interval"|"once"|"every_day"|"day_of_week"|"day_of_month", ...}} — interval:{every_value:int,time_span:"Minutes|Hours|Days|Weeks"}; once:{run_at:"YYYY-MM-DDTHH:mm"}; every_day:{trigger_hour,trigger_minute}; day_of_week:{trigger_hour,trigger_minute,selected_days:[0=Sun..6=Sat]}; day_of_month:{trigger_hour,trigger_minute,selected_dates:[1..31]}. • lead_score: {app:"lead_score", event:"score_added"|"score_subtract", events:[ "email_open"|"email_click"|"email_bounce"|"unsubscribe" ]}. • anniversary: {app:"anniversary", subscriberList:name, dateField:"dateOfBirth" or a custom field name, offsetType:"on"|"before", offsetValue?, offsetUnit?:"days"|"hours", triggerHour?, triggerMinute?}.
STEPS (actions, in order): • {action:"email", campaignId, deliveryServerName?} — send an API/Workflow campaign (list_campaigns). deliveryServerName is the delivery server name (a custom SMTP server name, "Amazon SES", or "Send With Us"); the from-email + credentials are taken from that server automatically. When omitted, a default active server is used; senderEmail and fromName override its defaults. • {action:"delay", method:"Delay for", value:N, unit:"Minutes|Hours|Days|Weeks"} (caps: Minutes 5-60, Hours ≤24, Days ≤7, Weeks ≤4) — or {method:"Wait", waitDay:"Monday", waitHour:9, waitMinute:30} — or {method:"Delay until", dateTime:"YYYY-MM-DD HH:mm:ss"}. • {action:"condition", filterBy:"workflow_activity", email:, event:"opened"|"not_opened"|"any_link_clicked"|"specific_link_clicked"|"opened_no_click"|"opened_not_specific_click", link?} → if it matches the flow continues to the next step; if not, it ends . Other filterBy: "custom_field"{customField,operator:"Equals|Not Equals To|Contains|Does not contain",value}; "tags"{tag,operator:"Is|Is not"}; "campaigns"{campaign(name or id),operator:"Opened|Clicked|Not Opened|Not Clicked"}; "subscriber_list"{subscriberList,operator:"Is|Is not"}. Combine with all:[...conds] (AND) or groups:[[...],[...]] (OR of ANDs). • {action:"router", branches:[ {filterBy...(same as condition), steps:[...]}, ... ]} → true YES/NO or multi-way branching; each branch has its own condition + steps. A router ends the main chain. • Subscriber ops: {action:"add_to_list", lists:[names]} / {action:"remove_from_list", lists:[names]} / {action:"move_to_list", moveFrom, moveTo} / {action:"copy_to_list", targetList} / {action:"move_to_suppression_list", targets:["Unsubscribed"|"Spam"|"Bounced"]} / {action:"add_tag", tags:[...]} (a tag that does not exist yet is created) / {action:"remove_tag", tags:[...]} / {action:"update_custom_field", fieldName, value} / {action:"mark_as_unsubscribed"}. • {action:"webhook", url}.
EXAMPLE (new subscriber, email, 24h delay, if opened then move to list "aaa"): {name:"Onboarding", trigger:{app:"subscriber_lifecycle", event:"new_subscriber_added", lists:["Default List"]}, steps:[{action:"email", campaignId:"", deliveryServerId:"send-with-us", senderEmail:"[email protected]", fromName:"Team"}, {action:"delay", method:"Delay for", value:24, unit:"Hours"}, {action:"condition", filterBy:"workflow_activity", email:"", event:"opened"}, {action:"move_to_list", moveFrom:"Default List", moveTo:"aaa"}]}
Need help? Contact Pabbly support from the Get Help menu in Pabbly Email Marketing.