Skip to main content
Glama

Turbo Notify: WhatsApp for AI agents

Poll the organization's event log

list_events
Read-onlyIdempotent

Poll everything that happened: messages, contacts, groups, numbers, quotas.

This is how an agent learns about inbound messages without hosting a webhook endpoint.

Events come back newest first, so polling for new ones uses ending_before, not starting_after. Typical loop: call with no cursor and remember the id of the FIRST event in the page (the newest one); next time, pass that id as ending_before to get only what has happened since. An empty page means you are caught up.

starting_after does the opposite: it walks BACKWARD into history, which is what you want for reading a backlog, and never what you want for noticing something new. Passing the last id you handled to starting_after in a loop returns steadily older events and never reaches the present.

request_id returns everything that came of one earlier call. A write tool's result carries request_id when the platform issued one; keep it and you can ask later what became of that specific send.

number_id restricts to one number and keeps matching its events after the number is renamed. number_alias restricts to one inbox by the alias it had when the event happened, so a rename hides the older events; the two can be combined. Either one excludes storage.* and media.unavailable events, which belong to the organization rather than to any one number.

Most events carry a number_alias telling you which inbox they belong to, and number_id (num_…), the same number's permanent identifier. The alias is the one at the time of the event and can be renamed later; the number_id cannot. You need one of them: message, contact and group ids are unique but not self-addressing, so an id alone does not tell you which number's tools to use with it, and both work as number_alias in the other tools. Read the fields defensively rather than assuming they are there: storage.* and media.unavailable belong to the organization as a whole and have no single number to name, so on those the keys are absent rather than empty.

Input Schema

NameRequiredDescriptionDefault
limitNoHow many events to return, 1-100. Defaults to 25.
number_idNoRestrict results to one number by its `id` (`num_…`, as returned by `list_numbers`). It keeps matching the number's events after the number is renamed, unlike `number_alias`, which matches the alias the number had when the event happened. Can be combined with `number_alias`. Absent means every number. Setting it excludes `storage.*` and `media.unavailable` events, which belong to the organization rather than to any one number.
event_typeNoFilter to exactly one event type, e.g. `message.received`. Common ones: `message.sent`, `message.delivered`, `message.read`, `message.received`, `message.reacted`, `message.edited` (a text or caption edit, or a calendar event that was edited or canceled), `message.calendar_responded` (a guest answered a calendar event), `message.quota.warning`, `number.connected`, `number.disconnected`, `contact.created`, `contact.quota.warning`, `group.joined`, `group.participants_added`. Use `event_types` instead to filter on more than one at once.
request_idNoReturn only the events that came of one earlier call (`req_…`). A write tool's result carries `request_id` when the platform issued one; keep it and you can ask later what became of that send.
created_gteNoOnly events created at or after this instant. ISO 8601 with an offset, e.g. `2026-09-01T00:00:00Z`.
created_lteNoOnly events created at or before this instant. ISO 8601 with an offset, e.g. `2026-09-10T00:00:00Z`.
event_typesNoFilter to several event types at once, e.g. `message.sent` and `message.delivered`. Same vocabulary as `event_type`. The API accepts at most 20.
number_aliasNoRestrict results to one inbox by the alias it had when the event happened, so events from before a rename are missed. Use `number_id` to follow a number across renames. **Absent means every number**, which is the usual choice. Note this is a filter, not a subject: unlike the messaging tools it does not default to `main`. Setting it also excludes `storage.*` and `media.unavailable` events, which belong to the organization rather than to any one number.
ending_beforeNoCatch up: return events NEWER than this id. Pass the newest id you have already handled to see only what has happened since. This is the one to poll with.
starting_afterNoRead further back: return events OLDER than this id. This is the one for walking a backlog, and the wrong one for noticing something new.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, openWorld), so the description goes further: it discloses result ordering (newest first), that an empty page means caught up, that number_alias is a point-in-time filter that hides pre-rename events, that either number filter excludes storage.* and media.unavailable, and that those keys are absent rather than empty. These are non-obvious traits an agent would otherwise learn only by trial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core purpose and the critical ordering rule before edge cases, and bold emphasis marks the trap. It is long for a list tool, and a few passages are redundant—the starting_after misconception is stated twice, and the number_alias rename caveat largely duplicates the schema's own parameter text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Ten optional parameters with an output schema present; the description need not explain return values and doesn't. It covers every decision an agent must make—which cursor, which number filter, when to use request_id, how to read missing keys defensively—so nothing material is left unresolved.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description supplies the operational semantics the schema cannot—how ending_before and starting_after compose into a working polling loop versus a history walk. It does restate some number_id/number_alias behavior already present in the schema, limiting added value, but the cursor workflow is genuinely new.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource—'Poll everything that happened'—and immediately enumerates the resource families covered (messages, contacts, groups, numbers, quotas). No sibling tool in the list has overlapping scope, so an agent can identify this as the sole event-log reader without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use case ('how an agent learns about inbound messages without hosting a webhook endpoint') and a concrete loop recipe. It also draws a hard exclusion between the two cursors: ending_before for new events, starting_after for backlog, with the failure mode of misusing the latter spelled out. Alternatives like request_id and the two number filters are each given a selecting condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.