get_brew_capabilities lists the current tools and guided workflows. Filter it by topic, such as automation, for a workflow’s full steps.
Clients that support MCP prompts can invoke the named workflows below.
These recipes assume a brand connection. Organization connections also pass brand_id on brand-scoped tools.
Configure a Brand and Domain
configure_brand works on either connection scope:
get_brandwithinclude: ["emailDesign", "imageStyle"]reads the current brand, its saved name and tagline included. Wait for extraction to finish before designing or sending.- Use
update_brandfor requested identity changes.emailDesignandimageStylereplace full Markdown documents, so read them first and preserve unrelated sections. list_domainsto reuse the intended sendable domain. Usecreate_domainonly when the requested marketing domain is absent.- Publish the returned DNS records at your registrar or DNS provider. The MCP cannot change your DNS. Then call
verify_domain; pending records mean you need to allow propagation or fix the records. If campaigns are held on the domain, a passing check resumes them, so on OAuth and organization connectionsverify_domainfirst returns a confirmation request. update_domainsets sender defaults. Live sends requiresendable: true.
onboard_brand workflow lists existing brands, calls create_brand only for a requested new brand, then polls get_brand with the returned brandId as brand_id until ready is true (and reports a failed extraction) before following configure_brand.
Brand connections configure their selected brand. To extract a different brand, reconnect with organization scope. Website extraction creates a new brand; it does not re-extract an existing one. Brand logos and transactional domain setup are managed in the app. Brand Identity and Verify Your Sending Domain cover the app steps.
Launch a Campaign
launch_email_campaign:
create_emailand, if needed,edit_email. Pollget_emailwhen generation is still running.send_emailwith theemailId, asubject,test: trueand your own address asto. OmittingdomainIduses Brew’s test sender. Check the received email; acceptance by the send tool does not prove inbox delivery.list_domainswithsendableOnly: trueandsendingPurpose: "marketing"; choose the intended sender.list_audiencesto choose an opted-in audience. Include["count"]with itsaudienceIdto review membership.- On OAuth or an organization connection, call
send_emailwithemailId,subject,audienceId,domainId, and anidempotency_key. - Show the returned confirmation preview. After approval, repeat the exact call with
confirmed: trueand itsconfirmation_id. get_email_analyticswithreport: { kind: "sends", sendId }to follow the send.
scheduledAt for a future send. Keep the same retry key for the same intended action.
Brand API-key connections execute directly, so review the target before the first live call.
The confirmation contract owns the full behavior.
Build a Segment and Send
build_segment_and_send:
search_contactsandlist_contact_fieldsto inspect the available fields.create_audiencewith a name andfilters: { filters: [...], logicalOperator: "and" }.- Review the returned member count, then follow the send workflow above.
type: "date". Create Audiences owns filter semantics.
Import or Update Contacts Before Segmenting
import_contacts (JSON rows) and import_contacts_csv (CSV text) add missing contacts and update existing ones, up to 1,000 rows per call; inspect row errors and retry only the failed rows after fixing them. Each call is one batch in Import History: pass fileName to name it, and filter on the returned importId to list its contacts (each keeps it until a later import touches that contact). update_contact changes one existing contact; a missing contact is an error there.
Register missing custom fields with create_contact_field first, then use their declared types. Import only people who opted in and pass consent (usually { "source": "import" }); an update does not restore an unsubscribed contact’s consent.
Set Up an Automation
set_up_automation:
save_triggerto define the event contract; keep thetriggerEventId.create_emailandget_emailfor ready designs. Pick a verified domain withlist_domains. Each send node insave_automationneedsemailId,emailVersionId,domainId, andsubject.test_automationwith theautomationIdand a samplepayloadcontainingemailand values for every required trigger and template field. OmittestRecipientto exercise the flow without sending mail. A no-delivery test still needs recipient and content values to traverse send nodes.- Inspect each returned run with
list_automation_runsusingrun: { kind: "execution", automationRunId, include: ["logs"] }. Fix failures and cover branches before publishing withsave_automationandpublished: true. Check the returnedisLiveandliveVersion. check_triggerto verify readiness;fire_trigger_eventstarts live runs.list_automation_runswithrun: { kind: "execution", automationId }to monitor them.
testRecipient, the test delivers email to that address.
Use the tool schemas for graph inputs and test scenarios.
Run an Automation for an Audience
run_audience_automation guides a one-shot launch:
- Choose a saved audience and read its current count and build readiness with
list_audiences. - Reuse a suitable graph with
get_automation, or save a draft whose trigger config hasmode: "manualAudience"andaudienceId. Omit the top-leveltriggerEventId; pin each send node’s email version and verified domain. test_automationwith theautomationIdand a samplepayloadcontainingemailand values for every required template or condition field. OmittestRecipientand inspect execution logs as above. A manual-audience launch uses the saved graph and does not require event-style publishing.- Call
run_automationwithdryRun: trueto review the recipient count, send-node count, and exclusion warnings. - After approval, launch without
dryRun, using oneidempotency_keyand the confirmation flow when required. A retry uses the same key and unchanged arguments. - Follow the returned
audienceRunIdwithlist_automation_runsusingrun: { kind: "audience", audienceRunId }. Usepause_audience_run,resume_audience_run, orcancel_audience_runwhen requested. Cancelling cannot undo already-delivered email.
Wire a Trigger from Code
wire_trigger_from_code validates a trigger’s payload and integrates the fire into your codebase. Production code fires over the REST API, not MCP. For the steps, call get_brew_capabilities with topic: "automation".
Analyze Performance
analyze_campaign_performance uses get_email_analytics with report.kind set to overview, sends, or events.
Pass a sendId with sends for one delivery job. Use list_automations with analytics: {} for automation performance.
Personalize with a CRM MCP
personalize_with_crm enriches contacts who already opted in:
- Read their context from your CRM MCP.
- Use
create_contact_fieldfor missing attributes, thenupdate_contactwith itsfieldsmap. - Build an audience, create its email, and follow the send workflow.
- Read the results and refine the segment.
Improve Deliverability
improve_deliverability diagnoses domain and delivery problems. For the steps, call get_brew_capabilities with topic: "domains".
Report an MCP Issue
report_mcp_issue files one report per failed call through report_tool_issue, and returns a flareId Brew support can look up. It includes the tool that failed, its status and error code, a Brew request id if you have one, and a short summary of what went wrong.
It never includes conversation text, secrets, or names, addresses, or recipient lists. Product feedback goes to submit_feedback instead.
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.
Ask ChatGPT or Claude
Click here to open the Copy page menu at the top of this page, then send the page to ChatGPT, Claude, or your editor.