get_email_analytics answers the overview, send, and event reads), and a few have no HTTP route at all. The catalog below is generated from what an organization connection’s tools/list returns, grouped under the topics get_brew_capabilities uses. A brand connection sees the same tools except create_brand.
Every tool is strictly typed and carries readOnlyHint and destructiveHint annotations. Call get_brew_capabilities with a tool for one tool’s full input schema, or with a topic for focused help. Each description is exactly what your agent reads, and it states the tool’s cost: every credit-metered tool names its price there, and running out returns INSUFFICIENT_CREDITS.
Tool Catalog
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
audit_email | Use this when checking an email before a production send. A complete audit costs 5 credits; a partial result is free and does not establish readiness. Pass exactly one of emailId (a saved design; pin emailVersionId), emailJsx or emailHtml; sendingPurpose is inferred when omitted. | write | POST /v1/emails/audit |
clone_email | Copy a Brew design exactly without AI; it shows no preview, since the copy looks like its source. Omit groupId/groupName to inherit its folder. Use edit_email to change content or import_email for external source. | write | POST /v1/emails/{emailId}/clone |
control_email_send | Control an existing campaign by sendId. Cancel stops remaining deliveries; pause/resume apply to gradual sends only. On OAuth and organization connections a resume returns a confirmation request first; the same call with confirmed:true and its confirmation_id resumes. Already delivered email cannot be recalled. | write | POST /v1/sends/{sendId}/cancel, POST /v1/sends/{sendId}/pause, POST /v1/sends/{sendId}/resume |
create_email | Create an on-brand email from a prompt, metered in credits; use clone_email for an exact copy or import_email for source content. The brand must be ready. Set groupId or groupName to choose its folder. A ready result already shows the design; only if generating, poll get_email. Repeating creation starts another billed design. | write | POST /v1/emails |
create_inbox_placement_test | Start a 10-credit seed test for inbox/spam placement; it sends a real email from the domain to the Brew seed inboxes. Requires a verified domain. Check get_domain_health first; poll get_inbox_placement_results. Visual client screenshots use test_email_rendering. | write | POST /v1/emails/{emailId}/inbox-placement-tests |
delete_email | Permanently delete a design and all its versions. Delivered campaigns remain delivered. deleted:false explains already_deleted (with its deletedAt) or not_found; a retry changes nothing. | write | DELETE /v1/emails/{emailId} |
delete_email_group | Delete a named email folder; its designs move to Ungrouped. Cannot delete Ungrouped. Use delete_email to delete a design itself. | write | DELETE /v1/email-groups/{groupId} |
edit_email | Change an existing design with a natural-language prompt. Each edit creates a version, moves automation steps pinned to the previous latest onto it (as a draft), and is usage-metered in credits. A ready result already shows the edited design; only if generating, poll get_email with the returned emailId and runId. Use update_email_metadata for title, subject, or group only. | write | PATCH /v1/emails/{emailId} |
export_email | Export a design as a template to an ESP already connected in Brew. Use list_integrations to check the provider, or send_email to deliver through Brew. | write | POST /v1/emails/{emailId}/export |
get_email | Show an existing email design with its preview, creator and Open-in-Brew link, read a saved version with emailVersionId, or poll a generation with the runId it returned. Free. Request include html, versions or links only when needed; those reads show no preview. preview:false reads a design without showing it again. Use test_email_rendering only for paid inbox-client screenshots. | read | GET /v1/emails/{emailId} |
get_email_analytics | Read report.kind overview for totals over time, sends for campaign sends and their lifetime stats (pass sendId for one send; include events for its recipients), or events for recipient engagement (groupBy/bucket count them per link, day, email or unsubscribe reason). Use list_automations or get_automation with analytics:{} for flow performance. | read | GET /v1/analytics/overview, GET /v1/sends, GET /v1/sends/{sendId}, GET /v1/analytics/events |
get_email_audit | Read a saved email audit and its precise findings without running or charging for a new audit. Use audit_email to create a fresh audit. | read | GET /v1/emails/audits/{auditId} |
get_email_rendering | Read a saved inbox-rendering job with previewId; waits up to 30 s while it runs. Returns per-client status and screenshot links without starting another paid render. Use test_email_rendering to start a new job. | read | GET /v1/emails/client-previews/{previewId} |
get_inbox_placement_results | Read a placement test with emailId and testId; poll about every 30 seconds while it is queued or running. Omit testId to compare a design’s previous tests. | read | GET /v1/emails/{emailId}/inbox-placement-tests, GET /v1/emails/{emailId}/inbox-placement-tests/{testId} |
get_insight | Read one Brew insight by the insightId from list_insights: frozen metrics (the figures it was computed on), evidence links, rationale, how its detector works and what resolves it, the run that produced it and what that run could not see, and its lifecycle state. Read-only and free. Use list_insights to find ids. | read | GET /v1/insights/{insightId} |
get_template | Use this when viewing one public template selected with search_templates. Returns preview and referenceEmailId for create_email. Include html only to inspect its content; large HTML is a downloadable file. Use get_email for a design in your brand. | read | GET /v1/templates/{templateId} |
import_email | Import existing HTML, MJML, React Email JSX, or a connected Figma frame as an editable email. Choose source.kind content or figma. For a new design from a prompt use create_email. | write | POST /v1/emails/import, POST /v1/emails/figma |
list_email_comments | List the open comment threads teammates left on one email design, newest activity first: commentId, whether it is on the whole email or one element, the 12 most recent participants and their count, message count and the latest preview. include [“messages”] adds each thread’s newest messages (author, body, mentions) and caps the page at 3 threads; a thread with older ones returns messagesCursor: pass it with that commentId for the next older messages, until null. An unknown emailId is 404 EMAIL_NOT_FOUND; a commentId that is not an open thread on it (resolving deletes one) is 404 COMMENT_NOT_FOUND. Read-only and free. Use get_email for the design itself. | read | GET /v1/emails/{emailId}/comments |
list_email_groups | List email folders with their groupId values and creators, including Ungrouped. Use list_emails with groupId to read a folder’s designs. save_email_group creates or renames folders. | read | GET /v1/email-groups |
list_emails | List this brand’s saved email designs by group or status. Returns public emailId, title, group, creator, and links; a page of up to 8 shows as a gallery (to show designs, pass limit 8 or preview:true). Pass preview:false to look up ids or act on many designs. Use get_email to view one design or retrieve its content. search_templates browses the public gallery. | read | GET /v1/emails |
list_insights | List the brand’s Brew Insights as the Insights page ranks them, most severe first: each finding’s insightId, title, description, severity, confidence, category, state and when it was first and last seen, plus when the engine last ran. Open findings by default; state “all” adds resolved, dismissed and cleared ones. include adds the weekly pulse, the latest intelligence report, its open suggestions and the agent memo; what does not fit one result is cut and named in truncated. A cursor is refused once the findings change; list again without it. Read-only and free. Use get_insight with an insightId for its frozen metrics and evidence; get_email_analytics reports raw performance. | read | GET /v1/insights |
restore_email_version | Restore a saved email version as a new latest version. Read available versions with get_email first. Existing history is preserved. Automation steps pinned to the previous latest move to it as a draft. | write | POST /v1/emails/{emailId}/restore |
save_email_group | Create a named email folder, or rename an existing group by groupId. Pass emailIds (up to 50) to move designs into it in the same call, one request against the rate limit; resend any notMoved with reason retry. Omit groupId only when creating. update_email_metadata moves one design. | write | POST /v1/email-groups, PATCH /v1/email-groups/{groupId} |
search_templates | Browse public templates by category or brand. Use semantic for relevance ranking (top 200), or query for a case-insensitive title substring or exact public ID. Pages contain metadata, preview links, and referenceEmailId; a page of up to 8 shows as a gallery (the default page). Pass preview:false to list them as text. count:true returns the total for brand/category instead of rows, refreshed every 15 minutes; add groupBy brand or category for per-value counts, largest first, such as which categories a brand has. Use get_template for one template’s content. | read | GET /v1/templates |
send_email | Send one campaign or a test:true QA email. A campaign goes from a verified marketing domain to a saved audience (audienceId) or to up to 50 existing subscribed contacts (to); it never creates contacts. With an idempotency_key a retry replays instead of sending twice. On OAuth and organization connections a campaign, or a test to anyone but the connected person, returns a confirmation request first; the same call with confirmed:true and its confirmation_id sends. Recurring/event mail uses fire_trigger_event or run_automation. | write | POST /v1/sends |
test_email_rendering | Test a design’s appearance in specific inbox clients and devices. Reserves 10 credits; charges once when a screenshot is ready. Waits up to 30 s; read clients still rendering with get_email_rendering and the returned previewId. For a free general design preview use get_email. | write | POST /v1/emails/{emailId}/client-previews |
update_email_metadata | Rename a design, set its inbox subject, or move it to an existing group atomically; groupId:null ungroups. Free: it never generates content, charges credits, creates a version or shows a preview. Shares the 20/min email-edit limit: to move several designs, use save_email_group with emailIds. edit_email changes the design itself. | write | PATCH /v1/emails/{emailId} |
Automations
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
cancel_automation_run | Cancel one running event or test run by automationRunId from list_automation_runs or test_automation. Returns canceled with the status it was in; delivered emails remain sent. Use control_audience_run for manual-audience runs, or save_automation to change a flow. | write | POST /v1/automations/runs/{automationRunId}/cancel |
check_trigger | Check whether a trigger can fire now and which published automations consume it. A trigger no published automation listens for is ready: false with a NO_PUBLISHED_AUTOMATION entry in blockers, not an error; publish one before firing. Include payload to validate that example against its contract. Nothing fires or changes. | read | GET /v1/automations/triggers/{triggerEventId}/readiness, POST /v1/automations/triggers/{triggerEventId}/contract/validate |
control_audience_run | Pause, resume, or cancel a manual-audience run by audienceRunId. resume continues an operator-paused run, or a failed run from its first undelivered step, and refuses a step that already delivered to part of its segment to avoid duplicate sends. On OAuth and organization connections a resume returns a confirmation request first; the same call with confirmed:true and its confirmation_id resumes. A run held at the plan limit (pauseReason: plan_limit) resumes on its own and refuses resume. Cancel is final; delivered emails stay sent. | write | POST /v1/automations/audience-runs/{audienceRunId}/pause, POST /v1/automations/audience-runs/{audienceRunId}/resume, POST /v1/automations/audience-runs/{audienceRunId}/cancel |
delete_automation | Use this when permanently removing an automation. Does not unsend already-delivered emails. Idempotent. | write | DELETE /v1/automations/{automationId} |
delete_trigger | Use this when removing an unused trigger. Fails while any automation, published or draft, is wired to it; unpublishing is not enough. Delete those with delete_automation, or re-point each to another trigger with save_automation and republish a published one, then retry. Idempotent. | write | DELETE /v1/automations/triggers/{triggerEventId} |
fire_trigger_event | Use this when starting published event automations from an app/event payload. Do not use send_email (one-off campaign) or run_automation (manual-audience launch). Requires a published automation listening for the trigger. With an idempotency_key, a retry replays the original runs instead of firing twice. On OAuth and organization connections it returns a confirmation request first; the same call with confirmed:true and its confirmation_id fires. A new payload email becomes a contact; a contact who unsubscribed is refused (RECIPIENT_UNSUBSCRIBED) and nothing is sent. | write | POST /v1/automations/triggers/{triggerEventId}/fire |
get_automation | Get an automation by automationId, including its creator, live publisher, canonical link and optional graph or versions. Include analytics:{from?,to?} for performance. Use list_automation_runs for execution logs. | read | GET /v1/automations/{automationId}, GET /v1/analytics/automations |
get_flow | Show one public email sequence by its slug from list_flows: up to 12 steps with subjects, day offsets, previews and emailId references for create_email. include: ["html"] adds step content. An unknown slug returns FLOW_NOT_FOUND. | read | GET /v1/flows/{slug} |
get_trigger_contract | Read a trigger’s payload contract before integration. Request format ts, zod, jsonschema or skill for generated code/docs. Use set_trigger_contract to change it. | read | GET /v1/automations/triggers/{triggerEventId}/contract |
infer_payload_contract | Infer typed fields and uncertainty notes from the required example event payload. Nothing is saved. Review the draft, then persist it with set_trigger_contract before integrating the trigger. | read | POST /v1/payload-contracts/infer |
list_automation_runs | Inspect run.kind execution for automation executions or audience for manual-audience launches. Pass automationRunId or audienceRunId to read one run; include logs on an execution for its node logs. Each kind has its own IDs and pagination cursor. | read | GET /v1/automations/runs, GET /v1/automations/runs/{automationRunId}, GET /v1/automations/audience-runs, GET /v1/automations/audience-runs/{audienceRunId} |
list_automations | List saved automations with their IDs, creator, publication state, and Open-in-Brew links; search finds them by name. Use get_automation for graph or version details. Include analytics:{from?,to?} for performance. list_automation_runs retrieves logs. | read | GET /v1/automations, GET /v1/analytics/automations |
list_flows | Browse public brand email sequences by brand, category, type or semantic relevance. Text only: each page lists its flows with their slug, email count and span, and total counts every flow the query matches, so limit 1 answers how many there are. Use get_flow with a slug to see one sequence’s emails. Use search_templates for single public designs or list_automations for your saved automations. | read | GET /v1/flows |
list_trigger_events | Read past trigger fires, their match state and the runs they started; pass triggerInstanceId for one fire. Fire payloads are not stored. list_automation_runs reads execution logs; get_email_analytics reads email engagement. | read | GET /v1/automations/trigger-instances, GET /v1/automations/trigger-instances/{triggerInstanceId} |
list_triggers | List automation trigger definitions or read one triggerEventId. include:[“skill”] returns its integration brief. Use list_trigger_events for past fires. get_trigger_contract retrieves its payload schema. | read | GET /v1/automations/triggers, GET /v1/automations/triggers/{triggerEventId} |
run_automation | Launch a manual-audience automation. dryRun previews without sending; scheduledAt/gradualSend control timing; with an idempotency_key a retry replays instead of launching twice. On OAuth and organization connections a real launch returns a confirmation request first; the same call with confirmed:true and its confirmation_id launches. Event-triggered flows use fire_trigger_event. send_email delivers a one-off campaign. | write | POST /v1/automations/{automationId}/run |
save_automation | Create an automation graph, or edit an existing automationId. State changes are explicit: published, paused, or stopInFlight (with published:false; permanently stops contacts mid-flow). On OAuth and organization connections publishing, resuming (paused:false) or stopInFlight returns a confirmation request first; the same call with confirmed:true and its confirmation_id applies it. dryRun validates without saving; test_automation exercises the flow. | write | POST /v1/automations, PATCH /v1/automations/{automationId} |
save_trigger | Define an event for automations, or update its existing triggerEventId. Keep the required recipient email field in the payload schema. Fire a real event with fire_trigger_event. | write | POST /v1/automations/triggers, PATCH /v1/automations/triggers/{triggerEventId} |
set_trigger_contract | Set a trigger payload contract. Keep a required top-level email string. Version changes only when behavior changes; enable enforcement explicitly after testing. | write | PUT /v1/automations/triggers/{triggerEventId}/contract |
test_automation | Test a draft or published automation. Omit testRecipient to send nothing; on OAuth and organization connections a test to anyone but the connected person returns a confirmation request first, and the same call with confirmed:true and its confirmation_id runs it. scenario simulates timed engagement and forces percentage branches; payload drives field conditions, and contact.<name> ones read the stored contact unless payload sets that key; a test never creates or edits a contact. Omit scenario for a smoke test. Inspect coverage; one run cannot prove every path. | write | POST /v1/automations/{automationId}/test |
Contacts and audiences
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
create_audience | Create a saved contact segment from filters, or copy one with sourceAudienceId (and an optional name for the copy). Contacts are not duplicated. Use create_audience_from_events for a frozen engagement-event cohort. | write | POST /v1/audiences |
create_audience_from_events | Save a frozen contact cohort from engagement events. Poll list_audiences with the returned audienceId and include:[“build”] until ready before sending. create_audience creates a live filter instead. | write | POST /v1/audiences/from-events |
create_contact_field | Define a contact field and its type before writing values through save_contact or import_contacts_csv. | write | POST /v1/fields |
delete_audience | Use this when removing a saved audience. Does not delete the contacts in it. Idempotent. | write | DELETE /v1/audiences/{audienceId} |
delete_contact_field | Use this when removing a custom field and its value from every contact. The values cannot be recovered, and audience filters on the field then see no value. On OAuth and organization connections it returns a confirmation request first; the same call with confirmed:true and its confirmation_id deletes. Cannot delete core system fields. Idempotent. | write | DELETE /v1/fields/{fieldName} |
delete_contacts | Permanently delete one or more contacts by email. Pass a nonempty emails array; already missing contacts are safe to retry. On OAuth and organization connections it returns a confirmation request first; the same call with confirmed:true and its confirmation_id deletes. | write | DELETE /v1/contacts/{email}, POST /v1/contacts/batch-delete |
import_contacts_csv | Update existing contacts in bulk from CSV. Headers map by name: Email, First Name and Subscribed fill the core fields, and a column Brew manages is skipped with a CSV_COLUMN_IGNORED warning. A row whose address is not already a contact is refused per row (CONTACT_NOT_FOUND); nothing is created. A subscribed opt-out unsubscribes, and a word that is not a subscription status fails its row; re-subscribing an opt-out is skipped with a RESUBSCRIBE_SKIPPED warning. No credits are charged; validate_contacts checks deliverability. Use save_contact for one contact. | write | POST /v1/contacts/import-csv |
list_audiences | List saved contact segments (search narrows them by name), or fetch one audienceId. Include build status for an event snapshot or count for its current size before sending. search_contacts retrieves the members. | read | GET /v1/audiences, GET /v1/audiences/{audienceId} |
list_contact_fields | List the brand’s contact field definitions and types before filtering or updating custom contact data. create_contact_field adds a definition. | read | GET /v1/fields |
save_contact | Update an existing contact by email with a partial fields map; a missing contact is refused (CONTACT_NOT_FOUND) and nothing is created. Custom fields must already exist; create_contact_field adds one. Supports null clearing. subscribed:false unsubscribes; true never re-subscribes an opt-out (422 RESUBSCRIBE_NOT_ALLOWED). validate:true checks deliverability for 2 credits per address. | write | MCP only |
search_contacts | Find contacts by email, text, audience, or structured filters. A search that is one whole email address returns only that contact; other text matches any of its words, so it can return other contacts. Returns contact fields with pagination, or with count:true the exact total, plus per-value groups with groupBy (a field or emailDomain) or bucket (signup day/week/month). include [“openProfile”] adds each returned contact’s smart-send open-time profile (opens per UTC half hour, best send time; up to 10 per page). Use list_contact_fields to discover custom fields. create_audience saves a reusable segment. | read | POST /v1/contacts/search |
update_audience | Rename a saved audience, replace its filter, or add/remove specific contacts by email (addEmails/removeEmails). For a separate copy, use create_audience with sourceAudienceId. | write | PATCH /v1/audiences/{audienceId} |
validate_contacts | Check deliverability for up to 100 addresses at 2 credits per address, saving verdicts on matching contacts without creating new ones. save_contact can also validate after saving. | write | POST /v1/contacts/validate |
Domains
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
add_domain_unsubscribes | Add addresses to one marketing domain’s unsubscribe list so that domain stops sending to them. Known contacts still receive mail from the brand’s other marketing domains; an address with no contact is created already unsubscribed everywhere. Idempotent. Use import_domain_unsubscribes for a CSV. Taking an address off the list happens in the Brew app, not over MCP. | write | POST /v1/domains/{domainId}/unsubscribes |
create_domain | Register a sending domain and return the DNS records to add; verify_domain checks them. A new domain is marketing (unsubscribe link, opt-outs skipped); re-adding an unverified one keeps the purpose it had. A transactional domain is set up in the Brew app. | write | POST /v1/domains |
delete_domain | Use this when removing a sending domain. Idempotent. Campaigns cannot send from a deleted domain. | write | DELETE /v1/domains/{domainId} |
get_domain_health | Diagnose sending-domain DNS, authentication, reputation and deliverability. Start here; create_inbox_placement_test measures where a specific email lands. include [“scoreHistory”] adds up to 50 saved score snapshots, newest first; [“scoreRuns”] adds the last 5 automated score runs. | read | GET /v1/domains/{domainId}/health |
import_domain_unsubscribes | Import a CSV (an email column, or one headerless column) into one marketing domain’s unsubscribe list, up to 10,000 rows per call. Unknown addresses are created already unsubscribed everywhere, as add_domain_unsubscribes does. Idempotent. | write | POST /v1/domains/{domainId}/unsubscribes/import |
list_domains | List sending domains, DNS records, verification, and sending purpose. Choose a verified marketing domain for campaigns. Use verify_domain only while a domain is not sendable. get_domain_health diagnoses DNS and reputation. | read | GET /v1/domains |
update_domain | Change a domain’s default sender name, from address or reply-to. It never changes the domain’s sending purpose (marketing or transactional), which is set in the Brew app. verify_domain rechecks DNS. | write | PATCH /v1/domains/{domainId} |
verify_domain | Recheck DNS after adding the records returned by create_domain, while the domain is not sendable; a sendable domain is only refreshed. get_domain_health diagnoses health without requesting verification. | write | POST /v1/domains/{domainId}/verify |
Brand
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
create_brand (organization connections only) | Create a brand by extracting its website. Organization connections only. Poll get_brand_status with the returned brandId until ready is true, then use that ID as brand_id for brand-scoped work. | write | POST /v1/brands |
delete_brand_image | Delete one image from the brand library, as Delete image on the Assets page does. Pass the assetId from search_brand_images; one image per call. The image leaves the library and image search, but its file stays hosted, so emails already using its URL keep rendering. Logos are refused; manage them on the Assets page. An assetId not in the library returns deleted: false. Idempotent. Free. Use add_image to add an image. | write | DELETE /v1/brand/images/{assetId} |
get_brand | Read the brand’s design system, voice and logos, or check ready before design work. get_brand_status polls extraction; list_brands discovers brands. | read | GET /v1/brand |
get_brand_status | Poll brand extraction by brandId. Returns status and ready; wait for ready: true before designing. Use get_brand for colors, voice and logos. | read | GET /v1/brands/{brandId} |
list_brands | List brands this connection can access. Organization connections choose a returned brandId for brand_id on scoped tools; brand connections see only their bound brand. | read | GET /v1/brands |
search_brand_images | List the brand’s logos and brand images (from the site or uploaded), free; sort newest or oldest. Pass q for semantic search over brand images at 1 credit on the first page; cursor paging is free. For a hero or photo, use kind brand. Imagery made with Brew stays inside the designs that use it; create_email and edit_email make new imagery. add_image adds a URL or an uploaded file; delete_brand_image removes one by assetId. | read | GET /v1/brand/images |
update_brand | Update identity fields such as brandName, description and contact details by partial merge. emailDesign and imageStyle replace their Markdown artifacts in full. Omitted fields stay unchanged; colors and logos are not writable identity fields. | write | PATCH /v1/brand |
Images and media
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
add_image | Add an image to the brand library. Free. imageUrl hosts one public URL; imageUrls imports up to 100 in the background; uploadId finishes a local file sent through create_image_upload, and repeating that call returns the same image. search_brand_images finds an image the brand already has; create_email and edit_email make new imagery inside a design. | write | POST /v1/content/add-image |
create_image_upload | Start uploading a local image file to the brand library. Free. Returns uploadUrl and uploadId: POST the raw bytes within 15 minutes (curl -X POST —data-binary @logo.png “<uploadUrl>”), then call add_image with the uploadId. It needs a shell or HTTP tool on the machine holding the file; a public URL goes straight to add_image with imageUrl. PNG, JPEG, GIF, WebP, AVIF, TIFF or SVG; 20 MB max, SVG 2 MB. | write | POST /v1/content/image-uploads |
render_html_image | Render HTML into a hosted PNG for 1 credit. Use get_email for an existing design preview or test_email_rendering for inbox-client screenshots. | write | POST /v1/content/html-to-png |
Account and discovery
| Tool | What it does | Reads or writes | HTTP equivalent |
|---|---|---|---|
get_brew_capabilities | Discover this connection’s scope and available tools. Filter by topic or tool for focused help and schemas; detailed adds a paginated HTTP API catalog. The default is a compact overview, so call only when guidance is needed. | read | MCP only |
get_chat_context | Resume a Brew chat by chatId. Returns transcript and referenced emails, automations and triggers; load those with their named read tools. list_chats finds the chatId of a recent chat. | read | GET /v1/chats/{chatId} |
get_usage | Use this when checking plan, remaining credits, or send allowance before a metered operation. Org-wide — no brand_id. | read | GET /v1/usage |
list_chats | List the brand’s Brew chats, most recently active first: chatId, title, the opening prompt, Brew’s latest reply, where the chat started and whether a run is still streaming. Read-only and free. Call get_chat_context with a chatId to resume one with its artifacts and transcript. | read | GET /v1/chats |
list_integrations | List connected or available integrations. A human connects providers in Brew Settings; this read does not begin OAuth. | read | GET /v1/integrations |
list_notifications | List the brand’s Brew notifications, newest first, as the app’s bell shows them: generations, sends, imports, domain checks and score runs finishing or failing, plus comment mentions addressed to you on a personal connection. Each row has its notificationId, type, status, title, subtitle, a link and the ids it concerns (chatId, emailId, domainId). Rows outside this connection’s access are left out, so a type it cannot see is an empty page; billing alerts reach organization admins only. Read-only and free; nothing is marked read. Follow a chat with get_chat_context. | read | GET /v1/notifications |
send_flare | Use this when the user asks to report a problem with Brew tools. Files a technical diagnostic report for Brew support: tool names, request IDs, status and error codes, Brew ids, the client and a short summary of what failed (no conversation text). Free. Returns a flareId support can look the report up by. Product feedback goes to submit_feedback. | write | MCP only |
submit_feedback | Use this when the user asks to send the Brew team a problem, a feature request, a question or praise. Sends their own message to the Brew inbox, with a title, kind and sentiment when clear. The message carries no secrets, API keys, tokens or recipient addresses. Technical diagnostics for failed tool calls go to send_flare. | write | MCP only |
Conventions
response_format
Every tool except submit_feedback accepts an optional response_format:
| Value | What comes back |
|---|---|
concise (default) | A Markdown summary: the rows or record with their identifiers, and an Open in Brew link. |
detailed | The same summary, plus the full JSON body appended. |
structuredContent
either way, so concise never costs you data, only the JSON echo in the
text channel. Reach for detailed when you want to read the raw fields in
the transcript.
Every tool publishes the shape of that record as its outputSchema in
tools/list, so a client can validate a result and read its fields without
guessing.
idempotency_key
Write tools that can be retried accept an optional idempotency_key: a repeat
call with the same key replays the original result instead of acting twice.
Use a fresh UUID per intended action. See Safe Retries.
include
Expansions are opt-in. Every tool that takes include takes an array of
the expansion names its input schema lists (include: ["html"] on
get_email, include: ["identity", "logos"] on get_brand). A string is
refused.
Previews
Email and image tools attach Brew’s stored preview where your client can show it in the transcript, plus an Open in Brew link, and the result’s text says which previews the client shows. Markdown images are left out: some clients turn them into a “Show Image” button instead of the design.preview: false
returns text only.
Confirmation
On OAuth and organization connections, a call that emails people or removes contact data returns a confirmation request first: campaigns, tests to someone else, automation launches and trigger fires, publishing or resuming an automation, resuming a send, and deleting contacts or a contact field. After the user approves, the same call withconfirmed: true and the request’s
confirmation_id runs it. See
Confirmation.
Result Size
Results are sized to fit a model’s context:- A list page comes back whole or not at all. When a page is too large, the
call returns
RESPONSE_TOO_LARGEwith no rows and names what to lower (thelimit, or anincludeexpansion). Rows are never trimmed behind a cursor.list_insightsis the one exception: it shortens long text and cuts its expansions to fit, and itstruncatedarray names what it cut. - So list pages are smaller than the HTTP API’s: 25 rows by default and at
most for most
list_*andsearch_*tools.search_contactsreads 10 by default (up to 25), because a contact carries every custom field it has.list_insightsreads 10, andlist_email_commentswith messages reads 3 threads. Each tool’slimitstates its bounds; the full table is on Pagination. - A single record comes back whole in
structuredContent. Its text summary may be shortened, keeping the identifiers and next steps. A record past the hard cap returnsRESPONSE_TOO_LARGEtoo. - A write always returns its outcome. An oversized result is compacted in place (long strings and arrays shortened), keeping every field’s type.
Need Help?
Our team is ready to support you at every step of your journey with Brew. Choose the option that works best for you:- Self-Service Tools
- Talk to Our Team
Search Documentation
Type in the “Ask any question” search bar at the top left to instantly find relevant documentation pages.
ChatGPT/Claude Integration
Click “Open in ChatGPT” at the top right of any page to explore it further with ChatGPT or Claude.
Schedule a Call
Book time with our founders for personalized guidance on strategy, best practices, or complex implementation questions.
Call Us Directly
Need immediate assistance? Reach us at +1-(332)-203-2145 for urgent issues or time-sensitive questions.
Slack Channel
Our preferred support channel. You’ll receive an invite after signup for direct founder support and fast responses.
Email Support
Contact us at support@brew.new for detailed inquiries or if you prefer not to use Slack.