Skip to main content
The Brew MCP server exposes customer tasks, not one tool per HTTP route. Some tools compose several Public API v1 operations (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 all four MCP annotations as booleans: readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, shown as the catalog’s Read-only, Destructive, Idempotent and Open world columns. A write that overwrites, unsubscribes, or sends is marked destructive. 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

Email

Automations

Contacts and audiences

Domains

Brand

Images and media

Account and discovery

Resources

Attach a resource to give your agent context before it calls tools. Each resource uses the connection’s permissions. Brand context resources are available on brand connections; organization connections offer the public gallery resources and can request brand context through tools with brand_id. brew://brand returns the brand’s saved identity (name, tagline, description, links) with emailDesign, imageStyle, and logos. For the same context through a tool, use get_brand({ include: ["emailDesign", "imageStyle", "logos"] }). A plain get_brand already returns the identity.

Conventions

response_format

Only two tools take response_format, because only their results come in two shapes. Every other tool returns one shape and refuses the field as an invalid argument. The HTTP API, SDK, and CLI always return the full contact row. Every result carries its record in structuredContent, and every tool publishes that record’s shape 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: ["emailDesign", "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, deleting contacts or a contact field, and verifying a domain that has campaigns held on it. After the user approves, the same call with confirmed: true and the request’s confirmation_id runs it. See Confirmation.

Limit Errors

When a call hits a plan limit (INSUFFICIENT_CREDITS, SEND_QUOTA_EXCEEDED, BRAND_LIMIT_REACHED, or an audience run held at the send allowance), the MCP error states the limit and when it resets. It does not suggest upgrading. get_usage shows the limit, the balance, and the reset date (period.end). The brand limit does not reset; deleting an unused brand frees a slot. The HTTP API keeps its own suggestion text.

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_LARGE with no rows and names what to lower (the limit, or an include expansion). Rows are never trimmed behind a cursor. list_insights is the one exception: it trims instead of refusing.
  • List pages are smaller than the HTTP API’s, and each tool’s limit states its bounds. MCP Page Sizes owns the numbers and the list_insights trimming rule.
  • 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 returns RESPONSE_TOO_LARGE too.
  • A write always returns its outcome. An oversized result is compacted in place (long strings and arrays shortened), keeping every field’s type.

Email Language

Every design carries a lang: the language its copy is written in, as an ISO 639-1 code or zh-Hans / zh-Hant. Brew reads it after each content change unless a caller set it, and renders it as the HTML document’s lang (and dir for right-to-left languages) on every send and export, and in the HTML get_email returns.
  • get_email returns lang on the design once Brew has read it.
  • create_email accepts lang to name the language up front. Omit it and Brew detects it from the finished body.
  • update_email_metadata accepts lang to set or correct it. Like the other metadata fields it is free and creates no version. A value you set is kept: Brew stops re-detecting it after later edits. Pass lang: null to clear it, and Brew reads the language from the email again.

Chat Artifacts and Feedback

list_chats returns chat titles, links and timestamps. Select a chat and use get_chat_artifacts for its referenced email designs, automations and triggers. These tools do not return previous messages, conversation snippets, channel context or the model used in the chat. import_contacts (JSON rows) and import_contacts_csv (CSV text) create missing contacts, subscribed unless a row opts out, and update existing ones. Both take consent, validate and fileName, record the batch in Import History, and return its importId. onConflict: "skip" leaves existing contacts unchanged, and dryRun: true returns the same counts without writing anything. update_contact updates one existing contact and cannot create one. Contact field values must match the declared field type; use list_contact_fields to read those definitions. When you ask to send feedback, submit_feedback takes your message, an optional title and an issue type. Brew redacts secrets and addresses and sends those fields to Notra’s Brew inbox. report_tool_issue records a requested technical issue for Brew support and returns a support reference. Neither automatically attaches conversation history. Ordinary tool results keep diagnostic identifiers on the server. Read our Privacy Policy for data recipients, retention, public asset handling and deletion controls.

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:

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.