Skip to main content
Glama

Preview a change across sites

fleet__bulk_edit

Preview one content or design change across many client sites at once (up to 50), through each site's Royal MCP Pro: tool wp_bulk_find_and_replace replaces literal text (a phone number, an address, an old brand name) in posts and pages, with args {find, replace, case_insensitive?, scope: {post_types, post_status?, post_ids?, limit?}, targets?: {content?, excerpt?, title?, meta_keys?, elementor_data?}}; tool elementor_bulk_replace_widget_setting sets one setting on every widget of a type on one Elementor page, with args {post_id, widget_type, setting_key, new_value}; tool elementor_update_kit_global changes one global color or font in Elementor's Site Settings (every widget using it follows), with args {kind: color|font, id or title (as in Site Settings, for example primary or Brand Orange), color, or font_family and font_weight}; it needs a later Royal MCP Pro release, so sites without it are left out; tool apply_brand_kit brings each site in line with its client’s brand kit (fleet__get_brand_kit), with args {client_id}: Site Settings colours and fonts the site already has are changed to the kit’s (matched by title), Elementor 4 variables and classes are created or updated to the kit’s (matched by label), nothing is deleted, entries the site lacks are named, and sites that are not that client’s are left out; tool wp_bulk_replace_widget_content replaces literal text in every widget of a type (sidebars and footers), with args {widget_type (block, text or custom_html), find, replace, case_insensitive?}; each site must allow AI to modify theme appearance in Royal MCP's settings; tool wp_update_menu_item changes the text or link of existing menu items whose current text and/or link match exactly (a phone number or address in a footer menu, a legal link), with args {match_title?, match_url?, menu? (a menu name or slug), new_title?, new_url?}, at most 10 changes per site (a new text and a new link on one item count as two), never adding, removing or moving items; a link to a page keeps its link and its text and is named in the results; tool wp_update_custom_css adds, replaces or removes one named block of CSS that Royally keeps between its own marker comments in the site's custom CSS, never touching the CSS around it, with args {name (lowercase letters, digits, hyphens), action: set|remove, css (for set)}; the site must allow AI to modify theme appearance and Royally's account there must be allowed to save CSS, which Royally can only learn when applying, so such sites are refused then and left unchanged; tool elementor_import_template copies one Elementor library template (a page template, section, or Theme Builder header, footer or other part) and tool divi_library_create copies one Divi Library item, from one site to the others, with args {source_site_id (the site it comes from, never changed and left out of the sites), template_id (its id there, from elementor_list_local_templates or divi_list_local_templates on that site)}; Royally reads the template once on that site and again when applying, refusing if it changed; each site gets a new library item with the same title, next to any with that title (nothing is replaced or deleted), and sites without the page builder (Elementor, Elementor Pro for Theme Builder parts, or Divi) or the tool are left out with the reason; the copy is not shown on any page until someone applies it, and its display conditions and Elementor page settings are not copied; tool wp_update_plugin updates plugins and tool wp_update_theme updates themes to the version WordPress has waiting, with args {items: plugin files or folders, theme folders, or ["*"] for every waiting update}, at most 15 per site; each site's update policy, its ignored updates (an ignored update that fixes a known vulnerability is still included) and requirements decide what is offered, a site set to Never is left out, a backup is taken first where the site's settings ask (SiteVault, else UpdraftPlus; a site with neither is refused), an update that breaks the home page is rolled back at once, and Royal MCP itself is never updated this way; tool wp_update_core updates WordPress itself to the newest version each site is offered, with args {}, always taking a full backup first whatever the site's settings say, because WordPress cannot be rolled back automatically; tool raif_set_bot_policies sets AI bot policies in Royal AI Firewall, with args {changes: [{bot_id (as raif_get_bot_policies lists it, for example openai-gptbot), policy: allow|block|log-only|default, rate_limit_per_min?, paywall_url?}]} (1 to 100 bots), each bot keeping its rate limit and paywall unless given; a search engine is only blocked where Royal AI Firewall's search engine override is on, otherwise that bot is left as it is and named with the reason; sites without Royal AI Firewall or the tool are left out; tool royal_mcp_update_ai_permissions changes what AI agents may change on each site through Royal MCP Pro, with args {allow_option_writes?, allowed_options? (the full option allowlist, which replaces the site's, up to 200 names), allow_theme_writes?}; only sites set to Managed by Royally in Royal MCP Pro > Royally take it, and the others are left out with that reason; tool gp_set_hardening turns GuardPress hardening settings on or off, with args {changes: [{key: hardening|xml_rpc_disabled|force_strong_passwords|disable_directory_browsing|uploads_php_block, enabled: true|false}]} (xml_rpc_disabled and force_strong_passwords take effect only while hardening is on); GuardPress applies them one by one and may leave one as it was (PHP blocked in uploads when PHP files are found there, directory listing off when the site stops loading with it), and that setting is named with the reason; sites without GuardPress or the tool are left out; tool elementor_replace_text_sitewide replaces literal text on every Elementor page, post and library template (Theme Builder parts, saved sections, global widgets), in classic and Elementor 4 widgets alike, with args {find, replace (may be empty), case_insensitive?, post_types? (only these, for example ["page", "elementor_library"])}; the preview counts matches per page with the classic and Elementor 4 split, pages Royally's account may not edit are left out and named, applying refuses a site whose count changed since the preview, and a site whose pages hold too much Elementor data to keep an undo is refused; tools wp_install_plugin (args {slugs: WordPress.org slugs, activate?}), wp_activate_plugin, wp_deactivate_plugin and wp_delete_plugin (args {plugins: plugin files, folders or names as the sites list them}) install, activate, deactivate or delete up to 5 plugins per site; each site's own plugin list says which plugin a name means there, and its own preview says what would happen, so a plugin not installed, already in that state, needing a newer PHP or WordPress, or that other active plugins need is left out and named; activating or deactivating checks the home page and the site switches the plugin back at once if it stops loading; only inactive plugins are deleted, deleting is permanent (it cannot be undone, and the plugin's uninstall routine may remove its data), so the preview is approved as a permanent change; Royal MCP itself is never changed this way; tools wp_install_theme (args {slugs: WordPress.org slugs}, installed but not activated), wp_switch_theme (args {theme: a theme folder or name}, the home page is checked and the site switches back at once if it stops loading) and wp_delete_theme (args {themes: folders or names}) install, activate or delete up to 5 themes per site, never deleting the active theme or the theme it is built on; tool wp_create_user adds up to 5 users, with args {users: [{username, email, role: administrator|editor|author|contributor|subscriber, first_name?, last_name?}]}, and Royally never sends or sees a password (each site makes one and emails the user a link to set theirs); tools wp_set_user_role (args {users: display names as the sites list them, role}), wp_demote_user (args {users: display names, end_sessions? (default true)}, which takes a user's access away by making them a subscriber and signing them out everywhere) and wp_delete_user (args {users: display names, reassign_to: the display name of the user who gets their posts}) change, demote or delete up to 5 users per site, never the account Royally connects as and never a site's last administrator, and a name two users share on a site is left out; tool wp_set_maintenance_mode turns maintenance mode on or off, with args {enabled, message? (up to 300 characters)}; tool wp_optimize_database removes old revisions, auto-drafts, trashed posts, spam and trashed comments and expired temporary data, with args {items? (revisions, auto_drafts, trashed_posts, spam_comments, trashed_comments, expired_transients; every kind when left out), keep_revisions? (0 to 100, default 5)}, up to 500 of each kind per run; deleting themes or users and cleaning the database are permanent, take a backup first where the site's settings ask, and are approved as permanent changes. Pick the sites with site_filter (a saved group's selection_id from fleet__list_site_groups, tags with tag_match any or all, status, plugin_slug); omit it for every site. Returns, per site, what would change (counts and up to 20 before/after examples), the sites with nothing to change or that could not be previewed, approve_url and approve_before. Nothing is written by this tool: show the person the summary and give them approve_url, where they review it and apply it in Royally before approve_before (a preview applies once; from 10 sites they type the site count to confirm). You cannot apply it yourself. When every site is in a site group the team set to apply changes without approval (picked with site_filter; a change to every site always waits), the change can be undone, does not touch users, roles, sign-in links, AI permissions, security hardening or IP blocks, needs no typed confirmation and no two-person approval covers the sites, Royally applies it at once instead: state is success, applied_by_rule names the groups, and preview_url replaces approve_url. Applying changes each site only if it still matches the preview, gives each site a receipt, and returns one undo for every site, which the person uses from the preview page in Royally for 72 hours. For text and widget changes it puts each changed page or widget back as it was, so edits made to them since are lost, except where a site reports that its undo leaves pages edited since as they are (Royal MCP Pro 1.0.15 for find and replace and Elementor widget settings), and Elementor text replaced on every page, where a page edited since is left as it is and named; a Site Settings color or font changed again since is left as it is; a menu item or custom CSS changed again since is not undone, and that site is named; a copied template is deleted from each site's library; a bot policy or the AI permissions changed again since are left as they are; every GuardPress hardening setting the change turned on or off is put back, unless it was changed again since; an update is rolled back to its previous version where WordPress.org has it, and an update from elsewhere or of WordPress itself is named, with the backup taken first as the way back; an installed plugin is removed, an activated plugin deactivated and a deactivated plugin activated again; a deleted plugin cannot be put back; an installed theme is removed unless it was made active since, a theme switch goes back to the theme before unless the theme was changed again, an added user is removed unless they have written posts or comments since, a changed role goes back unless it was changed again (a user whose access was taken away gets their roles back, but sessions that were ended stay ended), and maintenance mode goes back as it was; deleted themes and users and removed database rows cannot be put back.

Input Schema

NameRequiredDescriptionDefault
argsYesThe change itself, in the shape the chosen tool takes (see above).
toolYesThe change to make on each site.
site_filterNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / tool / enum
      Previous value: -[
      -  "wp_bulk_find_and_replace",
      -  "elementor_bulk_replace_widget_setting",
      -  "elementor_update_kit_global",
      -  "wp_bulk_replace_widget_content",
      -  "wp_update_menu_item",
      -  "wp_update_custom_css",
      -  "elementor_import_template",
      -  "divi_library_create",
      -  "wp_update_plugin",
      -  "wp_update_theme",
      -  "wp_update_core",
      -  "raif_set_bot_policies",
      -  "royal_mcp_update_ai_permissions",
      -  "gp_set_hardening",
      -  "elementor_replace_text_sitewide",
      -  "wp_install_plugin",
      -  "wp_activate_plugin",
      -  "wp_deactivate_plugin",
      -  "wp_delete_plugin",
      -  "wp_install_theme",
      -  "wp_switch_theme",
      -  "wp_delete_theme",
      -  "wp_create_user",
      -  "wp_set_user_role",
      -  "wp_demote_user",
      -  "wp_delete_user",
      -  "wp_set_maintenance_mode",
      -  "wp_optimize_database"
      -]New value: +[
      +  "wp_bulk_find_and_replace",
      +  "elementor_bulk_replace_widget_setting",
      +  "elementor_update_kit_global",
      +  "apply_brand_kit",
      +  "wp_bulk_replace_widget_content",
      +  "wp_update_menu_item",
      +  "wp_update_custom_css",
      +  "elementor_import_template",
      +  "divi_library_create",
      +  "wp_update_plugin",
      +  "wp_update_theme",
      +  "wp_update_core",
      +  "raif_set_bot_policies",
      +  "royal_mcp_update_ai_permissions",
      +  "gp_set_hardening",
      +  "elementor_replace_text_sitewide",
      +  "wp_install_plugin",
      +  "wp_activate_plugin",
      +  "wp_deactivate_plugin",
      +  "wp_delete_plugin",
      +  "wp_install_theme",
      +  "wp_switch_theme",
      +  "wp_delete_theme",
      +  "wp_create_user",
      +  "wp_set_user_role",
      +  "wp_demote_user",
      +  "wp_delete_user",
      +  "wp_set_maintenance_mode",
      +  "wp_optimize_database"
      +]
  2. First observed

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite the sparse annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description discloses an unusual amount: that sites are only read during preview, that applying re-verifies the preview state, per-change-type undo semantics (including which edits made since are lost or left), backup-before-update behavior, 72-hour undo window, and every refusal/left-out condition with reasons. The only mild tension is 'Nothing is written by this tool' versus readOnlyHint=false, but the text clarifies the pending change is applied later from Royally, so this is not a genuine contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, and most content is genuinely load-bearing given 29 modes, but it is delivered as one enormous run-on paragraph mixing argument shapes, preconditions and undo semantics per tool with no headings, bullets or line breaks. An agent must parse a wall of semicolon-separated clauses to locate the args for a single chosen tool, so structure substantially undercuts the value of the content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still specifies the return shape ('per site, what would change (counts and up to 20 before/after examples)', sites with nothing to change, approve_url, approve_before) and the auto-applied variant (state, applied_by_rule, preview_url, one undo per site). For a 29-mode, high-risk bulk tool this is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only enumerates the 29 tool strings and describes args as 'the shape the chosen tool takes'; the description supplies the actual argument shapes for each tool (e.g. {find, replace, case_insensitive?, scope:{post_types, post_status?, post_ids?, limit?}}, {users:[{username,email,role,...}]}) plus limits like 50 sites, 15 updates, 5 plugins/users. It also explains site_filter semantics ('omit it for every site', tag_match any/all), far exceeding the 67% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb, resource and scope: 'Preview one content or design change across many client sites at once (up to 50)'. Combined with 'Nothing is written by this tool' and the approve_url hand-off, an agent can immediately tell this apart from the apply-style sibling fleet__run_across_sites without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states how to select sites (site_filter with selection_id from fleet__list_site_groups, tags with tag_match, status, plugin_slug; omit for every site), what the agent must do with the result (show the summary, give approve_url, 'You cannot apply it yourself'), and the auto-apply exception when every site is in an auto-apply group. It never explicitly names an alternative tool to use instead, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources