Tool reference
Every tool a connected assistant can call, grouped the same way the server registers them. A tool is only ever offered to the assistant if your connection holds the scope it needs — there's no such thing as a write tool that's present but always errors; if you didn't grant contacts:write, the assistant simply doesn't see upsert_contacts at all. See Scopes & permissions for what each scope means.
Destructive in the tables below is the same MCP annotation Claude and ChatGPT's own review process requires — it marks a tool whose effect can't be trivially undone (deleting a project, overwriting a tree, removing a contact), not "dangerous" in some vaguer sense. Every write tool still only takes the fields you'd expect; none of them accept a raw payload the model could smuggle arbitrary changes through.
Discovery
| Tool | Scope | Notes |
| --- | --- | --- |
| search | any of projects:read / templates:read / contacts:read | Searches projects, templates and contact lists by name. Returns opaque ids for fetch. This is the exact tool ChatGPT's deep-research mode calls automatically. |
| fetch | same as search | Resolves one id from search into its full content. |
Email design
| Tool | Scope | Destructive | Notes |
| --- | --- | :-: | --- |
| list_projects | projects:read | | Id, name, purpose for every project. |
| get_email | projects:read | | A project's current block tree and theme. |
| preview_email | projects:read | | Renders through the real mailed-HTML pipeline — the exact document a send would produce. Widget-attached (see below). |
| list_block_types | projects:read | | The full 44-block catalog, generated from the live registry — always current, never hand-maintained. |
| list_templates | projects:read | | Your saved templates, or the approved community gallery. |
| create_project | projects:write | | Optionally seeded from a built-in purpose template. |
| add_block / update_block / move_block | projects:write | | Tree edits, canPlace/field-validated the same way the in-studio copilot's edits are. |
| remove_block | projects:write | ✓ | Deletes a block and its children. |
| set_theme | projects:write | | Brand colors, font, button radius. |
| rename_project | projects:write | | |
| delete_project | projects:write | ✓ | Permanent. |
| apply_template | projects:write | ✓ | Overwrites the project's entire tree and theme. |
| save_as_template | templates:write | | Snapshots the current project into a reusable template. |
Audience
| Tool | Scope | Destructive | Notes |
| --- | --- | :-: | --- |
| list_data_sources | contacts:read | | Every data source, contact lists included. Credential values are never returned. |
| list_contact_lists | contacts:read | | Contact lists specifically — id, name, fields, row count. |
| get_contact_list_summary | contacts:read | | Counts and suppression totals — no individual contact data. |
| find_contacts | contacts:read | | Bounded lookup (≤25 rows, cursor-paginated). Every call is written to the personal-data access log, same as a dashboard contact read. |
| upsert_contacts | contacts:write | | Add or update rows; enforces your plan's contact cap. |
| remove_contact | contacts:write | ✓ | Permanently removes one row. |
| add_suppression / remove_suppression | contacts:write | | Blocks or unblocks an address account-wide, same effect as a recipient's own unsubscribe link. |
Results
| Tool | Scope | Destructive | Notes |
| --- | --- | :-: | --- |
| get_campaign_results | analytics:read | | Opens/clicks/responses/revenue, A/B variant comparison, click heatmap. Summarized only — never raw per-recipient events. Widget-attached. |
| get_form_responses | analytics:read | | Per-question rollups; free-text answers are a capped, fenced sample. |
| list_orders | analytics:read | | Product-block checkout orders. |
| list_campaign_sends | analytics:read | | Past bulk sends, most recent first. |
| list_schedules | analytics:read | | Recurring sends configured on a project. |
| mark_order_fulfilled | commerce:write | | Marks a physical order shipped and emails the buyer. |
| create_schedule | campaigns:send | | Configures a new recurring send. |
| set_schedule_enabled | campaigns:send | ✓ | Marked destructive because disabling a live schedule stops future sends silently. |
Sending
| Tool | Scope | Destructive | Notes |
| --- | --- | :-: | --- |
| send_test_email | campaigns:read | | A single [Test]-prefixed copy to one address you specify — doesn't touch your real audience or need campaigns:send. |
| prepare_send | campaigns:send | | Read-only by annotation — resolves the audience and renders a preview, sends nothing. Returns a confirmationToken. Widget-attached (send-confirmation card). |
| confirm_send | campaigns:send | ✓ | Requires the exact confirmationToken prepare_send returned, unchanged, within 10 minutes. See Security for why. |
Mailbox & tickets
| Tool | Scope | Notes |
| --- | --- | --- |
| list_mailbox_threads / get_mailbox_thread | mailbox:read | Inbound mail at your verified domain. Message bodies are fenced as untrusted, recipient-authored content. |
| reply_to_mailbox_thread | mailbox:write | Sends from the exact mailbox address the original mail arrived at, correctly threaded. |
| list_tickets / get_ticket | mailbox:read | Support-ticket conversations. Same untrusted-content fencing. |
| reply_to_ticket | mailbox:write | Adds an owner message and emails the recipient a link back. |
Account
| Tool | Scope | Notes |
| --- | --- | --- |
| get_plan_usage | none — always available | Plan, quotas, and this month's usage. Read-only, and not sensitive account data the way projects/contacts/mailbox are, so it's available regardless of which scopes you granted. |
Widgets
Three tools attach an interactive widget on hosts that support MCP Apps / the Apps SDK (Claude and ChatGPT — Gemini has no widget layer and always gets the plain-text/JSON result instead): preview_email (live desktop/mobile email preview), get_campaign_results (results dashboard), and prepare_send (the send-confirmation card, whose own Confirm & Send button is what actually calls confirm_send).