Formidable
These abilities register when Formidable is detected on the site and a Pro licence is active. If either is missing the module stays absent rather than failing at call time.
At a glance
Formidable registers 39 abilities: 17 that only read, 8 that write, and 14 marked destructive. That split is the practical answer to how much of this module can run unattended. Reads cost nothing and are safe to repeat, so discovery is the part to be generous with; the writes are where review belongs, and the destructive calls stop for an explicit confirmation every single time regardless of which profile is active.
What this module is for
Work with Formidable forms, fields, styles, entries, applications, actions, notifications, on-submit behavior, subscriptions, and transactions.
Before you rely on it: Application mapping and on-submit actions can affect downstream workflows; test them end to end.
Typical workflows
- Map a form to an application after inspecting both
- Audit on-submit actions and notifications
- Review entry status changes as a separate approval step
The Formidable Forms integration page covers the same module from the workflow side, with the capability map and the questions worth asking before a first write.
Availability on your site
The Formidable module needs three things at once: WPPilot Free as the MCP foundation, an active Pro licence, and the companion plugin detected on the site. Miss any one and the module does not register, which is deliberate: an ability that appears in the tool list but fails at call time is worse than an ability that was never offered. What the connected agent can actually call is then narrowed twice more: by the safety profile active on the site, and by the WordPress capabilities of the user behind the credential. A read that succeeds for an administrator can be absent entirely for an editor.
Every write these abilities perform is recorded in the change ledger, and destructive calls can be routed through the approval queue so a person signs off before anything is applied. A successful tool result means the operation returned, not that the front end, the cache, and every dependent template are correct: that still needs a look.
Reads
Available in every safety profile, including Read Only. Inspection costs nothing and is not rate limited.
| Ability | What it does |
|---|---|
wppilot/formidable-check-setupCheck Formidable Setup | See the plugin source for this ability's contract. |
wppilot/formidable-get-applicationGet Formidable Application | Reads one Formidable Pro Application by id. Returns id, name, slug, form_count, created_at, updated_at, AND the form_ids list (member form ids retrieved via FrmProApplication::get_forms_for_application). Pro-only. |
wppilot/formidable-get-entryGet Formidable Entry | Reads ONE submission by id. With include_meta=true (default), the response includes a meta map keyed by field_key with the submitted values (Formidable stores them in wp_frm_item_metas). Long string values are truncated at max_field_bytes (default 8192) and the truncation paths are reported in truncations[] so you can re-fetch a specific field with a higher cap. |
wppilot/formidable-get-field-types-schemaList Formidable Field Types | See the plugin source for this ability's contract. |
wppilot/formidable-get-form-actionGet Formidable Form Action | Reads the full payload for one form action of ANY type. Returns id, name, type, enabled, modified_at, and the decoded settings blob (verbatim — no whitelist filter, since the shape varies by action type). Pass action_id; the action MUST belong to form_id. Use this when you need to inspect a non-email action (wppost, webhook, payment, …) — for email actions, get-notification gives you the same payload with a curated key list. |
wppilot/formidable-get-form-canonicalGet Formidable Form (Canonical) | Reads a single Formidable form by id and returns it mapped to the plugin-agnostic form-model-schema vocabulary (17 canonical types: text/email/tel/url/number/textarea/date/time/datetime/select/radio/checkbox/file/hidden/submit/consent/group) used by the form-model-migration skill. Formidable native field types (~30 including Pro) fold onto those 17 — composites (name, address, divider|repeat) collapse to canonical group; structural-only types (divider, end_divider, break, html, summary, captcha) drop with informational warnings; Pro payment types (credit_card, product, quantity, total) drop with structural warnings. The form lives in wp_frm_forms (with the legacy options blob carrying success_msg / success_action / success_url); fields live in wp_frm_fields (one row each, loaded via FrmField::get_all_for_form). Notifications are frm_form_actions posts with post_excerpt="email"; the on-submit confirmation is a frm_form_actions post with post_excerpt="on_submit", falling back to the legacy options.success_* keys. Output keys: fields[] with canonical types, mail_config{} from the first published email action, notifications[] from the rest, messages{} (empty — Formidable has no built-in message catalogue), conditional_rules[] from per-field field_options.hide_field / hide_opt (mapped 1:1 when expressible), meta{} (source plugin + version + lossless form options echo), plus warnings[] for everything that does not fit the canonical shape (multi-page break, repeater sections, payment fields, captcha, custom redirects). Smart-tag syntax [FIELD_ID] and [field_key] inside subject / message / recipient is rewritten to [<canonical-name>] to match the CF7 / WPForms / Gravity / Fluent canonical convention. Honours the same max_field_bytes truncation contract as the other canonical readers (default 8192 bytes for mail_config.body, notifications[].body, with *_truncated flags); pass max_field_bytes: 0 to disable truncation when full-fidelity canonical is required before an execute-mode migration. Returns WP_Error formidable_form_not_found when the id does not exist or refers to a trashed form. Use this ability inside the form-model-migration workflow (Phase 2 — read source schema); for ad-hoc inspection outside the migration pipeline, prefer formidable-get-form which returns the Formidable-native shape. |
wppilot/formidable-get-notificationGet Formidable Notification | Reads the full settings blob for one email notification on a Formidable form. Pass form_id + action_id. Returns: id, name, enabled, plus the email settings (email_to, cc, bcc, reply_to, from, email_subject, email_message, plain_text, inc_user_info, event, conditions). Non-email actions are rejected — use list-form-actions for those. |
wppilot/formidable-get-subscriptionGet Formidable Subscription | Reads one row from wp_frm_subscriptions by id. |
wppilot/formidable-get-transactionGet Formidable Transaction | Reads one row from wp_frm_payments by id. Returns id, receipt_id, invoice_id, sub_id, item_id, amount, status, action_id, paysys, created_at, begin_date, expire_date, meta (decoded blob), test. |
wppilot/formidable-list-applicationsList Formidable Applications | Lists every Formidable Pro Application (terms in the frm_application taxonomy). Compact row per application: id, name, slug, form_count (cached on _frm_form_count term meta), created_at, updated_at (Unix timestamps from _frm_created_at / _frm_updated_at term meta). Pro-only. Use this BEFORE get-application / apply-form-to-application to pick an application id. |
wppilot/formidable-list-entriesList Formidable Entries | Lists submissions (wp_frm_items rows) for a Formidable form. Filters: is_draft (omit for both, true = saved drafts only, false = completed entries only); user_id (entries created by that WP user id); search (substring on item_key); created_after / created_before (ISO-8601 dates, inclusive bounds on created_at). Paginated: default per_page=50, max 500. Hard cap on the matching pool is 5000 — pagination.truncated=true when reached. Compact row per entry: id, item_key, form_id, user_id, is_draft, parent_item_id, created_at, updated_at, ip. Use get-entry for the full meta payload. |
wppilot/formidable-list-form-actionsList Formidable Form Actions | Enumerates every form action on a Formidable form across ALL types (email, wppost, webhook, mailchimp, activecampaign, stripe, paypal, on_submit, …). Use the type filter to scope to one (e.g. wppost); omit to return everything. Compact per-row payload: id, name, type, enabled, modified_at. This is the generic surface — for email-action CRUD use wppilot-manage-wppilot-notifications.php (list-/get-/create-/edit-/delete-notification); for on-submit configuration use set-on-submit-action. Read/delete only at this surface; create/edit for non-email types go through wppilot/execute-php with the Formidable action subclass dispatcher (see the SKILL.md companion for snippets). |
wppilot/formidable-list-formsList Formidable Forms | Lists Formidable forms with a compact summary per row (id, form_key, name, description, status, parent_form_id, is_template, created_at). Supports filtering by status (published / draft / trash / any — default published), by template flag (is_template), by parent_form_id (for repeater child forms), and by a substring match on the form name (search). Paginated: default per_page=50, max 500. Use this BEFORE get-form to pick a form id; the full settings blob (options, fields[], actions) ships from get-form, never from this surface. |
wppilot/formidable-list-notificationsList Formidable Notifications | See the plugin source for this ability's contract. |
wppilot/formidable-list-stylesList Formidable Styles | See the plugin source for this ability's contract. |
wppilot/formidable-list-subscriptionsList Formidable Subscriptions | Lists rows from wp_frm_subscriptions (Stripe Lite + Pro recurring billing ledger). Same gating as transactions — available whenever payments_supported=true. |
wppilot/formidable-list-transactionsList Formidable Transactions | See the plugin source for this ability's contract. |
Writes
Gated by the active profile and your WordPress capabilities. Rate limited to 120 per minute per credential.
| Ability | What it does |
|---|---|
wppilot/formidable-add-fieldAdd Formidable Field | See the plugin source for this ability's contract. |
wppilot/formidable-apply-form-to-applicationApply Form to Application | Binds a form to a Formidable Pro Application — wraps FrmProApplication::add_form_to_application which adds a _frm_form_id term meta and bumps the cached form_count. Idempotent re-call returns applied=false. Pro-only. |
wppilot/formidable-apply-styleApply Formidable Style | See the plugin source for this ability's contract. |
wppilot/formidable-clear-form-from-applicationClear Form From Application | See the plugin source for this ability's contract. |
wppilot/formidable-create-applicationCreate Formidable Application | Creates a new Formidable Pro Application (a frm_application taxonomy term). Wraps FrmProApplication::create which calls wp_insert_term + adds _frm_created_at / _frm_updated_at term meta. Pass name (required). Pro-only. |
wppilot/formidable-create-formCreate Formidable Form | Creates a Formidable form. Accepts both short and WordPress-native keys for the common fields: title ↔ name (255-char limit, CRLF-stripped); slug ↔ form_key (auto-suffixed when it collides with an existing form, so always trust the returned value, never the input). Optional description and status (published | draft). Set is_template=true to register the row as a form-template. Pass source_form_id to DUPLICATE an existing form (including its fields and Repeater child sub-forms) and then apply the caller-supplied name / slug / description / status as overrides — the duplication path uses FrmForm::duplicate, which copies fields verbatim. Returns the compact form row of the newly created (or duplicated) form. |
wppilot/formidable-create-notificationCreate Formidable Notification | See the plugin source for this ability's contract. |
wppilot/formidable-get-formGet Formidable Form | See the plugin source for this ability's contract. |
Destructive
Marked destructive in the source, so each call needs an explicit confirmation flag, every time.
| Ability | What it does |
|---|---|
wppilot/formidable-cancel-subscriptionCancel Formidable Subscription | Cancels a recurring billing subscription (wp_frm_subscriptions row) by setting its status column to cancelled. NOTE: this changes the local ledger only — the upstream gateway (Stripe / PayPal / Square) is NOT contacted; that lifecycle is owned by the Pro gateway controllers. Use this when the upstream cancel has already happened externally and the ledger needs to catch up. Pro-only. |
wppilot/formidable-delete-applicationDelete Formidable Application | See the plugin source for this ability's contract. |
wppilot/formidable-delete-entryDelete Formidable Entry | Hard-deletes one entry + its wp_frm_item_metas rows. No soft-delete (there is no trash state for entries — only the is_draft flag which means something different). Idempotent: deleting an already-missing entry returns deleted=false. |
wppilot/formidable-delete-fieldDelete Formidable Field | Hard-deletes a single field from a form. Identify the field by field_id (numeric) OR field_key (slug from get-form); the field MUST belong to form_id — cross-form refs are rejected with formidable_field_form_mismatch (400). Idempotent: deleting an already-missing field is a no-op that returns deleted=false — re-running the same call is safe. There is no soft-delete for fields; the field row + its wp_frm_item_metas rows are removed atomically by FrmField::destroy. Heads-up for Repeater (Pro) fields: FrmField::destroy does NOT cascade to the auto-generated child sub-form (a wp_frm_forms row with parent_form_id pointing at the parent). Delete that child form separately via delete-form on its id, OR delete the parent form (which DOES cascade child sub-forms). |
wppilot/formidable-delete-formDelete Formidable Form | See the plugin source for this ability's contract. |
wppilot/formidable-delete-form-actionDelete Formidable Form Action | Hard-deletes one form action by action_id. Works for any type EXCEPT on_submit (route those through set-on-submit-action which manages the singleton lifecycle properly). For email actions specifically, delete-notification has the same effect with the same idempotency contract. Idempotent: deleting an already-missing action returns deleted=false. |
wppilot/formidable-delete-notificationDelete Formidable Notification | Hard-deletes one email notification by form_id + action_id. No soft-delete — the row is removed from wp_posts via wp_delete_post(force=true). Idempotent: deleting an already-missing action returns deleted=false (no-op) rather than 404. |
wppilot/formidable-edit-entryEdit Formidable Entry | Modifies field values on an existing entry. Pass item_meta keyed by field_id (int) OR field_key (string) — both are accepted and normalised internally. Unknown field refs are rejected with formidable_invalid_input (arbitrary-key-injection guard). Goes through FrmEntry::update so the documented frm_after_update_entry hook chain fires (downstream listeners like audit log / payment processors see the change). Do NOT poke FrmEntryMeta::update_entry_meta directly — that path skips the hooks. |
wppilot/formidable-edit-fieldEdit Formidable Field | See the plugin source for this ability's contract. |
wppilot/formidable-edit-formEdit Formidable Form | See the plugin source for this ability's contract. |
wppilot/formidable-edit-form-settingsEdit Formidable Form Settings | Partial-merge edit of the wp_frm_forms.options blob (the Settings → General tab in the Formidable admin UI). Whitelisted keys: submit_value, submit_html, before_html, after_html, show_title, show_description, ajax_submit, antispam, js_validate, save_draft, editable, logged_in, no_save, open_status, open_date, open_msg, closed_msg, open_form_msg. The success_msg / success_action / success_url / success_page_id family has been migrated to the on-submit action in Formidable 6.0+ — write those via set-on-submit-action, not here. custom_style is REJECTED — use apply-style for style binding. Unknown keys are silently dropped. |
wppilot/formidable-edit-notificationEdit Formidable Notification | Partial-merge edit of one email notification. Identify by form_id + action_id. Only the keys you pass are written; email_to / cc / bcc / reply_to / from / email_subject are CRLF-validated on every write. enabled=false flips the underlying post to draft (Formidable skips draft actions on entry events); enabled=true restores publish. The settings blob is partial-merged on the whitelisted keys ONLY — unknown keys are silently dropped to prevent arbitrary-key injection (FluentForms audit round 3 #F lesson). |
wppilot/formidable-set-entry-statusSet Formidable Entry Status | Toggles the is_draft flag on an entry. Draft entries (is_draft=1) are typically saved-for-later submissions; completed entries (is_draft=0) are final. Goes through FrmEntry::update so the documented hook chain fires (NOT a direct wp_frm_items column write). Idempotent: setting is_draft to its current value returns changed=false. |
wppilot/formidable-set-on-submit-actionSet Formidable On-Submit Action | See the plugin source for this ability's contract. |