---
title: persona_get
description: 'Read one persona of a brand: who the brand talks to, and the words that this audience uses.'
---

Ask for work for one audience of a brand. The agent reads that persona in full.

> "Write three headlines for Acme, for the Loyalists."

The agent calls `persona_get` for the Loyalists of Acme. It reads their frictions and their words together with the voice of the brand. You then get headlines that answer a real objection in the words of the reader.

The job guide [Describe a brand](/mcp/tools/describe-a-brand) shows each step of the job.

## Reference

Fetch one of a brand's personas — an audience archetype describing who the brand talks to. Returns the full context (profile, motivations, frictions, language) and the age range. Unwritten sections are null. Echo the revision back as base_revision when updating. Personas are listed inside brand_get; there is no separate list tool.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `brand_name` | string | yes | The slug of the brand that owns the persona. |
| `persona_name` | string | yes | The persona slug. Unique within its brand, so it must be paired with brand_name. |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `persona` | object | yes | The persona in full. |
| `persona.ageMax` | integer, 0 to 120 or null | yes | The highest age of the audience. `null` when the range has no upper bound. |
| `persona.ageMin` | integer, 0 to 120 or null | yes | The lowest age of the audience. `null` when the range has no lower bound. |
| `persona.brandId` | string | yes | The brand that owns the persona (`brd_…`). |
| `persona.createdAt` | number | yes | Milliseconds since the Unix epoch, in UTC. |
| `persona.createdBy` | string | yes | The user who created the record (`usr_…`). |
| `persona.description` | string | yes | One line about the persona. An agent picks a persona on it. |
| `persona.frictions` | string or null | yes | What stops the audience: objections, doubts, perceived risk. Markdown. `null` when the section is not written. |
| `persona.id` | string | yes | The id of the persona (`psn_…`). |
| `persona.language` | string or null | yes | The words that the audience uses for the problem. It is not a locale. Markdown. `null` when the section is not written. |
| `persona.motivations` | string or null | yes | What the audience wants: jobs to be done, triggers, outcomes. Markdown. `null` when the section is not written. |
| `persona.name` | string | yes | The display name. |
| `persona.profile` | string or null | yes | Who the audience is: life stage, situation, role. Markdown. `null` when the section is not written. |
| `persona.revision` | number | yes | The version of the record. Each change adds 1. Send it as `base_revision` to update or delete the record. |
| `persona.slug` | string | yes | The handle of the persona. It is unique in its brand, not in the organization. The tools take it as `persona_name`. |
| `persona.updatedAt` | number or null | yes | Milliseconds since the Unix epoch, in UTC. `null` until the first change. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `brand:read`. [Auth & scopes](/mcp/auth) 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.

- **Read-only.** The tool changes nothing.
- **Closed world.** The tool reads and writes the data of AdCrunch only.

### Example

The arguments:

```json
{
  "brand_name": "acme",
  "persona_name": "loyalists"
}
```

The result, in `structuredContent`:

```json
{
  "persona": {
    "ageMax": 45,
    "ageMin": 28,
    "brandId": "brd_6a9c33",
    "createdAt": 1790000000000,
    "createdBy": "usr_4d8b12",
    "description": "Runners who already own a pair, and who buy the next one without looking at another brand.",
    "frictions": "They fear the new model is worse than the one they know. A change of sole or of last reads to them as a risk, not as progress.",
    "language": "They say \"my daily trainer\" and \"I got 900 out of the last pair\". They ask about the drop and the stack, never about the technology.",
    "motivations": "They want the same shoe again, and proof that it is the same. A resole keeps them running on a pair they trust.",
    "profile": "Runners of 40 to 80 kilometres a week, ten years in, with one pair in rotation and one on the shelf.",
    "id": "psn_8c4a20",
    "name": "Loyalists",
    "revision": 2,
    "slug": "loyalists",
    "updatedAt": 1790086400000
  }
}
```
