# MCP Filters These filter hooks tune the FluentCRM MCP (Model Context Protocol) server and the context returned to AI agents by the `get-crm-context` tool. For the matching actions, see [MCP Actions](/hooks/actions/mcp). ## Server ### `fluent_crm/mcp_server_namespace` Filter the REST namespace of the dedicated FluentCRM MCP server. Together with [`fluent_crm/mcp_server_route`](#fluent-crm-mcp-server-route) it forms the endpoint, which defaults to `/wp-json/fluent-crm/mcp`. The same filter is used when the settings screen builds the endpoint URL, so connection snippets follow your change. **Parameters** - `$namespace` String - Default `fluent-crm` **Usage:** ```php add_filter('fluent_crm/mcp_server_namespace', function($namespace) { return 'my-crm'; }); ``` **Source:** `fluent-crm/app/Modules/MCP/MCPInit.php` --- ### `fluent_crm/mcp_server_route` Filter the route of the dedicated FluentCRM MCP server inside its namespace. **Parameters** - `$route` String - Default `mcp` **Usage:** ```php add_filter('fluent_crm/mcp_server_route', function($route) { return 'agent'; }); ``` **Source:** `fluent-crm/app/Modules/MCP/MCPInit.php` --- ### `fluent_crm/mcp_ability_names` Filter the list of ability names exposed by the dedicated FluentCRM MCP server (what agents discover through `tools/list`). Add the names of abilities you registered on [`fluent_crm/mcp_loaded`](/hooks/actions/mcp#fluent-crm-mcp-loaded). FluentCampaign Pro uses this to add its Pro abilities. The filter also runs when the settings screen counts available abilities. **Parameters** - `$abilityNames` Array - fully-qualified ability names, for example `fluent-crm/list-contacts` **Usage:** ```php add_filter('fluent_crm/mcp_ability_names', function($abilityNames) { $abilityNames[] = 'fluent-crm/my-custom-tool'; return $abilityNames; }); ``` **Source:** `fluent-crm/app/Modules/MCP/MCPInit.php` --- ## Context Returned to Agents ### `fluent_crm/mcp_capabilities` Filter the versioned capabilities map the `get-crm-context` tool returns (as `mcp_capabilities`) so agents can adapt to what the server supports. **Parameters** - `$capabilities` Array - keys: `version` (string), `supports` (list of feature slugs), `deprecated`, `corrections` (lists of notes) and `breaking_changes_pending` **Usage:** ```php add_filter('fluent_crm/mcp_capabilities', function($capabilities) { $capabilities['supports'][] = 'my_custom_tool'; return $capabilities; }); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContextTools.php` --- ### `fluent_crm/mcp_safety_levels` Filter the map of ability name to safety level returned in the `safety_levels` section of `get-crm-context`. Agents use it to decide how careful to be. Add an entry for every custom ability you register. Levels used by core: `safe_render`, `readonly`, `creates_or_mutates_draft`, `mutating_with_dry_run`, `destructive_send` and `destructive_irrecoverable`. **Parameters** - `$levels` Array - ability name => safety level **Usage:** ```php add_filter('fluent_crm/mcp_safety_levels', function($levels) { $levels['fluent-crm/my-custom-tool'] = 'readonly'; return $levels; }); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContextTools.php` --- ### `fluent_crm/mcp_rate_hints` Filter the per-ability limits returned in the `rate_hints` section of `get-crm-context`, which let agents validate batch sizes before calling a tool. Note this only changes what agents are told; to change the enforced limits use [`fluent_crm/mcp_bulk_cap`](#fluent-crm-mcp-bulk-cap). **Parameters** - `$hints` Array - ability name => array with `max_per_call` and `recommended_batch`, or a free-text `note` **Usage:** ```php add_filter('fluent_crm/mcp_rate_hints', function($hints) { $hints['fluent-crm/my-custom-tool'] = ['max_per_call' => 100]; return $hints; }); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContextTools.php` --- ### `fluent_crm/mcp_ai_guidelines` Filter the guidance text returned as the AI guidelines in `get-crm-context`. The default is built from the current user's permissions. Use it for site-specific rules, and keep it short because agents may request the context often. **Parameters** - `$guidelines` String - the default guidelines text **Usage:** ```php add_filter('fluent_crm/mcp_ai_guidelines', function($guidelines) { return $guidelines . ' Always tag contacts you edit with "mcp-edited".'; }); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContextTools.php` --- ### `fluent_crm/mcp_allowed_design_templates` Filter the email design templates agents may choose when creating campaigns or emails. By default these are the registered design templates minus `visual_builder`, which is an interactive editor and is not meant for agents. The result also feeds the allowed values (enum) in the tool schemas. **Parameters** - `$templates` Array - map of template slug => label **Usage:** ```php add_filter('fluent_crm/mcp_allowed_design_templates', function($templates) { unset($templates['raw_html']); // Do not let agents author raw HTML return $templates; }); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContextTools.php` --- ## Limits ### `fluent_crm/mcp_bulk_cap` Filter the maximum number of contacts a bulk MCP tool will process in one call. It is applied per tool; compare `$tool` to target one. Calls above the cap are refused with a `cap_reached` error. Defaults by tool: | `$tool` | Default cap | |---|---| | `bulk-upsert-contacts` | 500 | | `apply-segments-to-contacts` | 5000 | | `manage-sequence-subscribers` (FluentCampaign Pro) | 5000 | **Parameters** - `$cap` Integer - the default cap for that tool - `$tool` String - the tool name without the `fluent-crm/` prefix **Usage:** ```php add_filter('fluent_crm/mcp_bulk_cap', function($cap, $tool) { if ($tool === 'apply-segments-to-contacts') { return 1000; } return $cap; }, 10, 2); ``` **Source:** `fluent-crm/app/Modules/MCP/Tools/ContactTools.php` --- ## Settings Screen ### `fluent_crm/mcp_is_local_dev` Override the local-development detection used by the MCP settings screen. A site counts as local when its host ends in `.test`, `.lab`, `.local`, `.localhost`, `.docker` or `.dev`, is `localhost`, or is a private or reserved IP address. When detected, the generated Claude Desktop snippet includes `NODE_TLS_REJECT_UNAUTHORIZED=0` so the proxy accepts self-signed certificates. Return `false` for a public site on a dev-style hostname. **Parameters** - `$isDev` Boolean - whether the install looks like local development - `$host` String - the lowercased host of `home_url()` **Usage:** ```php add_filter('fluent_crm/mcp_is_local_dev', function($isDev, $host) { return false; }, 10, 2); ``` **Source:** `fluent-crm/app/Http/Controllers/MCPSettingsController.php`