brand_update
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.
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
nulland 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.”
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
Requires the brand:write scope.
Reference
Update a brand. Pass base_revision (from brand_get) — the update is rejected if the brand changed since you read it. Only the fields you pass are changed; pass null for a context section to clear it. Optionally rename the slug handle.
Input
| Argument | Type | Required | Description |
|---|---|---|---|
base_revision |
integer | yes | The revision you last read via brand_get. Guards against overwriting a concurrent edit. |
brand_name |
string | yes | The current brand slug identifying which brand to update. |
description |
string | no | New one-line summary. |
guidelines |
string or null | no | New do’s and don’ts. Pass null to clear the section. |
identity |
string or null | no | New positioning and mission. Pass null to clear the section. |
logo_document_id |
string or null | no | Nominate one of the brand’s documents as its logo, or null to clear the nomination. Upload the file first with document_create_upload. |
messaging |
string or null | no | New key messages. Pass null to clear the section. |
name |
string | no | New display name. |
slug |
string | no | Optional new slug handle (a deliberate rename); normalized to kebab-case. Callers of the old handle must be updated. |
voice |
string or null | no | New tone of voice. Pass null to clear the section. |
website_url |
string, at most 2048 characters or null | no | The brand’s public site, http or https; null to clear it. Changing it reads nothing — it is a locator, like the slug. |
Failure codes
A failed call has isError set, and structuredContent.error holds one of these codes. Errors describes the shape of a failed call.
not_foundinvalid_sluginvalid_logorevision_mismatchslug_conflictforbiddeninvalid_requestinternal_error
Scope
The token must hold brand:write. Auth & scopes lists each scope.
Annotations
A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.
- Writes. The tool can change data.
- Destructive. The tool can make a change that you cannot undo. A client can ask you to confirm before it calls the tool.
- Not idempotent. A second call with the same arguments can change more.
- Closed world. The tool reads and writes the data of AdCrunch only.