# Tools · Events

> MCP tools for events: listing events and who RSVP'd, creating an event with a ticket (published or as a draft), publishing a draft, editing the date, location, stream and banner, starting and ending the live stream, RSVPing yourself and deleting an event.

The community's calendar: upcoming events and who's going, a new event (online, in person or hybrid) with its ticket on sale, changes to date, location or banner, the live stream and your own RSVP.

Each tool carries a badge: <span class="tool-kind tool-kind-read">Read-only</span> changes nothing, <span class="tool-kind tool-kind-write">Changes</span> creates or changes something right away, and <span class="tool-kind tool-kind-confirm">Asks to confirm</span> only acts after your yes to a summary. See [Money and confirmation](/mcp/dinheiro-e-confirmacao).

## In short

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| [`list_events`](#list-events) | Upcoming, past, your own or all events | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`list_event_attendees`](#list-event-attendees) | Who RSVP'd to an event | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`create_event`](#create-event) | Space, event and the ticket, in one go, published or as a draft | Moderator (with a ticket, admin) | <span class="tool-kind tool-kind-write">Changes</span> |
| [`update_event`](#update-event) | Edits only the fields sent of an event or draft, and the banner | Moderator or finance | <span class="tool-kind tool-kind-write">Changes</span> |
| [`publish_event`](#publish-event) | Publishes a draft, with or without an e-mail notice | Moderator or finance | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`start_live_stream`](#start-live-stream) | Marks the event as live, with the stream link | Moderator or finance | <span class="tool-kind tool-kind-write">Changes</span> |
| [`stop_live_stream`](#stop-live-stream) | Ends the live stream | Moderator or finance | <span class="tool-kind tool-kind-write">Changes</span> |
| [`rsvp_event`](#rsvp-event) | Says whether you're going: going, maybe or not going | Member (not finance) | <span class="tool-kind tool-kind-write">Changes</span> |
| [`delete_event`](#delete-event) | Deletes an event | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`list_event_categories`](#list-event-categories) | The event categories | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`register_member_for_event`](#register-member-for-event) | Registers someone else for an event that is free for them | Moderator | <span class="tool-kind tool-kind-write">Changes</span> |
| [`remove_event_recording`](#remove-event-recording) | Removes an event's hosted recording | Moderator or finance | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

## `list_events`

<span class="tool-kind tool-kind-read">Read-only</span>

**List events.** The community's events. *Minimum role: any.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `filter` | `next`, `past`, `my`, `all` | No | Upcoming (the default), past, the ones you RSVP'd to, or all |
| `space_id` | id | No | Only one events space |
| `search` | text | No | Part of the title |
| `status` | `DRAFT`, `all` | No | Team only: `DRAFT` returns only the drafts, of any date (the app's **Drafts** tab); `all`, drafts and published events. Ignored for other roles: drafts never come back |
| `page`, `limit` | number | No | Pagination |
| `from` and `to` | date (ISO) | No | Together: the events that overlap the period (up to 62 days, `to` inclusive), by start, for a calendar; `filter` `next`/`past` is ignored |
| `undated` | yes or no | No | `true` lists only the events with no date |

With `from`/`to` or `undated`, the answer is `{ items, truncated, undated_count }`: `truncated` says there were more than 300 events in the period, and `undated_count`, how many events have no date.

**Returns:** the events, with id, title, start, end, type (online, in person, hybrid) and location, `status` (`DRAFT` or `PUBLISHED`), `publishedAt`, `updatedAt` and `visibility`.

**Ask like this:** *"What are the upcoming events?"*

Without `space_id`, the tool now lists the events of every Events space. Each event says whether it issues a certificate; owners and admins also see the setting (whether it is on, the template, the text, the workload that will print and the warning for an archived template), and whoever confirmed sees the state of their own certificate.

## `list_event_attendees`

<span class="tool-kind tool-kind-read">Read-only</span>

**Who RSVP'd.** An event's participants. *Minimum role: any.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event_id` | id | Yes | From `list_events` |
| `status` | `going`, `maybe` | No | Only those going, or only those who might go |

**Returns:** the participants, with name and answer.

**Ask like this:** *"How many people confirmed for Thursday's meetup? List the names."*

**Notes:** whoever bought the ticket already shows in this list as **Going**: the purchase confirms attendance.

## `create_event`

<span class="tool-kind tool-kind-write">Changes</span>

**Create event (with optional ticket).** Events space → event → (optional) the ticket, a one-time product that unlocks the space, with stock. *Minimum role: moderator or finance; with a ticket, or when creating the space, admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `title` | text, up to 255 | Yes | |
| `description` | Markdown | No | The event description, in [Markdown](/mcp/ferramentas#markdown-text) |
| `start` | ISO 8601 date with time zone | To publish | E.g. `2026-11-10T19:00:00-03:00`. Without it, the event stays a draft |
| `end` | ISO 8601 date | No | |
| `type` | `online`, `in_person`, `hybrid` | No | Default: `online` |
| `category` | a value from [`list_event_categories`](/mcp/ferramentas-eventos#list-event-categories) | No | E.g. `workshop` |
| `location` | text | No | The venue name |
| `address` | object | No | `street`, `number`, `neighborhood`, `city`, `state`, `country`, `postal_code` |
| `streaming_url` | web address | No | |
| `timezone` | text | No | E.g. `America/Sao_Paulo`. Default: the community's |
| `visibility` | `public`, `members`, `plan`, `private` | No | `plan` is **Subscribers** (subscribers and the team); `private`, the team only |
| `as_draft` | yes/no | No | `true` creates only the draft: nothing is announced and members don't see it until [`publish_event`](#publish-event). Default: create and publish |
| `notify_by_email` | yes/no | No | E-mails the notice on publishing (**Events** category). Ignored with `as_draft`; a past event never notifies |
| `space_id` | id | No | An existing Events space |
| `section_id` | id | No | Where to create the space |
| `space_title` | text | No | |
| `icon` | one of the icons in the list | No | The icon of the space it creates |
| `image_url` | link | No | The event banner. See [Images](/mcp/ferramentas#images) |
| `featured_image_url` or `featured_image_base64` | link or file | No | The event's featured image (square, 1:1). See [Images](/mcp/ferramentas#images) |
| `ticket` | object | No | The same fields as `sale` in `create_course` |
| `check_in_badge` | badge id or name | No | The [badge](/membros/engajamento#badges) whoever checks in gets, once. Owner and admin only |
| `idempotency_key` | text, up to 100 | No | |

**Returns:** the space, the event (id, title, slug, `status`, start, end, `visibility` and, in a moderated space, `moderation_status`) and the ticket (id, title, price, stock, status), if any.

**Draft and publishing.** `create_event` creates the event as a draft, applies the badge, the images and the ticket, and only then publishes it, like the app's **Publish**: the ticket goes on sale once the event is live. To publish, the event needs a title, start, end, location (in person or hybrid) and the ticket type (the event's product, always created). If something is missing, **nothing is undone**: the event stays a draft, `publish_missing` lists what is missing (`field`, `argument`, `message`), `draft_notice` says so, and the next steps are `update_event` (what to fill in) and `publish_event`.

**Ask like this:** *"Create the November Meetup, in person, on 11/15 from 7 to 10 p.m. at Espaço Paulista, Rua Augusta 1500, São Paulo, with 80 tickets at US$ 20 as a draft."*

`create_event` accepts `certificate` (`enabled`, `template_id`, `text`), for owners and admins only. Turning it on requires `end`, is not retroactive and sends nothing right away; without `template_id`, the **Platform default** applies. The answer says that whoever has "going" when the event ends gets the certificate by email about 1 hour later (between 1h and 1h15), and that an archived template stops issuing. The text accepts `{nome}`, `{assunto}` (or `{evento}`), `{data}` and `{cargaHoraria}`. See recipe [28](/mcp/receitas#28-turn-on-my-event-s-certificate).

Every event is created with its own product (**Event** kind, free draft), and the response carries `product` and the next steps: **set the price**, the **seats** (`update_product` with `capacity`) and **publish** (`publish_product`). Publishing the event already puts the draft ticket types on sale; a paid type only with approved business information. `ticket` now sets up that product instead of creating another. Whoever buys the event's ticket has their attendance **confirmed at once** (**Going**), taking a seat. See [Selling tickets](/espacos/eventos#selling-tickets).

**Notes:** A moderator without `space_id` is refused at the space step, because creating a space requires an admin: as a moderator, pass an existing events space.

## `update_event`

<span class="tool-kind tool-kind-write">Changes</span>

**Edit an event.** Changes the title, description, dates, type, location, address, stream link, visibility and the banner, of a published event or a draft. Only the fields sent change. *Minimum role: moderator or finance.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |
| `title`, `description`, `start`, `end`, `type`, `location`, `address`, `streaming_url`, `visibility`, `category` | | No | The same as in [`create_event`](/mcp/ferramentas-eventos#create-event) |
| `image_url` or `image_base64` | link or file | No | The new banner |
| `featured_image_url` or `featured_image_base64` | link or file | No | The new featured image (1:1). Images are checked before the event changes |
| `check_in_badge` | badge id or name, or `null` | No | The [badge](/membros/engajamento#badges) whoever checks in gets, once; `null` removes it. Owner and admin only |
| `updated_at` | date | No | The version you read (the `updatedAt` of the last answer). Without it, the tool reads the current version first |

**Ask like this:** *"Move tomorrow's meetup to Thursday, same time."*

**Editing at the same time.** If someone saved the event (in the app or in another conversation) after the version you read, **nothing changes**: the error carries `current_updated_at` and the `open_link` next step, to read the event again and repeat. On a draft, the answer suggests `publish_event`, or what is still missing to publish.

`recording_file_url` (a link, video up to 2 GB) or `recording_file_base64` (about 7 MB), with `recording_file_type` and `recording_file_name`, store the event's **recording** on Memberfy, in a private area: it replaces the previous one and shows to those who can attend. To take it off, [`remove_event_recording`](#remove-event-recording); for the 1-hour link, [`get_media_url`](/mcp/ferramentas-conteudo#get-media-url). Minimum role: moderator (or finance). See [Event recording](/espacos/eventos#event-recording).

`update_event` accepts the same `certificate` as `create_event` (`enabled`, `template_id`, `text`), for owners and admins only; a moderator edits the event, but a call with `certificate` is refused. Omitted, the event certificate is not touched. Turning it on for an event that already ended works, but the assistant warns that nobody gets a certificate from it.

## `publish_event`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Publish an event.** Publishes a draft, like the app's **Publish**: the event shows up (or goes to the space's moderation), enters the Feed, the draft ticket types go on sale and the `event.created` webhook fires. *Minimum role: moderator (owner, admin, moderator and finance).*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | The draft. Drafts are in [`list_events`](#list-events) with `status: DRAFT` |
| `notify_by_email` | yes/no | No | Default `true`: e-mails whoever can see the event (**Events** category) |

**How it confirms.** With the notice on, the first call returns the event and **how many people** get the e-mail (never who); the assistant shows the summary and only publishes after your yes. With `notify_by_email: false`, it publishes on the first call, quietly, and that event won't send the notice later.

**When it refuses.** A draft with something missing is refused before confirming, with `missing` and the `update_event` step. An event already published: refused (`409`).

**Ask like this:** *"Publish the December Meetup draft, without sending e-mail."*

## `start_live_stream`

<span class="tool-kind tool-kind-write">Changes</span>

**Start live stream.** Marks an event as live, with the stream link and service, if any. *Minimum role: moderator or finance.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |
| `streaming_url` | link | No | |
| `streaming_service` | `youtube`, `vimeo`, `mux` | No | |

**Ask like this:** *"We're live: mark today's live session with the link https://youtube.com/…"*

**Notes:** afterwards, the response suggests ending the stream when it's over.

## `stop_live_stream`

<span class="tool-kind tool-kind-write">Changes</span>

**End live stream.** *Minimum role: moderator or finance.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |

## `rsvp_event`

<span class="tool-kind tool-kind-write">Changes</span>

**Answer event invitation.** Says whether you're going to an event. *Role: owner, admin, moderator or member.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |
| `status` | `going`, `maybe`, `not_going` | Yes | Going, maybe or not going |

**Ask like this:** *"RSVP me to the November Meetup."*

After the end, `going` and `maybe` return `409` and only `not_going` is accepted; the answer explains this. An event with its product published and priced answers `403` to whoever hasn't bought it (with the price; the purchase is made in the app), and a full event answers `409` (sold out), with the offer of [`join_waitlist`](/mcp/ferramentas-cursos#join-waitlist). When the event issues a certificate, the answer reminds you that only "going" at the end of the event counts: "maybe" does not.

## `delete_event`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Delete event.** *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |

**Returns:** on the first call, the title, the date and how many people RSVP'd, and the confirmation code.

Deleting the event also archives its product, and is refused (`409`) while there's a paid purchase that still gives access.

## `remove_event_recording`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Remove the recording.** Deletes the event's hosted recording file for good and gives the storage back. On the first call it shows the event; on the second, with the `confirmation_token`, it removes. *Minimum role: moderator (or finance).*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id, slug or link | Yes | |

## `list_event_categories`

<span class="tool-kind tool-kind-read">Read-only</span>

**Event categories.** The event categories, with the value and the translated name: the values `create_event` and `update_event` take in `category`. *Minimum role: any.*

Parameters: none.

**Returns:** each category, with the value (e.g. `workshop`) and the name in the connected person's language.

**Ask like this:** *"Which event categories are there?"*

## `register_member_for_event`

<span class="tool-kind tool-kind-write">Changes</span>

**Register someone for the event.** The team registers a person from the community (going) for an event that doesn't charge them, with the rules of the person's own registration: an event that has already ended, required questions and seats. The person gets the confirmation e-mail. Runs on the first call. *Role: owner, admin or moderator.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `event` | id or link | Yes | The event |
| `member` | id, e-mail or profile link | Yes | The person |

**Ask like this:** *"Register Maria for Thursday's meetup."*

## Registration questions

6 tools for an event's registration questions. See [Events › Registration questions](/espacos/eventos#registration-questions).

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `get_event_registration_questions` | The event's questions, with ids, type, required and **Show at the door** | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_event_registration_questions` | Saves the whole set of questions (the Forms types plus the document); removing them all asks to confirm | Moderator or finance | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_event_registrations` | Who registered, with their answers; filters by name or e-mail, by answer and by who still owes an answer | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `export_event_registrations_csv` | The answers as CSV, with the whole document | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_my_event_registration` | Your registration: the questions, what comes from your profile, your answers and until when you can edit | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_my_event_registration` | Changes your answers until the event starts; only what changes | Any | <span class="tool-kind tool-kind-write">Changes</span> |

`rsvp_event` takes `answers`: on an event with required questions, the first call without them comes back with the questions and what comes from the profile, and the assistant asks before confirming. Answers stay out of the audit log.

**Ask like this:** *"Ask company, job title and CPF on the November Meetup registration, with the CPF at the door"*, *"Who hasn't answered the event questions yet?"*, *"Confirm my attendance at the November Meetup"*.

## Event check-in

11 tools for door check-in. See [Events › Check-in](/espacos/eventos#check-in).

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `get_my_event_ticket` | Your ticket: QR, code and whether you checked in | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `open_event_stream` | Opens the live stream; signed in, it counts as attendance | Any | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_event_check_ins` | The door list, with filter and search | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `check_in_event_attendee` | Checks in by code, QR, ticket or member | Team or organizer | <span class="tool-kind tool-kind-write">Changes</span> |
| `undo_event_check_in` | Undoes a check-in; the registration stays | Team or organizer | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `export_event_check_ins` | The door list as CSV | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_event_kiosks` | The event's kiosks | Team or organizer | <span class="tool-kind tool-kind-read">Read-only</span> |
| `grant_event_courtesy` | Grants a courtesy: confirmed and present, taking a seat | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `create_event_kiosk` | Creates a kiosk link | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `revoke_event_kiosk` | Revokes a kiosk at once | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `preview_event_certificates` | Who would get the automatic certificate and who is left out | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |

`create_event` and `update_event` take `check_in_enabled`; turning check-in on suggests `create_event_kiosk`. An event organizer can be a member, so the door tools show for every role and the route decides. The ticket token, the QR and the kiosk link stay out of the audit log. The ready-made prompt **Event door** (`run_event_door`) walks through check-in in the conversation.

## Ticket types and batches

| Tool | What it does | Minimum role | Kind |
|---|---|---|---|
| `list_ticket_types` | An event's ticket types, with the current batch, the price and how many are left | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_ticket_type` | A ticket type, with its batches | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `quote_event_tickets` | Works out the price of a quantity of tickets of a type | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_my_event_tickets` | Your tickets for an event, including the ones still to give | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_my_tickets` | Your tickets for every event: the upcoming ones, with the entry code and QR, or the past and canceled ones | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `assign_event_ticket` | Gives a ticket from a group order to someone by e-mail; shows first who receives it (and whether a new account will be created) | Any | <span class="tool-kind tool-kind-write">Changes</span> |
| `get_event_ticket_registration` | The registration answers of a ticket of yours | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_event_ticket_registration` | Answers the questions of a ticket of yours | Any | <span class="tool-kind tool-kind-write">Changes</span> |
| `get_event_ticket_sales` | Sales per type and batch: tickets, orders, gross and refunded | Admin or finance | <span class="tool-kind tool-kind-read">Read-only</span> |
| `export_event_ticket_sales_csv` | The sales as CSV | Admin or finance | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_purchase_tickets` | An order's tickets, to choose the refund | Admin or finance | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_ticket_type` | Creates a ticket type with its first batch; when paid, asks to confirm | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `update_ticket_type` | Edits a type (name, seats, minimum and maximum per order, shown on the page, proof, publish, close) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_ticket_type` | Deletes a type without sales | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `create_ticket_batch` | Adds a batch; when paid, asks to confirm | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `update_ticket_batch` | Edits or closes a batch; changing the price asks to confirm | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_ticket_batch` | Deletes a batch without sales | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `update_event_ticket_settings` | Event seats, show how many are left and the subscribers' type | Admin | <span class="tool-kind tool-kind-write">Changes</span> |

`claim_free_product` takes `quantity` and `registration_answers`; `refund_purchase` takes `ticket_ids` (not together with `amount`), and the summary before confirmation lists the tickets and the amount of each.

**Ask like this:** *"Create the conference's half-price ticket at $60, 100 seats, with proof at the door"*, *"How much did each batch sell?"*, *"Give my second ticket to maria@memberfy.net."*

## Related

- [Tools](/mcp/ferramentas)
- [Recipes](/mcp/receitas)
- [Money and confirmation](/mcp/dinheiro-e-confirmacao)
