---
title: brand_update
description: Edit a brand's context, guarded by base_revision so a concurrent change can't be silently overwritten.
---

Updates a **Brand**. Only the fields you pass are changed, and the whole call is guarded by `base_revision` — the revision you last read via [`brand_get`](/mcp/tools/brand-get).

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `brand_name` | `string` | yes | The current slug identifying which brand to update. |
| `base_revision` | `number` | yes | The revision you last read. Guards concurrent edits. |
| `name` | `string` | no | New display name. |
| `description` | `string` | no | New one-line summary. |
| `identity` | `string \| null` | no | New positioning; `null` clears the section. |
| `voice` | `string \| null` | no | New tone of voice; `null` clears the section. |
| `guidelines` | `string \| null` | no | New do's and don'ts; `null` clears the section. |
| `messaging` | `string \| null` | no | New key messages; `null` clears the section. |
| `website_url` | `string \| null` | no | The brand's public site. `http`/`https`, up to 2048 characters; `null` clears it. |
| `logo_document_id` | `string \| null` | no | Nominate a document as the logo; `null` clears it. |
| `slug` | `string` | no | New handle — a deliberate rename. |

## Omitting a section is not the same as clearing it

This is the distinction worth internalising:

- **Omit** a section and it is left exactly as it was.
- Pass **`null`** and it is erased.

Without that split, editing only the voice would silently wipe the identity — so "I didn't mention it" and "delete it" have to be different signals.

`website_url` follows the same rule, and correcting one is safe: **changing a brand's website triggers nothing**. It is a locator, like the slug — the URL is stored, the site is not read.

## Output

The updated brand, with `revision` incremented.

## Example

> _"Acme's guidelines should say we never make medical claims."_

```ts
brand_update({
  brand_name: 'acme-running',
  base_revision: 3,
  guidelines: 'Never make medical or performance-injury claims.',
});
// → { slug: 'acme-running', revision: 4, … }  — voice and identity untouched
```

:::warning[If the revision doesn't match]

The call is rejected and nothing changes — someone edited the brand since you read it. Re-fetch with [`brand_get`](/mcp/tools/brand-get) and retry with the new `revision`, so you're editing what's actually there.

:::

Requires the `brand:write` scope.
