MCP, use Groupilot from Claude
Connect Claude, Cursor or any MCP client to Groupilot, the tools exposed, the sequence prompt, the docs resource and the safety rules.
Groupilot runs an MCP server. Connect it to your assistant and say "create my Sunday 8 pm webinar with a J-1, H-1 and replay sequence". The assistant calls the same API as everyone else, with your key or your OAuth connection, and asks before anything that reaches real people.
Connect
Remote server (recommended)
| URL | https://mcp.groupilot.com/mcp (https://mcp.groupilot.com/ works too) |
| Transport | Streamable HTTP, no session, JSON responses |
| Auth | OAuth (the client opens the Groupilot consent page) or Authorization: Bearer gp_live_… |
In claude.ai, Claude Desktop, Cursor or VS Code, add a remote MCP server with that URL. Without a token the server answers 401 with WWW-Authenticate: Bearer realm="groupilot", resource_metadata="https://mcp.groupilot.com/.well-known/oauth-protected-resource" (on /mcp, that URL ends with /mcp): a client that supports OAuth registers itself, opens the Groupilot consent page where you pick the WhatsApp account and the rights, and gets its token. Nothing to copy. See Connect OAuth.
With a client that lets you set headers, an API key works instead: header Authorization with value Bearer gp_live_….
{ "mcpServers": { "groupilot": { "url": "https://mcp.groupilot.com/mcp" } } }Local package (available soon)
For clients without remote OAuth, a local bridge runs over stdio with an API key:
{
"mcpServers": {
"groupilot": {
"command": "npx",
"args": ["-y", "@groupilot/mcp"],
"env": { "GROUPILOT_API_KEY": "gp_live_…" }
}
}
}GROUPILOT_MCP_URL is optional. The package is not on npm yet: use the remote server in the meantime.
What the assistant can do
One tool per API endpoint, with the same scopes (read, write, send), the same limits and the same errors ({ "error": { "code", "message", "field" } }). Every call appears in Settings, Integrations, Last calls, with the method MCP. There is no two-step media upload over MCP: the assistant uses import_media with a public URL.
Tools that reach real people (send_adhoc_message, create_broadcast, cancel_job, cancel_broadcast, pause_event, delete_sequence, delete_message, delete_webhook, confirm_backup_admin) are flagged destructive and their description asks the assistant to confirm with you first. Reading tools are flagged read-only.
Read (23)
| Tool | What it does |
|---|---|
get_account | The connected WhatsApp account: number status, billing state, limits and the scopes of this key. Call it first to know what you can do. |
list_notifications | Recent account notifications: send failures, disconnections, full communities. Use it to explain a problem to the user. |
list_events | The account's events (a webinar, a challenge…), each with its WhatsApp communities and smart link. Filter by status. |
get_event | One event with its linked sequence, recurrence, smart link and where the link currently sends people. |
get_recurrence | The weekly rule of a recurring event (days, time, time zone) and its smart link. |
list_occurrences | The dated sessions of an event (upcoming or past), each with its WhatsApp communities and their invite links. |
get_occurrence | One dated session with its communities, invite links, member counts and provisioning state. |
list_communities | Every community of the number: the ones Groupilot created (with their event) and the external ones. Their `whatsapp_id` is what broadcasts target. |
get_community | One Groupilot community with its links, member count and settings. |
list_sequences | The message sequences of the account (name, message count, linked events). |
get_sequence | A sequence and its ordered steps (timing relative to the live, type, text, media, poll, or the `community_update` payload of a step that renames / re-describes the community). |
preview_resync | What applying the sequence again to its linked events would change (messages added, updated, canceled), per event, without changing anything. |
list_jobs | The messages planned, sent or failed for an event, with filters (status, occurrence, dates) and a cursor. |
get_job | One scheduled message with its effective content, status, retries and what can still be done with it. |
list_job_deliveries | For one scheduled message, each community it was sent to and the result. |
list_broadcasts | Broadcasts sent or scheduled to chosen communities, with their counters. |
get_broadcast | One broadcast with its status and counters. |
list_broadcast_recipients | The communities targeted by a broadcast and the outcome for each. |
list_webhooks | The account's webhook endpoints. Event types: member.joined (Someone joined a WhatsApp community of one of your events.); job.sent (A scheduled message was sent (all or part of its communities).); job.failed (A scheduled message failed for good (no more automatic retry).); community.created (A WhatsApp community was created for an occurrence.); community.full (A community reached its switch threshold; the next one takes over.); channel.disconnected (The WhatsApp number went offline and needs a new QR scan.); event.paused (An event was paused (through the API).); broadcast.completed (A broadcast finished (completed, failed or requires review).). |
list_webhook_deliveries | Recent deliveries of one endpoint with status, attempts and HTTP results (30 days). |
get_webhook | One endpoint with its events and state. |
get_member_webhook | The per-event webhook called when someone joins a community (legacy feature; prefer account webhooks with `member.joined`). |
get_backup_admin | Sensitive. The backup administrator (a second phone number added as admin of each community so the user keeps control if the main number is lost), with the state per community. Phone numbers are masked. |
Configure (29)
| Tool | What it does |
|---|---|
create_event | Creates an event (punctual or recurring) with its WhatsApp community settings. Communities are created automatically before each occurrence. Ask the user for the name, the date/time (or weekly days) and the time zone before calling. |
update_event | Changes an event's settings (display name, link fallback, community names, policies…). The slug (smart link) and the time zone are locked once created; renaming keeps the link and the existing communities as they are. `apply_to_existing_communities` pushes community name/description changes to live WhatsApp communities. |
pause_event (asks you to confirm) | Stops every scheduled message of the event until resumed; messages whose time passes during the pause are not sent later. Confirm with the user before calling. There is no delete: pausing is the way to stop. |
resume_event | Resumes a paused event: future messages go out again (elapsed ones were canceled). |
link_sequence | Attaches a message sequence to an event (or detaches it with sequence_id null). Pending messages of upcoming occurrences are recomputed. |
set_recurrence | Changes the weekly days/time of a recurring event. Use `dry_run: true` first to see which occurrences would be added or canceled, then apply. |
create_occurrence | Adds a dated session to an event (local date-time in the event's time zone). Its community and messages are created automatically. |
retry_provisioning | When an occurrence's WhatsApp community failed to be created, asks for a new attempt. |
update_community | Renames a community, changes its description or who may post. Applied on WhatsApp right away. |
sync_sequence | The recommended way to write a sequence: send the complete sequence (name + ordered messages, each with an `external_id`). Groupilot creates it or updates it, matching messages by external_id and removing the missing ones. Pending messages of linked events are resynchronised unless `apply_to_pending_jobs` is false. Timing format: `J-2 10:00` (2 days before the live at 10:00), `J0 19:45`, `J+1 09:00`, or whole hours relative to the live time (`H-1`, `H+2`; minutes are not allowed in `H` timings, use a fixed `J0 HH:MM` time instead). A step of type `community_update` posts nothing: it changes the community name and/or description at its time (`community_update: { name_template, description_template, restore_name, restore_description }`, variables `{community_name}`, `{community_description}`, `{event_name}`, `{date}`, `{time}`, `{J+4:date}`...); typical pair: `🔴 EN LIVE · {community_name}` at the live time (`J0 20:00` for a 20:00 live) and `restore_name: true` at a fixed time after the live (`J0 22:00`). Always use fixed `J0 HH:MM` times for these steps. WhatsApp shows a system line at each change, so keep these steps rare. A text message with `link_preview: false` is sent without the preview card of its link (default `true`). At most 200 messages per sequence. The texts, poll questions and options, and community update templates of one call add up to at most 3 MiB (3,145,728 bytes, counted in UTF-8); a larger payload is refused with `400 validation_error` (field `messages`) before anything is written: split the content across several sequences or shorten the texts. Send the JSON as UTF-8: a request body above 4 MiB is refused with HTTP `413` (escaping every non-ASCII character as `\uXXXX` can double the size of texts written in non-Latin scripts). The sync is refused with a `conflict` error, before anything is written, when the linked events' upcoming occurrences times the messages would exceed 20,000 scheduled sends: link fewer events, or pass `apply_to_pending_jobs: false` and resync event by event with `resync_sequence`. Use the `generate_sequence` prompt to draft one. |
create_sequence | Creates a sequence with a name; add messages with add_message (prefer sync_sequence for a full sequence). |
rename_sequence | Changes the name of a sequence. |
delete_sequence (asks you to confirm) | Deletes a sequence. Refused while an active or paused event uses it unless `force` is true (the events are then unlinked and their pending messages canceled). Confirm with the user. |
add_message | Appends one step (text, image, video, audio, document, poll, or `community_update` to rename / re-describe the community at that time; then pass `community_update` with `name_template` / `description_template` or `restore_name` / `restore_description`, no text or media) with its timing. On a text message, `link_preview: false` sends it without the preview card of its link (default `true`). At most 200 messages per sequence. Pending sends of linked events are resynchronised unless `resync` is false. |
update_message | Changes the text, timing, media, poll, link preview (`link_preview`, text messages only) or `community_update` payload of one step. Switching a step to `community_update` needs its payload in the same call and drops text, media, poll and ghost mention. |
delete_message (asks you to confirm) | Removes one message; its pending sends are canceled when `resync` is true (default). |
reorder_messages | Sets the display order of the messages (all ids, in order). |
resync_sequence | Applies the sequence to the pending messages of its linked events (or only `event_ids`). Sent, in-progress and hand-edited messages are left alone. Refused with a `conflict` error, before anything changes, above 20,000 scheduled sends in one call: pass fewer `event_ids`. |
import_media | Downloads a public HTTPS file (image, video, audio, document; 40 MB max) into the account's media library and returns the `media_url` to use in messages. |
create_webhook | Registers an HTTPS URL to receive events (5 max). Returns the signing secret ONCE: give it to the user to store, never repeat it later. |
update_webhook | Changes the URL, events or description; `enabled: false` pauses deliveries. |
delete_webhook (asks you to confirm) | Deletes an endpoint and its delivery history. Confirm with the user. |
rotate_webhook_secret | Issues a new signing secret (shown once); the old one stops working immediately. |
test_webhook | Posts a `webhook.test` envelope now and reports the first attempt (HTTP status). |
set_member_webhook | Sets (or clears with null) the per-event member-join webhook URL. Returns the signing secret once when created. |
rotate_member_webhook_secret | New signing secret for the per-event webhook, shown once. |
test_member_webhook | Sends a test delivery to the per-event webhook. |
set_backup_admin_default | Sensitive. Saves the default backup phone number of an event (E.164, must already be a saved WhatsApp contact of the main number). Does not change communities by itself: use preview_backup_admin then confirm_backup_admin. |
preview_backup_admin | Sensitive. Computes what `apply`, `retry`, `stop`, `enable_rule` or `stop_rule` would do on the chosen communities and returns a preview id valid a few minutes. Nothing changes yet. |
Send (7)
| Tool | What it does |
|---|---|
send_adhoc_message (asks you to confirm) | Plans one extra message to the communities of an occurrence at `send_at` (at least 60 s ahead; 30 per day). This sends a WhatsApp message to real people: confirm the text, the occurrence and the time with the user first. |
override_job | Changes the text or media of one pending message (not a poll, not a community update step: error `community_update_not_editable`, not already attempted) for this occurrence only, without touching the sequence. |
cancel_job (asks you to confirm) | Cancels one pending scheduled message for good. Confirm with the user. |
retry_job | Re-queues a failed or partially sent message (`mode`: failed, partial, overdue, force_now). Only communities that certainly did not receive it are retried. |
create_broadcast (asks you to confirm) | Sends one message (text, media or poll; never a community update) to up to 200 communities now or at a date (8 per day). Targets are `whatsapp_id`s from list_communities. This reaches real people: show the user the exact text and targets and get a yes before calling. |
cancel_broadcast (asks you to confirm) | Cancels a broadcast that has not started sending. |
confirm_backup_admin (asks you to confirm) | Sensitive, irreversible on WhatsApp: applies a previewed change (adds or removes an administrator in real communities). Show the preview to the user and get an explicit yes before calling. |
The list above comes from the live catalogue, mcp-tools.json.
The sequence prompt
The server ships a generate_sequence prompt with arguments event_name, live_day_time, offer, and optional tone and language (French by default). It gives the assistant the rules of a sequence (a window from J-4 to J+3, at most 200 messages, H timings in whole hours, mention of all members on the two or three most important messages only) and the exact format of sync_sequence. The assistant writes, you review, then it saves with sync_sequence. Groupilot runs no AI itself: the generation happens in your assistant.
The docs as a resource
The server exposes groupilot://docs/llms.txt, this documentation in one file refreshed every hour, so the assistant knows the timing rules, the variables and the limits without searching. You can also paste llms-full.txt into any chat.
Safety
- The server has exactly the rights of the key or the OAuth grant. A key without
sendcannot send, whatever the assistant tries. - Prefer
readandwritefor everyday setup. Addsendonly when you want the assistant to send. - Revoke a key from Settings, Integrations, or an OAuth connection from Connected applications: the assistant loses access within a minute.
Example conversation
Create a recurring event "Sunday webinar", every Sunday at 20:00, communities created 3 days before. Then build a sequence with a reminder the day before at 10:00, an image one hour before, a message mentioning everyone at 19:55 with the Zoom link, and a replay message the day after at 10:00. Link it to the event and give me the smart link.
The assistant calls create_event, sync_sequence (after showing you the messages), link_sequence, then get_event and returns the smart_link.