# The agent construction kit

Build an agent for MeetingBurner meetings from parts: a name, a face, a voice, a brain, skills, a personality and permissions. Every part has a price a minute shown beside it, a part you bring on your own key adds nothing, and a token is a cent. The same build can be made on the Agents page or by the call at the end of this page.

What the room always shows, whatever is built: the agent's name, whose it is, and the AI marker. Nothing an agent is given here lets it hide that it is an AI, talk over a person, or send, change or spend anything its owner did not allow.

This page as markdown: https://meetingburner.com/developers/agent-kit.md

## Faces

`face` takes `{ "provider": ..., "id": ... }`. A face needs a voice: picking one with no voice gives the agent Heart. No face uploads; photoreal is our own Cynthia.

| provider | id | Name | State | Tokens a minute |
|---|---|---|---|---|
| `none` | — | No face | live | 0 |
| `cartoon` | `cartoon-1` | Cartoon Cynthia | live | +2 |
| `cartoon` | `cartoon-2` | Ben | coming | +2 |
| `cartoon` | `cartoon-3` | Helen | coming | +2 |
| `cartoon` | `cartoon-4` | Walter | coming | +2 |
| `cartoon` | `cartoon-5` | Tessa | coming | +2 |
| `cartoon` | `cartoon-6` | Owen | coming | +2 |
| `cartoon` | `cartoon-7` | Iris | coming | +2 |
| `cartoon` | `cartoon-8` | Sam | coming | +2 |
| `cartoon` | `cartoon-9` | Josie | coming | +2 |
| `photoreal` | `cynthia-scene` | Photoreal Cynthia | held, John first | +6 (proposed) |
| `anam` | — | Anam face, your key | your key | 0 |
| `outside` | — | Bring your own complete avatar | live | 0 |

## Voices

`voice` takes `{ "provider": ..., "id": ... }`. `none` is chat only: a flat 1 a minute and no face. `byo_realtime` is speech to speech and fills the brain too. Anam's voice goes with an Anam face.

| provider | id | Name | State | Tokens a minute |
|---|---|---|---|---|
| `kokoro` | `af_heart` | Heart | live | +1 |
| `kokoro` | `am_fenrir` | Fenrir | coming | +1 |
| `kokoro` | `bf_emma` | Emma | coming | +1 |
| `kokoro` | `bm_george` | George | coming | +1 |
| `kokoro` | `af_bella` | Bella | coming | +1 |
| `kokoro` | `am_michael` | Michael | coming | +1 |
| `kokoro` | `af_sarah` | Sarah | coming | +1 |
| `kokoro` | `am_puck` | Puck | coming | +1 |
| `kokoro` | `af_aoede` | Aoede | coming | +1 |
| `assemblyai_tts` | `tts-1` | Premium voice | coming | +2 (proposed) |
| `openai_tts` | `marin` | Marin, your OpenAI key | your key | 0 |
| `anam` | — | Anam’s voice | your key | 0 |
| `byo_realtime` | — | Speech to speech, your key | your key | 0 |
| `none` | — | No voice | live | flat 1 |

## Brains

`brain` takes `{ "provider", "tier", "key_vendor", "key_id", "bridge_id" }`. Never a model name: a tier for ours, a vendor for yours. A key is stored once through `POST /api/account/provider-keys` and only its id and first characters ever come back; the agent row names the id, never the key.

| provider | config | Name | State | Tokens a minute |
|---|---|---|---|---|
| `ours` | tier `fast` | Cynthia’s mind, fast | live | +1 |
| `ours` | tier `big` | Cynthia’s mind, big | live | +1 |
| `byo_key` | key_vendor `anthropic`, key_id | Anthropic, your key | your key | 0 |
| `byo_key` | key_vendor `openai`, key_id | OpenAI, your key | your key | 0 |
| `byo_key` | key_vendor `google`, key_id | Google, your key | your key | 0 |
| `byo_key` | key_vendor `xai`, key_id | xAI, your key | your key | 0 |
| `bridge` | bridge_id `muse` | Muse | coming | 0 |
| `bridge` | bridge_id `dots` | dots | coming | 0 |
| `bridge` | bridge_id `grokbot` | GrokBot | coming | 0 |
| `bridge` | bridge_id `claude` | Claude, over MCP | coming | 0 |

## Skills

`skills.built_in` is a list of ids. `skills.connections` names each connected MCP server with `allowed_tools` (every tool is opted in; an empty list means none) and `writes_enabled`. A tool that changes, sends or spends stays off until writes are enabled on that connection, and then still waits for the owner's spoken Go unless `action_tier` is `act`.

| id | Name | Does | What it is |
|---|---|---|---|
| `catch_up` | Catch up | Reads | Reads the transcript so far and answers "what did I miss". |
| `meeting_control` | Meeting control | Changes things | Mute, admit, remove, end: the host’s buttons, every press published to the room. |
| `people_notes` | People notes | Changes things | Remembers what you tell it about the people you meet. |
| `meeting_history` | Meeting history | Reads | Answers from your past meetings, with the line it found. |
| `present_deck` | Present a deck | Changes things | Writes a few slides and shares its screen. Anyone can say Stop. |
| `magic_trick` | Magic trick | Reads | A party piece when someone asks for one. |
| `sing` | Sing (Suno) | Spends money | Writes and plays a song on your own Suno credits. |

## Personality and permissions

`personality`: up to 1,500 characters, read by the brain every turn UNDER the house rules. It cannot lift a ban, hide the AI marker or grant a power the permissions below do not.

`permissions`:

- `speak_mode`, when it speaks up:
- `when_addressed`: She answers when someone says her name.
- `direct_questions`: Her name, and a question that follows straight on from what she just said.
- `joins_in`: Also answers an open question to the room that nobody else was asked. She does not comment on talk that is not a question.
- `interrupts_per_10_min`: 0 to 3 unprompted interjections in ten minutes; default 1. Anyone talking over the agent stops it.
- `may_present`: may share a screen and walk a deck; anyone can say Stop. Never for an outside agent yet.
- `action_tier`: `read` (default), `act_with_go` (acts after the owner's spoken Go), or `act` (owner only, never for a tool its server marks destructive).
- `answer_mode`: `safe` (an answer from a connected tool goes to the owner first) or `bold` (spoken at once).
- `cost_cap_tokens_per_meeting`: default 1,200; at the cap the agent drops to chat and says so.

`is_stopped`: the kill switch. A stopped agent leaves every meeting and cannot be added until its owner turns it back on.

The account sets the ceiling; an agent may tighten it, never loosen it; the host of a room can always turn an agent down or send it home.

## Price

The list price: a speaking agent pays a base fee of 6 tokens a minute (ears, transcription, the seat and video) plus each part we run, from the tables above. A part you bring adds 0. Chat only is a flat 1. A song (Suno) is paid per song on your own credits. "Proposed" marks a price awaiting a ruling.

**What the meter bills today:** Until the per-part meter ships, every speaking agent is billed 10 tokens a minute, whatever its parts; chat only is 1 token a minute either way. The list price applies once the per-part meter ships; the presets table shows both.

## Presets

Start from one and edit. Each is a whole definition; the Agents page fills the form from it in one click. "List" is the per-part price; "Today" is what the meter bills until the per-part meter ships.

| id | Name | What it is | List, tokens a minute | Today | Speaks |
|---|---|---|---|---|---|
| `cynthia` | Cynthia | Our cartoon, our voice, our brain. 10 a minute. | 10 | 10 | It speaks direct questions and interrupts at most once in ten minutes. Anyone talking over it stops it. |
| `photoreal-cynthia` | Photoreal Cynthia | The same agent with our photoreal face. | 14 | 10 | It speaks direct questions and interrupts at most once in ten minutes. Anyone talking over it stops it. |
| `anam-your-key` | Anam face, your tools | An Anam face on your key, your MCP tools, read with a spoken Go. | 7 | 10 | It speaks direct questions and interrupts at most once in ten minutes. Anyone talking over it stops it. |
| `grok-whole-agent` | Grok voice, whole agent | Your complete agent over LiveKit: its video, voice and brain. 6 a minute. | 6 | 10 | It speaks direct questions and interrupts at most once in ten minutes. Anyone talking over it stops it. |
| `claude-in-chat` | Claude, in the chat | No face, no voice. Claude reads and types through the hosted MCP door. 1 a minute. | 1 | 1 | It types in the chat and never speaks. |

## The call

Opens when the kit’s store lands. The shape is final; the door is not yet open.

**Live today:** `POST /api/v1/bots/join` brings a complete outside agent into a meeting (https://meetingburner.com/developers/livekit-agents.md); `POST /api/account/provider-keys` stores a key, answering with an id and a prefix only; the hosted MCP door (https://meetingburner.com/api-docs.md) for an account with the door open.

**The kit's contract:** `POST /api/agents` with your API key, body as below, answers `{ "id": "..." }`. The same build as an MCP tool call is `create_agent` on the hosted door. The Cynthia preset as the body:

```bash
curl -X POST https://meetingburner.com/api/agents \
  -H "X-API-Key: $MEETINGBURNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Cynthia",
  "description": "The agent built into MeetingBurner. Listens, answers when asked, keeps up with the meeting.",
  "personality": "Warm, brief, direct. Answers the question that was asked and then stops.",
  "face": {
    "provider": "cartoon",
    "id": "cartoon-1"
  },
  "voice": {
    "provider": "kokoro",
    "id": "af_heart"
  },
  "brain": {
    "provider": "ours",
    "tier": "fast",
    "key_vendor": null,
    "key_id": null,
    "bridge_id": null
  },
  "skills": {
    "built_in": [
      "meeting_control",
      "catch_up",
      "people_notes",
      "magic_trick",
      "meeting_history"
    ],
    "connections": []
  },
  "permissions": {
    "speak_mode": "direct_questions",
    "interrupts_per_10_min": 1,
    "may_present": true,
    "action_tier": "read",
    "answer_mode": "safe",
    "cost_cap_tokens_per_meeting": 1200
  },
  "is_stopped": false
}'
```

As an MCP call:

```json
{
  "tool": "create_agent",
  "arguments": {
    "name": "Cynthia",
    "description": "The agent built into MeetingBurner. Listens, answers when asked, keeps up with the meeting.",
    "personality": "Warm, brief, direct. Answers the question that was asked and then stops.",
    "face": {
      "provider": "cartoon",
      "id": "cartoon-1"
    },
    "voice": {
      "provider": "kokoro",
      "id": "af_heart"
    },
    "brain": {
      "provider": "ours",
      "tier": "fast",
      "key_vendor": null,
      "key_id": null,
      "bridge_id": null
    },
    "skills": {
      "built_in": [
        "meeting_control",
        "catch_up",
        "people_notes",
        "magic_trick",
        "meeting_history"
      ],
      "connections": []
    },
    "permissions": {
      "speak_mode": "direct_questions",
      "interrupts_per_10_min": 1,
      "may_present": true,
      "action_tier": "read",
      "answer_mode": "safe",
      "cost_cap_tokens_per_meeting": 1200
    },
    "is_stopped": false
  }
}
```
