add_audience_contacts
ChatGPTImmediately add contacts to a STATIC audience by their UUIDs.
audience_create
ChatGPTCreate a new audience. DYNAMIC audiences require a filter. BEFORE CALLING: Call learn_statement_semantics first to load the schema before calling this tool. Audience filters use the statement query language with a CONTACT root, but the set of legal root-level ATTRIBUTE names is NOT the same as contact_list. Names like subscriptionStatus, email, createdAt, updatedAt, companyId work in contact_list but will be rejected here with ATTRIBUTE_NOT_FOUND. For audience filters, always go through a field (wire-format VARIABLE with a real variableSchemaId from contact_list_fields) or an event (wire-format ENGAGEMENT). To filter by subscription state, use an ENGAGEMENT of type EMAIL with data.eventType = EMAIL_UNSUBSCRIBE (wrap in NOT for "still subscribed").
audience_delete
ChatGPTPermanently delete an audience. Use audience_list first when you need to verify the target.
audience_list
ChatGPTList or search audiences for this business.
business_get_email_settings
ChatGPTGet the business's email settings including communication limits (daily, weekly, monthly send caps) and link tracking configuration.
business_get_logo
ChatGPTGet the business's logo and icon asset IDs. Returns four fields: logoLight, logoDark, iconLight, iconDark. Each is a tapp-assets asset ID — render via https://assets.conversion.ai/i/{id}, or empty string if unset.
campaign_add_members
ChatGPTImmediately add everyone matching a statement as campaign members. BEFORE CALLING: Call learn_statement_semantics first to load the schema before calling this tool.
campaign_create
ChatGPTCreate a new campaign. Must provide an existing campaign type ID.
campaign_create_token
ChatGPTCreate a new campaign token definition at the business level.
campaign_create_type
ChatGPTCreate a new campaign type with initial member statuses.
campaign_create_type_status
ChatGPTAdd a new member status to an existing campaign type. Statuses define the lifecycle stages a contact can be in for any campaign of this type (e.g., adding 'Waitlisted' to an 'Event' type). Before calling, use campaign_list_type_statuses to see what's already defined — duplicate names are confusing for downstream reporting.
campaign_delete
ChatGPTPermanently delete a campaign that is already EMPTY. Works for custom campaigns, webinars and field events — set category to say which, since the id alone does not identify the kind. Use campaign_list first when you need to verify the target. Deleting a bound webinar or field event removes it here only; the event still exists at the provider, and a linked Salesforce campaign is untouched. A field event the user is merely done with should be archived (edit_campaign with archived: true), not deleted. A campaign holding assets cannot be deleted, and nothing is cascaded: every email, automation, form, audience and nested campaign or folder inside it has to be deleted (or moved out) first. This tool refuses and lists what is in the way rather than deleting anything, so campaign_get_items is only needed when you want to look before calling.
campaign_delete_type
ChatGPTPermanently delete a campaign type that no campaign is on. Refused while any campaign still uses it — deleting a type never deletes or retypes those campaigns. Use campaign_list_types and campaign_list first to verify the target and find what is still on it.
campaign_delete_type_status
ChatGPTPermanently delete a campaign member status. Refused while any campaign member still has the status — a status in use can only be retired by hiding it, which keeps existing members on it but stops it being offered when picking a status. Use campaign_list_type_statuses first to verify the target.
campaign_get_items
ChatGPTGet all assets inside a campaign (emails, automations, forms, etc.).
campaign_get_member_stats
ChatGPTGet member counts by status for a webinar or a field event — total members plus one count per status (e.g. Invited, Registered, Attended, No Show), zero-filled and ordered by the status ladder. Statuses with isSuccess true count as attendance; a field event's statuses also carry their systemStatus meaning. Prefer this over paging campaign_list_members when you only need counts. Custom campaigns report memberCount on campaign_list instead.
campaign_link_provider
ChatGPTBind a Conversion webinar to a provider webinar (Zoom, Sequel, or Goldcast) and cache that provider's title, schedule, host, and registration URL. Resolve provider and providerWebinarId with list (resource bindable_webinars) — never guess them. Fails if the Conversion webinar is already bound (list (resource campaigns) with category: "WEBINAR", check bound) or if that provider webinar is already bound to another Conversion webinar. Binding is one-shot: you cannot unbind or re-bind from here — unbinding is done from the webinar's page in the app. This does NOT connect the webinar to Salesforce. Use campaign_link_salesforce or campaign_sync_salesforce for that.
campaign_link_salesforce
ChatGPTConnect a campaign to an EXISTING Salesforce campaign and queue the initial member sync. Set category to choose which kind. Resolve salesforceCampaignId with salesforce_list_campaigns — never guess it. Fails if the campaign is already connected: check it first with campaign_list (externalId for CUSTOM, salesforceId for WEBINAR and FIELD_EVENT) and if it's set, tell the user instead of retrying. A Salesforce campaign can be linked to only one campaign, webinar or field event. To create a new Salesforce campaign instead, use campaign_sync_salesforce. The sync is queued, not instant. For a WEBINAR or FIELD_EVENT this connects it to Salesforce only. It does NOT connect it to the provider that hosts it (Zoom, Cvent and friends) — use campaign_link_provider for that.
campaign_list
ChatGPTList campaigns for the current business with cursor pagination.
campaign_list_bindable
ChatGPTList events at the business's connected providers that are not already bound to a Conversion webinar or field event. For WEBINAR (the default) this lists webinars across every connected webinar provider (Zoom, Sequel, Goldcast) in one call. For FIELD_EVENT pass the provider (CVENT, LUMA or SPLASH) — each provider is listed separately, newest start first, and pages with after; query searches titles on Cvent and Splash (Luma lists by date only). Use this to resolve the provider and providerWebinarId / providerEventId you pass to campaign_link_provider — never guess those values. Already-bound events are omitted. An empty list means no provider is connected, or every event is already bound. Salesforce campaigns are not in this list — use salesforce_list_campaigns for those.
campaign_list_members
ChatGPTList members of a campaign with cursor pagination. Returns each member with their contact details and campaign status. Supports statement filters to narrow by contact properties.
campaign_list_tokens
ChatGPTList all campaign tokens defined for this business.
campaign_list_type_statuses
ChatGPTList the member statuses defined on a campaign type (e.g., Invited, Registered, Attended). Each status has an id, name, and isSuccess flag. Call this before campaign_create_type_status to avoid creating a duplicate, and before referencing a status by id in campaign_update_member_status.
campaign_list_types
ChatGPTList campaign types for the business. Each type defines a set of member statuses (e.g., Invited, Registered, Attended). You need a campaign type ID to create a campaign.
campaign_set_token_value
ChatGPTImmediately set a campaign's value for one token.
campaign_sync_salesforce
ChatGPTCreate a NEW Salesforce campaign for an existing campaign and queue the initial sync, pushing its members out to Salesforce. Set category to choose which kind. Fails if the campaign is already connected — check it first with campaign_list (externalId for CUSTOM, salesforceId for WEBINAR and FIELD_EVENT) — or if its statuses aren't Salesforce-compatible. To connect it to a Salesforce campaign that already exists, use campaign_link_salesforce. The sync is queued, not instant. For a WEBINAR the managed Webinar statuses are what get created in Salesforce. For a FIELD_EVENT the event's type statuses are created and the Salesforce campaign's Type is set to the field event type's name. Neither connects the event to the provider that hosts it — use campaign_link_provider for that.
campaign_update_member_status
ChatGPTImmediately set a campaign member's status.
campaign_update_token
ChatGPTUpdate an existing campaign token definition. Any of key, label, defaultValue may be set; omitted fields are left unchanged. The token's value on a specific campaign is set with campaign_set_token_value.
campaign_update_type
ChatGPTUpdate an existing campaign type. Any of name, description, archived may be set; omitted fields are left unchanged. Statuses on the type are managed separately.
company_list_opportunities
ChatGPTList the opportunities associated with a company. Answers 'show me Acme's opportunities'. Returns the full Opportunity records (id, variables, externalOpportunity metadata, timestamps).
contact_count
ChatGPTCount contacts matching filters using the statement query language. Use this when you only need the number of matching contacts rather than fetching rows. BEFORE CALLING (when passing a statement): Call learn_statement_semantics first to load the schema before calling this tool.
contact_create
ChatGPTCreate a new contact on the current business. email is required and must be unique. fields and companyFields are maps of field UUID to value — call contact_list_fields first to discover the right ids. Returns the new contact's id.
contact_create_field
ChatGPTCreate a new contact or company field. The key should be snake_case and unique.
contact_delete
ChatGPTPermanently delete one contact. This also deletes the contact's company if that company becomes orphaned. Use contact_get first when you need to verify the target.
contact_get
ChatGPTLook up a contact by their UUID. Returns contact details including name, email, company, subscription status, and key fields. To search by email, use contact_list with a filter instead.
contact_get_automation_runs
ChatGPTGet a contact's run history within a specific automation workflow. Returns each run with status, nodes passed, and activity log.
contact_get_distinct_field_values
ChatGPTGet the distinct values for a contact or company field, with counts of how many contacts have each value. Useful for understanding what data exists before building filters or audiences, and (with sort: 'count:desc') for ranking the most common values — e.g. 'top 10 industries', 'most common subscription tiers'.
contact_get_events
ChatGPTGet the event history for a contact: page visits, form submissions, email events (open, click, unsubscribe), and other activities. Returns the most recent 50 items. If there are more, 'hasMore' and 'total' are included.
contact_list
ChatGPTList contacts for the current business with cursor pagination using the statement query language. IMPORTANT: If you haven't already, Call learn_statement_semantics first to load the schema before calling this tool. HOW TO USE: 1. Call contact_list_fields to discover field IDs (e.g., first_name, last_name, phone). 2. Build a statement JSON object and pass it as the "statement" parameter. CORE ATTRIBUTES (usable as root-level ATTRIBUTE names in this tool ONLY): "email", "subscriptionStatus", "createdAt", "updatedAt", "companyId". FIELDS: Reference a custom field by using the wire-format VARIABLE type with a variableSchemaId from contact_list_fields. ("VARIABLE" / "variableSchemaId" are the JSON enum/key names the backend requires — keep them verbatim.) This form works in every CONTACT-context endpoint, so prefer it whenever you may want to reuse the filter elsewhere. SORTING: Sort by any core attribute or field. Use "variables.<field_id>" for field sorts (again, "variables" is the wire-format key). RETURNS: count (number of results in this page), contacts array, and optional next cursor. If you only need a count, you can still use this tool — check the count field in the response.
contact_list_fields
ChatGPTList all contact and company fields for the business. Returns id, key, label, dataType, and objectType. Use this to discover filterable fields for statement queries. Every business has default contact fields: first_name, last_name, email, phone, mobile_phone, city, state, country, postal_code, job_title, department, lead_source, lead_status, date_of_birth, salutation, description, street, owner_id. Company fields: company_name, industry, annual_revenue, number_of_employees, website, phone, billing_city, billing_state, billing_country. Businesses may also have custom fields. Use contact_get_distinct_field_values to see what values exist for a specific field.
contact_list_fields_verbose
ChatGPTList all contact and company fields with full metadata including accessibility, sync mode, external source, timestamps.
contact_list_opportunities
ChatGPTList the opportunities a contact is attached to, along with the contact's role on each (e.g. Decision Maker, Influencer) and whether they're the primary contact. Answers 'what is this person involved in?'. Each returned item is an Opportunity with an embedded opportunityContactRole field.
create_agent
ChatGPTCreate a custom agent with standing instructions, triggers, and tool access. The agent is created switched off. Its triggers do not run until a person enables it in the app. Report that clearly and link the new agent. Use this for recurring or event-driven work, not a task that should be done now. Tool names are the ones you already use, plus the agent-only integration tools (slack_*, linear_*) a custom agent can be given even when you do not hold them yourself. Provide the complete definition in one call. Write instructions as a permanent brief because the new agent cannot see this conversation.
create_email
ChatGPTCreate a new email (blast, workflow email, or template). The email is created LIVE but DORMANT — blasts and workflow emails are created as DRAFTs, never sent, scheduled, or published. You cannot send, schedule, publish, or delete via the agent. To change an email that already exists, use update_email instead — do not recreate it. BEFORE CALLING: Call learn_email_building first to load the schema before calling this tool. Think through the entire email before building the JSON: objective, audience, content strategy, structure (header/body sections/footer), personalization (merge fields), and design choices. Be creative, bold, and opinionated — write punchy, conversational copy that feels human, not corporate. Key points: - All component IDs must be valid UUID v4 strings. - The components array is flat — parent-child via children references. - Always include an unsubscribe component in the footer. - The data field must be a raw JSON object, not a stringified JSON.
create_email_theme
ChatGPTCreate a new workspace email theme from a complete WorkspaceTheme design payload. The theme is created as an unpublished DRAFT. Nothing references it and no email can adopt it until a person publishes it in the app — the agent cannot publish. Creating a theme never changes existing emails. BEFORE CALLING: Call learn_email_theming first to load the schema before calling this tool. Prefer starting from an existing theme: call email_theme_get on the workspace default, then modify the values you actually want to change. A theme must be complete — every field the schema requires must be present.
create_email_topic
ChatGPTCreate a marketing topic in the current workspace. Topics categorize emails and let recipients manage their subscription preferences. Returns topicId to assign to blast or workflow emails.
create_field
ChatGPTCreate a field on a contact, company, campaign member, or custom object. The key should be snake_case and unique on that object. Use CAMPAIGN_MEMBER for data that describes a membership rather than the person — a value that differs between the same contact's two campaigns has to live there, or the second one overwrites the first. For a custom object, pass objectType CUSTOM_OBJECT with a customObjectId from custom_object_list; a business without custom objects has none to name. A field whose value is another record is a relationship — use create_relationship_field for those.
create_form
ChatGPTCreate a new form. The form is created LIVE but DORMANT — as an unpublished DRAFT. You cannot publish or delete via the agent. To change a form that already exists, use update_form (metadata) or update_form_draft (design) instead — do not recreate it. BEFORE CALLING: Call learn_form_building first to load the schema before calling this tool. Plan the form before building: purpose, target audience, what data to collect, which CRM fields to map inputs to. Call contact_list_fields to get CRM field UUIDs (especially the email field). Key points: - All component IDs must be valid UUID v4 strings. - The components array is flat — parent-child via children references. - Every form needs exactly one ROOT, at least one ROW > COLUMN chain, and exactly one SUBMIT. - Input labels and display values must be Lexical SerializedEditorState JSON, not plain strings. - Include an EMAIL component with a CRM mapping so submissions are linked to contacts. - The draft field must be a raw JSON object, not a stringified JSON.
create_landing_page
ChatGPTCreate a new landing page. It is created as an unpublished DRAFT: nothing is served until a person publishes it in the app. You cannot publish, bind a custom domain, or change who can view the page. To change a page that already exists, use edit_landing_page (chat: proposes an edit for review) or update_landing_page (MCP: applies immediately) instead of creating another one. BEFORE CALLING: Call learn_landing_page_building first to load the schema before calling this tool. Plan the page before building the JSON: its one goal (the conversion), the audience, the sections that earn that goal (hero, proof, benefits, form or CTA, FAQ), and the copy. Write specific, confident copy; no lorem ipsum and no placeholder brackets. Key points: - Node ids must be unique strings; use UUID v4. - The node list is flat: parents reference children by id. root > section > row > column > blocks. - Every row's column spans sum to 12, at most 4 columns per row. - Colors, fonts and radii come from the theme: leave them unset unless the design deliberately deviates. - data is a raw JSON object, never a string.
create_landing_page_theme
ChatGPTCreate a new landing page theme from a complete LandingTheme payload. The theme is created as an unpublished DRAFT. No page can adopt it until a person publishes it in the app; you cannot publish. Creating a theme never changes existing pages. BEFORE CALLING: Call learn_landing_page_theming first to load the schema before calling this tool. Start from an existing theme: call landing_page_theme_get on the workspace default and change only what you mean to. A theme must be complete: every field the schema requires must be present.
create_relationship_field
ChatGPTCreate a relationship between two objects — a field whose value is another record rather than a scalar. Either side may be a contact, company, opportunity, or one of the business's own custom objects. A relationship is a PAIR of fields written together, and this is the only way to create either half: - source is the MANY side and owns the value: each record there points at one target record. - target is the ONE side and is read-only: it lists the records pointing back at it. Model 'a Product belongs to a Company' as source = Product 'primary_company', target = Company 'products'. A self-relationship (both halves on the same object, e.g. a product's parent product) is allowed, but the two keys must differ. Custom object sides need a customObjectId from custom_object_list; a business without custom objects has none to name. Use create_field for plain scalar fields.
create_workflow
ChatGPTCreate a new automation/workflow from its full graph — trigger, nodes, and edges — in one call. The workflow is created LIVE but DORMANT (inactive). You cannot activate or delete via the agent; the user activates it. Create-only: editing an existing workflow is not supported. BEFORE CALLING: Call learn_workflow_building first to load the schema before calling this tool. If your workflow has ANY conditions (trigger conditions, exit conditions, TRUE_FALSE, IF_ELSE, SPLIT, or WAIT_FOR_CONDITION nodes), you MUST ALSO follow this: Call learn_statement_semantics first to load the schema before calling this tool. Statement structure (type→attribute pairing, OR>AND wrapping, field/event/audience operand shapes — wire-format VARIABLE/ENGAGEMENT/AUDIENCE) is where most workflow validation failures come from. Plan the full workflow first: trigger type, action sequence, branching logic, and how branches rejoin. Key points: - First node must be TRIGGER with full config in data. - Every node needs a unique temp ID, used in edges and cross-references (defaultNodeId, conditionNodeId). - BRANCH and JOIN nodes must be included explicitly — not auto-created. - Every parent→child connection needs an explicit edge. - All node data must be fully populated.
custom_object_count_records
ChatGPTCount one custom object's records, optionally filtered. Use this instead of paging custom_object_list_records to the end when you only need the number. BEFORE CALLING (when passing a statement): Call learn_statement_semantics first to load the schema before calling this tool.
custom_object_create
ChatGPTCreate a custom object — a record type the business models beyond contacts, companies, and opportunities (Product, Subscription, Property). The object is only the schema's container: it starts with no fields. Add them with create_field (objectType CUSTOM_OBJECT, customObjectId from the id this returns) and create_relationship_field, then point the object at its display field with custom_object_update. Check custom_object_list first — a duplicate key is refused, and an object that already exists is usually the one to extend rather than replace. RETURNS: the new customObjectId.
custom_object_delete
ChatGPTPermanently delete a custom object and the fields defined on it. Refused while the object still has records — nothing is cascaded — so empty it first with custom_object_delete_record, one record at a time. Use custom_object_count_records to see how many are in the way.
custom_object_delete_record
ChatGPTPermanently delete one custom object record. Relationship values on other records that name it are cleared, but nothing else is cascaded — the records that pointed at it stay. Record ids are globally unique, so this needs no customObjectId; use custom_object_get_record first when you need to verify the target.
custom_object_get_record
ChatGPTRead one custom object record by id, with every field the business defined on its object in variables. Record ids are globally unique, so this needs no customObjectId — use it when you hold an id from custom_object_upsert_records, a relationship value, or search, and custom_object_list_records when you want a filtered page instead. Related records are not inlined. To read them, list the related object's records filtered on the relationship field naming this record.
custom_object_list
ChatGPTList the business's custom objects — the record types it models beyond contacts, companies, and opportunities (e.g. Product, Subscription, Property). Returns id, key, label, pluralLabel, and the Salesforce object each one syncs with when it is connected to one. This is the discovery step for everything else custom-object-shaped: custom_object_list_records reads one object's records, and create_field / create_relationship_field take the ids from here. IMPORTANT: If you filter or sort, and haven't already, Call learn_statement_semantics first to load the schema before calling this tool. FILTERABLE AND SORTABLE ATTRIBUTES: "id", "key", "label", "pluralLabel", "color", "primaryVariableSchemaId", "salesforceObjectId", "salesforceObjectName", "createdAt". These are the definitions themselves, not their records — a custom object's own fields are filterable through custom_object_list_records instead. RETURNS: count (number of results in this page), customObjects array, and optional next cursor.
custom_object_list_records
ChatGPTList one custom object's records with cursor pagination using the statement query language. Call custom_object_list first for the customObjectId. IMPORTANT: If you haven't already, Call learn_statement_semantics first to load the schema before calling this tool. A custom object IS its schema, so every field the business defined on it — relationships included — comes back in each record's variables. Discover those field ids with list_fields: this object's fields are the ones whose customObjectId matches the one you passed here, since every custom object's fields read objectType CUSTOM_OBJECT and two objects may share a key. Reference one in a statement through the wire-format VARIABLE type. ROOT ATTRIBUTES: "id", "createdAt", "updatedAt". RETURNS: count (number of results in this page), records array, and optional next cursor.
delete_agent
ChatGPTPermanently delete a custom agent, including its triggers and saved sessions. Provisioned agents cannot be deleted. Verify the target in the Agents settings before proceeding.
delete_email
ChatGPTPermanently delete a blast or workflow email. Use email_get or the corresponding email list tool first when you need to verify the target. This tool does not block deletion when workflows or other assets reference the email. Deleting it can leave those references invalid, so confirm that the user intends to break them before calling.
delete_email_template
ChatGPTPermanently delete a reusable email template. Use email_list_templates first when you need to verify the target. This tool does not block deletion when emails or other assets reference the template. Deleting it can leave those references invalid, so confirm that the user intends to break them before calling.
delete_field
ChatGPTPermanently delete a field definition, on any object it belongs to. Use list_fields_verbose first to verify the field and its object type. Deleting either half of a relationship deletes both.
delete_form
ChatGPTDelete a form by archiving it, matching the Conversion app's delete behavior. The form disappears from active lists and its existing references become invalid. Use form_get first when you need to verify the target.
delete_landing_page
ChatGPTMove a landing page to trash. A published page stops being served at once, at every address bound to it. Its versions and access settings are kept, so a person can restore it from trash in the app. Confirm with the user before deleting a published page: visitors and ads pointing at it will hit a missing page.
delete_workflow
ChatGPTPermanently delete an automation workflow. Use workflow_get first when you need to verify the target.
duplicate_campaign
ChatGPTDuplicate an existing campaign. Creates a brand-new campaign that copies the source's content. What gets copied: - The campaign row itself: same campaign type, same description. New name (you provide it). - Campaign token values. - The full folder hierarchy under the campaign (subfolders are recursively cloned). - All emails / blast emails in the campaign - All automations in the campaign. Internal references inside the workflow JSON (e.g. send_email nodes pointing at a campaign email, references to the campaign id itself) are rewritten to point at the newly-cloned assets, so the duplicated workflow stays self-consistent. - All internal forms in the campaign. - The duplicate is placed in the same folder as the source (or at the root if the source is at the root). What does NOT get copied: - Campaign members. The duplicate starts with zero contacts. - External (Salesforce / HubSpot / embed) forms. Only internal Conversion-built forms are duplicated; external forms in the campaign tree are silently skipped. - Token DEFINITIONS (the token rows themselves). Tokens are per-business, not per-campaign — the duplicate references the same token definitions. How email copies work: Each email is duplicated via the email-copy flow, which merges the live email's published state with any in-flight draft changes (draft wins where set), then writes the merged snapshot into the new email's draft column. The new email's top-level columns are blank, so it starts as a draft awaiting publish. The user has to publish each duplicated email through the normal flow before it can send. When to use this tool: - User says "duplicate / copy / clone this campaign" or wants to spin up a similar campaign for a new audience or season. - User wants to use a past campaign as a template.
duplicate_landing_page
ChatGPTCopy a landing page into a new unpublished, members-only page owned by the caller. The copy takes the latest draft (or the published content when there is no draft) and keeps the theme. Addresses, visitor passwords, version history and shares are not copied, and the copy gets a new generated slug. Use it to start a variant of an existing page, then change the copy with edit_landing_page.
duplicate_workflow
ChatGPTDuplicate an existing automation. The server clones the source's graph, so use this whenever the user wants a copy of a workflow — into another folder, as the starting point for a variant, or as a template. Do NOT rebuild the graph yourself with create_workflow: this preserves node data the agent cannot re-author (a FIRE_WEBHOOK's webhookId, for one), and keeps the copy faithful. - The copy is created PAUSED. The user activates it. - Nodes and edges are copied as they are, so the copy references the same emails, audiences, webhooks and campaigns as the source. Nothing is cloned alongside it. - Contacts do not come along: the copy starts empty, with every node's occupancy at zero. - To copy and then change something, duplicate first, then edit_workflow the copy.
email_get
ChatGPTGet an email object by its ID. Returns the subject line, body design, sender settings, blast configuration, and validation status. This is the email as designed in the editor, NOT a record of a specific send.
email_get_metrics
ChatGPTGet delivery and event metrics for an email — opens, clicks, deliveries, bounces, and unsubscribes. Optionally filter by date range or statement.
email_get_template
ChatGPTGet an email template by ID, including its v5 body and workspace theme reference. Read this before editing a template. Reuse its component IDs so the edit is a focused change rather than a rebuild. Compare its themeVersionId with the theme's publishedVersionId from email_theme_get when checking for a theme update.
email_list_blast_emails
ChatGPTList blast emails (campaign / one-off sends) for the current business with cursor pagination.
email_list_recipients
ChatGPTList recipients of an email with their delivery and event details (sent time, open, click, bounce, unsubscribe). Useful for seeing who received a specific email and how they interacted with it.
email_list_templates
ChatGPTList email templates for the current business with cursor pagination. Templates are reusable starting points for creating emails.
email_list_workflow_emails
ChatGPTList workflow emails for the current business with cursor pagination. These are emails used in automations, not one-off blasts.
email_theme_archive
ChatGPTArchive a workspace email theme. It disappears from the theme picker and can no longer be applied to emails, but every email already referencing it keeps rendering exactly as before — nothing is deleted. The workspace default theme cannot be archived; someone has to make a different theme the default first, which you cannot do. Reversible with email_theme_unarchive. Note that while a theme is archived, an email still on it cannot re-select it from the normal picker after switching away.
email_theme_get
ChatGPTGet a workspace email theme: its head row plus the full design payload of its working draft and its current published version. Read this BEFORE writing per-component style overrides on an email that references this theme — anything the theme already provides should be left absent on the component so it inherits. published.data is what emails referencing the theme's latest version actually render against. draft.data is the unpublished working copy; hasUnpublishedChanges says whether they differ.
email_theme_get_version
ChatGPTGet one immutable theme version by id, including its full design payload. This is how you read the exact theme an email or template renders against: take themeVersionId from email_get (or a template row) and pass it here. An email pinned to an older version does NOT render against the theme's current published values.
email_theme_list
ChatGPTList the workspace's email themes. A theme is a workspace-level design system (fonts, spacing, borders, color palettes) that emails and templates adopt; every new email starts on the workspace default theme. Returns head rows only — name, status, isDefault, draftVersionId, publishedVersionId. Call email_theme_get for a theme's actual design values. Only a theme with a publishedVersionId can be applied to an email or template.
email_theme_unarchive
ChatGPTRestore an archived workspace email theme to the active set so it appears in the theme picker again and can be applied to emails. Only affects a theme that is currently archived.
file_delete
ChatGPTPermanently delete a file from the Files page. Its public URL stops working immediately and any email, form or page still embedding that URL will show a broken link — check with file_get and the user before deleting. There is no undo.
file_get
ChatGPTLook up one file on the Files page by id. Returns { id, name, slug, type, size, createdAt, updatedAt, folderId?, folderType?, url }. url is the public preview link; use your client's download tools if you need the bytes. For a link on one of the business's own domains, use file_get_links.
file_get_links
ChatGPTGet the public links for a file on the Files page. Every file has a conversion-files.com preview link that always works, plus one link per allowed origin (https://<origin>/a/<business slug>/<file slug>) that serves once that origin is configured — see file_list_origins. Pass origin when the user wants the link on a specific domain; the result then carries just that link, or the origins that are available when it is not one of them. Returns { fileId, slug, previewUrl, links: [{ origin, url }] }, or with origin: { fileId, slug, origin, url }.
file_list
ChatGPTList the files on the business's Files page, newest first, with optional statement filter, sort and cursor paging. Each file carries its public preview url.
file_list_origins
ChatGPTList the origins (bare hostnames) allowed to serve the business's Files publicly. Every file is always reachable at its conversion-files.com preview link; an allowed origin additionally serves it at https://<origin>/a/<business slug>/<file slug>, which is what to hand out when the user wants links on their own domain. Use file_get_links to get a specific file's link on a specific origin. Returns { origins }. An empty list means no origin serves the files yet.
file_update
ChatGPTRename a file on the Files page and/or change its slug. File contents are immutable — to replace what a file holds, upload a new one with file_upload. Prefer leaving the slug alone unless the user asks: it is part of the file's public URL.
folder_create
ChatGPTCreate a new folder. Pass parentFolderId to nest it under a parent folder/campaign — folder type is inferred from the parent. Omit parentFolderId to create at the root.
folder_delete
ChatGPTPermanently delete a folder that is already EMPTY. A folder holding items cannot be deleted, and nothing is cascaded: every campaign, email, automation, form and nested folder inside it has to be deleted (or moved out) first. This tool refuses and lists what is in the way rather than deleting anything, so folder_get_items is only needed when you want to look before calling. A folder that lists as empty can still be refused when it holds an item this session may not view — that item is not listable here, so report the refusal instead of retrying.
folder_get_items
ChatGPTGet the direct items inside a folder or campaign (immediate children, not recursive). Each item has its id, type (CAMPAIGN / FOLDER / EMAIL / TEMPLATE / AUTOMATION / FORM), and name.
folder_list_root
ChatGPTList the top-level items for the business — campaigns and root-level folders, plus any unfiled assets at the root. Each item has id, type (CAMPAIGN / FOLDER / EMAIL / TEMPLATE / AUTOMATION / FORM), and name. Use this when the user asks 'what's at the top of my account' or you need a starting point before drilling into a specific folder/campaign with folder_get_items.
folder_move_assets
ChatGPTMove assets into a folder or campaign.
folder_move_assets_to_root
ChatGPTMove assets out of their current folder back to the root. For folders and campaigns, this re-parents them to the root. For other asset types (emails, forms, automations, audiences, templates), it removes the folder relationship so they appear at the root.
form_get
ChatGPTGet a form by its ID. The response includes the form's current design at internalForm.draft (the complete FormData — components, fields, CRM field mappings, hidden fields, theme, settings) and its live published design at internalForm.published. Read internalForm.draft to see or edit an existing form's fields.
form_get_statistics
ChatGPTGet pre-computed submission statistics in a time window: a window total, daily buckets, and per-day breakdowns by submitting page URL and UTM source, plus page-visit counts. Pass formId for one form, or omit it to aggregate across every form in the business in one call — prefer that over calling once per form. Prefer this tool over paging form_list_submissions when you need counts or per-page numbers.
form_list
ChatGPTList forms for the current business with cursor pagination.
form_list_lead_gen_forms
ChatGPTList the lead gen forms that exist on one Meta Page or LinkedIn ad account, with each form's fields and a suggested CRM field mapping. Resolve provider and sourceId with form_list_lead_gen_sources first. Each form's fields[] are the provider's questions: key is the provider field key that inbound leads are keyed by, and suggestedFieldId is the Conversion field (see list, resource fields) we inferred from the label, or null when nothing matched. Pass the mappings you want to keep to create_lead_gen_form; the one mapped to the contact email field is required. Forms already synced into Conversion still appear here — check form_list if you need to avoid a duplicate.
form_list_lead_gen_sources
ChatGPTList where lead gen forms can be synced from: the Meta Pages and LinkedIn ad accounts reachable through the business's connected ad accounts. Each source carries the provider and sourceId you pass to form_list_lead_gen_forms and create_lead_gen_form — never guess those values. A provider that is not connected is reported under errors rather than failing the whole call; the user connects Meta or LinkedIn under Settings → Ads in the app.
form_list_submissions
ChatGPTList submissions for a specific form.
get_agent
ChatGPTRead a non-play agent's current name, description, instructions, activation status and triggers. Read before editing with update_agent. Use play_get for Plays.
get_artifact
ChatGPTGet a single artifact by ID, including its type, status, linked asset ID, and content.
get_background_job
ChatGPTCheck a background job's status, progress, result, and errors. PENDING or RUNNING: wait 10-20 seconds before checking again. COMPLETED: the job finished. For campaign duplication, result.containerDuplicate.containerId is the new campaign ID. FAILED or CANCELED: report the status and any errorMessage. Do not assume the copy is complete or automatically start another copy.
get_distinct_field_values
ChatGPTGet the distinct values stored in a field, with counts of how many contacts have each value. Useful for understanding what data exists before building filters or audiences, and (with sort: 'count:desc') for ranking the most common values — e.g. 'top 10 industries', 'most common subscription tiers'.
import_contacts_csv_process
ChatGPTStep 2 of 2 for importing contacts from a CSV. Confirms the column mappings, audience/campaign config, and flips the upload job to PENDING so the import worker actually processes it. Only call this AFTER `import_contacts_csv_upload` and AFTER the user has confirmed the column mappings. Pass the jobId from step 1 and the columns array (with any user-requested edits applied). Behavior notes: - Default createNew=true means new rows that don't match an existing contact will be inserted. - Default subscribeContacts=false — only set to true when the user has consent for marketing communication. - audience and campaign are independent and both optional. Omit them if the user just wants the contacts imported with no grouping. After this tool succeeds, tell the user the import is queued and processing happens in the background — they can watch the job in the imports list. Don't say "all contacts have been imported" yet; the worker has just been triggered.
import_contacts_csv_upload
ChatGPTStep 1 of 2 for importing contacts from a CSV file in the sandbox. This tool uploads the CSV from the agent's sandbox to Conversion and asks the server to auto-detect how each column maps to existing contact/company fields. No contacts are imported yet — this just stages the file and returns the proposed column mapping plus a 5-row preview per column. After this tool returns, you MUST do the following before continuing: 1. Show the user a clear summary of the auto-detected mappings — for each column, say what it was mapped to (e.g. "Email column → Email identifier", "First Name column → First Name field", "Source column → Custom field 'Source'") or call out columns that didn't get mapped. 2. Ask the user something like: "These are the column mappings I detected. Are you OK with these, or would you like me to change any? Should I also create a new audience or add these contacts to an existing audience or campaign?" 3. Wait for the user's reply. Do NOT call import_contacts_csv_process until the user has confirmed. Once the user confirms (and tells you any audience/campaign preferences), call import_contacts_csv_process with the jobId from this response and the (possibly edited) column mappings. Returns: { jobId, filename, columns: [{ header, variableSchemaId?, columnRole?, overwriteValues, previewData }] }.
landing_page_add_url
ChatGPTBind a custom-domain address (hostname + path) to a landing page. A custom address is served only once it is verified: the business's TXT record on the root domain and a CNAME on the hostname must both resolve. Give the user the dnsRecords to publish at their DNS provider, then call landing_page_verify_url. The address must be free: one already bound, to this page or another, fails. The server normalizes the hostname and path, so report them from the result. A page can have several addresses. Only a published page is served at them.
landing_page_get
ChatGPTGet a landing page: its head row (name, slug, status, folder, access), its working draft, and its published version. draft.data is the LandingPageData payload you edit: read it before editing a page and reuse its node ids so the edit reads as a change rather than a rebuild. published.data is what visitors see today; hasUnpublishedChanges says whether the two differ. Each version's themeId + themeVersionId is the landing page theme it renders against; read it with landing_page_theme_get_version. unsupportedNodes lists blocks this editor cannot read (written by a newer editor or invalid). A page holding any cannot be edited by you; tell the user. unreadable means the whole version cannot be read.
landing_page_get_version
ChatGPTGet one version of a landing page: its payload in the current shape, its theme pin and publishedAt. Published versions are frozen: compare one with the draft, or restore it through the edit tool's restoreVersionId.
landing_page_list
ChatGPTList the workspace's landing pages: head rows only (id, name, slug, status, draftVersionId, publishedVersionId, folder). Call landing_page_get for a page's design. status is DRAFT (never published), PUBLISHED, or ARCHIVED (taken offline).
landing_page_list_domains
ChatGPTList the custom hostnames the workspace's landing pages already use. Reusing one of these for a new address means its root domain's ownership record is already in place, so only the hostname's CNAME may be needed.
landing_page_list_urls
ChatGPTList every address a landing page answers at. - live: the generated address serving the published version. Absent until the page has been published once. - draft: the generated preview of the draft. Only signed-in Conversion users with access can open it. - routes: custom-domain addresses bound to the page, each with its id, verified state and the dnsRecords it needs. access is who may view the published page: PUBLIC, or PASSWORD. With passwordSet: false a PASSWORD page has no password yet, so visitors can't open it until a person sets one in the app. An archived or unpublished page serves nothing at live or its routes.
landing_page_list_versions
ChatGPTList a landing page's version history, newest first: each published version's id, seq (its number) and publishedAt. Read one with landing_page_get_version. To bring an old version back, set restoreVersionId on the edit tool (edit_landing_page in chat, update_landing_page over MCP): it copies that version into the draft.
landing_page_remove_url
ChatGPTUnbind a custom-domain address from its landing page. The page stops being served there at once, so links, ads and QR codes pointing at it break. The generated address is unaffected. Take the route id from landing_page_list_urls.
landing_page_set_access
ChatGPTMake a landing page public, or password-protected. It takes effect immediately on the live page; no publish is needed. - PUBLIC: anyone with the address. - PASSWORD: visitors need the page's password. You cannot set, see or change the password. When none is set yet (passwordSet: false in the result), visitors can't open the page at all until a person sets one in the page's Settings in the app: tell the user exactly that.
landing_page_theme_archive
ChatGPTArchive a landing page theme. It disappears from the theme picker and can no longer be applied to pages, but every page already pinned to it keeps rendering exactly as before. Nothing is deleted. The workspace default theme cannot be archived; a person has to make another theme the default first, which you cannot do. Reversible with landing_page_theme_unarchive.
landing_page_theme_get
ChatGPTGet a landing page theme: its head row plus its working draft and its current published version. Read this BEFORE styling blocks on a page that uses the theme: anything the theme provides (fonts, sizes, colors, radii, button style) should stay unset on the block so it inherits. Each version carries data (as stored) and effectiveData (what pages render). They differ when the stored payload is empty, as a freshly seeded workspace default is: pages then render the built-in default theme. To edit a theme, start from effectiveData. published is what pages pinned to the latest version render against; draft is the unpublished working copy.
landing_page_theme_get_version
ChatGPTGet one immutable landing page theme version by id, with its design payload. This is how you read the exact theme a page renders against: take themeVersionId from a version returned by landing_page_get and pass it here. A page pinned to an older version does NOT render against the theme's current published values.
landing_page_theme_list
ChatGPTList the workspace's landing page themes. A theme is the landing pages' design system (fonts, type scale, spacing, radii, button style, and color schemes); every new page starts on the workspace default theme. Returns head rows only: name, status, isDefault, draftVersionId, publishedVersionId. Call landing_page_theme_get for a theme's design values. Only a theme with a publishedVersionId can be applied to a page. Landing page themes are separate from email themes.
landing_page_theme_list_versions
ChatGPTList a landing page theme's published versions, newest first: id, seq and publishedAt. Read one with landing_page_theme_get_version, or bring it back into the draft with restoreVersionId on the theme edit tool.
landing_page_theme_unarchive
ChatGPTRestore an archived landing page theme so it appears in the theme picker again and can be applied to pages.
landing_page_verify_url
ChatGPTCheck a custom-domain address's DNS records now. A verified address starts serving the published page. Returns the route and each record with its verified state; tell the user exactly which record is still missing. DNS changes can take minutes to hours to propagate, so a fresh record may not verify on the first try.
lead_score_model_coverage
ChatGPTCount how many contacts in the model's scope each rule and group of a version (the draft by default) matches right now, without writing anything. A rule "matches" a contact when its conditions hold, whatever its points: a fit rule's statement, or an activity rule's qualifying activity (or frequency). Groups count contacts matching any of their rules. Rules flagged as matching no contacts or nearly every contact usually point at a wrong value, field or event filter. Rules that can't be scored yet (unfinished or invalid) are listed under notCounted. Use it after building or editing groups to check each rule matches who it should.
lead_score_model_create
ChatGPTCreate a lead score model. It starts inactive, with a default draft: fit and engagement ranges of -100..100 with no groups, and the fixed tiers (fit C -100 / B 20 / A 60, engagement 3 -100 / 2 20 / 1 60). Nothing is scored until the model is published and activated. Then add groups of rules with lead_score_model_upsert_group, set ranges, thresholds and scope with lead_score_model_update, check each rule matches who it should with lead_score_model_coverage and the overall result with lead_score_model_preview, and publish with lead_score_model_publish. Call learn_lead_scoring first to load the schema before calling this tool.
lead_score_model_delete
ChatGPTPermanently delete a lead score model, every version of it, and every score it has written. This cannot be undone; to stop scoring but keep the model, use lead_score_model_set_active with active: false.
lead_score_model_explain_contact
ChatGPTExplain contacts' scores rule by rule: each group's points, the rules that contributed, and where a group's limit or the dimension range cut the total. Calculated now against the published version by default (or the draft, or another version), without writing anything, so it can differ slightly from the last stored run. Rules that contributed nothing are left out. Contacts outside the model's scope are listed under notInScope.
lead_score_model_get
ChatGPTRead a lead score model: its head, its draft's full rules and configuration, and the validation of the draft and the published version. The draft is what the edit tools change; issues lists every rule, group or setting that blocks publishing, by path and validation code. hasUnpublishedChanges compares the draft with the published version. Before reading or changing rules, and if you haven't already, Call learn_lead_scoring first to load the schema before calling this tool.
lead_score_model_list
ChatGPTList the business's lead score models (the Scoring page). Each has a draft and, once published, a published version; active models are the ones being scored. FILTERABLE AND SORTABLE ATTRIBUTES: "id", "name", "objectType", "active", "status" (DRAFT, PUBLISHED, ARCHIVED), "createdAt", "updatedAt". RETURNS: count, leadScoreModels array, and optional next cursor. Read one with lead_score_model_get.
lead_score_model_overview
ChatGPTRead a model's stored scoring results from its last run: how many contacts are scored, the counts per fit and engagement tier and per fit × engagement tier pair, and the highest-scoring contacts. Nothing is recalculated, so it's fast but reflects the published version as of the last run. Use it for questions about current results ("how many A-tier contacts do we have?"). To see what a draft would change, use lead_score_model_preview instead.
lead_score_model_preview
ChatGPTScore every contact in the model's scope with a version (the draft by default) and compare it with another (the published version by default), without writing anything. Returns the version's contact count and tier counts, the top contacts, and, against the base version, how many contacts change score or tier, the tier moves, contacts added to or removed from scope, and the biggest changes. Before the first publish there's no base, so only the version itself is described. Use it after editing rules to check they do what was asked before publishing. The draft must be valid: an invalid draft is refused with its validation codes, which lead_score_model_get lists by rule.
lead_score_model_publish
ChatGPTPublish a lead score model's draft: it becomes the version contacts are scored with while the model is active, and a fresh draft is forked from it. Refused while the draft is invalid; check lead_score_model_get or lead_score_model_preview first. Publishing does not activate the model; use lead_score_model_set_active for that.
lead_score_model_set_active
ChatGPTStart or stop scoring contacts with a lead score model's published version. Activation needs a published, non-archived model. Stopping keeps the scores already written.
learn_email_building
ChatGPTLoad the schema reference for constructing the EmailData JSON shape (components, theme, layout, merge fields, etc.). Call this before any tool that takes an email body / EmailData payload.
learn_email_theming
ChatGPTLoad the schema reference for the WorkspaceTheme JSON shape — the workspace-level design system (typography, borders, radii, and per-surface color palettes; spacing is per-email, not themeable) that emails inherit from. Call this before any tool that creates or edits an email theme. For building an email body instead, call learn_email_building.
learn_form_building
ChatGPTLoad the schema reference for constructing the FormData JSON shape (components, hidden fields, theme, settings). Call this before any tool that takes a form body / FormData payload.
learn_landing_page_building
ChatGPTLoad the schema reference for the LandingPageData JSON shape (pages, the flat node tree of sections, rows, columns and blocks, field values and breakpoint variants, rich text, theme inheritance) and a complete example. Call this before create_landing_page or update_landing_page with data.
learn_landing_page_theming
ChatGPTLoad the schema reference for the LandingTheme JSON shape (foundations: typography, spacing, shape, links, button; color schemes) that landing pages inherit from. Call this before create_landing_page_theme or update_landing_page_theme. For a page's design instead, call learn_landing_page_building.
learn_lead_scoring
ChatGPTLoad the reference for lead score models: groups, fit rule statements, activity rules (event filters, contribution methods, timeframes, decay, frequency), ranges, tiers and validation codes. Call this before lead_score_model_upsert_group or lead_score_model_update.
learn_reporting
ChatGPTLoad the reference for custom reports: the definition grammar, the catalog of metric, source, and dimension IDs, and how to read results. Call this before run_report.
learn_statement_semantics
ChatGPTLoad the schema reference for the statement query language. Call this BEFORE using any tool that takes a statement or filter argument (audience_create, update_audience, contact_list, contact_count, campaign_add_members, workflow_list_runs).
learn_workflow_building
ChatGPTLoad the schema reference for constructing workflow / automation graph data (node + edge graph, trigger conditions, control flow nodes). Call this before any tool that takes a workflow body. If the workflow has any conditions, also call learn_statement_semantics.
list_artifacts
ChatGPTList all artifacts created for the current agent, including pending and applied ones.
list_fields
ChatGPTFind the business's fields and their ids. Pass query to search by name — that is the fast path, and you can run several searches at once. Returns one tab-separated row per field: id, key, label, dataType, objectType, and — on a field that lives on a custom object — customObjectId. Use this to discover filterable fields for statement queries, and to find the ids a CSV import maps its columns to. objectType says which record a field belongs to. A CSV import can map columns to CONTACT, COMPANY, and CAMPAIGN_MEMBER fields; other object types come back in this list but are not importable. Campaign-member fields hold per-membership data rather than anything about the person, so they only mean something in a campaign context. Every field on a custom object reads CUSTOM_OBJECT, so customObjectId is what tells two objects' fields apart — match it against custom_object_list when two of them share a key. Every business has default contact fields: first_name, last_name, email, phone, mobile_phone, city, state, country, postal_code, job_title, department, lead_source, lead_status, date_of_birth, salutation, description, street, owner_id. Company fields: company_name, industry, annual_revenue, number_of_employees, website, phone, billing_city, billing_state, billing_country. Businesses may also have custom fields. Use get_distinct_field_values to see what values exist for a specific field.
list_fields_verbose
ChatGPTList fields with full metadata including types, relationships, schema and value owners, Salesforce mappings, and timestamps. Covers every object type — contact, company, campaign member, custom object — so filter by objectType when you only want one.
media_delete
ChatGPTRemove an image from the Media gallery. It disappears from the Media page for good; confirm with the user first. Emails or forms already embedding its url keep the hosted image, but nothing new can pick it from the gallery.
media_get
ChatGPTLook up one Media gallery image by its mediaId. Returns { id, mediaId, businessId, createdAt, updatedAt, url }. Use your client's image viewing tools with url when you need to see it.
media_list
ChatGPTList the images in the business's Media gallery, newest first. Each item carries its hosted image url and the mediaId the other media tools take.
opportunity_count
ChatGPTCount opportunities matching a statement filter. Use this when you only need the number (e.g. "how many open opps over $50k") rather than fetching rows. BEFORE CALLING (when passing a statement): Call learn_statement_semantics first to load the schema before calling this tool.
opportunity_get
ChatGPTLook up an opportunity by its UUID. Returns full opportunity details: variables (custom fields), nested company, Salesforce external metadata, timestamps. Use this after opportunity_list returns an ID, or after pulling an opportunityId from a contact's engagements / opportunity-role results.
opportunity_list
ChatGPTList opportunities for the current business with cursor pagination using the statement query language. Opportunities only exist when Salesforce sync is connected — this tool will return an empty list on businesses without it. IMPORTANT: If you haven't already, Call learn_statement_semantics first to load the schema before calling this tool. HOW TO USE: 1. To discover opportunity field IDs, call contact_list_fields (it lists ALL variable schemas including ones with objectType: "OPPORTUNITY"). 2. Build a statement JSON object and pass it as the "statement" parameter. CORE ATTRIBUTES (usable as root-level ATTRIBUTE names): "companyId", "createdAt", "updatedAt". FIELDS: Reference a custom field via the wire-format VARIABLE type with a variableSchemaId from contact_list_fields (filtered to opportunity-typed schemas). Each returned opportunity carries: id, companyId, nested company, variables map (schemaId → value), externalOpportunity (Salesforce metadata), createdAt, updatedAt. RETURNS: count (number of results in this page), opportunities array, and optional next cursor.
opportunity_list_contacts
ChatGPTList the contacts attached to an opportunity along with each contact's role on it (e.g. Decision Maker, Influencer) and whether they are the primary contact. Answers 'who's on this opportunity?'. Returns contact details (id, name, email, etc.) embedded with the OpportunityContactRole metadata.
rename_folder
ChatGPTRename a folder by its id. Updates the live folder's name immediately. Does not move items between folders — use folder_move_assets for that.
rename_workflow
ChatGPTRename an automation by its id. Updates the live automation's name immediately — no review cycle. Use this when the user asks to rename a workflow / automation, or one created earlier needs a clearer name. Do NOT use this tool to change the automation's structure (nodes, edges, triggers).
run_report
ChatGPTExecute custom reporting datasets for analysis. BEFORE CALLING: Call learn_reporting first to load the schema before calling this tool.
salesforce_list_campaigns
ChatGPTList campaigns that exist in the business's connected Salesforce org (NOT Conversion campaigns — use campaign_list for those). Returns each Salesforce campaign's id and name. Use this to resolve the Salesforce campaign id you pass to campaign_create (externalId) or edit_campaign (salesforceCampaignId) — never guess or invent that id. Errors if the business has no Salesforce connection.
search
ChatGPTSearch across Conversion records by name, keyword, identifier, or meaning. Use this to discover relevant contacts, companies, opportunities, emails, email templates, workflows, forms, audiences, campaigns, folders, or files when you do not already know their ID. Prefer a type-specific list tool for structured filters or pagination. Each result includes sourceId, which can be passed to the matching get tool for full details.
sync_get_error_breakdown
ChatGPTAggregate the business's CRM sync logs in a time window, grouped by external object type (CONTACT, ACCOUNT, OPPORTUNITY, TASK, …), status (SUCCESS, SKIPPED, FAILED), and pre-classified failure reason enum. Returns counts per group plus the window total — use it for failure rates and week-over-week comparisons instead of paging sync_list_logs. Sync logs are retained for 14 days, so windows older than that come back partially or fully empty.
sync_get_settings
ChatGPTGet the business-level Salesforce sync settings: which Salesforce objects are read in (Contacts, Leads, Accounts, Opportunities), whether Conversion contacts/companies are written out to Salesforce, the default Salesforce target for new Conversion contacts (Contact or Lead), account linking/creation behavior, and deletion propagation rules. Use this when diagnosing why a record did or didn't sync. Returns a not-found error if the business has never configured Salesforce sync.
sync_list_batches
ChatGPTList Salesforce sync batches. Each batch represents a sync run with metrics.
sync_list_logs
ChatGPTList individual sync logs. Provide exactly one of batchId, contactId, or companyId to choose the scope.
token_create
ChatGPTCreate a new token definition at the business level.
token_delete
ChatGPTPermanently delete a business-level campaign token definition. Use token_list first to verify the target.
token_list
ChatGPTList all tokens defined for this business.
token_list_values
ChatGPTList the token values set on a campaign. Takes a custom campaign or a webinar id, so no category is needed. Each value is joined with its token's key and label; a token not listed here has no value on this campaign.
token_set_default_value
ChatGPTSet a token's default value: its value at the workspace root. An asset uses the value of its nearest folder or campaign that sets the token, then this default. Read current defaults with token_list.
token_update
ChatGPTUpdate an existing token definition. Either key or label may be set; omitted fields are left unchanged. The token's value on a specific campaign is set with edit_campaign (tokenValues) and reviewed at the end of the turn.
update_agent
ChatGPTUpdate a non-play agent's name, description, instructions, appearance or activation status. Omitted fields stay unchanged. Read get_agent first; instructions replace the full text, so preserve rules the user did not ask to change. Set enabled only when asked to pause or activate. Use the Play tools for Plays. This does not edit triggers, tools or reference documents.
update_audience
ChatGPTImmediately update an existing audience's name, type, and/or dynamic filter. Use add_audience_contacts to add contacts to a static audience.
update_campaign
ChatGPTImmediately update an existing campaign's name and/or description.
update_email
ChatGPTImmediately update an existing blast or workflow email (partial — set only the fields you change). For a blast, statement / sendDate set its recipients/schedule. Read the current email first with email_get. Cannot send, schedule, publish, or edit templates.
update_form
ChatGPTImmediately update an existing form's metadata (name, CRM-sync, subscribe behavior). To change the form's design/fields, use update_form_draft.
update_form_draft
ChatGPTImmediately replace an existing form's design (its draft FormData). Read the current design first via form_get → internalForm.draft, modify it, and pass the COMPLETE FormData (not a diff). Cannot publish. BEFORE CALLING: Call learn_form_building first to load the schema before calling this tool.
workflow_get
ChatGPTGet details about a specific automation workflow including its nodes, edges, status, and structure.
workflow_get_metrics
ChatGPTGet aggregate metrics for an automation: total runs, distinct contacts, completed, running, failed, and average duration. Use this to answer "how is workflow X doing" without paging through individual runs. Optionally pass a statement filter to scope the numbers to a subset of contacts. NOTE: averageDuration is in NANOSECONDS (Go's wire format). BEFORE CALLING (when passing a statement): Call learn_statement_semantics first to load the schema before calling this tool.
workflow_get_run
ChatGPTGet a single automation run by its ID. Returns the run details including status, activity log, nodes visited, and timing.
workflow_list
ChatGPTList automations for the current business with cursor pagination and optional sorting.
workflow_list_runs
ChatGPTList runs for an automation. Each run represents a contact's journey through the automation. Supports statement filters to narrow results by contact properties. BEFORE CALLING (when passing a statement): Call learn_statement_semantics first to load the schema before calling this tool.
add_audience_contacts
Claudeaudience_create
Claudeaudience_list
Claudebusiness_get_email_settings
Claudebusiness_get_logo
Claudecampaign_add_members
Claudecampaign_create
Claudecampaign_create_token
Claudecampaign_create_type
Claudecampaign_create_type_status
Claudecampaign_get_items
Claudecampaign_list
Claudecampaign_list_members
Claudecampaign_list_tokens
Claudecampaign_list_type_statuses
Claudecampaign_list_types
Claudecampaign_set_token_value
Claudecampaign_update_member_status
Claudecampaign_update_token
Claudecampaign_update_type
Claudecompany_list_opportunities
Claudecontact_count
Claudecontact_create
Claudecontact_create_field
Claudecontact_get
Claudecontact_get_automation_runs
Claudecontact_get_distinct_field_values
Claudecontact_get_events
Claudecontact_list
Claudecontact_list_fields
Claudecontact_list_fields_verbose
Claudecontact_list_opportunities
Claudecreate_email
Claudecreate_form
Claudecreate_workflow
Claudeduplicate_campaign
Claudeemail_get
Claudeemail_get_metrics
Claudeemail_list_blast_emails
Claudeemail_list_recipients
Claudeemail_list_templates
Claudeemail_list_workflow_emails
Claudefolder_create
Claudefolder_get_items
Claudefolder_list_root
Claudefolder_move_assets
Claudefolder_move_assets_to_root
Claudeform_get
Claudeform_list
Claudeform_list_submissions
Claudeget_artifact
Claudeimport_contacts_csv_process
Claudeimport_contacts_csv_upload
Claudelearn_email_building
Claudelearn_form_building
Claudelearn_statement_semantics
Claudelearn_workflow_building
Claudelist_artifacts
Claudeopportunity_count
Claudeopportunity_get
Claudeopportunity_list
Claudeopportunity_list_contacts
Clauderename_folder
Clauderename_workflow
Claudesync_list_batches
Claudesync_list_logs
Claudetop-level
Claudeupdate_audience
Claudeupdate_campaign
Claudeupdate_email
Claudeupdate_form
Claudeupdate_form_draft
Claudeworkflow_get
Claudeworkflow_get_metrics
Claudeworkflow_get_run
Claudeworkflow_list
Claudeworkflow_list_runs
Claude