30 days free. No credit card. Full access from the moment you connect your site.

Start free trial

v0.9.15 — MailerPress abilities say what they do, and counters are numbers

A focused release: the MailerPress half of five issues found by driving the abilities over a live MCP connection. The other four were in AcrossAI Abilities Manager and shipped in its 0.0.36.

Every MailerPress ability now says what it does

Not one of the 117 MailerPress / MailerPress Pro abilities declared readonly, destructive or idempotent. The key was absent entirely, so all three read null. mailerpress/list-campaigns described itself as "Read-only" in its own text while telling a caller nothing.

An AI client asks three questions before running anything — is this safe to try, safe to retry, safe to run without asking — and a missing answer isn't read as "unknown". It's read as "not destructive", which is the wrong way round to be wrong.

Judged on evidence, not on names

These abilities delegate through dispatch_rest( 'METHOD', … ), so the HTTP method is direct evidence of what each actually does:

dispatchesreadonlydestructiveidempotent
GETtruefalsetrue
POSTfalsefalsefalse
PUTfalsefalsetrue
DELETEfalsetruetrue

96 followed that mechanically. 21 were judgement calls, reviewed before anything was written — among them manage-api-keys (dispatches all four methods and can delete a key → destructive), four POST-as-query endpoints that mutate nothing → read-only, and send-campaign as the only destructive and non-idempotent entry, since sending cannot be unsent.

Counts came back as text

List Campaigns returned "count": "0" — the digit zero as a string, so a caller comparing it numerically could get the wrong answer. MailerPress returns that field as text from one of its queries, and this plugin passed the payload straight through.

Counts, page numbers and per-campaign figures like opens and clicks are now returned as numbers wherever they arrive as whole-number text, coerced once in both guards' envelopes rather than in 117 places.

Identifiers are deliberately left alone. MailerPress uses both plain numbers and long reference codes for those, so forcing one type would break the other.

No breaking changes

Nothing about how an ability runs changed — only what it tells a caller about itself, and the type of a number it already returned.


Quality gates: mailerpress 968 tests · mailerpress-pro 185 · toolsets 10 · WordPress Plugin Check clean.


Keep reading