# `event_update`

**Update calendar event.** Changes an existing calendar event.

**Who can use it:** Owners and managers with a role in the community. Not yet a management company's owners and managers.

| Scope | Effect | Hints |
|---|---|---|
| `community:write` | send (write when `visibility` is `staff_only`) | changes data, destructive, idempotent |

## Description shown to assistants

> Use this when an owner or manager asks to update an existing PorchQ calendar event.

## Arguments

| Argument | Type | Required | About |
|---|---|---|---|
| `property_id` | string | No | The community's public id (`prop_web…`). Pass it on every call. |
| `event_id` | string | Yes | The event's public id (`evnt_web…`), from `events_list`. |
| `title` | string | No | The event's new name. |
| `description` | string | No | What the event is about. |
| `location` | string | No | Where it happens. |
| `starts_at` | string | No | ISO8601 event start time. Include a timezone offset when possible. |
| `starts_at_text` | string | No | Original natural-language start time when the user used relative wording. |
| `ends_at` | string | No | ISO8601 event end time. Include a timezone offset when possible. |
| `ends_at_text` | string | No | Original natural-language end time when the user used relative wording. |
| `all_day` | boolean | No | The event lasts all day. |
| `event_type` | string | No | One of `meeting`, `community_event`, `maintenance`, `voting_deadline`, `other`. |
| `visibility` | string | No | One of `public`, `members_only`, `staff_only`. |
| `reminder_offsets_minutes` | array of integer | No | Minutes before the start at which members who can see the event get a reminder. Each from 1 to 43200. |
| `idempotency_key` | string | No | Optional. A unique value for this change; sending the same value again does nothing twice. At most 200 characters. |

## What it returns

Every result has `content` (one short sentence for the person) and `structuredContent` (the data below). A tool that could not run answers with `isError: true` and a sentence saying why; see [Errors and limits](/developers/mcp/errors-and-limits).

- `property`: the community.
- `status`: `done` when the change was made at once (a staff-only event), or `awaiting_confirmation`.
- `event`: the event after the change, when `status` is `done`, with the same fields as in `events_list`.
- `confirmation`: when `status` is `awaiting_confirmation`, the `url` of the PorchQ page where the person confirms and when it `expires_at`.

`structuredContent` follows this JSON Schema, also in `tools/list` as `outputSchema`:

```json
{
  "type": "object",
  "properties": {
    "property": {
      "type": "object",
      "properties": {
        "id": { "type": "string" },
        "name": { "type": "string" },
        "addressLine1": { "type": ["string", "null"] },
        "addressLine2": { "type": ["string", "null"] },
        "city": { "type": ["string", "null"] },
        "state": { "type": ["string", "null"] },
        "postalCode": { "type": ["string", "null"] },
        "timezone": { "type": ["string", "null"] },
        "billingFrequency": { "type": ["string", "null"] },
        "demoClone": { "type": "boolean" },
        "demoPersona": { "type": ["string", "null"] },
        "demoExpiresAt": { "type": ["string", "null"] }
      },
      "required": ["id", "name"]
    },
    "status": { "enum": ["done", "awaiting_confirmation"] },
    "event": {
      "type": "object",
      "properties": {
        "id": { "type": "string" },
        "title": { "type": "string" },
        "description": { "type": ["string", "null"] },
        "location": { "type": ["string", "null"] },
        "starts_at": { "type": ["string", "null"] },
        "ends_at": { "type": ["string", "null"] },
        "all_day": { "type": ["boolean", "null"] },
        "event_type": { "type": ["string", "null"] },
        "visibility": { "type": ["string", "null"] },
        "reminder_offsets_minutes": { "type": ["array", "null"], "items": { "type": "integer" } },
        "created_via": { "type": ["string", "null"] }
      },
      "required": ["id", "title"],
      "description": "The event, when it was created or changed at once."
    },
    "confirmation": {
      "type": "object",
      "description": "When the change waits for the person to confirm it in PorchQ.",
      "properties": { "url": { "type": "string" }, "expires_at": { "type": "string" } },
      "required": ["url", "expires_at"]
    }
  },
  "required": ["property", "status"]
}
```

## Notes

- Only the fields you pass change. The values you pass replace the old ones, so the tool is marked destructive; sending the same change twice leaves the same result.
- A change to an event residents can see, before or after the change, waits for the person to confirm it in PorchQ, as with `event_create`. The page shows the old values struck through. If the event changes in PorchQ before they confirm, nothing is changed and they ask again.
- A change to a staff-only event that stays staff-only happens at once.

## Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "event_update",
    "arguments": {
      "property_id": "prop_web4k2m9q7x1v8c3n5b6z0a2s4d",
      "event_id": "evnt_web8n3b5v7c9x1z2a4s6d8f0g2h",
      "location": "Pool deck",
      "idempotency_key": "5d7f9b1c-3e5a-4c7e-9b1d-3f5a7c9e1b3d"
    }
  }
}
```
