add_contact
ChatGPTAdds one contact with optional merge fields. Fails with conflict when the email already exists; use import_contacts for many at once.
add_contacts_to_list
ChatGPTAdds existing contacts to a list (contacts not in the book yet are created first).
add_postmaster_domain
ChatGPTProfessional plan. Registers a domain the user owns in Gmail Postmaster Tools and returns the DNS record that proves ownership (record.type / record.name / record.value). Give the user that record to add at their DNS provider; once it is published (propagation can take up to ~10 minutes), call verify_postmaster_domain. Calling it for a domain already registered is harmless and returns the record again. Only domains the user owns — never a consumer domain such as gmail.com. Confirm the domain with the user first.
block_contacts
ChatGPTAdds emails to the account's blocklist: every future campaign skips them, even when they appear in a sheet. Contacts not yet in the book are created as blocked.
check_email_reputation
ChatGPTChecks a sender address's domain reputation signals (SPF, DKIM, DMARC, blacklists, MX). 20 checks per day per account.
check_quota
ChatGPTChecks whether sending N emails at a given time fits the account's daily quota, counting what is already used or scheduled that day. Call it before proposing a send time.
create_contact_list
ChatGPTCreates an empty contact list; add members with add_contacts_to_list.
create_template
ChatGPTCreates an email template from a name, subject and HTML body. Write the body yourself from what the user asked for; use generate_template only when the user wants Mail Merge's AI to draft it.
delete_contact_list
ChatGPTDeletes a contact list. The contacts themselves are kept; only the grouping disappears. Confirm with the user first.
delete_contacts
ChatGPTPermanently deletes contacts (their fields and campaign history in the contact book). Confirm the list with the user first.
delete_scheduled_campaign
ChatGPTCancels a scheduled campaign that has not started; its sheet rows are marked Deleted. Cannot be undone. Confirm with the user first.
delete_template
ChatGPTPermanently deletes a template. Confirm with the user first; this cannot be undone.
duplicate_template
ChatGPTCopies a template (body, subject and attachments) into a new one named '<name> (copy)'. With owner, copies a teammate's shared template into this account's own library under its original name.
generate_ai_field
ChatGPTProfessional plan. Writes one short personalization snippet per row with AI — e.g. an icebreaker from the Company and Website columns — and returns it as a value for a merge tag. Nothing is sent or saved. Max 100 rows per call, 2000 rows per day. To use the values: put {{<field name>}} in the subject or body and pass each row's value in send_campaign's per-recipient fields under the same name (or write it into a sheet column of that name).
generate_template
ChatGPTWrites and saves an email template with Mail Merge's AI from a plain-language brief (prompt), or saves the exact subject + content you pass, or a sample template (useSampleValues). If the user asked for a template but gave no details, ask for the goal, audience and tone first, or offer useSampleValues. Optionally also creates a sample Google Sheet with the merge-tag columns (createSampleSpreadsheet). After it succeeds, show the user the template name, subject and the sheet link if one was created.
get_account
ChatGPTReturns the signed-in Mail Merge account: email, plan (free / personal / professional), daily sending quota (max, used today, remaining), whether Google access is connected, and a features map saying which features this plan can use (autopilot, followUps, abTesting, warmup, verification, deliverabilityHub, apiKeys, webhooks, aiFields, teamAnalytics, analytics, sharedTemplates, scheduling, tracking), and team (role owner/member and size) when the account is on a team subscription. Call it first in a session, and before planning anything that depends on the plan or the quota.
get_account_events
ChatGPTAccount events log: campaign launched / completed / paused, quota deferrals, Gmail cooldowns, access revoked, billing changes. Newest first, paginated.
get_activity
ChatGPTThe recipient activity feed: who opened, clicked, replied, bounced or unsubscribed, newest first. Paid plans only. Paginated with nextCursor.
get_analytics
ChatGPTAccount-level engagement analytics for a period: emails sent, opens, clicks, replies and bounces per campaign, daily time series, most engaged contacts and most clicked links. Paid plans only; a free account gets the sent total and an upgrade link. scope 'team' (Professional, subscription owner only) folds every seat member's sends into the same report, each campaign tagged with its sender.
get_campaign
ChatGPTReturns one campaign's details; when it is part of a follow-up sequence, the per-step statistics (each step's condition and skips); when it runs an A/B subject test, the per-variant results (abTest: sent, opened, clicked, replied, rates, the auto-picked winner).
get_campaign_recipients
ChatGPTLists a campaign's recipients with their status (In queue, Sent, Read, Clicked, Replied, Bounced, Error, Unsubscribed…). Replied/Bounced are detected on paid plans for 14 days after a campaign finishes. Paginated with nextCursor.
get_domain_compliance
ChatGPTProfessional plan. What Gmail Postmaster Tools reports for the sender's domain: Google's sender-requirements compliance verdict (SPF, DKIM, DMARC policy and alignment, DNS, TLS, user-reported spam rate, one-click unsubscribe, honoring unsubscribes) and the last 30 days of spam rate, authentication success and delivery error rate. Only domains the user registered and verified at postmaster.google.com have data; consumer addresses (gmail.com) never do — state tells which case applies. Requires one extra Google permission the first time (google_grant_required carries the link).
get_sequence_stats
ChatGPTPer-step statistics of a follow-up sequence: sent, opened, clicked, replied, skipped per step, each step's audience condition and how many it left out (conditionNotMet), and the first step's A/B subject test results when it ran one.
get_template
ChatGPTReturns one template in full: name, subject, HTML body and settings. With owner, reads a teammate's shared template (read-only; duplicate_template copies it into this account).
get_warmup
ChatGPTStatus of the email warm-up (automated peer-to-peer exchanges that build the sender's reputation): active/paused, today's target and sent count, reputation band, 7-day stats. Warm-up is enabled by the user in the web app (setupUrl in the result), not by a tool.
import_contacts
ChatGPTAdds up to 500 contacts in one call (chunk larger lists). Each contact is an email plus optional merge fields that appear in the email. Emails already in the book are skipped (their fields are not changed); the result says how many were imported and skipped.
import_google_doc
ChatGPTCreates a template from a Google Docs document the user owns or can read: the document's formatted text becomes the HTML body and its title the template name. Needs the user's Google access.
list_campaigns
ChatGPTLists the account's campaigns in three buckets: ongoing (sending or paused), scheduled (not started yet, autopilot included) and completed (finished or stopped). Free accounts keep completed campaigns for 3 days only.
list_contact_lists
ChatGPTLists the account's contact lists (id, name, created). A list is a named group of contacts a campaign can be sent to.
list_contacts
ChatGPTLists the account's contacts with their merge fields, campaign count, unsubscribed/blocked flags and list memberships. Paginated: pass the returned nextCursor to get the next page.
list_postmaster_domains
ChatGPTProfessional plan. The domains registered in Gmail Postmaster Tools under the user's Google account, each verified or unverified. A verified domain is what get_domain_compliance reports on; an unverified one still needs its DNS record (add_postmaster_domain returns it again) and verify_postmaster_domain.
list_sheets
ChatGPTLists the tabs (sheets) of a Google Sheets spreadsheet with their numeric ids, from a link or id. Use it before read_sheet or send_campaign when the spreadsheet has several tabs.
list_spreadsheets
ChatGPTLists the user's Google Sheets spreadsheets (id, title, last modified, URL), newest first, optionally filtered by title. Needs Google Drive read access: when the result says google_grant_required, give the user the reconnectUrl it carries, or simply ask them to paste the spreadsheet link instead — list_sheets and read_sheet work from a link without this permission.
list_templates
ChatGPTLists email templates (id, name, subject, last edited). Bodies are not included; call get_template for one. scope 'team' lists the templates teammates share through the team subscription, each with its owner email — pass that owner to get_template or duplicate_template.
pause_campaign
ChatGPTPauses an ongoing campaign; queued emails wait until resume_campaign.
pause_warmup
ChatGPTPauses the warm-up; the ramp history is kept.
read_sheet
ChatGPTReads a tab of a Google Sheets spreadsheet: the header row (these are the merge tags, usable as {{Header}} in a template), a preview of the data rows, the total row count and the column that holds the recipient emails. Use it to understand a sheet before sending; pass the same spreadsheet and sheetTitle to send_campaign.
remove_contacts_from_list
ChatGPTRemoves contacts from a list without deleting them.
rename_contact_list
ChatGPTRenames a contact list.
reschedule_campaign
ChatGPTMoves a scheduled campaign to another start time. Check the new day's quota with check_quota first.
resume_campaign
ChatGPTResumes a paused campaign (also one the system paused for a Gmail restriction, once the user has fixed it). Sending through Gmail starts again at the next sweep.
resume_warmup
ChatGPTResumes a paused warm-up.
send_campaign
ChatGPTSends (now, at a scheduled time, or on autopilot) a personalised campaign with a template to recipients from a Google Sheet, a contact list or an inline list. RULES: 1) Never call it without the user's explicit confirmation that names the recipient count, the template and the send time. 2) Call it with dryRun: true first and show the user the summary (recipient count, quota, skipped rows). 3) Merge tags in the template must match the sheet headers / contact field names; check with read_sheet or list_contacts. Autopilot and followUp need the Professional plan; a quota overrun answers quota_exceeded with the reset time — on a paid plan retry with autoContinue: true (what fits goes today, the rest continues daily), otherwise offer to schedule for later or to upgrade. The sheet gets a status column that the user can watch in Google Sheets.
send_test_email
ChatGPTSends ONE rendered email to the user's own address (or another address they name) so they can check the template before a campaign. Merge tags are filled from substitutions; the tracking pixel is omitted.
set_throttle
ChatGPTSets the account's default pause between two emails of a campaign, in minutes: 0 sends as fast as Gmail allows, a number is a fixed pause, [min, max] a random pause. Campaigns that pass their own throttleIntervalMinutes override it.
stop_campaign
ChatGPTStops a campaign for good: queued emails are cancelled and their quota refunded. Cannot be resumed. Confirm with the user first.
stop_warmup
ChatGPTStops the warm-up and deletes the stored app password and ramp history. Confirm with the user first.
unblock_contacts
ChatGPTRemoves emails from the blocklist. Does not undo an unsubscribe the recipient made themselves.
update_autopilot
ChatGPTChanges a running autopilot campaign's days, window, daily cap or interval. Professional plan only.
update_template
ChatGPTChanges a template's name, subject, body and/or unsubscribe setting. Fields left out keep their current value; a field passed REPLACES the stored one and the previous version is not kept — confirm with the user before overwriting a body.
update_warmup_settings
ChatGPTChanges the warm-up ramp: the daily maximum and how many more emails each day adds.
verify_postmaster_domain
ChatGPTProfessional plan. Asks Google to check the DNS record for a domain registered with add_postmaster_domain. If Google cannot see the record yet the result says so: wait a few minutes and call again — do not re-add the domain.
verify_recipients
ChatGPTProfessional plan. Verifies a list of recipient addresses before a send: each comes back valid, risky (role address such as info@, or a domain on a blocklist) or invalid (bad syntax, disposable domain, no mail server, or it bounced in an earlier campaign) with a reason code. No email is sent to the addresses. Verdicts are cached for 30 days on the sender's contact book; 5000 fresh addresses per day. Afterwards, send_campaign with skipInvalidRecipients: true skips the invalid ones automatically.