Agents

Connect an AI client

Add braaand to Claude, ChatGPT, Cursor, or Claude Code.

braaand connects to the AI apps you already use, so your agent can read your brand and make things with it. There's nothing to install: you add one connector and sign in.

Add the connector

In your app's connector or integration settings, add:

https://mcp.braaand.ai/mcp

You'll sign in once in your browser, and that's it. This works in:

  • Claude (desktop and web)
  • Claude Code
  • ChatGPT
  • Cursor

The exact spot to paste the link is a little different in each app, but it's always under connectors, integrations, or MCP settings.

What your agent can do once connected

  • Set up a brand from a manual and assets in one go.
  • Pick a system template and instantiate it into your brand.
  • Create client-specific brand templates from scratch when the catalog is not enough.
  • Make and render creatives, getting the images back right in the chat.
  • Run whole campaigns — hand start_workflow a brief (add templateIds to pin exact templates instead of letting braaand match), or author a custom pipeline with build_pipeline, and get back a share-ready review board. See Campaigns.
  • Bring images in — upload_asset takes a hosted url (fetched server-side) or base64, and place them into a creative's image slot by the asset's library URL.
  • Convert and compress images and save them into a brand's library.
  • Find things by what they say — list_creatives returns compact summary rows (displayName — the human-facing label, headline, status, thumbnail) and its query searches headlines and copy, not just names; find_entity searches creatives, templates, boards, collections and assets in one go.
  • Reference things by id, unambiguously — every entity has one canonical id (crv_… creatives, cmp_… runs, brd_… boards, col_… collections, set_… sets, ptl_… recipes, plus brand/template/asset ids), copyable from every sidebar in the app. resolve_id turns any of them (or a pasted braaand.ai/r/<id> link) into its kind, brand, name, and app URL — and the same /r/<id> link opens the right page for any signed-in teammate. Ids work as references in the palette chat and in Slack mentions too.
  • Keep the brand's people in one place — sync_people seeds a record per person from the library's tagged portraits, create_person / update_person maintain them, and bind_site_people binds a site's contact cards and team lists to them, so a changed phone number moves every page. See People.
  • Close the review loop — share a board, poll list_board_comments for feedback (share-link visitors can comment without an account), edit, re-render, and clear handled notes.
  • Read your brand so everything it writes and designs stays on brand.
  • Find your local brand folder — sync_status reports whether (and where) braaand sync last mirrored your brands to disk, and whether that copy is stale. See The synced brand folder.

Renders and edits come back instantly. Anything that needs your AI to think, like writing copy or choosing images, uses your plan's credits. See AI credits.

Template work

Agents work with brand-owned templates. They can instantiate a polished system template into your brand, create a new brand template from scratch, and then tune it by editing the whole template or patching individual elements.

Useful tools:

  • list_system_templates and instantiate_template turn catalog layouts into editable brand templates.
  • create_template starts a brand template from a blank document or supplied JSON.
  • update_template and update_template_element tune brand templates.
  • create_creative, update_creative_element, render, and render_batch produce final creative assets.
  • render_motion exports a creative's motion — the clip — as an mp4 per format (a background job; poll get_motion_render until terminal, the clips also land on the creative as takes), as an animated GIF per format (output: "gif" — a file on the job, never a take), or as one animated HTML5 page. No credits.
  • animate_element makes one image element move — the picture itself, generated from its own crop with Seedance by default — while copy, logo and buttons stay stills on top. A background job: poll get_video_job until terminal; the clip lands on the element per format and plays in every animated output. Credit-metered per second of video.
  • convert_image is the whole deterministic image editor as one tool, and it costs no credits. Its op object takes the same vocabulary the Image Tool's controls write: output (format, quality, optimize), size (maxDim to cap a longest edge, resize for exact dimensions with cover/contain/inside), geometry (crop, flipH, flipV, rotate, trim), tone (brightness, contrast, saturation, sharpen, blur) and transparency (removeColor to key a flat color out, maskEdit to erase or fill a region you name, flatten to composite alpha away). Point it at an image already in a brand with sourceAssetId so nothing large travels through the conversation, or pass a url; set saveToBrandId to add the result to the library. For batch-converting a local folder, the braaand images convert CLI keeps the file bytes out of the chat entirely.
  • maskEdit is the eraser and the redaction bar. Give it mode: "erase" to punch a region out to real transparency (the output switches to an alpha capable format automatically), or mode: "fill" with a color to cover a watermark or black out a detail. Name the region with rect (left, top, width, height in source pixels, the same space as crop), add invert: true for "keep only this" (the canvas keeps its size, so use crop when you want it smaller), and feather to soften the edge by that many pixels. It runs before crop and rotate, so the numbers mean what you measured on the source image.
  • generate_image creates a new image from a rich text prompt (AI, costs credits — roughly 2/18/71 at low/medium/high quality, 15-60s). Set saveToBrandId to land it in the brand's library tagged generated / ai / agent and analyzed for POI; omit for a short-lived download URL. edit_image transforms an existing image (sourceAssetId/url/base64) guided by a prompt and an optional mask PNG whose transparent pixels mark the edit region (guidance, not a hard clip). For exact pixel dims, generate at the closest aspect and finish with convert_image.
  • remove_background cuts the subject out of a photograph and returns a real alpha channel (AI, costs credits). Pass subject when more than one thing could plausibly be the subject. Finish with convert_image op.trim to tighten the canvas to the artwork, or op.flatten to drop the cutout onto a solid color.
  • async: true is the right default when you are saving to a library, and get_image_job is how you collect the result. The vendor call is 15-60s and saving to a brand adds the ~75s POI/metadata vision pass on top, so the recommended path routinely runs 90 seconds to three minutes — longer than many clients will hold a call open. A timeout after the vendor has answered is the worst case there is: the credits are spent, the asset may exist, and you have no id to find it with. async: true on generate_image / edit_image / remove_background hands back a jobId before anything is spent and runs the work on a detached worker that outlives your connection. Poll get_image_job({ brandId, jobId }) every 5-10 seconds until terminal is true; the finished image arrives as assetCard, a failure as errorCode and error, and a job whose worker died is aged to failed after about eight minutes so terminal always arrives. Async needs saveToBrandId (a job's result is an asset) and a source the worker can re-resolve later — sourceAssetId or url, never base64.
  • Or skip polling entirely: pass callbackUrl and we POST you the result. Available on every async path, https only. When the job settles we POST the same payload shape the poll returns — { event, deliveryId, attempt, sentAt, job }, where job is the snapshot and job.assetCard is the finished image — and we do it for failures as well as successes, because a caller who only hears about successes has to keep polling for the failures anyway. Verify every delivery: recompute sha256=hex(hmac_sha256(secret, "{timestamp}.{rawBody}")) over the raw body using X-Braaand-Timestamp, compare it to X-Braaand-Signature in constant time, and reject a timestamp older than five minutes — signing the body alone would let a captured delivery be replayed forever. The secret comes from get_webhook_secret, is per-brand, is derived rather than stored, and needs admin on the brand because whoever holds it can forge a delivery. Delivery is at-least-once, so dedupe on X-Braaand-Delivery, which is stable across every retry of one event. Failures retry immediately and then at 30s, 2m, 10m and 30m for network errors, timeouts, 408, 429 and 5xx; any other 4xx reads as your receiver rejecting the delivery and is not retried. The poll stays authoritative — that ladder can genuinely exhaust against a receiver that stays down, so treat the webhook as a latency optimization, read job.webhook on the snapshot to see what happened to a delivery, and POST /api/brands/{brandId}/images/jobs/{jobId}/redeliver to replay one with the same delivery id.
  • upload_asset takes async: true too, for the same reason: the ingest analyze pass is that same ~75s. The asset comes back immediately and fully usable — id, URL, dimensions, bytes stored — with only the focal point and descriptive tags still to land, on an analyzeJobId the same get_image_job polls. Poll it only if you need POI before placing the image in a template slot. It is a no-op for files nothing analyzes anyway (fonts, PDFs, SVGs, logos), so a bulk import can pass it unconditionally.

Three ways to name a region, and picking the right one is most of the job. A flat color you can point at is convert_image with op.removeColor: exact, instant, free, and it unmixes the color out of the edge pixels so the cutout has no fringe. An explicit rectangle is convert_image with op.maskEdit: also exact, instant and free. A photographic edge, where no color test could separate subject from background, is the only case that needs remove_background and its credits.