Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BLUETICKS_API_KEYYesYour Blueticks API key. The server can also read the key from the --api-key <key> command-line option.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
scheduled_messagesA

Send, list, edit, cancel, or look up the status of WhatsApp messages. Available actions:

  • send: send a message now (or schedule for later via send_at). Use text for plain text, media_url (+ optional media_caption) for image/video/document, or poll: {question, options, allow_multiple?} for a WhatsApp poll. The three are mutually exclusive.

  • get: retrieve a single message by id

  • list: list messages, newest first (offset pagination via limit/skip). Optionally filter by chat_id (recipient JID) and/or status — use status: 'pending' to see queued, not-yet-sent messages.

  • update: edit a pending message that hasn't dispatched yet. Accepts text, media_url, media_caption, send_at (any subset).

  • cancel: cancel a pending message that hasn't dispatched yet.

  • ack: batch lookup of delivery + read acknowledgements for up to 200 message keys

Identifier model (important for chaining send → ack):

  • id is the internal Blueticks message id, returned by send and accepted by get/update/cancel. Use it to look up message status.

  • waMessageKey is the WhatsApp wire message key, populated by the engine once the message is dispatched. Use its _serialized form for ack here and for every chats per-message endpoint. It is null on a freshly-pending message — call get after status advances to obtain it.

Examples:

  • send: 'message 972544325389@c.us — your appointment is tomorrow at 10am'

  • get: 'what's the status of message msg_abc?'

  • list: 'show me my scheduled messages' (status: 'pending')

  • update: 'reschedule msg_abc to send tomorrow at 5pm'

  • cancel: 'cancel my scheduled message msg_abc'

  • ack: 'were these 3 messages read?' (message_keys come from get/list)

chatsA

Read or send WhatsApp messages inside chats on the connected engine. Available actions:

  • list: list chats, newest message first (offset pagination via limit/skip)

  • search: list chats matching a name/keyword query. Archived chats are excluded by default — pass include_archive=true to find an archived chat (e.g. to get its chat_id before unarchive).

  • get: retrieve a single chat by chat_id (e.g. 972544325389@c.us)

  • list_messages: list messages inside a chat

  • mark_read: mark all messages in a chat as read

  • archive: archive a chat (hide it from the main chat list)

  • unarchive: unarchive a chat (restore it to the main chat list)

  • get_media: download media bytes for one message by its wire key — returns url/data_base64 + mimetype/filename + original_quality flag (false when WA returned a preview rather than the original; currently only happens for own-sent newsletter media).

  • get_participants: list the members of a group chat

  • load_more_history: request OLDER history for ONE specific chat (chat_id) from the phone, so a subsequent list_messages can page further back. Each call pulls one page; call it again to go deeper. Use it whenever a chat's loaded messages don't reach far enough back for what you need. Paced and limited: one request per chat at a time, WA-paced — a call while that chat's request is in flight or cooling down returns added:0 (not an error); wait and retry. While the initial sync is still running the call throws a not_connected error. After repeated unanswered requests WhatsApp history requests pause: the result's error starts "cooling_down:" and says how long to wait — retry after that, don't treat it as "no history". canLoadMore:false = history is genuinely exhausted — stop paging. A chat with no messages AND no chat activity on the engine (e.g. a saved contact whose conversation WhatsApp's first sync never delivered: get returns it with lastMessageAt null) has nothing to page back from, so added stays 0. Once one message is sent or received in that chat, its older history can be requested.

  • send_message_text: send a text message NOW (fire-and-forget). Body: {chat_id, type: "text", text}

  • send_message_media: send an image/video/audio/document NOW. Body: {chat_id, type: "media", media: {url, kind?, caption?, filename?}}

  • send_message_poll: send a poll NOW. Body: {chat_id, type: "poll", poll: {question, options[2..12], allow_multiple?}}

type is derived automatically from the action ("text"/"media"/"poll"), so you don't need to send it; include it only if you want to be explicit.

send_message_* is for IMMEDIATE delivery into a chat — use the scheduled_messages tool's send action to schedule a future send (with send_at) or to keep the message in a queue you can edit/cancel before dispatch.

Examples:

contactsA

Read WhatsApp contacts known to the connected engine. Available actions:

  • list: list contacts, optionally filtered by query (offset pagination via limit/skip)

  • common_groups: list the groups the connected account shares with a contact (WhatsApp's "groups in common"). chat_id is the contact JID (e.g. 12345@c.us).

Examples:

  • list: 'find contacts named Douglas'

  • common_groups: 'what groups do I share with 972544325389@c.us?'

groupsA

Create and manage WhatsApp groups via the connected engine. Available actions:

  • list: list groups the engine sees (offset pagination; optional name query)

  • get: retrieve a group by group_id (e.g. 972...-1597620113@g.us); set include_participants for the member list inline

  • create: create a new group with a name and a list of participant phone numbers

  • update: rename a group or change its admin/messaging settings

  • leave: cancel the authenticated user's membership. NOTE: WhatsApp has no "destroy group" — the group continues for any remaining members; only your membership ends.

Notes:

  • Newly-created groups default to admins-only-post (announce=true) and admins-only-edit (restrict=true) — that's WAWeb's default. To open posting/editing to all members, follow create with update settings={announce:false, restrict:false}.

  • participant_count includes the creator/owner. Inviting your own phone number deduplicates into the owner slot rather than adding a separate participant.

  • create always returns participants[] inline so you can confirm membership immediately.

Examples:

  • list: 'show me my groups'

  • get: 'fetch group 972...-1597620113@g.us'

  • create: 'create a group called Crew with +972544325389 and +1234567890'

  • update: 'rename group g@g.us to Sales Team'

  • leave: 'leave group g@g.us'

audiencesA

Reusable contact lists used as targets for messages and campaigns. Available actions:

  • list: list audiences

  • create: create a new audience by name

  • get / update / delete: standard CRUD on an audience

  • append_contacts: add contacts (to + optional variables) to an audience

  • update_contact / remove_contact: edit or remove a single contact within an audience

Phone format: to must be in international format (e.g. +14155551234). JID form (12345@c.us) is rejected here. Variables: each key on variables becomes a {key} token usable in campaign templates (case-insensitive). Custom tokens override built-ins: setting variables.firstName='Doug' makes {firstName} resolve to Doug instead of the WA profile name. Built-ins always available even without variables: whatsappname, displayname, phone, mobile.

Examples:

  • create: 'create an audience called Leads'

  • append_contacts: 'add +972544325389 to the Leads audience with firstName=Doug, product=Premium'

campaignsA

Schedule audiences for paced bulk delivery, with pause/resume/cancel controls. Available actions:

  • list: list campaigns

  • create: schedule a campaign against an audience (name + audience_id + optional text/media_url/media_caption/on_missing_variable)

  • get: retrieve a campaign by id

  • pause / resume / cancel: control a running campaign

Templates: text supports per-contact substitution using SINGLE-brace tokens — Hi {firstName}, your {product} is renewing. Resolution is case-insensitive. Built-ins always available: {whatsappname}, {displayname}, {phone}, {mobile}. Custom tokens come from audiences.append_contacts variables (the property name becomes the token). on_missing_variable=fail (default) rejects at create time if any contact lacks a referenced token; skip accepts and leaves {token} literal in unresolved sends.

Examples:

  • create: 'campaign called Summer Promo targeting the Leads audience with text "Hi {firstName}, your {product} is renewing"'

  • pause: 'pause campaign 6a37b9a44919fa7098017a65'

webhooksB

Register URLs to receive HTTPS POSTs on Blueticks events. Available actions:

  • list: list webhooks

  • create: register a new webhook (URL + events)

  • get / update / delete: standard CRUD

Examples:

engineA

Inspect the WhatsApp engine(s) connected to this account. Available actions:

  • status: returns the connected engines as an array — one entry per online engine, each with {id, type, connected, state, stream, hasSynced}. An empty array means no engine is currently connected (not an error).

Examples:

  • status: 'is WhatsApp connected?'

utilsA

Local helpers that don't require a backend call. Available actions:

  • current_date_time: current date/time + timezone of the MCP host (gateway pod or stdio bridge). Always call this before any tool that takes a future timestamp.

Examples:

  • current_date_time: 'what time is it for me right now?'

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation4/5

Each top-level tool maps to a distinct resource (messages, chats, contacts, groups, audiences, campaigns, webhooks, engine, utils), so an agent can pick the right one by domain. The main gray area is sending: scheduled_messages.send can also send 'now', overlapping with chats.send_message_text/media/poll, and chats.list vs groups.list both return group-ish entities — but the descriptions explicitly clarify the intended split.

Naming Consistency4/5

Consistent plural-resource noun naming with a uniform 'action' sub-parameter pattern (send/get/list/update/cancel) throughout all nine tools. Minor deviations: singular tools (engine, utils) and a few noun-style action names (common_groups, get_media) break the pure verb pattern, but the scheme is predictable.

Tool Count5/5

Nine top-level tools is well-scoped for a WhatsApp automation server, and each maps to a coherent domain object rather than exposing every operation as its own tool. Heavy sub-action surfaces (e.g. chats) are grouped logically rather than sprawling the tool list.

Completeness4/5

Broad coverage: send/receive, scheduled queue, contacts, groups, audiences, campaigns, webhooks, and engine status — a full lifecycle for messaging automation. Gaps remain around destructive/engagement operations: no message delete/revoke or reaction, and group membership management lacks add/remove/promote participant actions despite group creation.

Maintenance

ActivityMaintained
ResponsivenessNo issues