Fluent WordPress MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FLUENT_WP_URL | No | Legacy alias for FLUENT_WP_SITE_URL; conflicting canonical values refuse. | |
| FLUENT_WP_PASS | No | Legacy alias for FLUENT_WP_APP_PASSWORD; conflicting canonical values refuse. | |
| FLUENT_WP_USER | No | WordPress username; no colon/control characters. | |
| FLUENT_WP_ACCOUNTS | No | Private unique named site_url/username/app_password or password_file profiles as a JSON array. | |
| FLUENT_WP_SITE_URL | No | Trusted HTTPS site root, optional install subdirectory. Do not append wp-json, put a password in the URL, or include a query/fragment. | |
| FLUENT_WP_AUDIT_LOG | No | Private best-effort JSONL guard log, no payloads. | |
| FLUENT_WP_READ_ONLY | No | 1/true hides and directly refuses 13 confirmed operations. | |
| FLUENT_WP_APP_PASSWORD | No | Private dedicated Application Password; never main login. | |
| FLUENT_WP_PASSWORD_FILE | No | Absolute owner-private non-symlink password-only file, <=64 KiB. | |
| FLUENT_WP_DEFAULT_ACCOUNT | No | Exact selected private site label. | |
| FLUENT_WP_ALLOW_DESTRUCTIVE | No | 0/false refuses all confirmed operations; default true. | |
| FLUENT_WP_REQUEST_TIMEOUT_MS | No | 30000 default; integer 100–300000; no automatic retry. | |
| FLUENT_WP_MIN_REQUEST_INTERVAL_MS | No | 250 default; integer 0–10000; process spacing only. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| fcrm_dashboard_statsA | Retrieve overall dashboard statistics including active contacts count, campaigns count, emails sent, active automations, onboarding progress, quick links, recent contacts, recent campaigns, active automations list, and system recommendations. Required capability: Enforced by |
| fcrm_list_contactsA | Retrieve a paginated list of contacts. Supports both simple filtering (by tags, lists, statuses) and advanced filtering with complex filter groups. Optionally includes custom field values. Required capability: Enforced by |
| fcrm_get_contactA | Retrieve a single contact by ID or email. Supports eager-loading related data like stats, custom values, custom field definitions, and commerce stats via the Required capability: Enforced by |
| fcrm_search_contactsA | Search contacts by name or email. Returns a lightweight object of contacts keyed by ID, suitable for dropdowns and autocomplete widgets. Optionally loads default contacts when no search term is provided. Required capability: Enforced by |
| fcrm_create_contactA | Create a new contact. If Required capability: Enforced by |
| fcrm_update_contactA | Update an existing contact's fields, custom values, tags, and lists. Supports attaching and detaching tags/lists in a single request. The Required capability: Enforced by |
| fcrm_contact_notesB | Retrieve a paginated list of notes for a contact. Supports searching notes by title. Each note includes the user who created it. Required capability: Enforced by |
| fcrm_add_contact_noteA | Add a new note to a contact. The note description supports SmartCode/merge tags which are parsed before saving. If Required capability: Enforced by |
| fcrm_list_tagsA | Retrieve a paginated list of tags. Optionally includes subscriber counts and a separate array of all tags for dropdown/select usage. Required capability: Enforced by |
| fcrm_list_listsA | Retrieve a paginated list of contact lists. Optionally includes subscriber counts and a separate array of all lists for dropdown/select usage. Required capability: Enforced by |
| fcrm_list_campaignsA | Retrieve a paginated list of email campaigns. Supports filtering by status, search term, labels, and sorting. Optionally includes campaign statistics. Required capability: Enforced by |
| fcrm_get_campaignA | Retrieve a single campaign by ID. Optionally include related data (template, subjects) via the Required capability: Enforced by |
| fcrm_campaign_statsA | Get overview statistics for a campaign including sent count, email status breakdown, and open/click analytics. This is a lighter-weight alternative to the full campaign status endpoint, suitable for dashboard widgets or summary views. Required capability: Enforced by |
| fcrm_list_sequencesB | Retrieve a paginated list of email sequences. Optionally include statistics (email count, subscriber count, revenue) for each sequence. Requires FluentCampaign Pro. Required capability: Enforced by Requires: FluentCampaign Pro. Without it the route does not exist. |
| fcrm_list_automationsA | Retrieve a paginated list of automation funnels. Supports sorting, searching by title, and filtering by label IDs. Optionally includes trigger definitions. Required capability: Enforced by |
| fcrm_automation_reportA | Retrieve statistical reporting data for a specific automation funnel. Returns aggregated stats generated by the Reporting service. Required capability: Enforced by |
| fcrm_contact_emailsA | Retrieve a paginated list of emails sent to a contact. Supports filtering by open/click status. Can also show FluentSMTP logs when the Required capability: Enforced by |
| fc_list_spacesB | Returns the paginated list of spaces with each one formatted for display, including the current user permissions and membership within it. Controller: |
| fc_get_spaceB | Returns one space with its settings, topics, the current user membership and the permissions they hold inside it. Controller: |
| fc_list_feedsA | Returns a page of posts the current user is allowed to read, transformed for display, with the pinned post of a space returned separately on the first page. Controller: |
| fc_get_feedA | Returns a single post by numeric id; the id is resolved to a slug and then handled exactly as the by-slug endpoint. Controller: |
| fc_create_feedB | Creates a post, renders its Markdown, attaches media and topics, and returns the transformed post ready to prepend to the feed. Controller: |
| fc_update_feedA | Replaces the body and metadata of an existing post, re-renders it, reconciles its media and topics, and records an edit history entry. Controller: |
| fc_delete_feedA | Deletes a post from the community. Controller: |
| fc_list_commentsA | Returns every comment on a post in chronological order, with each author profile attached and the current user liked state flagged. Controller: |
| fc_create_commentA | Posts a comment or a threaded reply on a feed item, renders its Markdown, links any attached media and bumps the post comment count. Controller: |
| fc_update_commentA | Replaces the body of an existing comment, re-renders it, and reconciles its attached media with the submitted list. Controller: |
| fc_delete_commentA | Deletes a comment, recounts the comments on its post and hands any attached media to the media cleanup hook. Controller: |
| fc_react_to_feedA | Adds or removes the current user reaction on a post and returns the updated count : a second route onto the same behaviour as the reactions toggle endpoint. Controller: |
| fc_list_coursesB | Returns the paginated list of courses the current user may manage, each with its student count and its section and lesson totals. Controller: |
| fc_get_courseA | Returns one course in its editable form, with the lock screen configuration, the attached category ids and : when it has students : the completion count and average progress. Controller: |
| fc_course_studentsB | Returns the paginated roster of a course, each student carrying their enrolment pivot and their completion percentage. Controller: |
| fc_course_lessonsB | Returns the lessons of a course in display order, optionally narrowed to one section. Controller: |
| fc_space_membersA | Returns the paginated active membership of a space, each entry carrying the member profile and their role, plus the count of outstanding join requests. Controller: |
| fc_get_profileB | Returns one member public profile by username, with the navigation tabs the portal should render for that member. Controller: |
| fc_scheduled_postsA | Returns the paginated list of posts one member has scheduled but not yet published, soonest first. Controller: |
| fc_analytics_top_membersA | Returns ten member profiles ordered by lifetime points, drawn from those who joined within the requested range. Controller: |
| fc_analytics_top_commentersA | Returns the ten members who wrote the most comments within the requested range, each with their comment count. Controller: |
| fc_analytics_top_post_startersA | Returns the ten members who published the most posts within the requested range, each with their post count. Controller: |
| fc_analytics_member_activityA | Returns a gap-filled time series of member signups across the requested range. Controller: |
| ff_list_formsB | Read one Forms page with current native sorting and date filters. Requires fluentform_dashboard_access and applicable native form permissions. Not an all-forms snapshot. |
| ff_get_formA | Read one native form with formMeta; may include private integration/settings data. Requires fluentform_forms_manager for the selected form. |
| ff_form_fieldsA | Read current native field definitions; no field edits. Requires fluentform_forms_manager for the selected form. |
| ff_list_submissionsB | Read one native individual-entry page for an explicitly selected form. Corrects old GET /report/submissions. Requires fluentform_entries_viewer for that form. Entry bodies are private; no automatic detail call or mark-as-read action. |
| ff_form_reportA | Read the native form report with explicit approval because ReportService::form invokes ReportHelper::maybeMigrateData. It may update stored reporting data. Requires native form-scoped fluentform_entries_viewer; hidden/refused in read-only mode. No automatic retries. |
| ff_form_statsA | Read native date-range form statistics. Requires form-scoped fluentform_entries_viewer when form_id is selected; all-forms permission otherwise. Native reports may change via site hooks and version-specific provider behavior. Not guaranteed lifetime revenue or all plugin statistics. |
| get_current_userA | One authenticated WordPress current-user GET with view context; verifies one user read, not site ownership or all plugin permissions. Native private output is untrusted. |
| list_accountsC | Local profile labels/default/credential source only; no site URL, username, password path, provider identity or network request. |
| get_operation_schemaA | Local method/path/query/body schema and pinned provenance for one selected native tool. No provider call or credentials. |
| fc_analytics_overviewC | Retained legacy selector mapped to four fixed reviewed native Pro report routes. Not a whole-community analytics export; native report permissions apply. |
| preview_site_batchA | Local native validation/hash for 1–20 CRM/Community writes. Binds selected profile label/site/username, request order and packaged schemas. No password read/provider state check or remote approval token. |
| submit_site_batchA | Confirmed 1–20 ordered CRM/Community writes. Validate every request and exact review hash before first request, stop on first failure with known receipts and unattempted indices; no retries/rollback/continuation. |
| read_site_snapshotA | Prevalidate 1–20 native reads for one exact private site profile; return at most5 MiB combined CRM/Community/Forms responses. No auto-pages, stateful report, browser cookies, uploads or atomic provider snapshot. Native records may contain private personal data. |
| save_site_snapshotA | Confirmed 1–20 prevalidated native reads delivered only to an exclusive new0600 JSON file. No record body echoed, overwrites, upload or all-pages guarantee. Failures remove only this helper’s newly created file and return indices without native records. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 54 tools
Within each product family (fcrm_, fc_, ff_) the list/get/create/update/delete tools are mostly distinct, but there is real overlap: fc_analytics_overview is explicitly a 'legacy selector mapped to four fixed routes' that duplicates the four specific fc_analytics_* tools, fcrm_dashboard_stats/fcrm_campaign_stats/fcrm_automation_report are competing stats endpoints, and the four generic batch/snapshot tools (preview_site_batch, submit_site_batch, read_site_snapshot, save_site_snapshot) shadow the individual read/write tools. An agent could easily pick the wrong stats or batch tool.
Inside the fcrm_ and fc_ prefixes there is a fairly predictable verb_noun pattern (list_contacts, get_contact, create_contact, update_contact), with minor exceptions like fcrm_contact_notes (noun-only) and fcrm_add_contact_note. However the server mixes four naming families (fcrm_, fc_, ff_) plus an unprefixed generic set (get_current_user, list_accounts, preview_site_batch) and fc_analytics_overview breaking its own prefix, so the overall surface is readable but not uniform.
54 tools is very heavy for an MCP surface, and while the server does span three products (FluentCRM, FluentCommunity, FluentForms) plus generic helpers, the count is well past the comfortable 3-15 range. Several tools are near-duplicates (batch wrappers vs. single calls, legacy analytics selector vs. four specific analytics tools), so not every tool clearly earns its place.
Read coverage is broad and the community side has full CRUD for feeds and comments, but there are notable gaps: FluentCRM campaigns, sequences, and automations are read-only (no create/update/delete), and the FluentForms family is entirely read-only with no form or submission write operations. Agents can work around some gaps but cannot complete full lifecycle workflows in several domains.