# Hotel configuration, branding and content — tool reference

Generated from the OpenAPI document (`https://maison-labs.com/api/v1/openapi.json`). Field types are JSON Schema types; GET/DELETE inputs travel as path or query, other methods as a JSON body.

## `add_client_note` — Add client note

Create a new operator note on the client. Notes support Markdown. The new note is attributed to the calling user. Requires the client-notes entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/note`
- MCP tool / A2A skill: `add_client_note`
- Needs: update-client WRITE (client); client plan must include `client-notes`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `bodyMarkdown` | body | string | yes | Note body in Markdown; supports headings, lists, code blocks |
| `pinned` | body | boolean | no | Pin the note to the top of the list; default false |

## `add_client_setting` — Add client setting

Create a new region, department, or tag for the hotel. The `kind` field selects the category. Returns the created item.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/setting/{kind}`
- MCP tool / A2A skill: `add_client_setting`
- Needs: clients WRITE (client)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: region \| department \| tag | yes | Setting type |
| `name` | body | string | yes | Display name |
| `description` | body | string | no | Optional description |

## `add_report_subscribers` — Add report subscribers

Add one or more email addresses as report subscribers for the hotel. Resolves known user accounts; unknown addresses are stored as raw emails. Returns the count of newly inserted rows. Recorded in the activity feed. Requires the update-client entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/subscribers`
- MCP tool / A2A skill: `add_report_subscribers`
- Needs: update-client WRITE (client); client plan must include `update-client`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `emails` | body | array of string | yes | Email addresses to add as subscribers |
| `emailType` | body | enum: CHAT_LOG_ANALYTICS \| AI_VISIBILITY_ANALYTICS \| WEBSITE_SYNC_REPORT | yes | Report type to subscribe to |

## `create_media_upload` — Create a media upload

Start a media-library upload larger than 64 KiB (up to 5 MB): returns `{ uploadId, uploadUrl, method, headers, expiresAt }`. PUT the raw file to `uploadUrl` with exactly `headers` within 15 minutes, then call `upload_media_asset` with the `uploadId` (instead of `bytesBase64`). Requires the update-client entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/mediaasset/upload`
- MCP tool / A2A skill: `create_media_upload`
- Needs: update-client WRITE (client); client plan must include `update-client`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `mimeType` | body | enum: image/png \| image/jpeg \| image/gif \| image/webp \| image/svg+xml | yes | Content-Type of the file you will PUT; the URL is signed for it |
| `sizeBytes` | body | integer | yes | Exact size of the file in bytes (at most 5 MB); the URL is signed for it |

## `create_theme_visual_upload` — Create a theme visual upload

Start a theme visual upload larger than 64 KiB (up to 5 MB): returns `{ uploadId, uploadUrl, method, headers, expiresAt }`. PUT the raw file to `uploadUrl` with exactly `headers` within 15 minutes, then call `upload_theme_visual` with the `uploadId` (instead of `bytesBase64`). Requires the branding entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/theme/visual/upload`
- MCP tool / A2A skill: `create_theme_visual_upload`
- Needs: branding WRITE (client); client plan must include `branding`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `mimeType` | body | enum: image/png \| image/jpeg \| image/gif \| image/webp \| image/svg+xml | yes | Content-Type of the file you will PUT; the URL is signed for it |
| `sizeBytes` | body | integer | yes | Exact size of the file in bytes (at most 5 MB); the URL is signed for it |

## `delete_client_note` — Delete client note

Soft-delete a note from the client. Only the note's author or a Maison admin may delete it. Requires the client-notes entitlement.

- REST: `DELETE https://maison-labs.com/api/v1/client/{clientId}/note/{noteId}`
- MCP tool / A2A skill: `delete_client_note`
- Needs: update-client WRITE (client); client plan must include `client-notes`
- Destructive — confirm with the user first.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `noteId` | path | string | yes | Note id; format uuid |

## `generate_theme_icon` — Generate the chat icon in the theme colour

Generate the chat widget's launcher icon in the hotel's theme colour and store it as the `icon` visual: it replaces the current chat icon. The icon is a rounded square in `color` (default: the theme seed colour set with `set_theme_color`) with a speech-bubble glyph in near-white or near-black, whichever contrasts more. Returns `{ url, color }`; the operator can preview it on the Theme page. Running it again replaces the icon again. Requires the branding entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/theme/icon`
- MCP tool / A2A skill: `generate_theme_icon`
- Needs: branding WRITE (client); client plan must include `branding`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `color` | body | string | no | Icon colour as #rgb or #rrggbb; defaults to the theme seed colour |

## `get_chat_runtime` — Get chat runtime switches

Read the chat widget's runtime switches: `branding.enabled` (the hotel's custom theme is applied) and `documents.enabled` (the agent may answer from uploaded documents). Use `update_chat_runtime` to change them; the theme itself is `get_theme` / `get_chat_styles`.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/config/runtime`
- MCP tool / A2A skill: `get_chat_runtime`
- Needs: hotel-config READ (client)
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_chat_styles` — Get chat styles

Read the chat widget's full style map (`chatStyles`: the seed colour `cuiSeedColor` and every other widget style token the console's theme editor writes). For just the seed colour and visual URLs use `get_theme`. Requires the branding entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/theme/chatstyles`
- MCP tool / A2A skill: `get_chat_styles`
- Needs: branding READ (client); client plan must include `branding`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_chatbot_tone` — Get chatbot tone

Fetch the chatbot tone instructions for the hotel. Returns `{ tone, defaultTone }`: the current tone as a plain string and the platform default that `set_chatbot_tone` with `reset: true` writes. Use `set_chatbot_tone` to update it.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/config/tone`
- MCP tool / A2A skill: `get_chatbot_tone`
- Needs: chatbot-tone READ (client)
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_client_email` — Get client email

Fetch the full detail of a single logged email, including the HTML/text body and event timeline. Requires the client-emails entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/email/{emailId}`
- MCP tool / A2A skill: `get_client_email`
- Needs: client-emails READ (client); client plan must include `client-emails`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `emailId` | path | string | yes | Email id; format uuid |

## `get_client_email_attachment` — Get email attachment URL

Generate a pre-signed download URL for an attachment at the given zero-based index on a logged email. The URL is short-lived. Requires the client-emails entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/email/{emailId}/attachment/{index}`
- MCP tool / A2A skill: `get_client_email_attachment`
- Needs: client-emails READ (client); client plan must include `client-emails`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `emailId` | path | string | yes | Email id; format uuid |
| `index` | path | integer | yes | Zero-based attachment index |

## `get_hotel_config` — Get hotel config

Fetch the hotel configuration document (property fields such as name, address, phone, hours, policies). Does NOT include the chatbot tone; use `get_chatbot_tone` for that.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/config`
- MCP tool / A2A skill: `get_hotel_config`
- Needs: hotel-config READ (client)
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_staff_notification_emails` — Get staff notification emails

Returns the list of staff email addresses that receive upsell and payment-notice notifications for a hotel. Requires the hotel-config entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/notifications`
- MCP tool / A2A skill: `get_staff_notification_emails`
- Needs: hotel-config READ (client); client plan must include `hotel-config`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_theme` — Get theme

Fetch the hotel's chat-widget theme: seed colour and visual asset URLs (icon, hero, herodark). Requires the branding entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/theme`
- MCP tool / A2A skill: `get_theme`
- Needs: branding READ (client); client plan must include `branding`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `get_theme_visual` — Get theme visual

Read the raw SVG text for one of the hotel's chat-widget visual assets (icon, hero, or herodark). Returns 404 when no visual of that kind has been uploaded. Requires the branding entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/theme/visual/{kind}`
- MCP tool / A2A skill: `get_theme_visual`
- Needs: branding READ (client); client plan must include `branding`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: icon \| hero \| herodark | yes | Visual asset kind |

## `get_translations` — Get translations

Fetch the full chat-widget translation map for the hotel. Returns `{ translations: { defaultLocale, languages: { <code>: {...} | false } } }`. Requires the translations entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/translations`
- MCP tool / A2A skill: `get_translations`
- Needs: translations READ (client); client plan must include `translations`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `list_client_emails` — List client emails

Paginated list of email messages logged for the hotel. Supports filtering by status, source, date range and search. Returns summaries only; use `get_client_email` for the full body. Requires the client-emails entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/emails`
- MCP tool / A2A skill: `list_client_emails`
- Needs: client-emails READ (client); client plan must include `client-emails`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `page` | query | integer | no | Page number (1-based); default 1 |
| `pageSize` | query | integer | no | Results per page (max 100); default 50 |
| `sort` | query | enum: createdDate \| sentDate \| status \| source | no | Sort column; default "createdDate" |
| `order` | query | enum: asc \| desc | no | Sort direction; default "desc" |
| `status` | query | array of string | no | Filter by one or more statuses, e.g. ["sent", "failed"] |
| `source` | query | array of string | no | Filter by one or more source identifiers |
| `search` | query | string | no | Case-insensitive search on subject or from |
| `from` | query | string | no | Inclusive lower bound on created date (ISO 8601); format date-time |
| `to` | query | string | no | Exclusive upper bound on created date (ISO 8601); format date-time |

## `list_client_notes` — List client notes

Page through operator notes on a client, pinned notes first. Returns serialised note objects and an optional cursor for the next page. Requires the client-notes entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/notes`
- MCP tool / A2A skill: `list_client_notes`
- Needs: update-client READ (client); client plan must include `client-notes`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `cursor` | query | string | no | Pagination cursor (note id) from the previous page's `nextCursor`; format uuid |

## `list_client_settings` — List client settings

Page through the hotel's regions, departments and tags. Without `kind`, returns the first page (`limit`) of all three; with `kind`, returns that category only and accepts its `after` cursor (each page carries `items`, `total`, `nextCursor`, `hasMore`). `search` filters case-insensitively. Use `add_client_setting` to create entries.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/settings`
- MCP tool / A2A skill: `list_client_settings`
- Needs: clients READ (client)
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | query | enum: region \| department \| tag | no | One category; required to page with `after` |
| `limit` | query | integer | no | Page size per category; default 50 |
| `after` | query | string | no | Cursor from the category's `nextCursor`; needs `kind` |
| `search` | query | string | no | Case-insensitive filter applied to the categories returned |

## `list_media_assets` — List media assets

List all media assets in the hotel's library (images used in knowledge articles, widget customisations, etc.). Requires the update-client entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/mediaassets`
- MCP tool / A2A skill: `list_media_assets`
- Needs: update-client READ (client); client plan must include `update-client`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `list_note_versions` — List note versions

Page through the version history of a note, newest first. Returns serialised version objects and a numeric cursor for the next page. Requires the client-notes entitlement.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/note/{noteId}/versions`
- MCP tool / A2A skill: `list_note_versions`
- Needs: update-client READ (client); client plan must include `client-notes`
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `noteId` | path | string | yes | Note id; format uuid |
| `cursor` | query | integer | no | Numeric cursor from the previous page's `nextCursor` |

## `list_report_subscribers` — List report subscribers

List all active report email subscribers for the hotel, including linked user details where available.

- REST: `GET https://maison-labs.com/api/v1/client/{clientId}/subscribers`
- MCP tool / A2A skill: `list_report_subscribers`
- Needs: clients READ (client)
- Read-only.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |

## `remove_client_setting` — Remove client setting

Disable (soft-delete) a region or department, or permanently delete a tag. The `kind` field selects the category.

- REST: `DELETE https://maison-labs.com/api/v1/client/{clientId}/setting/{kind}/{settingId}`
- MCP tool / A2A skill: `remove_client_setting`
- Needs: clients WRITE (client)
- Destructive — confirm with the user first.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: region \| department \| tag | yes | Setting type |
| `settingId` | path | string | yes | Setting id; format uuid |

## `remove_media_asset` — Remove media asset

Delete a media asset from S3 and the hotel's media library. Requires the update-client entitlement.

- REST: `DELETE https://maison-labs.com/api/v1/client/{clientId}/mediaasset/{assetId}`
- MCP tool / A2A skill: `remove_media_asset`
- Needs: update-client WRITE (client); client plan must include `update-client`
- Destructive — confirm with the user first.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `assetId` | path | string | yes | Media asset id; format uuid |

## `remove_report_subscribers` — Remove report subscribers

Soft-delete report subscribers by their subscriber row ids. Only rows that belong to the specified client are removed; returns how many were. Recorded in the activity feed. Requires the update-client entitlement.

- REST: `DELETE https://maison-labs.com/api/v1/client/{clientId}/subscribers`
- MCP tool / A2A skill: `remove_report_subscribers`
- Needs: update-client WRITE (client); client plan must include `update-client`
- Destructive — confirm with the user first.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `ids` | query | array of string | yes | Subscriber row ids to remove (from `list_report_subscribers`) |

## `remove_theme_visual` — Remove theme visual

Delete a chat-widget visual asset (icon, hero, or herodark) from S3 and the client config. Requires the branding entitlement.

- REST: `DELETE https://maison-labs.com/api/v1/client/{clientId}/theme/visual/{kind}`
- MCP tool / A2A skill: `remove_theme_visual`
- Needs: branding WRITE (client); client plan must include `branding`
- Destructive — confirm with the user first.

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: icon \| hero \| herodark | yes | Visual asset kind |

## `set_chat_styles` — Set chat styles

Replace the chat widget's full style map (`chatStyles`) — send every token you want kept (read it first with `get_chat_styles`); the widget's cached styles are refreshed. To change only the seed colour use `set_theme_color`. Recorded in the activity feed. Requires the branding entitlement.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/theme/chatstyles`
- MCP tool / A2A skill: `set_chat_styles`
- Needs: branding WRITE (client); client plan must include `branding`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `chatStyles` | body | object | yes | Style token → value, e.g. { cuiSeedColor: "<hex colour>" } |

## `set_chatbot_tone` — Set chatbot tone

Replace the chatbot tone instructions for the hotel (a free-text prompt that shapes the agent's voice and personality), or send `reset: true` to restore the platform default (`defaultTone` from `get_chatbot_tone`). Send exactly one of `tone` or `reset`. Returns the tone now stored.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/config/tone`
- MCP tool / A2A skill: `set_chatbot_tone`
- Needs: chatbot-tone WRITE (client)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `tone` | body | string | no | New tone instructions; replaces the existing value entirely |
| `reset` | body | boolean | no | Restore the platform default tone instead of sending one |

## `set_staff_notification_emails` — Set staff notification emails

Replaces the list of staff email addresses that receive upsell and payment-notice notifications for a hotel (trimmed, lower-cased, de-duplicated). Send an empty array to clear all recipients. Recorded in the activity feed. Requires the hotel-config entitlement.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/notifications`
- MCP tool / A2A skill: `set_staff_notification_emails`
- Needs: hotel-config WRITE (client); client plan must include `hotel-config`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `staffNotificationEmails` | body | array of string | yes | Email addresses to notify (replaces the current list) |

## `set_theme_color` — Set theme seed colour

Update the chat-widget seed colour (CUI seed color string). This drives the brand colour of the embedded widget. Requires the branding entitlement.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/theme`
- MCP tool / A2A skill: `set_theme_color`
- Needs: branding WRITE (client); client plan must include `branding`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `cuiSeedColor` | body | string | yes | CUI seed colour as a CSS colour value (hex or named) |

## `translate_text` — Translate text

Machine-translate up to 10 short strings to a target locale using AWS Translate. Use for translating button labels, short prompts, or widget messages. Per-item failures fall back to the original text instead of failing the whole batch.

- REST: `POST https://maison-labs.com/api/v1/translate`
- MCP tool / A2A skill: `translate_text`
- Needs: clients READ (any)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `items` | body | array of object | yes | Items to translate (max 10) |
| `targetLocale` | body | string | yes | BCP-47 target locale, e.g. fr or zh-TW |

## `update_chat_runtime` — Update chat runtime switches

Switch the chat widget's custom theme (`branding`) and/or document answers (`documents`) on or off. Only the switches sent change; at least one is required. Recorded in the client activity feed. Returns the switches written.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/config/runtime`
- MCP tool / A2A skill: `update_chat_runtime`
- Needs: hotel-config WRITE (client)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `branding` | body | object | no | Apply the hotel's custom chat theme |
| `documents` | body | object | no | Let the agent answer from uploaded documents |

## `update_client_note` — Update client note

Edit the body or pinned state of an existing note. Only the note's author or a Maison admin may update it. Pass `updatedDate` from the fetched note for optimistic concurrency — if the note was modified since, a 409 Conflict is returned. Requires the client-notes entitlement.

- REST: `PATCH https://maison-labs.com/api/v1/client/{clientId}/note/{noteId}`
- MCP tool / A2A skill: `update_client_note`
- Needs: update-client WRITE (client); client plan must include `client-notes`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `noteId` | path | string | yes | Note id; format uuid |
| `bodyMarkdown` | body | string | no | New note body; omit to leave unchanged |
| `pinned` | body | boolean | no | New pinned state; omit to leave unchanged |
| `updatedDate` | body | string | no | ISO timestamp from the fetched note for optimistic concurrency; format date-time |

## `update_client_setting` — Update client setting

Update the name or description of an existing region, department, or tag. At least one field must be provided. Returns the updated item, or 404 if not found.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/setting/{kind}/{settingId}`
- MCP tool / A2A skill: `update_client_setting`
- Needs: clients WRITE (client)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: region \| department \| tag | yes | Setting type |
| `settingId` | path | string | yes | Setting id; format uuid |
| `name` | body | string | no | New display name |
| `description` | body | string | no | New description |

## `update_hotel_config` — Update hotel config

Merge new fields into the hotel config (`set`), remove keys (`unset`), or declare value types (`types`). At least one of `set`, `unset`, or `types` must be provided. Returns the full updated hotel config.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/config`
- MCP tool / A2A skill: `update_hotel_config`
- Needs: hotel-config WRITE (client)

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `set` | body | object | no | Fields to add or update in the hotel config |
| `unset` | body | array of string | no | Field keys to remove from the hotel config |
| `types` | body | object | no | Value-type declarations for new custom fields (e.g. { myField: 'string' }) |

## `update_media_asset` — Update media asset

Update the description or published state of an existing media asset. At least one of `description` or `published` must be provided. Requires the update-client entitlement.

- REST: `PATCH https://maison-labs.com/api/v1/client/{clientId}/mediaasset/{assetId}`
- MCP tool / A2A skill: `update_media_asset`
- Needs: update-client WRITE (client); client plan must include `update-client`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `assetId` | path | string | yes | Media asset id; format uuid |
| `description` | body | string | no | New caption or description |
| `published` | body | boolean | no | Published state |

## `update_translations` — Update translations

Replace the entire chat-widget translation map: `{ defaultLocale, languages }` where each language code (e.g. `en`, `pt_BR`) maps to its phrases or `false` (removed). At most 60 languages and 200 phrases each; phrase keys are identifiers; `openingMessages` is a string list; the default must be an active language. Validated exactly as the console's save; recorded in the activity feed. Requires the translations entitlement.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/translations`
- MCP tool / A2A skill: `update_translations`
- Needs: translations WRITE (client); client plan must include `translations`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `translations` | body | object | yes | Full translations object: `defaultLocale` and the `languages` map |

## `upload_media_asset` — Upload media asset

Add an image (PNG, JPEG, GIF, WebP or SVG) to the hotel's media library. Send the file inline as `bytesBase64` (at most 64 KiB) or, for up to 5 MB, the `uploadId` from `create_media_upload` after PUTting the file. Returns the stored asset record. Requires the update-client entitlement.

- REST: `POST https://maison-labs.com/api/v1/client/{clientId}/mediaasset`
- MCP tool / A2A skill: `upload_media_asset`
- Needs: update-client WRITE (client); client plan must include `update-client`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `filename` | body | string | yes | Original filename |
| `mimeType` | body | string | yes | MIME type, e.g. image/svg+xml |
| `bytesBase64` | body | string | no | File content, canonical base64-encoded; decoded size must not exceed 64 KiB. Send this or `uploadId`, not both |
| `uploadId` | body | string | no | Id of a presigned upload already PUT to S3 (up to 5 MB). Send this or `bytesBase64`, not both; format uuid |
| `description` | body | string | no | Optional caption or description |
| `published` | body | boolean | no | Whether the asset is publicly visible immediately; default false |

## `upload_theme_visual` — Upload theme visual

Upload or replace a chat-widget visual asset (icon, hero, or herodark): PNG, JPEG, GIF, WebP or SVG (SVG is sanitised). Send the file inline as `bytesBase64` (at most 64 KiB) or, for up to 5 MB, the `uploadId` from `create_theme_visual_upload` after PUTting the file. Returns the URL of the stored asset. Requires the branding entitlement.

- REST: `PUT https://maison-labs.com/api/v1/client/{clientId}/theme/visual/{kind}`
- MCP tool / A2A skill: `upload_theme_visual`
- Needs: branding WRITE (client); client plan must include `branding`

Inputs:

| Field | Where | Type | Required | Notes |
| --- | --- | --- | --- | --- |
| `clientId` | path | string | yes | Client (hotel) id; format uuid |
| `kind` | path | enum: icon \| hero \| herodark | yes | Visual asset kind |
| `filename` | body | string | yes | Original filename |
| `mimeType` | body | string | yes | MIME type, e.g. image/svg+xml |
| `bytesBase64` | body | string | no | File content, canonical base64-encoded; decoded size must not exceed 64 KiB. Send this or `uploadId`, not both |
| `uploadId` | body | string | no | Id of a presigned upload already PUT to S3 (up to 5 MB). Send this or `bytesBase64`, not both; format uuid |
