Skip to content
Whats91

The six safety classes, the prepare and confirm pattern, idempotency, approvals, and audit behaviour.

Safety and Approvals

Summary

The six safety classes, the prepare and confirm pattern, idempotency, approvals, and audit behaviour.

Prerequisites

  • A Whats91 account
  • A generated public API token

Every Whats91 MCP tool declares a safety class. The class is not decorative: it sets the tool annotations, audit severity, rate-limit class, and the default confirmation, preview, and approval behaviour. A client can read all of it from tools/list before deciding to call anything.

Safety Classes

The Approval and Preview columns below are the defaults a class implies. Individual tools override them in both directions, so treat the class as a guide and the per-tool metadata as the authority.

ClassToolsApprovalPreviewRetry policyAudit
READ_ONLY69NoNoSAFEINFO
DRAFT_WRITE17NoNoIDEMPOTENCY_REQUIREDNOTICE
REVERSIBLE_WRITE23NoNoIDEMPOTENCY_REQUIREDNOTICE
DESTRUCTIVE_WRITE15YesYesNO_AUTOMATIC_RETRYWARNING
EXTERNAL_SIDE_EFFECT14YesYesPROVIDER_AWAREWARNING
HIGH_IMPACT_EXECUTION13YesYesNO_AUTOMATIC_RETRYCRITICAL
ClassMeans
READ_ONLYReads data. Safe to call and safe to retry.
DRAFT_WRITECreates or edits a draft that has no external effect until it is published or sent.
REVERSIBLE_WRITEChanges stored data in a way you can undo through another tool or the dashboard.
DESTRUCTIVE_WRITERemoves or overwrites data in a way that is not trivially reversible.
EXTERNAL_SIDE_EFFECTReaches an external system such as Meta. The effect leaves Whats91 and cannot be recalled.
HIGH_IMPACT_EXECUTIONBoth destructive and externally visible, typically at audience scale. The most restricted class.

Note

A tool with no declared safety class is treated as HIGH_IMPACT_EXECUTION rather than as read-only. The platform fails closed.

Never Infer Approval From the Class

A tool can require approval that its class would not imply, and can waive approval that its class would imply. Read whats91/approvalRequired from the tool _meta returned by tools/list, and branch on that value rather than on the safety class.

ToolClassActual behaviour
whats91_blacklist_bulk_add_confirmREVERSIBLE_WRITERequires approval and preview even though the class does not imply them.
whats91_chatbot_deleteDESTRUCTIVE_WRITEDoes not require approval; the guarded path is the separate prepare and confirm pair.
whats91_media_upload_prepareEXTERNAL_SIDE_EFFECTDoes not require approval; it opens an upload session rather than publishing anything.
whats91_media_upload_bytesEXTERNAL_SIDE_EFFECTDoes not require approval; bytes are staged until the upload is completed.
whats91_media_upload_completeEXTERNAL_SIDE_EFFECTDoes not require approval; it finalises an already-authorised upload session.

Prepare and Confirm

High-risk operations are split into two calls. Prepare computes the effect server-side and returns a one-time confirmation token; the second call executes exactly that computed effect. The model never gets to describe an effect in its own words and then have that description executed.

  1. Call the prepare tool with an idempotency key. It validates the target, computes a server-side preview, and returns a confirmation token.
  2. Show the preview to the person responsible for the action.
  3. Call the matching confirm tool with the token to execute the previewed effect.
  4. If the underlying draft changed between prepare and confirm, the token no longer matches and confirm is rejected.
Prepare a campaign execution
{
  "jsonrpc": "2.0",
  "id": 10,
  "method": "tools/call",
  "params": {
    "name": "whats91_campaign_execution_prepare",
    "arguments": {
      "setup_uid": "setup_abc12345",
      "campaign_uid": "cmp_abc123",
      "idempotency_key": "acme-campaign-2026-08-12-001"
    }
  }
}

Warning

Never treat a prepare result as the action having happened. Prepare has no external effect. Only the second call executes.

Most pairs are named _prepare and _confirm. Two flows use a different second step, so match on the prepare tool rather than assuming the suffix.

Prepare toolSecond stepNotes
whats91_<operation>_preparewhats91_<operation>_confirmThe standard pair, used by 20 of the 22 prepare tools.
whats91_contact_book_archive_preparewhats91_contact_book_archiveThe executing tool keeps the plain name.
whats91_media_upload_preparewhats91_media_upload_bytes, then whats91_media_upload_completeA three-step upload: open a session, stage bytes, then finalise. Poll whats91_media_upload_status_get for progress.

Idempotency

Every non-read class expects idempotency. Write tools take an idempotency_key: a caller-generated stable key, 8 to 200 characters from letters, digits, dot, underscore, colon, and hyphen. Replaying the same key replays the same result rather than performing the operation twice.

  • Derive the key from something stable in your own system, not from a timestamp or random value regenerated on retry.
  • SAFE retry policy means the tool can be retried freely.
  • IDEMPOTENCY_REQUIRED means retry only with the same idempotency key.
  • PROVIDER_AWARE means the outcome depends on an external provider; reconcile before retrying.
  • NO_AUTOMATIC_RETRY means never retry automatically. Surface the failure to a human.

Approvals

Approval-required tools are gated by the customer approval path in addition to OAuth scope. Before executing, the platform checks operational readiness and reports whether the approval path is available. When approvals are not configured, an approval-required tool reports that it cannot be attempted instead of silently running.

operational_capability on a tool result
{
  "operational_capability": {
    "can_attempt": true,
    "approval_required": true
  }
}

Note

Message sending has its own customer policy. When the policy is set to require approval, message-sending tools are only attemptable while the approval path is available.

Tools also declare the Whats91 entitlements they need, such as mcp_platform, campaign_builder, or campaign_send, and whether customer consent is required. A scope grant does not bypass a missing subscription, an expired plan, or an inactive add-on.

Error codeMeaning
MCP_FEATURE_DISABLEDThe capability is not enabled for the account.
MCP_SUBSCRIPTION_REQUIREDAn active Whats91 subscription is required.
MCP_SUBSCRIPTION_EXPIREDThe subscription has expired. Renew before retrying.
MCP_ADDON_ACCESS_REQUIREDThe required add-on is not active for the account.

Rate Limits

LimitDefaultCounted by
MCP server requests120 / 60 secondsConnection
MCP runtime per user120 / 60 secondsTenant
Authorization endpoint10 / 60 secondsClient IP
Token and revoke endpoints60 / 60 secondsClient and IP
Per tool class (READ, WRITE, BULK_WRITE, EXTERNAL_SIDE_EFFECT, HIGH_IMPACT)120 / 60 seconds eachTenant and class

Note

Tool class limits are configured independently, so a burst of reads cannot exhaust the budget for high-impact executions. All values are operator-configurable defaults.

Related Documentation