---
name: "maison-channels"
description: "Operate a hotel's messaging channels: list connected Instagram, Messenger, WhatsApp and email channels with their auto-reply state, change auto-reply or draft-only settings, disconnect a channel, manage per-channel reply instructions, get the browser link that starts a channel connection, and opt a hotel into the ChatGPT guest app. Use when a hotel wants the concierge on a social or email channel, or when replies on a channel misbehave. Tools: add_channel_instruction, connect_chatgpt_channel, delete_channel_instruction, disconnect_channel, get_channel_connect_link, list_channel_instructions, list_channels, update_channel_instruction, update_channel_settings."
license: "Proprietary. Use with a Maison API key under the Maison terms of service."
metadata:
  author: "maison-labs"
  version: "1.0.0"
  category: "channels"
  api-base: "https://maison-labs.com"
  openapi: "https://maison-labs.com/api/v1/openapi.json"
  docs: "https://docs.maison-labs.com/skills/maison-channels/"
---

# Maison — Messaging channels

Operate a hotel's messaging channels: list connected Instagram, Messenger, WhatsApp and email channels with their auto-reply state, change auto-reply or draft-only settings, disconnect a channel, manage per-channel reply instructions, get the browser link that starts a channel connection, and opt a hotel into the ChatGPT guest app. Use when a hotel wants the concierge on a social or email channel, or when replies on a channel misbehave.

Part of the Maison public API. Read the `maison-public-api` skill first for authentication, discovery and transport details (`https://docs.maison-labs.com/skills/maison-public-api/SKILL.md`).

## When to use

- See which channels a hotel has connected — `list_channels`.
- Pause automatic replies on a channel — `update_channel_settings` with `autoReplyEnabled: false` or `draftOnly: true`.
- Give channel-specific tone or rules — `add_channel_instruction`.

## Before you start

1. Send `x-api-key: <key>` on every call; the key only reaches `/api/v1`.
2. `GET /api/v1/tools` (or MCP `tools/list`) returns the tools THIS key may run — if a tool below is missing there, you lack a grant; do not retry it.
3. Client-scoped tools take `clientId` (a hotel id). `whoami` lists the ids you can act on.

## Tools

| Tool | What it does | REST | Needs |
| --- | --- | --- | --- |
| `add_channel_instruction` | Appends one titled operator instruction to a channel's ordered list. | `POST /api/v1/client/{clientId}/channel/{channelType}/instruction` | update-client WRITE (client); plan: `update-client` |
| `connect_chatgpt_channel` | Opts the hotel into the ChatGPT guest-app integration — records the connection in client_channels. | `POST /api/v1/client/{clientId}/channel/chatgpt/connect` | update-client WRITE (client) |
| `delete_channel_instruction` | Removes one instruction from a channel's list by its id. | `DELETE /api/v1/client/{clientId}/channel/{channelType}/instruction/{instructionId}` | update-client WRITE (client); plan: `update-client`; destructive |
| `disconnect_channel` | Permanently disconnects and deletes a channel connection. | `DELETE /api/v1/client/{clientId}/channel/{channelId}` | update-client WRITE (client); plan: `update-client`; destructive |
| `get_channel_connect_link` | Returns the URL the operator must open in a signed-in browser to start an OAuth channel connection (Instagram, Messenger, Gmail, Outlook) — the connection is the third party's consent screen, so it cannot complete over the API. | `GET /api/v1/client/{clientId}/channel/{channel}/connectlink` | update-client WRITE (client); plan: `update-client`; read-only |
| `list_channel_instructions` | Returns all operator-authored style instructions for every channel type (WEB, GMAIL, OUTLOOK, INSTAGRAM, MESSENGER, WHATSAPP, SMS, CHATGPT). | `GET /api/v1/client/{clientId}/channels/instructions` | update-client READ (client); plan: `update-client`; read-only |
| `list_channels` | Returns every messaging channel connected to a hotel (Instagram, Messenger, Gmail, Outlook, WhatsApp, ChatGPT guest app, …), with the reply-mode settings of each. | `GET /api/v1/client/{clientId}/channels` | update-client READ (client); plan: `update-client`; read-only |
| `update_channel_instruction` | Replaces the title and text of one instruction by its id. | `PUT /api/v1/client/{clientId}/channel/{channelType}/instruction/{instructionId}` | update-client WRITE (client); plan: `update-client` |
| `update_channel_settings` | Changes the reply mode of a connected channel: `autoReplyEnabled` turns automatic responses on/off; `draftOnly` puts replies in draft mode instead of sending. | `PATCH /api/v1/client/{clientId}/channel/{channelId}` | update-client WRITE (client); plan: `update-client` |

Full input fields for every tool: [references/tools.md](references/tools.md).

## Recommended workflows

### Connect a channel

1. `get_channel_connect_link` for the channel; it returns a URL that a signed-in operator must open in a browser (OAuth cannot be completed through the API).
2. After the operator finishes, `list_channels` shows the connection; set `update_channel_settings` as wanted.

## Tips

- `list_channels` reports `entitled` (channels in the plan), `guestappEntitled` and `guestMcpAvailable` — `connect_chatgpt_channel` works only when the last two are both true.
- `connect_chatgpt_channel` answers 503 where the guest app does not exist (checked first) and 403 `not_entitled` without the `guestapp` plan feature.
- Pass `returnTo` (a console, QA editor or admin `/clients/` URL) to `get_channel_connect_link` to land the operator back where they started; other URLs are refused with 400.

## Pitfalls

- Disconnecting a channel deletes its tokens; reconnecting requires the browser flow again.
- Every channel write is recorded in the hotel's activity feed as `channel_updated`.

## Calling conventions

Same tool, three transports — pick whichever your runtime already speaks. Always send `x-api-key`.

```bash
# REST
curl -X POST "https://maison-labs.com/api/v1/client/<clientId>/channel/<channelType>/instruction" -H "x-api-key: $MAISON_API_KEY" -H "content-type: application/json" -d '{ "title": …, "text": … }'
```

```json
// MCP (https://maison-labs.com/mcp, Streamable HTTP): tools/call
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "add_channel_instruction", "arguments": { "title": …, "text": … } } }
```

```json
// A2A (https://maison-labs.com/a2a): tasks/send with a data part
{ "jsonrpc": "2.0", "id": 1, "method": "tasks/send", "params": { "message": { "role": "user", "parts": [{ "type": "data", "data": { "tool": "add_channel_instruction", "input": { "title": …, "text": … } } }] } } }
```

Errors are the same everywhere: `401` no/invalid key; `403 forbidden` with `details.missing` (the grants you lack — fall back to the composite's parts or stop); `403 not_entitled` (the hotel's plan lacks the feature); `404`, `409`, `413 too_large`, `503`. Inputs that fail validation return `400 invalid_input` with the Zod issues — fix and retry once.
