---
title: persona_update
description: Edit a persona's sections, age range or handle, guarded against overwriting someone else's concurrent change.
---

Updates a **Persona**. Only the fields you pass are changed, and the write is guarded by `base_revision` — read it with [`persona_get`](/mcp/tools/persona-get) first.

## Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `brand_name` | `string` | yes | The slug of the brand that owns the persona. |
| `persona_name` | `string` | yes | The current persona slug. |
| `base_revision` | `integer` | yes | The `revision` you last read. Guards against overwriting a concurrent edit. |
| `name` | `string` | no | New display name. |
| `description` | `string` | no | New one-line summary. |
| `profile` / `motivations` / `frictions` / `language` | `string \| null` | no | New section text; `null` clears it. |
| `age_min` / `age_max` | `integer \| null` | no | New age bound; `null` clears it. |
| `slug` | `string` | no | New handle (a deliberate rename). |

## Omit versus null

The distinction is load-bearing for every nullable field:

- **Omit** a field to leave it exactly as it is.
- Pass **`null`** to clear it.

So editing only `frictions` cannot silently erase `profile`, and clearing `age_max` is how a persona becomes "35 and older".

## Example

```ts
persona_update({
  brand_name: 'acme-running',
  persona_name: 'marathon-maya',
  base_revision: 3,
  language: '“My knees are shot by mile 18” — never “joint fatigue”.',
  age_max: null, // now 30 and older
});
```

:::warning[The age range is checked after your change is applied]

Passing one bound can conflict with the stored other: sending `age_min: 50` against a stored `age_max: 40` is rejected as inverted even though the input alone looks fine. Send both when moving the range across the other bound.

:::

:::info[A stale base_revision is rejected, not merged]

If the persona changed since you read it, the update fails and tells you the current revision. Re-fetch with [`persona_get`](/mcp/tools/persona-get) and decide what to keep — the write is never applied on top of a row you have not seen.

:::

Renaming via `slug` changes the handle: anything referencing the old one, including authored Skills, needs updating.

Requires the `brand:write` scope.
