Agent Skills / maison-channels
Install this skill alone, or read it below. Raw file: SKILL.md · references/tools.md
npx skills add https://docs.maison-labs.com --skill maison-channelsMaison — 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_settingswithautoReplyEnabled: falseordraftOnly: true. - Give channel-specific tone or rules —
add_channel_instruction.
Before you start
- Send
x-api-key: <key>on every call; the key only reaches/api/v1. GET /api/v1/tools(or MCPtools/list) returns the tools THIS key may run — if a tool below is missing there, you lack a grant; do not retry it.- Client-scoped tools take
clientId(a hotel id).whoamilists 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.
Recommended workflows
Connect a channel
get_channel_connect_linkfor the channel; it returns a URL that a signed-in operator must open in a browser (OAuth cannot be completed through the API).- After the operator finishes,
list_channelsshows the connection; setupdate_channel_settingsas wanted.
Tips
list_channelsreportsentitled(channels in the plan),guestappEntitledandguestMcpAvailable—connect_chatgpt_channelworks only when the last two are both true.connect_chatgpt_channelanswers 503 where the guest app does not exist (checked first) and 403not_entitledwithout theguestappplan feature.- Pass
returnTo(a console, QA editor or admin/clients/URL) toget_channel_connect_linkto 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.
# 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": … }'// 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": … } } }// 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.