persona_get
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 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 describes the shape of a failed call.
not_foundforbiddeninvalid_requestinternal_error
Scope
The token must hold brand:read. 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.
- Read-only. The tool changes nothing.
- Closed world. The tool reads and writes the data of AdCrunch only.
Example
The arguments:
{
"brand_name": "acme",
"persona_name": "loyalists"
}
The result, in structuredContent:
{
"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
}
}