Feature 016: comprehensive MailerPress coverage — 54 new agent-facing abilities across 4 domains (Campaigns, Contacts, Templates + Media, Dashboard + Settings). MailerPress goes from 15 → 69 abilities.
Feature 016 was scoped in response to a user question about mailerpress/create-campaign being missing from the Feature 014 MVP — a gap analysis of every remaining MailerPress REST endpoint surfaced 54 more that agents could productively wrap. All 54 shipped in a single 0.9.6 release across 4 sequential PRs and were verified end-to-end via MCP execution before merge.
Campaigns (21 new)
Full campaign lifecycle for AI agents: create-campaign (POST /campaigns), update-campaign (PUT /campaign/{id}), update-campaign-settings (PUT /campaign/{id}/settings), save-campaign-content (PUT /campaign/save-content/{id}), update-campaign-status (bulk-shaped: accepts single id / array / comma-separated / 'all' with optional filter), send-test-email (POST /campaign/send_test — external side-effect), create-campaign-batch + pause-campaign-batch + resume-campaign-batch (send-queue controls), get-campaign-logs + get-campaign-email-logs (per-recipient delivery detail), count-campaign-audience (pre-send validation), get-campaign-batches + get-batch-chunks (operational dashboard + Action Scheduler debug), get-campaign-status-summary (bulk multi-campaign snapshot), list-campaign-opened-contacts + list-campaign-clicked-contacts + list-campaign-unsubscribed-contacts (post-send engagement pivots), list-sent-campaigns (historical archive), format-campaign-html (pre-send lint), preview-campaign-for-contact (personalization preview).
Contacts (12 new)
Batch import + progress polling (import-contacts, track-import-progress, retry-import-batch), export-contacts (async ZIP delivery), engagement/campaign cross-ref (get-contact-activity, get-contact-campaign-history, get-contact-stats), free-plugin custom-field CRUD (list-free-custom-fields, create-free-custom-field — distinct from Pro's mailerpress-pro/*-custom-fields on plural /custom-fields route), check-email-validity (pre-import dedup), send-confirmation-email (double-opt-in resend), bulk-delete-contacts (confirm_count guardrail mirroring Feature 014's bulk-update).
Templates + Media (7 new)
Full template CRUD — list-templates, get-template, create-template, update-template, save-template-content, delete-template (with confirm_name guardrail). upload-campaign-image accepts either a fully-qualified URL or a data:image/*;base64,… data URI and returns the WP attachment id + all standard image sizes for use in campaign HTML.
Dashboard + Consolidated Settings (8 new)
Five thin dashboard-read wrappers: get-dashboard-campaigns, get-dashboard-contacts, get-dashboard-email-performance, get-dashboard-recent-campaigns, get-dashboard-contact-growth.
Three omnibus settings abilities (12 underlying endpoints compressed via an action enum):
manage-settings— active-provider read + connect/disconnect/set-primary + export/importmanage-api-keys— full 6-action key lifecycle (list/create/update/revoke/reactivate/hard-delete withconfirm_idguardrail)send-raw-email— stays as its own ability because it's an active send with external side-effect
See DEC-OMNIBUS-ABILITY-ACTION-ENUM in docs/memory/DECISIONS.md for the consolidation rationale.
CRUD symmetry finishers (7 new — from PR-A)
Filling in obvious holes from the Feature 014 MVP: list-tags (was missing — blocked tag-referencing workflows), delete-list + delete-tag (both with confirm_name guardrails; both dispatch to bulk-shaped DELETE /list and DELETE /tag endpoints with single-id ability wrappers), rename-list + rename-tag + set-default-list.
5 endpoint-drift bug patterns codified
MCP end-to-end execution testing (all 54 abilities exercised before merge) surfaced 5 distinct drift patterns that only appear at runtime, not at PHP-lint / static-analysis / unit-test time:
- Bare-scalar / bare-array responses failing
data: objectoutput_schema — need wrap under a semantic key - WP REST route matcher normalizing trailing slashes off during dispatch — endpoints registered
/foo/must be dispatched/foo - Non-standard / legacy param names on target endpoints (e.g., MailerPress
templateNamenotname) — translate at boundary - PHP strict-string TypeError on omitted null params — always pass explicit empty-string default on the wire
- Bulk-shaped endpoints taking
idsarrays where a single id is being passed — wrap as{ids: [id]}
All 5 patterns are captured in docs/memory/BUGS.md under BUG-ENDPOINT-DRIFT-PATTERNS as a systematic pre-verification checklist for future integrations, plus a full regression-test suite locking in the specific fixes (tests/Unit/MailerPress/DispatchDriftTest.php).
Test coverage delta
Started F016 at 135 MailerPress unit tests / 495 assertions (post-0.9.5). Ended at 377 tests / 1376 assertions — a +242 test / +881 assertion expansion covering every new ability's shape invariants + 11 dispatch-drift regressions. Full suite runs in ~100 ms via composer test:mailerpress.
Operator note
Both MailerPress + MailerPress Pro suites now register a combined 97 abilities (69 free + 28 Pro) — up from 43 at 0.9.5. All 54 new abilities appear automatically on the abilities-manager Integrations page's MailerPress tab and on every MCP server's Abilities table. No database schema changes; no runtime migration. Companion acrossai-mcp-manager version parity unchanged.
Deferred (backlog)
5 MailerPress Pro embed abilities tracked in #61: revoke-embed-key + activate-embed-key (finish embed-key lifecycle) and validate-embed-key / get-embed-form-config / submit-embed-contact (public embed-form API). These warrant their own security-review pass since the public-form endpoints open a distinct agent-use pattern (programmatic form submission from Airtable/Zapier flows) — scoped out of F016 to keep this release focused on the free-plugin coverage sweep.
Compatibility
- WordPress: Requires 6.9, tested up to 7.1
- PHP: Requires 8.1+
- Pairs with
acrossai-mcp-manager(hardRequires Plugins:dep) — no version bump required
Full changelog: v0.9.5…v0.9.6