Capabilities
You drive the MCP server in natural language — describe what you want and the assistant picks the right action. This page shows example prompts and lists what the server can do today.
The exact set of actions evolves as we add features; once connected, your client always shows the current list. The actions below cover both easycart (your store) and easymail (your email marketing) — a single connection reaches both, see Connecting. The easymail actions additionally need the Manage Easymail API keys permission on the store you are acting on.
Example prompts
easycart
Try asking your assistant:
"Show me this week's revenue compared to last week."
"Find my product called Masterclass and give me its checkout link."
"List the orders from the last 7 days."
"Create a 20% discount code BLACKFRIDAY for my course."
"Add a $99 one-time price to Masterclass that gives buyers access for one year."
"Cancel jane@example.com's subscription at the end of the period."
"Refund the last payment from john@example.com."
"List my Creator pages."
"Create a Creator page called Print Shop."
"Turn on abandoned-cart recovery with a 10% off coupon."
"Create a Studio branding palette and attach it to Masterclass checkout."
"Offer the workbook as a checkout order bump when someone buys Masterclass."
"Offer the workbook as a thank-you-page cross-sell after someone buys Masterclass."
"Create an affiliate partner named Ada with the ref ada."
easymail
"How many subscribed contacts do I have?"
"Find contacts who haven't opened an email in the last 90 days."
"Add jane@example.com to my Newsletter list."
"Draft a campaign announcing the summer sale, then send me a test copy."
"Schedule the Summer Sale campaign for Friday at 9am."
"What were the open and click rates for my last campaign?"
"Unsubscribe john@example.com from all email."
What you can do — easycart
Store
| Action | Description |
|---|---|
get_store | Read the selected store: profile, currencies, payment methods (provider always present, is_available live), popup embed hostnames, abandoned-cart recovery, tax defaults, and partner defaults (partners.cookie_valid_days, partners.commission_percent) |
update_store | Sparse-update checkout setup — payment-method enablement and order, popup domains, recovery, tax defaults, and partner defaults (partners.cookie_valid_days, partners.commission_percent). A rejected patch writes nothing at all |
list_stores | List every store your token can manage |
update_store writes checkout setup and partner defaults. Profile fields such as name, email,
address, and logo are not writable here — sending them returns 422. Omitted
keys are unchanged. Recovery coupon percent is an integer 1–100; amount is
minor units with no currency — send one or the other, not both. coupon: null
clears it. partners is always present and never null. cookie_valid_days is
an integer of at least 1; commission_percent is an integer 1–100, where 20
means 20%. Until the store saves its own, they are 7 days and 20%. Sending one
key leaves the other in place. null on either key returns 422. Send
commission_percent, not commission. Unknown keys return 422, and a patch
applies as a whole — when any part of it is rejected, nothing in it is written. Enabling a payment
method while get_store reports is_available false is usually rejected,
so the assistant asks you to connect the provider in the dashboard first;
that flag also covers a store whose availability could not be checked, so a
retry is worth it once the provider is connected. The matching HTTP
endpoints are documented under
Store.
Branding themes
| Action | Description |
|---|---|
find_branding_themes | List store-owned palettes, or look one up by UUID or name |
create_branding_theme | Create a palette — name is required; colours are # plus 6 hex digits |
update_branding_theme | Sparse-update a palette, identified by UUID or name |
delete_branding_theme | Delete a palette. Pass dry_run first to confirm the resolved theme |
These are four separate actions — there is no combined manage_branding_theme.
Find, update, and delete accept a UUID or a name (integer ids are not
accepted). A name is resolved from the store-owned list. A name that matches
nothing is an error from the assistant; the HTTP API addresses themes by UUID
only, and a malformed id is 400. Built-in dashboard palettes are not in this
list. Colour tokens are # plus 6 hex digits, or null — not transparent or
3-digit hex. A store may have zero defaults: unsetting or deleting the last
default does not promote another theme. Creating a theme does not attach it to
a product — pass the UUID as branding_theme_id to update_product_styles.
Deleting a theme is irreversible from the API list; products keep their copied
colours and their branding_theme_id is cleared. The matching HTTP endpoints
are documented under Branding Themes.
Products
| Action | Description |
|---|---|
find_products | Look up a product by ID or search by keyword. Get-one with include=styles includes styles.branding_theme_id |
create_product | Create a new product |
update_product | Change a product's details as an unpublished draft |
publish_product | Put the current draft on sale, so buyers see it |
unpublish_product | Take a product off sale, saving any pending draft once you confirm |
Variants
| Action | Description |
|---|---|
find_variants | List a product's price variants, or look one up by ID. Each result includes upsells |
create_variant | Add a price variant to a product's draft |
update_variant | Change a variant's details in the product's draft, including replace-all upsells |
archive_variant | Retire a price variant from the unpublished draft. There is no unarchive |
reorder_variants | Set the display order of a product's unpublished-draft variants |
Product and variant edits are saved as an unpublished draft. Buyers keep seeing the
current version until publish_product runs, and the assistant gives you a preview link
after each edit so you can check the result before putting it live.
To change a published price amount, archive the variant and create a new one —
update_variant cannot change amount. Same-product upsells are set on
update_variant, not on create.
unpublish_product is not a simple status flip. If the product has a pending draft —
including one left half-finished in the dashboard — taking it off sale saves that draft as
the live product, so edits nobody remembers making can become real, and a store connected
to Stripe may have products or prices created there as a result. Because of that, the
assistant stops and shows you a preview link first, and only goes ahead once you confirm.
A product with no pending draft is taken off sale straight away.
Checkout appearance
| Action | Description |
|---|---|
update_product_styles | Change checkout colours, rounding, shadow, dark mode, and attached branding theme on the unpublished draft. Returns a preview link |
update_product_settings | Change checkout logos, thank-you copy, confirmation email, and recovery on the unpublished draft |
update_product_media | Replace the checkout gallery on the unpublished draft |
prepare_media_upload | Reserve an upload and return the PUT request. Same action for checkout and Creator-page files |
complete_media_upload | Host the file after the PUT and return file_url — does not attach it |
Styles, settings, and gallery writes land on the unpublished draft and return a
preview link. update_product_styles accepts branding_theme_id (a UUID from
find_branding_themes, or null to detach and keep current colours). Attach
copies non-null theme colours and logos only; null theme values leave the
product unchanged. Attach plus a colour, border_radius, or shadow field in
the same call is rejected (422). Colour / rounding / shadow writes detach the theme;
only darkmode_enabled preserves it. Host a file with
prepare_media_upload. The assistant then PUTs the local file to
upload_request.url, copying upload_request.headers and sending no
Authorization — the server does not receive the bytes. Call
complete_media_upload next, then pass the returned file_url into
update_product_media (gallery) or update_product_settings (logos).
Creator-page header, settings, and widgets use the same two actions, then
update_storefront or manage_storefront_blocks. The matching HTTP
endpoints are documented under
Upload Media and
Checkout appearance.
Custom fields
| Action | Description |
|---|---|
manage_product_custom_fields | List, get, create, update, or delete checkout custom fields on a product's unpublished draft |
manage_waitlist_custom_fields | Same actions for waitlist custom fields — they do not appear at checkout |
manage_variant_custom_fields | Same actions for a variant's checkout custom-field override |
Pick the action with action (list, get, create, update, delete). Identity
is the field name, not a UUID. After a write, the assistant returns a preview link
and stops — it does not publish. An empty variant override means the variant inherits
the product checkout fields.
Order bumps
| Action | Description |
|---|---|
manage_order_bumps | List, get, create, update, delete, or reorder add-to-order checkout offers on a product's unpublished draft |
Pick the action with action (list, get, create, update, delete, reorder).
These write the unpublished overlay — live /order-bumps routes stay HTTP-only.
After a write, the assistant returns a preview link and stops — it does not
publish. Path parent is the checkout that shows the bump before pay;
product_id and variant_id are the offered product and one-time variant.
A product may have at most 10 order bumps, counting inactive ones.
amount is a nullable override — null inherits the offered variant's
price, it is not free. display_type omitted on create stores
large_thumbnail; countdown needs validity_minutes of at least 1.
Ask for a preview and the assistant runs the action with dry_run first,
reporting what it would write without writing it.
The matching HTTP endpoints are documented under
Order Bumps.
Cross-sells
| Action | Description |
|---|---|
manage_cross_sells | List, get, create, update, delete, or reorder after-purchase offers on a product's unpublished draft |
Pick the action with action (list, get, create, update, delete, reorder).
These write the unpublished overlay — live /cross-sells routes stay HTTP-only.
After a write, the assistant returns a preview link and stops — it does not
publish. Path parent is the checkout that shows the offer after purchase;
product_id and variant_id are the offered product and variant. Offers nest
at most 3 levels. Delete promotes children to the deleted offer's parent.
amount on the resource is the variant list price, not an override.
validity_minutes omitted on create stores 15; null means no timer.
Sending discount replaces the stored discount as a whole, so a partial
object drops the parts it leaves out. Ask for a preview and the assistant
runs the action with dry_run first, reporting what it would write without
writing it; a previewed create does not check the offered product, variant,
or parent, and states no price. The
matching HTTP endpoints are documented under
Cross-sells.
Orders
| Action | Description |
|---|---|
list_orders | Browse and filter orders |
get_order | Read the full details of a single order |
Checkout sessions
| Action | Description |
|---|---|
list_checkout_sessions | Browse checkout sessions a buyer started, including ones that never became an order |
get_checkout_session | Read one checkout session |
These actions only read sessions. The matching HTTP endpoints are documented under Checkout Sessions.
Customers
| Action | Description |
|---|---|
list_customers | Browse and filter customers |
get_customer | Read the full details of a single customer |
Waitlists
| Action | Description |
|---|---|
list_waitlists | Browse product waitlists |
get_waitlist | Read one waitlist |
list_waitlist_members | Browse signups on one waitlist |
get_waitlist_member | Read one signup |
Signup answers are custom_field_answers. These actions only read. The matching HTTP endpoints are documented under
Waitlists.
Product access
| Action | Description |
|---|---|
grant_product_access | Give a customer free access to a one-time product |
revoke_product_access | Remove a customer's access to a one-time product |
Transactions & refunds
| Action | Description |
|---|---|
list_transactions | Browse and filter transactions |
get_transaction | Read a transaction's details, including what is refundable |
issue_refund | Refund a transaction in full or in part |
Invoices
| Action | Description |
|---|---|
list_invoices | Browse and filter invoices |
get_invoice | Read the full details of a single invoice |
resend_invoice | Email an issued invoice to the customer again |
Promotion codes
| Action | Description |
|---|---|
list_promotion_codes | Browse promotion codes |
get_promotion_code | Read the details of a single promotion code |
create_promotion_code | Create a discount code |
update_promotion_code | Update a code's name, status, or variants |
archive_promotion_code | Permanently retire a promotion code |
Partners
| Action | Description |
|---|---|
list_partners | Browse published partners |
get_partner | Read one partner. Earnings need include=stats and currency |
create_partner | Create a partner. name and ref are required |
update_partner | Sparse-update a partner's name, ref, email, commission, or cookie length |
commission_percent and cookie_valid_days are overrides. null means the
partner inherits the store defaults on get_store → partners. 20 means
20%. cookie_valid_days is an integer from 1 to 3650. ref is up to 49
characters. update_partner accepts a UUID or an exact name or ref.
conversion_rate_percent is a float (0.24 means 0.24%) and is null when
there are no visits. Archived partners and the store referrer are omitted, and there is no
archive action. The matching HTTP endpoints are documented under
Partners.
Partner transactions
| Action | Description |
|---|---|
list_partner_transactions | Browse purchase rows for every partner, in one currency |
A refund is a second row, with its own id and a negative amount, unless the refund commission is 0. Then no refund row is written.
Archived partners' rows are included, with ref null and a partner_id that get_partner
cannot open. variant_name is the variant's current name, not a snapshot. The
matching HTTP endpoint is documented under
Partner Transactions.
Subscriptions
| Action | Description |
|---|---|
list_subscriptions | Browse and filter subscriptions |
get_subscription | Read the full details of a single subscription |
manage_subscription | Cancel, resume, or change the plan of a subscription |
Statistics
| Action | Description |
|---|---|
get_stats | Read a sales or revenue statistic with period-over-period comparison |
Storefronts (Creator pages)
In the dashboard these pages are labeled Creator page. The actions use the
API name storefront — when someone asks for a Creator page, that is this
resource, not Pages (landing pages).
| Action | Description |
|---|---|
find_storefronts | List or look up Creator pages (storefronts) by name, slug, or domain |
get_storefront_analytics | Read traffic and revenue for one Creator page |
create_storefront | Create a new Creator page as a draft |
update_storefront | Change a Creator page's draft styles, header, or settings |
manage_storefront_blocks | List, add, edit, hide, or reorder widgets on a Creator page |
publish_storefront | Put a Creator page's draft live |
unpublish_storefront | Take a live Creator page down; the draft stays |
Creator-page edits write the unpublished draft. The assistant returns a preview link
after each edit and does not publish until you confirm. Host a header, settings,
or widget file with prepare_media_upload and complete_media_upload — the
same actions as checkout — then send file_url on update_storefront or
manage_storefront_blocks. The assistant PUTs the local file itself; the
server does not upload the bytes.
Landing pages
| Action | Description |
|---|---|
list_pages | List Easypages (landing pages) |
get_page_analytics | Read analytics for one landing page |
Easypages are a different surface from Creator pages. Landing pages are authored in the dashboard; these actions only list them and read their analytics.
What you can do — easymail
Contacts
| Action | Description |
|---|---|
find_contacts | Find and filter contacts by email, status, list, segment, custom field, or engagement recency |
count_contacts | Count the contacts matching a filter, without listing them |
create_contact | Add a new contact |
upsert_contact | Create a contact, or update it if the email already exists |
update_contact | Change an existing contact's details |
delete_contact | Permanently delete a contact |
unsubscribe_contact | Withdraw a contact's consent so they stop receiving email |
resubscribe_contact | Restore consent so a contact can receive email again |
list_contact_events | Read a contact's activity timeline — opens, clicks, bounces, purchases |
Lists
| Action | Description |
|---|---|
find_contact_lists | Browse contact lists, optionally with subscriber and mailability stats |
create_contact_list | Create a contact list |
update_contact_list | Rename a contact list or change its description |
delete_contact_list | Delete a contact list |
manage_contact_list_membership | Add or remove contacts from a contact list |
Segments
| Action | Description |
|---|---|
find_contact_segments | Browse contact segments — saved, filter-based audiences. An exact UUID read includes the stored filters |
create_contact_segment | Create a contact segment from a name and a filter tree |
list_contact_segment_members | List the contacts who currently match a segment and can receive mail |
Filter fields, operators, and the limits on a tree (50 conditions, 50 groups, 3 levels of groups) are on Segments.
A 503 from list_contact_segment_members means the segment's members could
not be counted or loaded in time. Retry after about a minute.
Custom fields
| Action | Description |
|---|---|
find_contact_custom_fields | Browse contact custom field definitions |
create_contact_custom_field | Define a new contact custom field |
rename_contact_custom_field | Rename a contact custom field |
delete_contact_custom_field | Delete an unused contact custom field and its values from every contact |
set_contact_custom_field | Set a custom field value on a single contact |
clear_contact_custom_field | Clear a custom field value on a single contact |
A custom field that an active automation, a segment, or an unsent campaign still uses cannot be deleted; edit those first. See Delete Custom Field.
Campaigns
| Action | Description |
|---|---|
find_campaigns | Browse campaigns |
get_campaign | Read a campaign's details, optionally with open/click stats and revenue |
create_campaign | Create a draft campaign |
update_campaign | Edit a draft campaign |
delete_campaign | Delete a campaign |
send_campaign | Send a campaign now |
schedule_campaign | Schedule a campaign to send at a future time |
unschedule_campaign | Revert a scheduled campaign back to draft |
cancel_campaign | Stop a campaign that is currently being sent |
send_test_email | Send a test copy of a campaign to specific addresses |
Campaign reporting
| Action | Description |
|---|---|
list_campaign_recipients | See the per-recipient send log for a campaign |
list_campaign_link_clicks | See which tracked links were clicked, and how often |
Automations
| Action | Description |
|---|---|
find_email_automations | Browse email automations |
get_email_automation | Read one automation, including its steps when they can be represented |
create_email_automation | Create a draft automation: a chain of delays and emails, optionally ending in an audience branch |
update_email_automation | Change a draft or paused automation |
duplicate_email_automation | Copy an automation into a new draft |
activate_email_automation | Start enrollment |
pause_email_automation | Stop new enrollment on an active automation |
delete_email_automation | Permanently delete an automation |
Triggers, conditions, steps, audience branches, and the limits on a chain (50 steps, 10 arms, 50 steps per arm, and the longest delay) are on Automations.
Ask for a preview and the assistant runs update_email_automation,
activate_email_automation, or delete_email_automation with dry_run first.
An update preview lists the stored step UUIDs the update would remove and
reports when the automation cannot be edited. It also predicts a step UUID that
is not on the automation or is repeated (422), and a kept email body that
needs overwrite (409 CONTENT_OVERWRITE_REQUIRED). With overwrite, it
lists the steps whose styled body would be replaced, and it flags a delay step
whose UUID is sent on a step of another type. It does not check the trigger,
names, segments, sender identities, or Markdown. An activation preview flags an
automation that is already active; other activation requirements are checked
by the real call. A delete preview shows the automation's name and status.
Sending setup
| Action | Description |
|---|---|
list_sender_identities | List the verified "from" addresses you can send as |
list_timezones | List timezones. A row's UUID is a contact timezone, the workspace timezone, or an automation timezone when the mode is fixed |
get_mailing_settings | Read the footer name and address, the workspace timezone, and whether a hosted list signup requires confirmation |
update_mailing_settings | Change the footer, the workspace timezone, or double opt-in. Omitted fields stay as stored |
Mailing settings are on Mailing Settings.
Actions that change data
Some actions write data, move real money, or contact your customers. The assistant acts as you, with your permissions, so review what it proposes before you confirm.
In easycart: issuing refunds (which move real money), granting or revoking
product access, resending invoices, cancelling subscriptions, archiving
promotion codes, archiving a price variant, and publishing a Creator page
(storefront). A full refund also revokes the customer's access to the product
and emails them; archiving a promotion code or a variant cannot be undone.
Taking a product off sale also saves any pending draft as the live product,
which the assistant asks you to confirm first — see Products.
Publishing a Creator page overwrites the live visitor page with the current
draft. Deleting a branding theme cannot be undone from the API list — the
assistant can preview it first with dry_run.
In easymail: sending or scheduling a campaign, sending a test email, and activating an automation deliver real mail; unsubscribing or resubscribing changes a contact's consent; and deleting a contact, list, campaign, custom field, or automation is permanent. Deleting a custom field removes its value from every contact.