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/mcpYou'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_workflowa brief (addtemplateIdsto pin exact templates instead of letting braaand match), or author a custom pipeline withbuild_pipeline, and get back a share-ready review board. See Campaigns. - Bring images in —
upload_assettakes a hostedurl(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_creativesreturns compact summary rows (displayName — the human-facing label, headline, status, thumbnail) and itsquerysearches headlines and copy, not just names;find_entitysearches 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_idturns any of them (or a pastedbraaand.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_peopleseeds a record per person from the library's tagged portraits,create_person/update_personmaintain them, andbind_site_peoplebinds 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_commentsfor 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_statusreports whether (and where)braaand synclast 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_templatesandinstantiate_templateturn catalog layouts into editable brand templates.create_templatestarts a brand template from a blank document or supplied JSON.update_templateandupdate_template_elementtune brand templates.create_creative,update_creative_element,render, andrender_batchproduce final creative assets.render_motionexports a creative's motion — the clip — as an mp4 per format (a background job; pollget_motion_renderuntilterminal, 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_elementmakes 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: pollget_video_jobuntilterminal; the clip lands on the element per format and plays in every animated output. Credit-metered per second of video.convert_imageis the whole deterministic image editor as one tool, and it costs no credits. Itsopobject takes the same vocabulary the Image Tool's controls write: output (format,quality,optimize), size (maxDimto cap a longest edge,resizefor exact dimensions withcover/contain/inside), geometry (crop,flipH,flipV,rotate,trim), tone (brightness,contrast,saturation,sharpen,blur) and transparency (removeColorto key a flat color out,maskEditto erase or fill a region you name,flattento composite alpha away). Point it at an image already in a brand withsourceAssetIdso nothing large travels through the conversation, or pass aurl; setsaveToBrandIdto add the result to the library. For batch-converting a local folder, thebraaand images convertCLI keeps the file bytes out of the chat entirely.maskEditis the eraser and the redaction bar. Give itmode: "erase"to punch a region out to real transparency (the output switches to an alpha capable format automatically), ormode: "fill"with acolorto cover a watermark or black out a detail. Name the region withrect(left,top,width,heightin source pixels, the same space ascrop), addinvert: truefor "keep only this" (the canvas keeps its size, so usecropwhen you want it smaller), andfeatherto 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_imagecreates a new image from a rich text prompt (AI, costs credits — roughly 2/18/71 at low/medium/high quality, 15-60s). SetsaveToBrandIdto land it in the brand's library taggedgenerated / ai / agentand analyzed for POI; omit for a short-lived download URL.edit_imagetransforms 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 withconvert_image.remove_backgroundcuts the subject out of a photograph and returns a real alpha channel (AI, costs credits). Passsubjectwhen more than one thing could plausibly be the subject. Finish withconvert_imageop.trimto tighten the canvas to the artwork, orop.flattento drop the cutout onto a solid color.async: trueis the right default when you are saving to a library, andget_image_jobis 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: trueongenerate_image/edit_image/remove_backgroundhands back ajobIdbefore anything is spent and runs the work on a detached worker that outlives your connection. Pollget_image_job({ brandId, jobId })every 5-10 seconds untilterminalis true; the finished image arrives asassetCard, a failure aserrorCodeanderror, and a job whose worker died is aged to failed after about eight minutes soterminalalways arrives. Async needssaveToBrandId(a job's result is an asset) and a source the worker can re-resolve later —sourceAssetIdorurl, neverbase64.- Or skip polling entirely: pass
callbackUrland 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 }, wherejobis the snapshot andjob.assetCardis 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: recomputesha256=hex(hmac_sha256(secret, "{timestamp}.{rawBody}"))over the raw body usingX-Braaand-Timestamp, compare it toX-Braaand-Signaturein 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 fromget_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 onX-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, readjob.webhookon the snapshot to see what happened to a delivery, andPOST /api/brands/{brandId}/images/jobs/{jobId}/redeliverto replay one with the same delivery id. upload_assettakesasync: truetoo, 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 ananalyzeJobIdthe sameget_image_jobpolls. 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.